[英]Link each point in one GeoPandas dataframe to polygons in another dataframe
我搜索了我的问题,发现这个问题与我的问题不同。
我有两个地理数据框,一个包含房屋位置作为points
(约 700 个点),另一个包含suburbs names
及其polygon
(约 2973 个多边形)。 我想将每个点链接到一个多边形,以将每个房屋分配给正确的郊区。
我的地理样本 dataframe
import geopandas as gpd
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
#creating geo series
polys = gpd.GeoSeries({
'6672': Polygon([(142.92288, -37.97886,), (141.74552, -35.07202), (141.74748, -35.06367)]),
'6372': Polygon([(148.66850, -37.40622), (148.66883, -37.40609), (148.66920, -37.40605)]),
})
#creating geo dataframe
polysgdf = gpd.GeoDataFrame(geometry=gpd.GeoSeries(polys))
polysgdf
产生以下内容(我的原始地理 dataframe 还包括一个suburb
列,其中包含郊区名称但我无法将其添加到我的示例中,您只能在下面看到郊区 ID)
geometry
6672 POLYGON ((142.92288 -37.97886, 141.74552 -35.07202, 141.74748 -35.06367, 142.92288 -37.97886))
6372 POLYGON ((148.66850 -37.40622, 148.66883 -37.40609, 148.66920 -37.40605, 148.66850 -37.40622))
地理点样本 dataframe
points=[Point(145.103,-37.792), Point(145.09720, -37.86400),
Point(145.02190, -37.85450)]
pointsDF = gpd.GeoDataFrame(geometry=points,
index=['house1_ID', 'house2_ID', 'house3_ID'])
pointsDF
产生以下
geometry
house1_ID POINT (145.10300 -37.79200)
house2_ID POINT (145.09720 -37.86400)
house3_ID POINT (145.02190 -37.85450)
我希望最终的 output 成为pointsDF
geo dataframe ,每个房屋都分配到相应的郊区。 作为匹配点和多边形的结果。
例子:
suburbID subrubName house_ID
6672 south apple house1_ID
6372 water garden house2_ID
我是 GeoPandas 的新手,我试图以最清晰的方式解释我的问题。 我很高兴澄清任何一点。 谢谢你。
我找到了一种通过使用空间连接连接两个数据框来完成此操作的方法
joinDF=gpd.sjoin(pointsDF, polysgdf, how='left',op="within")
使用 shapely 的 Point-in-Polygon 分析 using.contains function 如下。
import geopandas as gpd
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
polys = gpd.GeoSeries({
'6672': Polygon([(0, 0), (0, 1), (1, 0)]),
'6372': Polygon([(0, 1), (1, 1), (1, 0)]),
})
#creating geo dataframe
polysgdf = gpd.GeoDataFrame(geometry=gpd.GeoSeries(polys))
polysgdf
Out[48]:
geometry
6672 POLYGON ((0 0, 0 1, 1 0, 0 0))
6372 POLYGON ((0 1, 1 1, 1 0, 0 1))
points=[Point(0.25,0.25), Point(0.75,0.75),
Point(145.02190, -37.85450)]
pointsDF = gpd.GeoDataFrame(geometry=points,
index=['house1_ID', 'house2_ID', 'house3_ID'])
pointsDF
Out[49]:
geometry
house1_ID POINT (0.25 0.25)
house2_ID POINT (0.75 0.75)
house3_ID POINT (145.0219 -37.8545)
polysgdf['house_ID'] = ''
for i in range(0,len(pointsDF)):
print('Check for house '+str(pointsDF.index.values.astype(str)[i]))
for j in range(0,len(polysgdf)):
print('Check for suburb '+str(polysgdf.index.values.astype(str)[j]))
if polysgdf['geometry'][j].contains(pointsDF['geometry'][i]) == True:
polysgdf['house_ID'][j] = pointsDF.index.values.astype(str)[i]
print(polysgdf)
geometry house_ID
6672 POLYGON ((0 0, 0 1, 1 0, 0 0)) house1_ID
6372 POLYGON ((0 1, 1 1, 1 0, 0 1)) house2_ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.