当前位置: 首页 > 知识库问答 >
问题:

在多边形geopandas列上循环时出错,in()函数不起作用

唐声
2023-03-14

我有一个多边形的数据帧,并希望循环,以便创建一个新的列检查,如果一个特定的点在一个或多个多边形(因为它们不是排他性的)。我试图遵循geopandas的教程,但这似乎不起作用,因为所有的列都返回一个“假”。有人能指出我做错了什么吗?非常感谢。以防万一,文件quartier_paris.geojson是一个经典的Geojson文件,它是读没有问题(形状出现,我可以去所有quartiers.explore()例如,看到地图上的所有多边形,我是100%肯定点在这些多边形内。文件的大小太大,无法下载,这是它的链接,以防万一https://parisdata.opendatasoft.com/explore/dataset/quartier_paris/download/?format=geojson

import pandas as pd
import geopandas
import os
import shapely
from shapely.geometry import Polygon, LineString, Point

quartiers = geopandas.read_file("quartier_paris.geojson")
p1 = Point(48.823, 2.30)  
quartiers["Match"] =quartiers["geometry"].apply(lambda x: p1.within(x))


共有1个答案

颜嘉福
2023-03-14
  • 你的点不在任何几何中。此外,您还转置了经度和纬度
  • 当换位时,它在几何的矩形边界内
  • 下面的代码显示测试和绘图映射框来演示
import requests
import geopandas as gpd
from shapely.geometry import Polygon, LineString, Point, box
import plotly.express as px
import plotly.graph_objects as go

res = requests.get(
    "https://parisdata.opendatasoft.com/explore/dataset/quartier_paris/download/?format=geojson&timezone=Europe/Berlin&lang=fr"
)
gdf = gpd.GeoDataFrame.from_features(res.json())
p1 = Point(48.823, 2.30)
p2 = Point(2.30, 48.823)

print(
    f"""
p1 in total bounds: {p1.within(box(*gdf.total_bounds))}
p2 in total bounds: {p2.within(box(*gdf.total_bounds))}
p2 in any geometry: gdf["geometry"].apply(lambda g: p2.within(g)).any()
"""
)

px.scatter_mapbox(lon=[p2.x], lat=[p2.y]).update_layout(
    mapbox={
        "style": "carto-positron",
        "zoom": 10,
        "layers": [
            {"source": gdf["geometry"].__geo_interface__, "type": "line"},
            {
                "source": gdf["geometry"]
                .apply(lambda g: box(*g.bounds))
                .__geo_interface__,
                "type": "line",
                "color": "skyblue",
            },
            {
                "source": box(*gdf.total_bounds).__geo_interface__,
                "type": "line",
                "color": "blue",
            },
        ],
    },
    margin={"l": 0, "r": 0, "t": 0, "b": 0},
).update_traces(marker_size=20)
 类似资料:
  • 我不熟悉geopandas,只想绘制多边形的轮廓,类似于PostGIS中的函数 我有一个地理数据框包含每个状态的多边形 当我按一个状态划分子集时,我能够绘制该状态: 我只对轮廓感兴趣,但在留档中不清楚如何将多边形转换为线几何。在或其他空间库中是否有有用的方法可以帮助将多边形转换为线性字符串?

  • 我有一个geopandas数据框,由一个id和一个由2D点填充的几何列组成。我想为每个唯一id连接点以创建一个多边形,以便我的新数据帧将多边形作为其几何体。我的代码当前看起来像这样: 它创建了一个多边形,但当我指定新变量时,它会显示 这很有意义,因为它仍然只是一个坐标列表,而不是实际的多边形对象。有人知道如何将它变成一个实际的多边形对象,我可以将它添加到geopandas上的列中吗 提前感谢:)

  • 我有一个带有lat和lon的商店位置csv文件。我还有一个geojson文件,其中包含美国人口普查区的多边形特征。我想使用Python查看每个位置存在哪些多边形。 我使用Shapely Python库的包含()来循环通过存储位置的csv文件,获取lat和lon坐标,然后检查这些坐标是否存在于Geojson文件中的一个多边形中。 如果我先遍历每个位置/坐标,然后遍历每个多边形,使用contains(

  • 我有一个geopandas数据框,其中包含一个形状良好的点几何体列表。还有一列包含ID列表,用于指定每个点所属的唯一多边形。简化输入代码为: 我想按多边形ID分组,以便将几何体从点转换为多边形。该输出基本上如下所示: 我想这很简单,但我很难让它工作。我发现下面的代码允许我将其转换为开放式多段线,但无法计算出多边形。有人能建议如何适应这种情况吗? 简单地用多边形替换LineString会导致Type

  • 似乎“for in”循环隐式调用函数迭代器,参数状态为:i(s) 任何人都能告诉我,发生了什么?

  • 我们在联系人列表中有一组表示不同人的对象。我们有一个 lookUpProfile 函数,它将 name 作为参数。该函数应检查姓名是否为实际联系人的名字。它将在控制台上打印联系人姓名,如果姓名与联系人的名字匹配,则为 true,否则,它将打印 false。 我想让我的while循环遍历数组,直到nameCheck等于true或者我的长度大于contact length(也就是它到达数组的末尾)。