লাইনে পয়েন্টগুলি সরানো (~ প্রতিবেশী)


14

আমার দুটি ভেক্টর স্তর রয়েছে যার মধ্যে একটি দূরবর্তী সেন্সিং দ্বারা "ইভেন্ট" ভিত্তিক একটি পয়েন্ট স্তর এবং দ্বিতীয়টি স্থানীয় গবেষণা থেকে প্রাপ্ত একটি লাইন স্তর।

আমার ক্ষেত্রে এগুলি ভূমিকম্প এবং টেকটোনিক ফল্ট, তবে আমি অনুমান করি যে কোনও একটি সাধারণ উদাহরণ হিসাবে কেবল "গাড়ি-দুর্ঘটনা এবং রাস্তা" বেছে নিতে পারে।

সুতরাং আমি যা করতে চাই তা হল পয়েন্টগুলি লাইনগুলির নিকটতম বিন্দুতে অনুলিপি করা, যতক্ষণ না এটি সহনীয়তার দূরত্বে (1-2 কিলোমিটার বা 0.0x say বলুন) নতুন বিন্দু স্তর সহ (+ অ্যাট্রারে সরানো হয়েছে) Y / N)।

কোন ধারনা ?

লিনাক্স, কিউজিআইএস 1.8



এটি করার জন্য আপনি কি একটি সম্পূর্ণ স্বয়ংক্রিয় ফাংশন সন্ধান করছেন, বা হাত দ্বারা এটি করার জন্য কোনও ধরণের स्न্পিংয়ের সরঞ্জামটি ঠিক আছে?
সিম্বামাঙ্গু

আমি অনুরূপ একটি প্রশ্ন জিজ্ঞাসা করলাম, আমি পয়েন্টগুলিতে লাইন স্ন্যাপ করার চেষ্টা করছিলাম তবে এর সহজ সমাধান আমি কখনই পাইনি। gis.stackexchange.com/questions/52232/…
গ্রেইহিপ্পো

ত্রিভঙ্গীকরণ এবং দূরত্বের মিলের বিষয়ে কী?
হাকফিন

অর্কজিআইএস-এ কাছাকাছি ব্যবহার করে এমন একটি পদ্ধতি সম্পর্কে আমি এই প্রশ্নটি পেয়েছি । কিউজিআইএস নিকটবর্তী সমতুল্যের জন্য অনুসন্ধান করা হয়েছিল এবং এই ফোরামের পোস্টটি খুঁজে পেয়েছে যেখানে কেউ গ্রাসের v.distance পরামর্শ দিয়েছিল। এটি আমাকে এই টিউটোরিয়ালে নিয়ে যায় যা কোনও পদ্ধতি সনাক্ত করতে পারে। সম্ভবত কোথাও কেউ এই মুহুর্তে একটি প্লাগইন লিখেছেন?
ক্রিস ডব্লিউ

উত্তর:


13

একটি কোড স্নিপেট পোস্ট করেছেন (পাইথন কনসোলে পরীক্ষিত) যা নীচে রয়েছে

  1. বিন্দুর নিকটতম লাইন বৈশিষ্ট্যটি খুঁজতে QgsSpatialIndex ব্যবহার করুন
  2. বিন্দুতে এই লাইনের নিকটতম বিন্দুটি সন্ধান করুন। আমি এর শর্টকাট হিসাবে সুদৃশ্য প্যাকেজটি ব্যবহার করেছি। আমি এর জন্য কিউজিস পদ্ধতিগুলি অপর্যাপ্ত হিসাবে খুঁজে পেয়েছি (অথবা সম্ভবত আমি সেগুলি সঠিকভাবে বুঝতে পারি না)
  3. স্ন্যাপের স্থানে রাবারব্যান্ড যুক্ত করা হয়েছে
from shapely.wkt import *
from shapely.geometry import *
from qgis.gui import *
from PyQt4.QtCore import Qt
lineLayer = iface.mapCanvas().layer(0)
pointLayer =  iface.mapCanvas().layer(1)
canvas =  iface.mapCanvas()
spIndex = QgsSpatialIndex() #create spatial index object
lineIter =  lineLayer.getFeatures()
for lineFeature in lineIter:
    spIndex.insertFeature(lineFeature)        
pointIter =  pointLayer.getFeatures()
for feature in pointIter:
    ptGeom = feature.geometry()
    pt = feature.geometry().asPoint()
    nearestIds = spIndex.nearestNeighbor(pt,1) # we need only one neighbour
    featureId = nearestIds[0]
    nearestIterator = lineLayer.getFeatures(QgsFeatureRequest().setFilterFid(featureId))
    nearFeature = QgsFeature()
    nearestIterator.nextFeature(nearFeature)
    shplyLineString = shapely.wkt.loads(nearFeature.geometry().exportToWkt())
    shplyPoint = shapely.wkt.loads(ptGeom.exportToWkt())
    #nearest distance from point to line
    dist = shplyLineString.distance(shplyPoint)
    print dist
    #the point on the road where the point should snap
    shplySnapPoint = shplyLineString.interpolate(shplyLineString.project(shplyPoint))
    #add rubber bands to the new points
    snapGeometry = QgsGeometry.fromWkt(shapely.wkt.dumps(shplySnapPoint))
    r = QgsRubberBand(canvas,QGis.Point)
    r.setColor(Qt.red)
    r.setToGeometry(snapGeometry,pointLayer)

