การสร้างจุดในระยะทางที่กำหนดตามเส้นโดยใช้ QGIS?


20

ฉันต้องการใช้จุดสร้าง QGIS ตามแนวเส้น แต่ตามระยะทางที่กำหนด ฉันพบเครื่องมือ GRASS สองตัวในกล่องเครื่องมือ SEXTANTE:

  • v.to.points
  • v.segment

ฉันลองv.to.pointsตั้งค่าระยะห่างสูงสุดระหว่างจุดในหน่วยแผนที่เป็น 100 และได้สิ่งนี้

จุดตามแนว

มองใกล้

ภาพถ่ายที่สองแสดงให้เห็นอย่างใกล้ชิดจากภาพบน ผลที่ได้คือสิ่งที่ฉันต้องการ แต่ฉันต้องการได้คะแนนน้อยลงแต่แม้ฉันจะตั้งระยะทางสูงสุดเป็น 1,000 หรือ 1000000 ผลลัพธ์ก็เหมือนกัน

ฉันพยายามใช้v.segmentแต่ฉันไม่มีไฟล์ที่มีกฎของเซ็กเมนต์

Underdark ให้คำแนะนำบางอย่างและฉันพยายามรูปทรงเรขาคณิตที่บดอัดให้ช่วงเวลา ครั้งแรกมันทำให้ฉันมีรูปร่างไฟล์ polyline เหมือนกับอินพุตของฉันและจากนั้นฉันใช้แยกโหนดเพื่อพยายามหาจุดเหล่านั้น แต่ผลลัพธ์เหมือนกันกับที่ฉันใช้v.to.pointsไม่ว่าฉันจะตั้งช่วงเวลาไว้ที่ใด

ฉันจะสร้างคะแนนตามเส้นได้อย่างไรและในระยะทางที่กำหนด?


4
ลองดูที่นี่แจ้งให้เราทราบ nathanw.net/2012/08/05/…
Willy

ขอบคุณที่ให้คำแนะนำที่เป็นประโยชน์กับฉัน! ถ้าฉันต้องการใช้สคริปต์ของคุณฉันต้องติดตั้ง python หรือไม่ หรือในเวอร์ชั่นใหม่ QGIS 2.0 มันมีฟังก์ชั่นนี้ติดตั้งอยู่ภายในหรือไม่?
Heinz

5
มีปลั๊กอินสำหรับสิ่งนี้ใน QGIS 2.0 เรียกว่า QChainage ดึงปลั๊กอินและติดตั้ง
Willy

โปรดทราบว่ากล่องเครื่องมือ "Sextante" เรียกว่า "กำลังดำเนินการ" ใน QGIS 2.2.0+ และรูปทรงเรขาคณิต Densify ที่กำหนดช่วงเวลา "อยู่ภายใต้เมนู ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools โปรดทราบว่านี่เป็นการแสดงให้เห็นถึงรูปทรงเรขาคณิต ที่ใกล้กว่าช่วงเวลาที่เลือก
Dave X

สิ่งนี้ใช้ได้กับฉัน: plugins.qgis.org/plugins/LocatePoints
Tactopoda

คำตอบ:


20

ในคอนโซล Python:

1) สร้างคลาสเลเยอร์หน่วยความจำ (คลาสที่สมบูรณ์ (ไม่มีแอตทริบิวต์) ที่crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) ฟังก์ชันพีชคณิตเวกเตอร์ (จากalgèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) ทิศทางโคไซน์

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) สายการผลิตหรือส่วนของเส้น

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

ผล

polyline จุดกึ่งกลางที่มี Shapely หรือ PyQGIS2 ที่มีทิศทาง cosines

เส้นหุ่นดีvector_algebra

จากนั้นเพียงแค่ปรับช่วงเวลา


จากการมองทางแยกดูเหมือนว่ามันจะเก็บจุดปมที่มีอยู่แล้วไว้บนบรรทัดดังนั้นมันจึงไม่สามารถทำให้บางลงไปที่ความละเอียดน้อยกว่ายอดที่มีอยู่แล้วในบรรทัด ด้วยเส้นโค้งที่ซับซ้อนและโค้งมนเหมือนใน OP ขั้นตอนเหล่านี้อาจไม่ได้ผลมากนัก
Dave X

