在多边形 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)
我有一个包含多边形的数据框,我想循环以创建一个新列来检查特定点是否在一个或多个多边形内(因为它们不是唯一的)。我试图按照 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)