কিউজিসে ভেরোনাই বহুভুজ তৈরির গর্ত / সীমাবদ্ধতা বিবেচনা করছেন?


12

আমি কিউজিআইএস-এ ভোরোনাই বহুভুজগুলি তৈরি করার চেষ্টা করছি যা সাধারণ ডোমেনে "গর্ত" বিবেচনা করবে। একটি উদাহরণ হবে:

এখানে চিত্র বর্ণনা লিখুন

আমি প্রকৃতপক্ষে জিআরএস কমান্ডের মাধ্যমে কিউজিআইএস ব্যবহার করে এই চিত্রটিতে ভোরোনোইস তৈরি করেছি, তারপরে গর্তগুলি তৈরি করতে "পার্থক্য" সরঞ্জামটি ব্যবহার করে। একটি পৃথক বহুভুজ আকৃতি, যা গর্তের এক্সটেন্টস ধারণ করে, "পার্থক্য" স্তর হিসাবে ব্যবহৃত হয়েছিল। উদাহরণস্বরূপ অ্যাপ্লিকেশনটি স্যাম্পলিং পয়েন্টগুলির চারপাশে বহুভুজ তৈরি করবে যা বিশ্লেষণ থেকে বাদ দেওয়া উচিত এমন কাঠামোর মধ্যে সংগ্রহ করা হয়েছিল।

এখানে দুটি সমস্যা দেখা দেয়:

  1. "পার্থক্য" ফাংশনটি 100% সঠিকভাবে কাজ করতে দেখা যায় না, কিছু বহুভুজ সীমানা "গর্তগুলিতে" প্রসারিত করে। এটি অ্যাট্রিবিউট টেবিলের সারি সন্ধান করে স্থির করা যেতে পারে যার একটি বহুভুজ আইডি নম্বর নেই (বা "0" এর ID)।

  2. এই ধরণের সত্যের পরে "ছিদ্র-পাঞ্চিং" এর ফলে বিচ্ছিন্ন বহুভুজ দেখা দিতে পারে, যেমনটি চিত্রের লাল তীর দ্বারা দেখানো হয়েছে।

আমার প্রশ্নটি হ'ল: এমন কোনও ভোরোনাই সরঞ্জাম বা প্লাগইন রয়েছে যা ডোমেনের কেন্দ্রে "গর্ত" উপস্থিতিটিকে এক-পদক্ষেপ প্রক্রিয়া হিসাবে বিবেচনা করতে এবং বিচ্ছিন্ন বহুভুজগুলির প্রজন্মকে দূর করতে পারে? আমি কল্পনা করি যে এই জাতীয় সরঞ্জামটি একটি বহুগুণ সীমানাটি অন্য সীমানাটির সাথে নিকটতম চৌরাস্তা পর্যন্ত প্রসারিত করবে, যদি না অন্য সীমানা প্রথমে "গর্ত" সীমানার বিপরীতে থাকে।


এটি এর অনুরূপ তবে আরকজিআইএসে এনভায়রনমেন্ট মাস্ক ব্যবহার করার বিপরীতে (আমার মনে হয়) । এটি আপনাকে তৈরি করা বহুভুজকে নির্দিষ্ট গণ্ডির মধ্যে সীমাবদ্ধ রাখতে দেয়। তবে আমি এমন কোনও সরঞ্জাম সম্পর্কে অবগত নই যা জটিল সীমানা / গর্তগুলি ব্যবহার করে (যদিও আর্কজিআইএস এ মুখোশটি জটিল হতে পারে - আমি এটি পরীক্ষা করেছি না এবং সময় পেলে পরে চেষ্টা করে দেখতে পারি))
ক্রিস ডব্লিউ

