如何判断一个点是否在一个多边形的一定半径内使用大地地形?



我有两个文件(.shp):第一个包含城市作为多边形,第二个包含公园作为点。我必须找出在给定距离内有多少个公园。我正在考虑使用缓冲区将多边形的面积扩展到距离,然后遍历多边形并检查哪个公园(点)在这个区域。请问我该怎么做呢?

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, Point
cities_shape = gpd.read_file('geo_cities_f.shp')
parks_shape = gpd.read_file('geo_parks_f.shp')
fig, ax = plt.subplots(figsize=(14,14))
cities_shape.buffer(0.002).plot(ax = ax, color='blue', edgecolor='black')
parks_shape.plot(ax = ax, color='red', edgecolor='black')
cities_shape['geometry'].buffer(0.0004).plot(figsize=(14,14))
**parks(points)**
SRID    geometry
0   SRID=4326   POINT (34.79473 32.07580)
1   SRID=4326   POINT (34.80149 32.12502)
2   SRID=4326   POINT (34.76660 32.07581)
3   SRID=4326   POINT (34.78834 32.06583)
4   SRID=4326   POINT (34.78338 32.06643)
**polygons**
SRID    geometry
0   SRID=4326   POLYGON ((34.80707 32.05355, 34.80704 32.05350...
1   SRID=4326   POLYGON ((34.80707 32.05355, 34.80704 32.05350...
2   SRID=4326   POLYGON ((34.80712 32.05342, 34.80713 32.05341...
3   SRID=4326   POLYGON ((34.80712 32.05342, 34.80713 32.05341...
4   SRID=4326   POLYGON ((34.80712 32.05337, 34.80715 32.05336...

听起来您的数据很大,而pandas是这里的瓶颈。尝试使用dask-geopandas,它使用任务数据框而不是熊猫数据框。只要用pip install dask-geopandas安装包,然后更改

import geopandas as gpd

import dask_geopandas as gpd

您可能想尝试geopandas.sjoin_nearest()与您选择的max_distance参数。

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, Point
cities_shape = gpd.read_file('geo_cities_f.shp')
parks_shape = gpd.read_file('geo_parks_f.shp')
park_city_pairs = parks_shape.sjoin_nearest(cities_shape, max_distance=1) #whatever distance you choose
number_of_parks = len(park_city_pairs['park_id'].drop_duplicates())

我假设你的geo_parks_f.shp有一个标识符列为每个公园像park_id

你说你的方法太慢了。缓冲后,如何检查多边形内是否有一个点?为了提高性能,您应该使用空间树来完成这部分,而不是在每个几何图形上循环。缓冲后,使用geopanda的intersect空间连接或使用shape手动构建树。

最新更新