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

Error while looping on polygon geopandas column, within() function not working

我有一个包含多边形的数据框,我想循环以创建一个新列来检查特定点是否在一个或多个多边形内(因为它们不是唯一的)。我试图按照 geopandas 的教程进行操作,但这似乎并不奏效,因为所有列 return 都是“False”。有人可以指出我做错了什么吗? 非常感谢。 以防万一,文件“quartier_paris.geojson”是一个经典的 geojson 文件,它可以毫无问题地读取(形状出现,我可以全部 quartiers.explore() 例如,查看地图上的所有多边形和我 100% 肯定该点在这些多边形内。文件的大小太大而无法加载,这是 link 以防万一 https://parisdata.opendatasoft.com/explore/dataset/quartier_paris/download/?format=geojson&timezone=Europe/Berlin&lang=fr)

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))


  • 您的点不在任何几何图形中。此外,您还调换了经度和纬度
  • 转置时它在几何的矩形边界内
  • 下面的代码显示了测试和一个 plotly mapbox 来演示
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)