মিমি ইউনিটগুলিতে ধারাবাহিকভাবে মাত্রিক বহুভুজ তৈরি করছেন?


11

আমার একটি ফাংশন রয়েছে যা বহুভুজ হিসাবে প্রতিনিধিত্ব করে সৌর ফটোভোল্যাটিক প্যানেল তৈরি করে। মূলত, এটি একটি আয়তক্ষেত্রাকার গ্রিড তৈরি করে যেখানে ব্যবহারকারী নিম্নলিখিত পরামিতিগুলি নির্দিষ্ট করতে পারেন:

  • লম্বা
  • প্রস্থ
  • অনুভূমিক দূরত্ব
  • উল্লম্ব দূরত্ব

কোডটি ফিচারগ্রিডক্রিটর প্লাগইন ভিত্তিক কিন্তু কেবল বহুভুজ দিকের উপর দৃষ্টি নিবদ্ধ করে। এটি বেশিরভাগ অংশের জন্য ভাল কাজ করে, বিশেষত যখন বড় মাত্রা (যেমন 10 মিটার দৈর্ঘ্য এবং প্রস্থ; 10 মি অনুভূমিক এবং উল্লম্ব দূরত্ব) সহ বহুভুজ তৈরি করার সময়।

তবে আমি কয়েকটি বিষয় লক্ষ্য করেছি:

  1. দৈর্ঘ্য এবং প্রস্থ উভয়ের জন্য 2 মি এর চেয়ে কম মাত্রার জন্য বহুভুজ নির্দিষ্ট করার সময়, কোনও বহুভুজ তৈরি করা হয়নি।

  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)

উত্তর:


11

আপনার অ্যালগরিদমটি বোধগম্য হয়, তবে মনে হয় আপনার সমস্যাটি একটি গোলাকার ত্রুটির কারণে হয়েছে যখন আপনি 2000 দ্বারা বিভাজক করেন (পূর্ণসংখ্যার দ্বারা ভাগ করুন, যা ব্যাখ্যা করে যে দুটি চেয়ে কম সংখ্যক কেন 0 দেয়, এবং সমস্ত দূরত্ব এমনকি মানকেও গোল করে)

আপনার ভাসা বিভাগের সাথে পূর্ণসংখ্যা বিভাগটি পরিবর্তন করা উচিত

l = length / 2000

হতে হবে

l = length / 2000. # the . makes sure that you divide by a decimal value

অথবা

l = float(length) / 2000

নোট করুন যে এটি আপনাকে ফর্মের মাধ্যমে প্রবেশের সঠিক মাত্রা দেয় তবে আপনি যদি পছন্দ করেন তবে আপনার পার্সেলগুলির আকার এক মিটারে গোল করার সিদ্ধান্ত নিতে পারেন:

l = float(length/1000) / 2

মনে রাখবেন যে আপনার সূচনা স্থানাঙ্কগুলিতেও রাউন্ডিংটি পরীক্ষা করা উচিত, তবে আমি জানি না যে এই রাউন্ডিংটি উদ্দেশ্যমূলক ছিল কিনা।

start_x = bbox.xMinimum() + float(distance_x) / 2

আমি মনে করি এটি আমার উল্লিখিত সমস্যাগুলি সমাধান করেছে (হাস্যকরভাবে, আমি কিছু নতুন সমস্যা ঘটতে দেখেছি তবে তারা সমাধান হয়েছে বলে মনে করেন)। এটি আরও পরীক্ষা চালিয়ে যাওয়া এবং ফিরে রিপোর্ট করা হবে। অনেক ধন্যবাদ :)
জোসেফ

হ্যাঁ, আমি বিশ্বাস করি আপনার সমাধান কার্যকর হয়েছে। আপনাকে আবার ধন্যবাদ;)
জোসেফ

3

@Radouxju কে ধন্যবাদ , এখানে একটি চূড়ান্ত কোড যা অনুভূমিক এবং উল্লম্ব দূরতাকে শূন্য বলে মনে করে:

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)])
    # Define variables
    fid = 0
    start_x = 0
    start_y = 0
    state_x = False
    state_y = False
    # Ensure polygons are not created 'within each other' if distance is zero;
    # Instead they will align on the bounding box
    if distance_x == 0:
        distance_x = (length / 1000)
        state_x = True
    if distance_y == 0:
        distance_y = (width / 1000)
        state_y = True
    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)
                if state_x == False:
                    start_x += distance_x + (length / 1000)
                else:
                    start_x += distance_x
            start_x = bbox.xMinimum() + float(distance_x / 2)
            if state_y == False:
                start_y += distance_y + (width / 1000)
            else:
                start_y += distance_y
    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 = float(length) / 2000
    w = float(width) / 2000
    return QgsGeometry.fromRect(QgsRectangle(x - l, y - w, x + l, y + w))

  • ব্যবহার generate_pv_panels(5500, 5000, 20, 1):

    দৃশ্যপট 1


  • ব্যবহার generate_pv_panels(5500, 5000, 20, 0):

    দৃশ্য 2

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.