আমার একটি ফাংশন রয়েছে যা বহুভুজ হিসাবে প্রতিনিধিত্ব করে সৌর ফটোভোল্যাটিক প্যানেল তৈরি করে। মূলত, এটি একটি আয়তক্ষেত্রাকার গ্রিড তৈরি করে যেখানে ব্যবহারকারী নিম্নলিখিত পরামিতিগুলি নির্দিষ্ট করতে পারেন:
- লম্বা
- প্রস্থ
- অনুভূমিক দূরত্ব
- উল্লম্ব দূরত্ব
কোডটি ফিচারগ্রিডক্রিটর প্লাগইন ভিত্তিক কিন্তু কেবল বহুভুজ দিকের উপর দৃষ্টি নিবদ্ধ করে। এটি বেশিরভাগ অংশের জন্য ভাল কাজ করে, বিশেষত যখন বড় মাত্রা (যেমন 10 মিটার দৈর্ঘ্য এবং প্রস্থ; 10 মি অনুভূমিক এবং উল্লম্ব দূরত্ব) সহ বহুভুজ তৈরি করার সময়।
তবে আমি কয়েকটি বিষয় লক্ষ্য করেছি:
দৈর্ঘ্য এবং প্রস্থ উভয়ের জন্য 2 মি এর চেয়ে কম মাত্রার জন্য বহুভুজ নির্দিষ্ট করার সময়, কোনও বহুভুজ তৈরি করা হয়নি।
বিভক্ত মাত্রা (যেমন 5 মি দৈর্ঘ্য এবং 7 মি প্রস্থ) সহ বহুভুজগুলি নির্দিষ্ট করার সময় পরিমাপ লাইন সরঞ্জামটি পরিমাপ করার সময় মাত্রাগুলি এক নয় । এই মাত্রার জন্য দৈর্ঘ্য এবং প্রস্থ যথাক্রমে 4 মিটার এবং 6 মিটার হিসাবে দেখানো হয়েছিল।
প্রক্ষেপণ এবং স্তর উভয়ের জন্য ব্যবহৃত সিআরএস হ'ল ইপিএসজি: 27700 যদিও আমি ভাবিনি যে এটি একটি সমস্যা হবে।
সুতরাং কারও কি ধারণা আছে যে এই সমস্যাগুলির কারণ হতে পারে? কোডটি কীভাবে উন্নত করা যায় বা আরও ভাল বিকল্পের সাথে প্রতিস্থাপন করা যায় সে সম্পর্কেও আমি পরামর্শের জন্য উন্মুক্ত।
পাইথন কনসোলে পুনরুত্পাদন করা যেতে পারে এমন কোডটি এখানে , ফাংশনটি চালানোর আগে একটি বহুভুজ স্তর অবশ্যই সম্পর্কিত সিআরএসের সাথে নির্বাচন করা উচিত:
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)