আমি আর্কজিআইএস তত্ত্ব পরীক্ষা করেছি এবং এটি কার্যকর হবে না। লিঙ্কিত প্রশ্ন অনুযায়ী, আপনি ফলাফলগুলি বাইরের আকারে সীমাবদ্ধ করতে পারেন। যাইহোক, আকারে একটি গর্ত কাটা ফলাফল polys দ্বারা উপেক্ষা করা হয়। তদুপরি, যদি সেই গর্তটিতে এর কিছু পয়েন্ট থাকে তবে সরঞ্জামটি ত্রুটিযুক্ত হয়ে যায় এবং চালাতে ব্যর্থ হয়। আমি আপনার প্রথম সমস্যাটি পার্থক্য সহ ব্যাখ্যা করতে পারছি না, তবে দ্বিতীয়টি স্লাইভারগুলির ফলে সম্পূর্ণ অপ্রত্যাশিত নয় - সর্বোপরি, গর্তটি উপস্থিত থাকলেও সেই অঞ্চলটি একই পয়েন্টে বরাদ্দ করা হবে। আপনি সেই পদ্ধতিটি ব্যবহার করতে পারেন এবং তারপরে একটি ক্লিনআপ পদ্ধতিতে স্লাইভারগুলি তাদের প্রতিবেশীদের মধ্যে অন্তর্ভুক্ত করতে পারেন।
ক্রিস ডাব্লু

2
রাস্টারে গিয়ে আপনি সম্ভবত এটি সমাধান করতে পারেন। একটি রাস্টার মুখোশের সাহায্যে, ইউক্লিডিয়ান দূরত্ব আপনার পয়েন্টগুলি থেকে অতিক্রম করবে যতক্ষণ না এটি অন্য বিন্দু থেকে বেরিয়ে আসা কোষগুলিতে আঘাত করে বা আপনার মাস্ক রেস্টার (আপনার সীমানা স্ল্যামের বিবরণ) hit তারপরে আপনি বহু অঞ্চলগুলি পরিষ্কার করার জন্য ফলাফলটি ভেক্টরাইজ করুন।
ক্রিস ডাব্লু

1
আমি ভেরোনাই জ্যামিতিটি v.clean চালিয়ে বৈধ কিনা তা নিশ্চিত করে জ্যামিতিটি পরীক্ষা করবো। শেষ পর্যন্ত গর্ত তৈরি করতে পার্থক্যটি কার্যকর করুন।
ক্লিভিস

এই গর্ত সম্পর্কে ভোরোনয় কী? আপনি কি পরিষ্কারভাবে গর্তগুলি ঘুষি মারতে চান না? কোনও বহুভুজ স্তর কেন করবে না?
mdsumner

উত্তর:


3

এটি সম্ভবত রাস্টারদের ব্যবহার করে সম্ভব হতে পারে। প্রথমে আপনার পয়েন্ট এবং সীমানা বহুভুজগুলিকে একটি উচ্চ রেজোলিউশন রাস্টার হিসাবে রূপান্তর করুন। আপনার সীমানা ব্যবহার করে একটি মুখোশ সেট করুন r.mask। তারপরে, r.grow.distanceগ্রাসে চালান এবং এটি ব্যবহার করুন Value= output। এটি আপনাকে প্রতিটি পিক্সেলের জন্য দেয় যা নিকটতম পয়েন্ট। এটিকে ভেক্টর বহুভুজগুলিতে রূপান্তর করুন। স্লিভার বহুভুজগুলি থেকে মুক্তি পেতে অতিরিক্ত পদক্ষেপের প্রয়োজন থাকতে পারে।


2

এটি অবশ্যই রেস্টারদের দ্বারা সম্ভব।

এই স্ক্রিনশটটি আশাবাদী বিষয়টি আরও স্পষ্টভাবে দেখায়। ভোরোনাইয়ের বি অংশটি 'কাকটি উড়ে যাওয়ার সাথে সাথে' মূল ভারোণোই কেন্দ্রে খুব কাছাকাছি রয়েছে, তবে এই ভবনের চারদিকে হাঁটতে আরও বেশি সময় লাগবে এই বিষয়টি বিবেচনায় নেই। ওপি-র প্রশ্নের আমার বোঝার বিষয়টি হ'ল ভোরোনাইকে ভবনের চারদিকে হাঁটার জন্য এই অতিরিক্ত দূরত্বটি বিবেচনায় নেওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন

আমি @ গুইলুমের পরামর্শটি পছন্দ করি। যাইহোক, আমি যখন চেষ্টা করেছিলাম r.grow.distanceতখন মুখোশটিকে সম্মান জানাতে সমস্যা হয়েছিল (নীচে দেখুন The রিপলগুলি বিল্ডিংগুলির মধ্য দিয়ে যেতে হবে না)।

