生成落在多边形或形状内的点网格的最快方法?

问题描述

我在 python 中使用 shapely 并试图在最快的 O(n) 时间内在网格中生成均匀分布的点,这些点落在一个形状内。形状可以是任何封闭的多边形,而不仅仅是正方形或圆形。我目前的做法是:

  1. 找到最小/最大 y & x 以构建一个矩形。
  2. 根据间距参数(分辨率)构建点网格
  3. 逐一验证点是否落在形状内。

有没有更快的方法来做到这一点?

# 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)])

example shape and points

解决方法

我看到您回答了您的问题(并且似乎对使用交集很满意)但也注意到 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)))