问题描述
我在 python 中使用 shapely 并试图在最快的 O(n) 时间内在网格中生成均匀分布的点,这些点落在一个形状内。形状可以是任何封闭的多边形,而不仅仅是正方形或圆形。我目前的做法是:
- 找到最小/最大 y & x 以构建一个矩形。
- 根据间距参数(分辨率)构建点网格
- 逐一验证点是否落在形状内。
有没有更快的方法来做到这一点?
# determine maximum edges
polygon = shape(geojson['features'][i]['geometry'])
latmin,lonmin,latmax,lonmax = polygon.bounds
# construct a rectangular mesh
points = []
for lat in np.arange(latmin,resolution):
for lon in np.arange(lonmin,lonmax,resolution):
points.append(Point((round(lat,4),round(lon,4))))
# validate if each point falls inside shape
valid_points.extend([i for i in points if polygon.contains(i)])
解决方法
我看到您回答了您的问题(并且似乎对使用交集很满意)但也注意到 shapely
(和底层的 geos
库)已经准备了几何体对某些谓词(contains、contains_properly、covers 和 intersects)进行更高效的批处理操作。
见Prepared geometry operations。
根据您问题中的代码改编,可以这样使用:
from shapely.prepared import prep
# determine maximum edges
polygon = shape(geojson['features'][i]['geometry'])
latmin,lonmin,latmax,lonmax = polygon.bounds
# create prepared polygon
prep_polygon = prep(polygon)
# construct a rectangular mesh
points = []
for lat in np.arange(latmin,resolution):
for lon in np.arange(lonmin,lonmax,resolution):
points.append(Point((round(lat,4),round(lon,4))))
# validate if each point falls inside shape using
# the prepared polygon
valid_points.extend(filter(prep_polygon.contains,points))
,
我认为最好的做法是:
X,Y = np.meshgrid(np.arange(latmin,resolution),np.arange(lonmin,resolution))
#create a iterable with the (x,y) coordinates
points = zip(X.flatten(),Y.flatten())
valid_points.extend([i for i in points if polygon.contains(i)])
,
哦,为什么是的。使用shapely的交集方法。
polygon = shape(geojson['features'][i]['geometry'])
latmin,lonmax = polygon.bounds
# construct rectangle of points
x,y = np.round(np.meshgrid(np.arange(latmin,resolution)),4)
points = MultiPoint(list(zip(x.flatten(),y.flatten())))
# validate each point falls inside shapes
valid_points.extend(list(points.intersection(polygon)))