আমার গ্রাস জ্ঞান এতটা শক্তিশালী নয়, তাই আমি বোকা কিছু করছি। অবশ্যই, পরামর্শটি আগে যাচাই করে নিন কারণ এটি আমার থেকে অনেক কম কাজ হবে ;-)

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 1 - একটি ব্যয় পৃষ্ঠ তৈরি করুন

প্রথম পদক্ষেপটি ব্যয় পৃষ্ঠ তৈরি করা হয়। এটি কেবল একবার করা দরকার।

  • একটি সম্পাদনযোগ্য স্তর, গর্ত এবং সমস্ত তৈরি করুন।
  • 'ইউনিট' নামে একটি ক্ষেত্র যুক্ত করুন, এটি 1 এ সেট করুন।
  • ফিল্ড 'ইউনিট' ব্যবহার করে আপনার "পাঞ্চ আউট" ভেক্টর লেয়ারে (একটিতে যা ছিদ্র রয়েছে) বহুভিত্তিক থেকে রাস্টার ব্যবহার করে। আপনার এখন একটি স্তর "মুখোশ" রয়েছে, যেখানে 1 খালি জায়গা এবং 0 টি নির্মাণ করছে।
  • এটিকে ব্যয় পৃষ্ঠে পরিণত করতে রাস্টার ক্যালকুলেটর ব্যবহার করুন। আমি 'বাইরের বাইরে' 1 এবং 'বাড়ির ভিতরে' 9999 এ সেট করব buildings এটি বিল্ডিংগুলির মধ্য দিয়ে চলাচলকে নিষিদ্ধভাবে কঠিন করে তুলবে।

    (( "মাস্ক @ 1" = 1) * 1) + (( "মাস্ক @ 1" = 0) * 9999)

ব্যয় পৃষ্ঠের উপর কিছুটা আওয়াজ যোগ করে আপনি আরও 'জৈব' ফলাফল পেতে পারেন (যেমন আউটডোর পিক্সিয়ালের জন্য 1 এর চেয়ে 1 থেকে 3 পর্যন্ত এলোমেলো সংখ্যা ব্যবহার করুন))

পদক্ষেপ 2. প্রতিটি ভোরোনাই কেন্দ্রের জন্য ক্রমবর্ধমান খরচের রাস্টার তৈরি করুন

এখন আমরা চালাতে পারি (একবারে একটি ভোরোনাই সেলের জন্য) r.cost.coordinatesআমাদের ব্যয় পৃষ্ঠের স্তরের বিপরীতে গ্রাআরএসএস অ্যালগরিদম ।

সূচনা সমন্বয়ের জন্য, ভার্নোই কেন্দ্রটি ব্যবহার করুন। শেষ স্থানাঙ্কের জন্য, আপনার অঞ্চলের কোণগুলির একটি বেছে নিন। আমি 'নাইট ট্যুর' ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি মসৃণ ফলাফল দেয়।

ফলাফলটি একটি ভোরোনাই কেন্দ্র থেকে সমান ভ্রমণের সময়ের রেখাগুলি দেখায়। কীভাবে ব্যান্ডগুলি বিল্ডিংয়ের চারপাশে মোড়ানো রয়েছে তা নোট করুন।

এখানে চিত্র বর্ণনা লিখুন

এটি কীভাবে সেরা তা স্বয়ংক্রিয় তা নিশ্চিত না Not হতে পারে ব্যাচ মোড প্রক্রিয়াজাতকরণ, বা পাইকগিসে সম্পন্ন।

পদক্ষেপ 3. রাস্টারদের নিচে মার্জ করুন

এটি সম্ভবত কোড প্রয়োজন হবে। অ্যালগরিদম হবে

create a raster 'A' to match the size of your cumulative cost images
fill raster 'A' with a suitably high number e.g. 9999
create an array of the same size as the raster.
for each cumulative cost raster number 1..N
    for each cell in image
        if cell < value in raster 'A'
            set value in raster 'A' to cell value
            set corresponding cell in array to cum. cost image number
write out array as a raster

