python - 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 来完成这项工作,但我一直在努力争取在这方面取得进展。我得到的最接近的是 inside 和 contains 函数,但我一直在努力的工作领域是成功地将多面体转换为多边形,然后利用 inside 和 contains 的力量来获得所需的输出。
shapefile 已从此处下载。
解决方案
world.crs
给出{'init': 'epsg:3857'}
(Web 墨卡托投影),因此如果要保留点的经纬度坐标系,则应首先在 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 检查结果:
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
推荐阅读
- c++ - 有什么办法可以简化这段代码吗?
- android - Android - 这三个 xml 文件有什么区别?
- installshield - 如何使重大升级从以前的安装中获取默认目标路径
- android - 如何区分在通知中单击了哪个操作?
- ios - 如何存储关卡数据
- html - 保存重定向页面的 URL
- sql - 如何在 sqlite 中将两列添加到我的数据集中?
- php - 解析错误:语法错误,意外 '$_POST' (T_VARIABLE),期待 '
- android - 如何获得 FragmentDialog 按钮对适配器的响应?
- cypress - 在 cypress 文件夹外指定 customSnapshotsDir 时出错