কিউজিআইএস-এ সামঞ্জস্যপূর্ণ পয়েন্ট তৈরি করছেন?


22

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


(আমি রূপান্তরটি জানতাম না বলে প্রস্তাবিত সমাধানগুলি বিভিন্ন ধরণের দৈর্ঘ্যের সাথে প্রয়োগ করেছি) @ নাথানসের সমাধানটি কিছুটা হলেও কাজ করেছে, আমি পেয়েছি ...

এখানে চিত্র বর্ণনা লিখুন। এখানে, এই ন্যায়সঙ্গত পয়েন্টগুলির অভিক্ষেপটি মূল রেখার চেয়ে আলাদা।

@ আন্ডারডार्কের পরামর্শের সাথে আমি পেয়েছি

এই ছবিটিযেখানে পয়েন্টগুলি সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে না। আমি অনুমান করি যে এই দুটিয়ের সাথেই কিছু প্রক্ষেপণ সমস্যা রয়েছে যা আমি বুঝতে পারি না।



2
কয়েক দফা। প্রথমত, লাইনটি কোনও প্রজেক্টেড সিআরএসে থাকতে হবে (ল্যাট / লম্বা নয়)। দ্বিতীয়ত, আপনার লাইনটি কি সত্য পললাইন? আমি মনে করি না যে কোনও পদ্ধতি পৃথক লাইনের একটি স্ট্রিং সমন্বিত লাইনে সঠিকভাবে কাজ করবে। নিক।
নপটন

এছাড়াও আমার কোড সহ, আপনাকে আর import locateএকবার লাইনটি কল করার দরকার নেই । কেবল একবার কল করুন তারপরে আপনি locate.pointsAlongLine(30)যতটা প্রয়োজন কল করতে পারবেন
নাথান ডাব্লু

আরেকটি পদ্ধতি (এখানে কিছু উত্তরের পরামর্শ অনুসারে সেক্সট্যান্ট দেওয়া হল কিউজিআইএস <2.0 শুধুমাত্র), এটি কিউচেইনেজ নামেও প্লাগইন ব্যবহার করা হয়।
অ্যান্ডি

উত্তর:


14

দ্রষ্টব্য: এখানে এখন কিউজিআইএস প্লাগইন রয়েছে QChainage। এটি আরও অনেক কিছু করে। নীচের কোডটি কিউজিআইএস ২.০ এবং তারপরের সাথে পুরানো।

এখানে কিছু পাইথন কোড রয়েছে যা আপনি কোনও ফাইলে আটকে থাকতে পারেন এবং কিউজিআইএস-এর অভ্যন্তরে ব্যবহার করতে পারেন:

কিউজিআইএস-এর লাইনার রেফারেন্সিংয়ের এপিআই-তে একটি পদ্ধতি রয়েছে তবে আমি এটি সঠিকভাবে কাজ করতে পারি না, তবে আমি কোডটির লেখকের সাথে যোগাযোগ করব এবং দেখুন যে আমি কোনও ভুল করছি।

আপাতত আপনার জন্য আকৃতির পাইথন লাইব্রেরি লাগবে , যা আপনার যেকোন উপায়ে ইনস্টল করা উচিত কারণ এটি চারপাশে থাকা সহজ y এটির http://toblerity.github.com/shapely/manual.html এ দুর্দান্ত ডকুমেন্টেশনও রয়েছে

এই বিভাগে আমি নিম্নলিখিত উদাহরণে ব্যবহার করছি হয় http://toblerity.github.com/shapely/manual.html#interoperation

নিম্নলিখিত কোডগুলির বেশিরভাগটি হ'ল কিউজিআইএস বয়লারপ্লিট কোডটি কেবল বৈশিষ্ট্যগুলি তৈরি করে, স্তরগুলি ডাব্লুবিবি এবং ডাব্লু কেটি এবং পিছনে রূপান্তর করে। মূল বিটটি হ'ল point = line.interpolate(currentdistance)যা একটি লাইনের সাথে দূরত্বে একটি বিন্দু দেয়। আমাদের লাইন শেষ না হওয়া অবধি আমরা এটিকে কেবল একটি লুপে আবৃত করি।