এই পদ্ধতির কোনও রাস্টার ফলন করা উচিত যেখানে প্রতিটি ঘরটি তার নিকটতম ভোরোনাই কেন্দ্র দ্বারা শ্রেণীবদ্ধ করা হয়, অ্যাকাউন্টের প্রতিবন্ধকতাগুলি গ্রহণ করে।

এরপরে আপনি রাস্টার-টু-বহুভুজ ব্যবহার করতে পারেন। এর পরে আপনি রাস্টার থেকে "পদক্ষেপ" প্রভাব শিল্পকর্মগুলি সরাতে জেনারেলাইজ প্লাগইন ব্যবহার করতে পারেন।

2 এবং 3 ধাপে অস্পষ্টতার জন্য ক্ষমা চাই ... আমি প্রত্যাশা করছি যে আরও চমকপ্রদ সমাধানের জন্য কেউ চিমি দিয়েছে :)


1
ধন্যবাদ স্টিভেন, আমার কাছে একটি গ্রাস গ্রাষ্ট রাস্টার কাজ রয়েছে তবে অনুগ্রহের বর্ণনায় বর্ণিত হিসাবে আমি আরও মার্জিত সমাধানের আশা করছিলাম।
আন্ডার ডার্ক

0

নোট # 1 : আমি প্রস্তাবিত ইস্যুটি পুনরুত্পাদন করতে সক্ষম হইনি কারণ ডিফারেন্স সরঞ্জামটি আমার জন্য সম্পাদিত বেশ কয়েকটি পরীক্ষায় আমার পক্ষে ভালভাবে কাজ করেছিল (সম্ভবত এটি সমস্যাটির সরল জ্যামিতির কারণে হয়েছে বা কারণ সমস্যাটি হয়েছে প্রশ্নটি থেকেই সরঞ্জামটির উন্নতি হয়েছে জিজ্ঞাসা 1 বছর আগে)।

তবে, পার্থক্য সরঞ্জামটি ব্যবহার এড়াতে আমি পাইকিজিআইএস-এ একটি কাজের প্রস্তাব করছি prop দুটি ইনপুট স্তর (স্থানীয় চিত্র দেখুন নীচে) এর মধ্যে স্থানীয় ছেদ উপর ভিত্তি করে সবকিছু:

  1. ভেরোনাই বহুভুজকে উপস্থাপন করে একটি বহুভুজ ভেক্টর স্তর;
  2. একটি বহুভুজ ভেক্টর স্তর যা গর্ত / সীমাবদ্ধতাগুলি উপস্থাপন করে যা বিশ্লেষণ থেকে বাদ দেওয়া দরকার।

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য # 2 : যেহেতু আমি পার্থক্যটি সরঞ্জামটি ব্যবহার করতে চাই না , তাই আমি "স্লাইভার" তৈরি করতে এড়াতে পারছি না (তারপরে দেখুন), সুতরাং v.cleanসেগুলি অপসারণ করার জন্য আমার সরঞ্জামটি চালানো দরকার । অধিকন্তু, যেমন ক্রিস ডব্লিউ বলেছেন,

[...] তবে স্লাইভারগুলির ফলে দ্বিতীয়টি সম্পূর্ণ অপ্রত্যাশিত নয় - সর্বোপরি, গর্তটি উপস্থিত থাকলেও সেই অঞ্চলটি একই পয়েন্টে বরাদ্দ করা হবে। আপনি সেই পদ্ধতিটি ব্যবহার করতে পারেন এবং তারপরে একটি ক্লিনআপ পদ্ধতিতে স্লাইভারগুলি তাদের প্রতিবেশীদের মধ্যে অন্তর্ভুক্ত করতে পারেন ।

এই প্রয়োজনীয় প্রাঙ্গণ পরে, আমি আমার কোড পোস্ট:

##Voronoi_Polygons=vector polygon
##Constraints=vector polygon
##Voronoi_Cleaned=output vector

from qgis.core import *

voronoi = processing.getObject(Voronoi_Polygons)
crs = voronoi.crs().toWkt()
ex = voronoi.extent()
extent = '%f,%f,%f,%f' % (ex.xMinimum(), ex.xMaximum(), ex.yMinimum(), ex.yMaximum())

constraints = processing.getObject(Constraints)

