কিউজিআইএস-এ একাধিক পয়েন্ট সারিবদ্ধ হচ্ছে?


11

আমি লাইন অবজেক্টগুলির আশেপাশে একটি নির্দিষ্ট সহনশীলতা বা বাফার ব্যবহার করে একটি স্তরের মধ্যে এক রেখায় বা একাধিক পয়েন্ট সারিবদ্ধ করতে চাই। সংযুক্ত নমুনা স্কেচ দেখুন দয়া করে।

এই উদাহরণের জন্য, চিত্রের আগে লাইনের নিকটে থাকা পয়েন্টগুলি লাইনটির 5 টি মানচিত্র ইউনিটের মধ্যে রয়েছে, যখন বাইরেরতম পয়েন্টগুলি 10 মানচিত্রের এককের বেশি রয়েছে। আমি ছবিটির ফলাফলের ফলাফল অর্জনের জন্য 5 টি মানচিত্র ইউনিটের সহনশীলতা ব্যবহার করে নিকটতম লাইনে নিকটস্থ পয়েন্টগুলি স্ন্যাপ করতে চাই।

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


সুতরাং বিন্দুটি লাইনটি 0 পর্যায়ক্রমে 0 মানচিত্রের ইউনিট হওয়া দরকার, তবে আপনি কি বিন্দুটির মূল অবস্থানটির সাথে লাইনটির দ্রাঘিমাংশটি শেষ করেন যেখানে যত্নশীল?
জো

আদর্শ দৃশ্যটি হ'ল লম্বের একটি লম্ব পথটি ব্যবহার করে পয়েন্টগুলি সরিয়ে নেওয়া। তবে উদ্দেশ্যটি হ'ল মোটামুটি ছোট সহনশীলতা ব্যবহার করা। পয়েন্টগুলি দ্রাঘিমাংশ বা অক্ষাংশ রেখার দিকে সরানো হলে, এটি পয়েন্টগুলি পছন্দসই লম্ব অবস্থানে থেকে অফসেট করবে না।
এড ক্যামডেন

এটি সর্বোত্তম উপায় কিনা তা নিশ্চিত না, তবে একটি উপায় যা আমি ভাবতে পারি তা হ'ল দুটি ডেটাসেট বিশ্লেষণ করার জন্য কিছু পাইথন কোড লেখা এবং কিছু পয়েন্ট স্থানাঙ্ক তৈরি করা। আপনি যদি মনে করেন যে এটিই আপনি চান, তবে আমাকে জানান এবং আমি আপনার জন্য উত্তর সরবরাহ করতে পারি। উদাহরণস্বরূপ প্রতিটি পয়েন্টের জন্য, লাইন <= 5 ইউনিট থেকে ল্যাট ডিস্টের পরম মানের যদি, তবে পার্শ্বীয় দূরত্ব = 0, আপনাকে x, y মানগুলিকে কর্ডে রূপান্তর করতে একটি জিডাল লাইব্রেরি আমদানি করতে হবে। মন্তব্যগুলি এতে দেখুন: gis.stackexchange.com/questions/185445/…
জো

পাইকিউজিআইএস এর সাহায্যে এটি একটি মেমরি স্তর তৈরি করতে পারে যেখানে পূর্বে 5 টি মানচিত্র ইউনিট সহনশীলতা এবং লাইনের একটি লম্ব লম্ব পথ হিসাবে বিবেচিত হয় points আমার উত্তর দেখুন।
xunilk

উত্তর:


15

(অপ্রকাশিত) কিউজিআইএস 3.0 সংস্করণে এটি করার জন্য একটি অন্তর্নির্মিত সরঞ্জাম রয়েছে। এটি আগে থেকে পরীক্ষার জন্য আপনি QGIS ওয়েবসাইট থেকে একটি রাতের স্ন্যাপশট পেতে পারেন।

এটা করতে:

  1. প্রক্রিয়াকরণ অ্যালগরিদম "স্ন্যাপ জ্যামিতি স্তর থেকে স্তর" চালান
  2. আপনার পয়েন্ট স্তরটিকে "ইনপুট স্তর" হিসাবে নির্বাচন করুন
  3. "রেফারেন্স স্তর" হিসাবে লাইন স্তরটি নির্বাচন করুন
  4. একটি উপযুক্ত সহনশীলতা প্রবেশ করান (স্ন্যাপিংয়ের সময় পয়েন্টগুলি সরাতে সর্বাধিক দূরত্ব)
  5. আচরণটি "নিকটতম স্থানে পছন্দ করুন" এ পরিবর্তন করুন

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

