Çokgen olarak temsil edilen Solar Fotovolatic panelleri oluşturan bir fonksiyonum var. Temel olarak, kullanıcının aşağıdaki parametreleri belirtebileceği dikdörtgen bir ızgara oluşturur:
- uzunluk
- Genişlik
- Yatay mesafe
- Dikey mesafe
Kod, FeatureGridCreator eklentisine dayanır, ancak yalnızca çokgen yönüne odaklanır. Özellikle büyük boyutlarda (örneğin 10m uzunluk ve genişlik; 10m yatay ve dikey mesafeler) çokgenler oluştururken çoğunlukla iyi çalışır.
Ama birkaç konuyu fark ettim:
Hem uzunluk hem de genişlik için 2 metreden küçük boyutlar için çokgenler belirtilirken, çokgen oluşturulmaz.
Farklı boyutlara (örneğin 5m uzunluk ve 7m genişlik) sahip çokgenler belirtilirken, Ölçüm Çizgisi aracıyla ölçüldüğünde boyutlar aynı değildi . Bu boyutlar için uzunluk ve genişliğin sırasıyla 4m ve 6m olduğu gösterilmiştir.
Hem projeksiyon hem de katman için kullanılan CRS, EPSG: 27700 olsa da bunun bir sorun olacağını düşünmezdim.
Peki bu sorunlara neyin sebep olabileceği hakkında bir fikri olan var mı? Kodun nasıl geliştirilebileceği veya daha iyi bir alternatifle nasıl değiştirilebileceği konusunda da önerilere açığım.
Python Konsolunda çoğaltılabilen kod , işlevi çalıştırmadan önce ilgili bir CRS ile bir çokgen katmanının seçilmesi gerekir:
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)