import qgis
from qgis.core import *
from PyQt4.QtCore import QVariant
from shapely.wkb import loads
from shapely.wkt import dumps

vl = None
pr = None

def createPointsAt(distance, geom):
    if distance > geom.length():
        print "No Way Man!"
        return

    length = geom.length()
    currentdistance = distance
    feats = []  

    while currentdistance < length: 
        line = loads(geom.asWkb())
        point = line.interpolate(currentdistance)
        fet = QgsFeature()
        fet.setAttributeMap( { 0 : currentdistance } )
        qgsgeom = QgsGeometry.fromWkt(dumps(point))
        fet.setGeometry(qgsgeom)
        feats.append(fet)
        currentdistance = currentdistance + distance

    pr.addFeatures(feats)
    vl.updateExtents()

def pointsAlongLine(distance):
    global vl
    vl = QgsVectorLayer("Point", "distance nodes", "memory")
    global pr
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = qgis.utils.iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        createPointsAt(distance, geom)

    QgsMapLayerRegistry.instance().addMapLayer(vl)

উপরের কোডটি ফাইলটিতে অনুলিপি করুন এবং আটকান, আমি ~./qgis/pythonডিরেক্টরিতে আমার পন্টেপিপি বলেছিলাম (কারণ এটি পাইথন পথে রয়েছে) এবং কিউজিআইএসের ভিতরে পাইথন কনসোলে এটি করুন।

 import locate
 locate.pointsAlongLine(30)

এটি নির্বাচিত লাইনের পাশাপাশি প্রতি 30 মিটারে পয়েন্ট সহ একটি নতুন পয়েন্ট স্তর তৈরি করবে:

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

দ্রষ্টব্য: কোডটি বেশ রুক্ষ এবং কিছুটা পরিষ্কার করার দরকার হতে পারে।

সম্পাদনা: সর্বশেষতম কিউজিআইএস দেব বিল্ড এখন এটি স্থানীয়ভাবে করতে পারে।

লুপ ইন এতে পরিবর্তন করুন createPointsAt:

 while currentdistance < length: 
    point = geom.interpolate(distance)
    fet = QgsFeature()
    fet.setAttributeMap( { 0 : currentdistance } )
    fet.setGeometry(point)
    feats.append(fet)
    currentdistance = currentdistance + distance

এবং আপনি মুছে ফেলতে পারেন

from shapely.wkb import loads
from shapely.wkt import dumps

ধন্যবাদ @ নাথান আমি আমার অজগরটির জন্য শেপলি প্যাকেজটি পাইনি। আমি পাইথন ২.7 ইনস্টল করেছি তবে শেপলি ইনস্টলারটি বলে যে পাইথন ২.7 আমার রেজিস্ট্রিতে নেই। শেপলি ইনস্টল করার অন্য কোনও উপায় আছে কি?
স্ট্যাটাস-আর

আমি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 656526২26২২ / অনুসরণ করেছি locateএবং এটি কল এবং ব্যবহারের জন্য উপরের দুটি লাইনটি টাইপ করেছি কিন্তু তবুও আমি সমকক্ষ পয়েন্টগুলি পাইনি। এছাড়াও, আমি পাইথনের একজন নিওফাইটি তাই আমি বুঝতে পারি না যে কোজিস ডিরেক্টরিতে (1) পাইথনটি কোড চালাতে হবে বা (2) যে সি: \ পাইথন 27 \ এ রয়েছে?
স্ট্যাটাস-আর

আপনি কোন ওএস চালু করছেন?
নাথান ডাব্লু

উইন্ডোজ 7 পেশাদার
-আর