คุณสามารถปรับสคริปต์ได้อย่างสมบูรณ์แบบ
ยีน

17

ขณะนี้มีปลั๊กอินที่เรียกว่า QChainage ที่ทำสิ่งที่คุณต้องการ คุณระบุระยะห่างของช่วงเวลาและปลั๊กอินสร้างจุดตามเส้นของคุณในช่วงเวลาที่ระบุ


* โปรดทราบว่าสิ่งนี้จะไม่บันทึกโหนดสายของคุณดังนั้นหากคุณต้องการคุณจะต้องใช้เครื่องมือรูปทรงเรขาคณิต - แยกโหนดและผนวกเข้ากับจุดเชื่อมโยงของคุณ
Jason

1
ยินดีต้อนรับสู่ GIS SE! ฉันคิดว่าข้อมูลที่คุณต่อท้ายที่นี่เป็นความคิดเห็นจะรวมอยู่ในคำตอบที่แท้จริงของคุณได้ดีขึ้นโดยใช้ปุ่มแก้ไขข้างใต้ คุณสามารถทำได้ด้วยการคัดลอก / วางและลบความคิดเห็นของคุณโดยคลิกกากบาทเล็ก ๆ ที่อยู่ติดกับมัน
PolyGeo

11

ฉันเขียนสคริปต์ที่เปลี่ยนเครื่องมือรูปทรงเรขาคณิต Sextante Densify เพื่อยอมรับระยะทางที่แน่นอน มันเรียกว่ารูปทรงเรขาคณิตที่บดอัดให้ช่วงเวลา

หลังจากรัน Densify คุณสามารถแยกคะแนนโดยใช้เครื่องมือExtract nodes

คุณจะได้รับจากGithubและติดตั้งคำแนะนำบนของบล็อก

ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าเครื่องมือนี้มีให้ใน QGIS โดยไม่ต้องติดตั้ง Sextante (QGIS 2.18.7) ฉันไม่เห็นมันในเมนู แต่พบว่าเป็นวิธีการทางภูมิศาสตร์ของ QGIS ในขณะค้นหาในกล่องเครื่องมือการประมวลผล
Nate Wanner

0

หากคุณไม่ต้องการใช้สคริปต์ python คุณสามารถติดตั้งและใช้ปลั๊กอิน "Profile from line" และละเว้น / ลบคอลัมน์ค่าแรสเตอร์ เชนจะเป็นสิ่งที่คุณกำหนดช่วงเวลาการสุ่มตัวอย่างให้เป็น


ใน QGIS 2.2.0 ฉันเห็นเครื่องมือ "โปรไฟล์", "qProf" และ "VoGIS-ProfilTool" แต่ไม่ใช่เครื่องมือ "โปรไฟล์จากบรรทัด"
Dave X

0

ไม่แน่ใจว่านี่เป็นรุ่นเสถียรหรือไม่ในกล่องเครื่องมือ sextante ที่ 1.9 alpha ภายใต้ Geoalgorithims-> Vector เป็นตัวเลือก "แปลงสายเป็นคะแนน" ใช้การรักษาได้ดีถ้ามันเพิ่มระยะทางตามแนวนอนเช่นกัน

ที่น่าสนใจก็เพิ่มฟิลด์ NAME จากเลเยอร์เวกเตอร์ของฉัน

ฉันพยายามทำให้ Python Script ทำงานโดย Nathan Woodrow แต่ฉันดูดด้วย python และด้วยรหัสโดยทั่วไปดูเหมือนว่า


0

ฉันใช้เวลานานในการต่อสู้กับปัญหานี้ แต่ในที่สุดก็มีสิ่งที่ฉันกำลังมองหาโดยใช้ QChainage มากขึ้นหรือน้อยลง สิ่งที่ฉันต้องการแบ่งปันคือสิ่งที่อาจช่วยเหลือผู้อื่น เมื่อใช้เครื่องมือละลายการประมวลผลทางภูมิศาสตร์ของ SAGA บนเส้น QChainage จะให้ผลลัพธ์ที่ไม่ถูกต้อง การใช้เครื่องมือละลายที่แตกต่างกันทำให้เครื่องมือทำงานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.