如何使用 Python 和 Geopandas 从 Geojson 文件中查找多边形中的点
How To Find a Point In Polygon from a Geojson file Using Python And Geopandas
所以我有一个 .geojson
文件,其中包含代表一个国家/地区的多个多边形 FeatureCollection
。我正在尝试确定特定点是否在这些多边形之一内。如果是这样,我 return 整个功能本身;如果没有,我return一个简单的消息。
到目前为止,我可以使用 geopandas 将数据加载到 GeoDataFrame
,但由于某些原因,我无法成功地遍历地理数据框并成功执行 polygon.contains(point)
。在我看来,迭代在某个点后停止,或者我的代码可能根本不起作用。
我已经尝试了 S/O 和 Google 上其他教程的多个建议,但我无法成功获得我想要的。下面是我的代码。
Geojson 文件
代码
%matplotlib inline
import json
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import shapely
from shapely.geometry import Point, Polygon
from descartes import PolygonPatch
import geocoder
import requests
import copy
session = requests.Session()
test_point = [14.1747157, 10.4952759]
f, ax = plt.subplots(1, figsize=(10, 10))
url = 'https://trello-attachments.s3.amazonaws.com/599b7f6ff18b8d629ac53168/5d03586a06add530095c325c/26f5d54bbfa9731ec16737641b59de9a/CMR_adm3-2.geojson'
df = gpd.read_file(url)
df['Area']= df['geometry'].area
df['centroid'] = df['geometry'].centroid
df.plot(ax=ax, column="Area", cmap='OrRd', alpha=0.5, edgecolor='k')
# ax.set_title(arr + " " + depart + " " + region, fontsize = font_size)
# print(df.head(3))
plt.show()
print("The length of the Dataframe is:", len(df))
def find_department(df, point):
for feature in df['geometry']:
polygon = Polygon(feature)
# print(type(polygon))
if polygon.contains(point):
# print(feature.to_json())
print ('Found containing polygon:', feature)
else:
print('Found nothing!')
p1 = Point(float(test_point[0]), float(test_point[1]))
dept = find_department(df, p1)
print("The department is:", dept)
这是我在笔记本上运行得到的回复:
这对我有用:
def find_department(df, point):
for index, row in df.iterrows():
if row.geometry.contains(point):
return row
所以我有一个 .geojson
文件,其中包含代表一个国家/地区的多个多边形 FeatureCollection
。我正在尝试确定特定点是否在这些多边形之一内。如果是这样,我 return 整个功能本身;如果没有,我return一个简单的消息。
到目前为止,我可以使用 geopandas 将数据加载到 GeoDataFrame
,但由于某些原因,我无法成功地遍历地理数据框并成功执行 polygon.contains(point)
。在我看来,迭代在某个点后停止,或者我的代码可能根本不起作用。
我已经尝试了 S/O 和 Google 上其他教程的多个建议,但我无法成功获得我想要的。下面是我的代码。
Geojson 文件
代码
%matplotlib inline
import json
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import shapely
from shapely.geometry import Point, Polygon
from descartes import PolygonPatch
import geocoder
import requests
import copy
session = requests.Session()
test_point = [14.1747157, 10.4952759]
f, ax = plt.subplots(1, figsize=(10, 10))
url = 'https://trello-attachments.s3.amazonaws.com/599b7f6ff18b8d629ac53168/5d03586a06add530095c325c/26f5d54bbfa9731ec16737641b59de9a/CMR_adm3-2.geojson'
df = gpd.read_file(url)
df['Area']= df['geometry'].area
df['centroid'] = df['geometry'].centroid
df.plot(ax=ax, column="Area", cmap='OrRd', alpha=0.5, edgecolor='k')
# ax.set_title(arr + " " + depart + " " + region, fontsize = font_size)
# print(df.head(3))
plt.show()
print("The length of the Dataframe is:", len(df))
def find_department(df, point):
for feature in df['geometry']:
polygon = Polygon(feature)
# print(type(polygon))
if polygon.contains(point):
# print(feature.to_json())
print ('Found containing polygon:', feature)
else:
print('Found nothing!')
p1 = Point(float(test_point[0]), float(test_point[1]))
dept = find_department(df, p1)
print("The department is:", dept)
这是我在笔记本上运行得到的回复:
这对我有用:
def find_department(df, point):
for index, row in df.iterrows():
if row.geometry.contains(point):
return row