다각형으로 표시된 Solar Photovolatic 패널을 만드는 기능이 있습니다. 기본적으로 사용자가 다음 매개 변수를 지정할 수있는 사각형 격자를 만듭니다.
- 길이
- 폭
- 수평 거리
- 수직 거리
이 코드는 FeatureGridCreator 플러그인을 기반으로 하지만 다각형 측면에만 초점을 맞 춥니 다. 특히 큰 치수 (예 : 10m 길이 및 너비, 10m 수평 및 수직 거리)의 다각형을 만들 때 가장 효과적입니다.
그러나 나는 몇 가지 문제를 발견했다.
길이와 너비 모두 2m 미만의 치수에 다각형을 지정하면 다각형이 만들어지지 않습니다.
치수가 다른 다각형 (예 : 5m 길이 및 7m 너비)을 지정할 때 치수 측정 도구로 측정 할 때 치수가 동일하지 않았습니다 . 이들 치수에 대하여, 길이 및 폭은 각각 4m 및 6m 인 것으로 나타났다.
투영과 레이어에 모두 사용되는 CRS는 EPSG : 27700 이지만 이것이 문제가 될 것이라고 생각하지는 않았습니다.
그렇다면이 문제를 일으키는 원인이 무엇인지 아는 사람이 있습니까? 또한 코드를 개선하거나 더 나은 대안으로 대체 할 수있는 방법에 대한 제안에도 열려 있습니다.
다음은 Python 콘솔 에서 재생할 수있는 코드입니다 . 함수를 실행하기 전에 관련 CRS를 사용하여 다각형 레이어를 선택해야합니다.
from PyQt4.QtCore import QVariant
from math import ceil
def generate_pv_panels(length, width, distance_x, distance_y):
# Define layer properties
layer = iface.activeLayer()
crs = layer.crs()
memory_lyr = QgsVectorLayer("Polygon?crs=epsg:" + unicode(crs.postgisSrid()) + "&index=yes", "PV panels for " + str(layer.name()), "memory")
QgsMapLayerRegistry.instance().addMapLayer(memory_lyr)
memory_lyr.startEditing()
provider = memory_lyr.dataProvider()
provider.addAttributes([QgsField("ID", QVariant.Int)])
fid = 0
start_x = 0
start_y = 0
# Ensure polygons are not created 'within each other'
if distance_x < (length / 1000):
distance_x = (length / 1000)
if distance_y < (width / 1000):
distance_y = (width / 1000)
fts = []
for f in layer.getFeatures():
fid += 1
bbox = f.geometry().boundingBox()
start_x = bbox.xMinimum() + float(distance_x / 2)
start_y = bbox.yMinimum() + float(distance_y / 2)
for row in range(0, int(ceil(bbox.height() / distance_y))):
for column in range(0, int(ceil(bbox.width() / distance_x))):
fet = QgsFeature()
geom_type = pv_panel_size(length, width, start_x, start_y)
if f.geometry().contains(geom_type):
fet.setGeometry(geom_type)
fet.setAttributes([fid])
fts.append(fet)
start_x += distance_x + (length / 1000)
start_x = bbox.xMinimum() + float(distance_x / 2)
start_y += distance_y + (width / 1000)
provider.addFeatures(fts)
memory_lyr.updateFields()
memory_lyr.commitChanges()
def pv_panel_size(length, width, x, y):
# Length & width measured in mm; x & y measured in m
l = length / 2000
w = width / 2000
return QgsGeometry.fromRect(QgsRectangle(x - l, y - w, x + l, y + w))
generate_pv_panels(10000, 10000, 100, 100)