Tôi có một chức năng tạo ra Tua bin gió được biểu thị như các điểm. Về cơ bản, nó sử dụng mã từ các điểm Ngẫu nhiên bên trong công cụ đa giác (cố định) mặc dù có một số thay đổi nhỏ.
Mục tiêu là tạo các điểm ngẫu nhiên bên trong đa giác có tính đến khoảng cách tối thiểu được chỉ định. Điều này hoạt động rất tốt đặc biệt là với các đa giác không gần với một đa giác khác (ví dụ: một đa giác đơn):
Tuy nhiên, nếu đa giác gần hoặc liền kề với đa giác khác (ví dụ như được hiển thị bên dưới), các điểm từ mỗi đa giác có thể nằm trong khoảng cách tối thiểu như được hiển thị màu đỏ:
Làm cách nào tôi có thể thay đổi mã để các điểm đó có màu đỏ không gần với điểm khác từ đa giác gần đó?
Lý tưởng nhất, tôi muốn nhiều điểm được thay thế bằng một điểm duy nhất:
Đây là mã có thể được sao chép trong Bảng điều khiển Python , một lớp đa giác phải được chọn với CRS có liên quan trước khi chạy chức năng:
import random
from PyQt4.QtCore import QVariant
def checkMinDistance(point, index, distance, points):
if distance == 0:
return True
neighbors = index.nearestNeighbor(point, 1)
if len(neighbors) == 0:
return True
if neighbors[0] in points:
np = points[neighbors[0]]
if np.sqrDist(point) < (distance * distance):
return False
return True
def generate_wind_turbines(spacing):
layer = iface.activeLayer()
crs = layer.crs()
# Memory layer
memory_lyr = QgsVectorLayer("Point?crs=epsg:" + unicode(crs.postgisSrid()) + "&index=yes", "Wind turbines for " + str(layer.name()), "memory")
QgsMapLayerRegistry.instance().addMapLayer(memory_lyr)
memory_lyr.startEditing()
provider = memory_lyr.dataProvider()
provider.addAttributes([QgsField("ID", QVariant.Int)])
# Variables
point_density = 0.0001
fid = 1
distance_area = QgsDistanceArea()
# List of features
fts = []
# Create points
for f in layer.getFeatures():
fGeom = QgsGeometry(f.geometry())
bbox = fGeom.boundingBox()
pointCount = int(round(point_density * distance_area.measure(fGeom)))
index = QgsSpatialIndex()
points = dict()
nPoints = 0
fid += 1
nIterations = 0
maxIterations = pointCount * 200
random.seed()
while nIterations < maxIterations and nPoints < pointCount:
rx = bbox.xMinimum() + bbox.width() * random.random()
ry = bbox.yMinimum() + bbox.height() * random.random()
pnt = QgsPoint(rx, ry)
geom = QgsGeometry.fromPoint(pnt)
if geom.within(fGeom) and checkMinDistance(pnt, index, spacing, points):
f = QgsFeature(nPoints)
f.setAttributes([fid])
f.setGeometry(geom)
fts.append(f)
index.insertFeature(f)
points[nPoints] = pnt
nPoints += 1
nIterations += 1
provider.addFeatures(fts)
memory_lyr.updateFields()
memory_lyr.commitChanges()
generate_wind_turbines(500)
Biên tập:
Hòa tan và / hoặc chuyển đổi các đa giác thành đơn lẻ dường như không giúp được gì nhiều vì các điểm được tạo dường như vẫn nằm trong khoảng cách tối thiểu.
Đã thử nghiệm trên QGIS 2.18.3 .