সম্পাদনা: সবেমাত্র পাওয়া গেছে যে @radouxju পদ্ধতিটি নিকটতম সেগমেন্টবিথকন্টেক্সট ব্যবহার করে কোডের কম লাইনে একই ফলাফল দেয়। আমি অবাক হয়েছি কেন তারা এই অদ্ভুত পদ্ধতির নামটি নিয়ে আসে? নিকটস্থ পয়েন্টঅনজিওট্রি এর মতো কিছু হওয়া উচিত ছিল।

সুতরাং আমরা সুদর্শন এড়াতে এবং পছন্দ করতে পারি,

nearFeature = QgsFeature()
nearestIterator.nextFeature(nearFeature)   

closeSegResult = nearFeature.geometry().closestSegmentWithContext(ptGeom.asPoint())
closePoint = closeSegResult[1]
snapGeometry = QgsGeometry.fromPoint(QgsPoint(closePoint[0],closePoint[1])) 

p1 = ptGeom.asPoint()
p2 = snapGeometry.asPoint()

dist = math.hypot(p2.x() - p1.x(), p2.y() - p1.y())
print dist

1
দুঃস্বপ্নে দৌড়ে এই অজগর কোডটি ফর্ম্যাট করার চেষ্টা করছে..আর্ব !!
বিনয়ন

5

এখানে একটি সিউডো কোড দিয়ে শুরু করুন। আমি আশা করি এটি সাহায্য করে এবং কারও কাছে পুরো কোড সরবরাহ করার জন্য সময় থাকবে (এই মুহূর্তে আমার নেই)

প্রথম কাজটি হ'ল পয়েন্টটিতে লুপ করা এবং প্রতিটি পয়েন্টের প্রান্তিক দূরত্বে অবস্থিত লাইনগুলি নির্বাচন করা। থি কিউএসস্প্যাটিয়াল ইন্ডেক্সের সাহায্যে করা যায়

প্রথম লুপের মধ্যে, দ্বিতীয় কাজটি হ'ল নির্বাচিত লাইনে লুপ করা এবং লাইনের নিকটতম বিন্দুটি সন্ধান করা। এটি সরাসরি QgsGeometry :: নিকটতমগ্রহের উইথকনটেক্সট উপর ভিত্তি করে করা যেতে পারে

ডাবল কিউজজিট্রি :: নিকটতম বিভাগ বিভাগ উইথকনটেক্সট (কনস্ট্রেট কিউসপয়েন্ট এবং পয়েন্ট, কিউএসপয়েন্ট এবং মিনিস্টিস্টপয়েন্ট, ইনট এবং আফটার ভার্টেক্স, ডাবল * বামফুল = 0, ডাবল ইপসিলন = ডিএফএল এসএসএমএমইপিএসিলন)

জ্যামিতির নিকটতম অংশটি প্রদত্ত বিন্দুতে অনুসন্ধান করে।

পরামিতি বিন্দু অনুসন্ধানের জন্য পয়েন্ট নির্দিষ্ট করে

minDistPoint  Receives the nearest point on the segment

afterVertex   Receives index of the vertex after the closest segment. The vertex before the closest segment is always afterVertex -

1 বাম আউট আউট: সেগমেন্টের স্ন্যাপিংয়ের জন্য বিন্দুটি বিভাগের ডানদিকে (<0 অর্থ বাম,> 0 এর অর্থ ডান) এপিসিলন অ্যাপসিলন ফিরে আসে (1.8-এ যুক্ত হয়েছে)

তৃতীয় ধাপটি (প্রথম লুপের মধ্যে) বিন্দুটির জ্যামিতিটি সর্বনিম্ন দূরত্বের সাথে মিনিস্টিস্টপয়েন্টের জ্যামিতির সাথে আপডেট করে থাকে

কিছু কোডের সাথে আপডেট করুন (কিউজিআইএস 3 এ)

pointlayer = QgsProject.instance().mapLayersByName('point')[0] #iface.mapCanvas().layer(0)
lineLayer = QgsProject.instance().mapLayersByName('lines')[0] # iface.mapCanvas().layer(1)

epsg = pointlayer.crs().postgisSrid()
uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer&field=distance:double(20,2)&field=left:integer&index=yes"
snapped = QgsVectorLayer(uri,'snapped', 'memory')

prov = snapped.dataProvider()

testIndex = QgsSpatialIndex(lineLayer)
i=0

feats=[]

for p in pointlayer.getFeatures():
    i+=1
    mindist = 10000.
    near_ids = testIndex.nearestNeighbor(p.geometry().asPoint(),4) #nearest neighbor works with bounding boxes, so I need to take more than one closest results and further check all of them. 
    features = lineLayer.getFeatures(QgsFeatureRequest().setFilterFids(near_ids))
    for tline in features:
        closeSegResult = tline.geometry().closestSegmentWithContext(p.geometry().asPoint())
        if mindist > closeSegResult[0]:
            closePoint = closeSegResult[1]
            mindist = closeSegResult[0]
            side = closeSegResult[3]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(closePoint[0],closePoint[1])))
    feat.setAttributes([i,mindist,side])
    feats.append(feat)

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