# Create the output layer
voronoi_mod = QgsVectorLayer('Polygon?crs='+ crs, 'voronoi' , 'memory')
prov = voronoi_mod.dataProvider()
fields = voronoi.pendingFields() # Fields from the input layer
prov.addAttributes(fields) # Add input layer fields to the outLayer
voronoi_mod.updateFields()

# Spatial index containing all the 'constraints'
index_builds = QgsSpatialIndex()
for feat in constraints.getFeatures():
    index_builds.insertFeature(feat)

final_geoms = {}
final_attrs = {}

for feat in voronoi.getFeatures():
    input_geom = feat.geometry()
    input_attrs = feat.attributes()
    final_geom = []
    multi_geom = input_geom.asPolygon()
    input_geoms = [] # edges of the input geometry
    for k in multi_geom:
        input_geoms.extend(k)
    final_geom.append(input_geoms)
    idsList = index_builds.intersects(input_geom.boundingBox())
    mid_geom = [] # edges of the holes/constraints
    if len(idsList) > 0:
        req = QgsFeatureRequest().setFilterFids(idsList)
        for ft in constraints.getFeatures(req):
            geom = ft.geometry()
            hole = []
            res = geom.intersection(input_geom)
            res_geom = res.asPolygon()
            for i in res_geom:
                hole.extend(i)
                mid_geom.append(hole)
        final_geom.extend(mid_geom)
    final_geoms[feat.id()] = final_geom
    final_attrs[feat.id()] = input_attrs

# Add the features to the output layer
outGeom = QgsFeature()
for key, value in final_geoms.iteritems():
    outGeom.setGeometry(QgsGeometry.fromPolygon(value))
    outGeom.setAttributes(final_attrs[key])
    prov.addFeatures([outGeom])

# Add 'voronoi_mod' to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(voronoi_mod)

# Run 'v.clean'
processing.runalg("grass7:v.clean",voronoi_mod, 2, 0.1, extent, -1, 0.0001, Voronoi_Cleaned, None)

# Remove 'voronoi_mod' to the Layers panel
QgsMapLayerRegistry.instance().removeMapLayer(voronoi_mod)

যা এই ফলাফলের দিকে নিয়ে যায়:

এখানে চিত্র বর্ণনা লিখুন

কেবল পরিষ্কার করার জন্য, v.cleanসরঞ্জামটি ব্যবহার না করেই এটি ফলাফল হবে :

এখানে চিত্র বর্ণনা লিখুন

@ লিনিংক্যাকটাসের ফলাফলের সাথে পার্থক্যটি হ'ল, এখন পর্যন্ত জ্যামিতিগুলি ভাঙা হয়নি এবং এগুলি ত্রুটি ছাড়াই "পরিষ্কার" করা যেতে পারে


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

দুঃখিত, আমি বুঝতে পারি না: ফলাফলগুলিতে আপনি কোনও ত্রুটি পেয়েছেন? আমি কেবলমাত্র সেই ক্ষেত্রে কোডগুলি পরীক্ষা করেছিলাম যেখানে বহুভুজ প্রশ্নে প্রস্তাবিতগুলির অনুরূপ ছিল।
এমগ্রি

দুর্ভাগ্যক্রমে এখনই কোডটি পরীক্ষা করা যায় না, তবে আপনি কি i.stack.imgur.com/Jpfra.png স্কেচ করা গর্তের পরিবর্তনের সাথে প্রাপ্ত ফলাফলগুলি দেখাতে পারেন ?
আন্ডার ডার্ক

যদি আমি ডান দিকে বৈশিষ্ট্য বাধ্যতা আপ প্রসারিত, আমি প্রাপ্ত এই । পরিবর্তে, আমি যদি সরাসরি বাধ্যতা সরানো, আমি প্রাপ্ত এই
মিগ্রি

আমার অঙ্কনের লাল তীরটি যে ছোট ত্রিভুজটির দিকে ইঙ্গিত করে তা হল। এটি সেখানে থাকা উচিত নয় তবে এটি আপনার ফলাফলগুলিতেও রয়েছে। দেখে মনে হচ্ছে এই পদ্ধতির ফলে প্রশ্নের # 1 সমস্যার সমাধান হয় তবে # 2 টি সমাধান করা যায় না।
underdark
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.