পাইথন ফাইলটি তৈরি করুন C:\Users\{you user name}\.qgis\pythonতারপরে কিউজিআইএস পুনরায় চালু হলে এটি পুনরায় চালু করুন এবং `প্লাগইনস>> পাইথন কনসোল . Load a line layer, select a line a call আমদানি সনাক্তকরণ` এবংlocate.pointsAlongLine(30)
নাথান ডব্লিউ

5

আপনি নিয়মিত বিরতিতে লাইন বরাবর পয়েন্ট তৈরি করতে QGIS গ্রাস প্লাগইন v.to.pPoint সরঞ্জামটি ব্যবহার করতে পারেন

# convert line to points; dmax = distance between points
v.to.points -i -v -t in=road out=road_pts type=line dmax=90

আমি dmax 100 হিসাবে ব্যবহার করেছি এবং ফলাফলগুলির জন্য প্রতিটির জন্য অনুমানগুলি নিম্নরূপ। (সিআরএস কীভাবে নিজের দ্বারা নির্ধারিত হচ্ছে তা আমি জানি না))CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
স্ট্যাট-আর

এখন এটিও পছন্দ করুন: কিউজিসআইএস -> সিক্সেন্টেটি -> গ্রাস -> ভি.টো.পয়েন্টস
মার্কসএন

5

আপনি যদি কোনও সড়ক লাইনের সাথে স্থির বিরতিতে চেইনজ প্লট করতে চান তবে এটি করতে আপনি 'লাইন থেকে প্রোফাইল' প্লাগ-ইন ব্যবহার করতে পারেন। আপনার রাস্তা লাইন স্তরের নীচে একটি ডিএম প্রয়োজন, তবে পদ্ধতিটি দ্রুত এবং খুব সহজ। নিক।

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


এটি একটি খুব ভাল এবং সহজ পদ্ধতি, ধন্যবাদ!
Shepherdjo

2

সাবধান যে শেপলি (পাইথন) / জিইওএস (সি ++) ডেটা মডেলটি একটি বিমানে সংজ্ঞায়িত হয়েছে। সুতরাং যদি আপনার পয়েন্টগুলি জিপিএস পজিশন নিয়ে থাকে (অক্ষাংশ, দ্রাঘিমাংশ) shapely.geometry.LineString.interpolate(distance)পদ্ধতিটি ব্যবহার করে প্রদত্ত বরাবর ইউক্যালিডিয়ান দূরত্বে একটি জিপিএস অবস্থান আউটপুট দেবে LineString

শেপলি এর পদ্ধতিটি ব্যবহার interpolate()করে জিইওএসের geos::linearref::LengthIndexedLineক্লাসের উপর ভিত্তি করে extractPoint

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

শেপলি মডিউলটি ব্যবহার করে আমি দুটি কাজের ক্ষেত্র সম্পর্কে ভাবতে পারি:

  • LineStringবৈশিষ্ট্যগুলি তাদের প্রদত্ত সমস্ত বিন্দু এবং লিনিয়ার-ইন্টারপোল্টেড বক্ররেখা। সম্ভবত আপনি এমন কোনও সদস্য লিখতে পারেন যা আন্তঃবিবাহিত বক্ররেখাকে অ্যাক্সেস করে এবং ইউক্লিডিয়ান দূরত্বের পরিবর্তে নিম্নলিখিত লাইন ইন্টিগ্রালটি প্রয়োগ করে। আমি এই পদ্ধতির কল্পনা করি কারণ টুকরা অনুসারে অবিচ্ছিন্ন বক্ররেখা ব্যবহার করে কাঙ্ক্ষিত পয়েন্টগুলি ব্যাসার্ধের সাথে বক্ররেখার সাথে সংলগ্ন বৃত্তের ছেদগুলি গণনা করে প্রাপ্ত করা যেতে পারে r = radian_measure(arc_length) = arc_length / R, যেখানে প্রদত্ত অবস্থানে আরথের ব্যাসার্ধের সমান হয়।
  • উপযুক্ত দূরত্ব ফাংশন (উদাঃ হেরসাইন ফর্মুলা) ব্যবহার করে আপনার নিজের ইন্টারপোলেশন পদ্ধতিটি (শেপলি কোড স্পর্শ না করে) কোড করুন।

