Python中的经纬度点属于哪个多面体?
Which multipolygon does the point of longtitude and latitude belong to in Python?
我有经度和纬度,预期结果是无论点在哪个多边形中,我都会得到多边形的名称或 ID。
import geopandas as gpd
world = gpd.read_file('/Control_Areas.shp')
world.plot()
输出
0 MULTIPOLYGON (((-9837042.000 6137048.000, -983...
1 MULTIPOLYGON (((-11583146.000 5695095.000, -11...
2 MULTIPOLYGON (((-8542840.287 4154568.013, -854...
3 MULTIPOLYGON (((-10822667.912 2996855.452, -10...
4 MULTIPOLYGON (((-13050304.061 3865631.027, -13.
之前的尝试:
我已经尝试过 fiona、shapely 和 geopandas 来完成这项工作,但我一直在努力取得进展。我得到的最接近的是 within 和 contains 函数,但我一直在努力的工作领域是成功地将多面体转换为多边形,然后利用 within 和 contains 的力量来获得所需的输出。
形状文件已从 here 下载。
world.crs
给出 {'init': 'epsg:3857'}
(Web 墨卡托投影),因此如果您想保留点的 latitude-longitude 坐标系,您应该首先在 WGS84 投影中重新投影 GeoDataFrame。
world = world.to_crs("EPSG:4326")
然后你可以使用GeoPandas的intersects方法来找到包含你的点的多边形的索引。
例如纽约市:
from shapely.geometry import Point
NY_pnt = Point(40.712784, -74.005941)
world[["ID","NAME"]][world.intersects(NY_pnt)]
这导致:
ID NAME
20 13501 NEW YORK INDEPENDENT SYSTEM OPERATOR
您可以使用 shapely within 方法检查结果:
NY_pnt.within(world["geometry"][20])
如果有多个点,可以创建一个GeoDataFrame并使用sjoin方法:
NY_pnt = Point(40.712784, -74.005941)
LA_pnt = Point(34.052235, -118.243683)
points_df = gpd.GeoDataFrame({'geometry': [NY_pnt, LA_pnt]}, crs='EPSG:4326')
results = gpd.sjoin(points_df, world, op='within')
results[['ID', 'NAME']]
输出:
ID NAME
0 13501 NEW YORK INDEPENDENT SYSTEM OPERATOR
1 11208 LOS ANGELES DEPARTMENT OF WATER AND POWER
我有经度和纬度,预期结果是无论点在哪个多边形中,我都会得到多边形的名称或 ID。
import geopandas as gpd
world = gpd.read_file('/Control_Areas.shp')
world.plot()
输出
0 MULTIPOLYGON (((-9837042.000 6137048.000, -983...
1 MULTIPOLYGON (((-11583146.000 5695095.000, -11...
2 MULTIPOLYGON (((-8542840.287 4154568.013, -854...
3 MULTIPOLYGON (((-10822667.912 2996855.452, -10...
4 MULTIPOLYGON (((-13050304.061 3865631.027, -13.
之前的尝试: 我已经尝试过 fiona、shapely 和 geopandas 来完成这项工作,但我一直在努力取得进展。我得到的最接近的是 within 和 contains 函数,但我一直在努力的工作领域是成功地将多面体转换为多边形,然后利用 within 和 contains 的力量来获得所需的输出。
形状文件已从 here 下载。
world.crs
给出 {'init': 'epsg:3857'}
(Web 墨卡托投影),因此如果您想保留点的 latitude-longitude 坐标系,您应该首先在 WGS84 投影中重新投影 GeoDataFrame。
world = world.to_crs("EPSG:4326")
然后你可以使用GeoPandas的intersects方法来找到包含你的点的多边形的索引。
例如纽约市:
from shapely.geometry import Point
NY_pnt = Point(40.712784, -74.005941)
world[["ID","NAME"]][world.intersects(NY_pnt)]
这导致:
ID NAME
20 13501 NEW YORK INDEPENDENT SYSTEM OPERATOR
您可以使用 shapely within 方法检查结果:
NY_pnt.within(world["geometry"][20])
如果有多个点,可以创建一个GeoDataFrame并使用sjoin方法:
NY_pnt = Point(40.712784, -74.005941)
LA_pnt = Point(34.052235, -118.243683)
points_df = gpd.GeoDataFrame({'geometry': [NY_pnt, LA_pnt]}, crs='EPSG:4326')
results = gpd.sjoin(points_df, world, op='within')
results[['ID', 'NAME']]
输出:
ID NAME
0 13501 NEW YORK INDEPENDENT SYSTEM OPERATOR
1 11208 LOS ANGELES DEPARTMENT OF WATER AND POWER