এখানে ফলাফল, মূল পয়েন্টগুলি "x" হিসাবে দেখায়, এবং বিভক্ত পয়েন্টগুলি সবুজ বিন্দু হিসাবে দেখায় আমি এখানে একটি সহনশীলতা ব্যবহার করেছি যাতে কেবলমাত্র কিছু ইনপুট পয়েন্ট ছড়িয়ে যায়।

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


এটি আমার প্রয়োজন ঠিক তাই। দুর্ভাগ্যক্রমে আমার নিয়োগকর্তা কেবল কিউজিআইএসের এলটিআর সংস্করণ ইনস্টল করেন এবং আমরা সবাই পরীক্ষার সংস্করণগুলি ডাউনলোড এবং ইনস্টল করা থেকে বিরত। (দীর্ঘশ্বাস) আমার ধারণা এটি অপেক্ষা করার বিষয় a এটি কি কোনও স্ট্যান্ডার্ড / বিল্ট ইন ফাংশন বা প্লাগ-ইন?
এড ক্যামডেন

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

1
পুরানো সংস্করণের জন্য এই প্লাগইনটিতে একবার দেখুন। docs.qgis.org/2.14/en/docs/user_manual/plugins/…
আইআরএফএএন

দেখে মনে হচ্ছে প্লাগইনটি পয়েন্টগুলির স্তরগুলিকে সমর্থন করে না।
মাইকোলা কোজির

7

এটি পাইকিউজিআইএস সহ সজ্জিত হতে পারে । পরবর্তী পরিস্থিতির জন্য:

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

5 টি মানচিত্র ইউনিটের সহনশীলতার কথা বিবেচনা করে নিম্নলিখিত কোডটি কিউজিআইএসের পাইথন কনসোলে চালানো হয়েছিল:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

এটি একটি মেমরি স্তর তৈরি করা হয়েছিল যেখানে পূর্বে 5 টি মানচিত্র ইউনিট সহনশীলতা এবং লাইনের একটি লম্ব লম্ব পথ হিসাবে বিবেচিত হয় points

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


2

আপনি এটি রিফফিউশনগুলি প্লাগইন সহ ফিল্ড ক্যালকুলেটরেও করতে পারেন। আপনি ফিল্ড ক্যালকুলেটরটি স্তর জ্যামিতির পাশাপাশি ক্ষেত্রগুলি আপডেট করতে পারেন। রেফফিউশনস আপনাকে প্রদত্ত দূরত্বের মধ্যে নিকটতম লাইনটি খুঁজে পেতে একটি "জিওমাস্টিনস" ফাংশন দেয় (অথবা আপনি যদি একটি চৌম্বকটি চান না তবে "geomnearest") এবং একটি বৈশিষ্ট্য বা জ্যামিতি ফিরিয়ে দেবেন এবং "নিকটতম_পয়েন্ট" ফাংশনটি নিকটতম সন্ধান করবে প্রদত্ত জ্যামিতির দিকে নির্দেশ করুন। আপনার বিন্দু স্তরের জন্য নতুন জ্যামিতিগুলি গণনা করার জন্য তাদের মতো স্ট্রিং করা:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

জ্যামিতিটি সরাসরি আপডেট করার পরিবর্তে পরিবর্তিত জ্যামিতির সাহায্যে আপনি কোনও ক্ষেত্র গণনা করতে পারেন can আমি বিভিন্ন স্ট্রিম স্তরগুলিতে কালভার্ট পয়েন্টগুলি ছড়িয়ে দেওয়ার জন্য একাধিক জ্যামিতি সঞ্চয় করি এবং আমি ফিল্ড ক্যালকুলেটরে সহজেই পয়েন্ট জ্যামিতিটি আপডেট করতে পারি যার স্ট্রিম লাইনগুলি আমার ব্যবহার করা উচিত তার উপর নির্ভর করে।

এর সাথে কিছু সীমাবদ্ধতা রয়েছে, উভয় স্তরকে একই সিআরএস হওয়া দরকার এবং ভূ-দূরত্ব ফাংশনটি আপনাকে একটি ত্রুটি দেবে যদি আপনার 100,000 এর বেশি পয়েন্ট থাকে তবে আপনি যদি রেফফিউশন প্লাগইন ফাইল সম্পাদনা করেন তবে আপনি এই সীমাটি পরিবর্তন করতে পারবেন।

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