এটি অর্জনের জন্য আমি নিম্নলিখিত স্ট্যাকওভারফ্লো প্রশ্ন এবং বিশেষ করে এই উত্তরটি উল্লেখ করতে চাই :

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

প্রথমত, সরল ইউক্লিডিয়ান দূরত্বের দিক থেকে পয়েন্টগুলি কী প্রতিবেশীদের কাছ থেকে সত্যই সামঞ্জস্যপূর্ণ হতে পারে? এটি করার জন্য একটি নির্দিষ্ট ব্যাসার্ধের বৃত্তযুক্ত বক্ররেখার যে কোনও বিন্দুতে ছেদটি সন্ধান করা জড়িত। তারপরে কেবল বক্ররেখার ধাপ

এরপরে, আপনি যদি বক্ররেখার সাথেই দূরত্বকে বোঝাতে দূরত্বের উদ্দেশ্যে থাকেন, যদি বক্ররেখার অংশটি লম্বালম্বি রৈখিক হয় তবে সমস্যাটি আবার করা সহজ। একটি রেখাংশের দূরত্ব পরিমাপ করা সহজ যেহেতু বক্ররেখার সাথে কেবল পদক্ষেপ করুন।

অবশেষে, আপনি যদি বক্ররেখার ঘন স্প্লিন হওয়ার জন্য মনস্থ করেন, আবার এটি অবিশ্বাস্যরকম কঠিন নয়, তবে এটি আরও কিছুটা কাজ। কৌশলটি এখানে:

  • বক্ররেখার বিন্দু থেকে বিন্দুতে টুকরোচক রৈখিক আর্কিলেন্থটি গুণান। এটাকে টি। X (টি), y (টি) এক জোড়া কিউবিক স্প্লাইড তৈরি করুন।

  • টি এর ফাংশন হিসাবে এক্স এবং y কে পার্থক্য করুন। যেহেতু এগুলি ঘনক্ষেত্রের বিভাগ, তাই এটি সহজ। ডেরাইভেটিভ ফাংশনগুলি টুকরা দিকের
    চতুর্ভুজ হবে।

  • ডিফারেনশিয়াল আর্কিলেন্থ ফাংশনকে সংহত করে, বক্ররেখার সাথে সরানোর জন্য একটি ওড সল্ভার ব্যবহার করুন। ম্যাটল্যাবে, ওডিডি 45 চমৎকার কাজ করেছে।

সুতরাং, এক সংহত করে

sqrt((x')^2 + (y')^2)

আবার, ম্যাটল্যাবে, ODE45 এমন স্থানে চিহ্নিত করতে পারে যেখানে ফাংশন নির্দিষ্ট নির্দিষ্ট পয়েন্টগুলি অতিক্রম করে certain

আপনার ম্যাটল্যাব দক্ষতা যদি কাজটি করে থাকে তবে আপনি আরও ব্যাখ্যার জন্য আন্তঃপর্কে কোডটি দেখতে পারেন । এটি যুক্তিসঙ্গতভাবে ভাল মন্তব্য কোড।

3 : http://www.mathworks.com/matlabcentral/fileexchange/34874-interparc


1

Sextante একটি সরঞ্জাম আছে যা আপনার জন্য কাজ করতে পারে। সিক্সেন্টেটি কিউগিস প্লাগইন সংগ্রহশালা থেকে ডাউনলোড করা যায়।

অনুসন্ধান করুন:
"লাইনের স্তরগুলির জন্য সরঞ্জামগুলি"
"লাইনগুলিতে সমতুল্য পয়েন্টস"


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