Membuat titik dalam jarak yang ditentukan sepanjang garis menggunakan QGIS?


20

Saya ingin menggunakan QGIS membuat titik di sepanjang garis, tetapi dalam jarak yang ditentukan. Saya menemukan dua alat GRASS di SEXTANTE Toolbox :

  • v.to.points
  • v.segment

Saya mencoba v.to.points , mengatur jarak maksimum antara titik dalam unit peta menjadi 100 dan mendapatkan ini :

poin di sepanjang garis

lihat dari dekat

Foto kedua menunjukkan tampilan dekat dari atas. Hasilnya adalah apa yang saya inginkan, tetapi saya ingin mendapatkan lebih sedikit poin , tetapi bahkan saya menetapkan jarak maksimum ke 1000, atau 1000000, hasilnya sama.

Saya mencoba menggunakan v.segment , tetapi saya tidak punya file yang berisi aturan segmen.

Underdark memberi saya beberapa saran, dan saya mencoba geometri Densify yang diberikan selang waktu . Pertama itu memberi saya polyline shapefile sama dengan yang saya input, dan kemudian saya menggunakan ekstrak node untuk mencoba mendapatkan poin-poin itu. Tapi hasilnya sama dengan saya menggunakan v.to.points , tidak peduli apa yang saya tetapkan interval jaraknya.

Bagaimana saya bisa membuat titik di sepanjang garis, dan dalam jarak yang ditentukan?


4
Lihatlah ini, beri tahu kami nathanw.net/2012/08/05/…
Willy

Terima kasih telah memberi saya saran bermanfaat ini! Jika saya ingin menggunakan skrip Anda, apakah saya harus menginstal python? atau di versi baru QGIS 2.0, apakah sudah memiliki fungsi ini dibangun di dalamnya?
Heinz

5
Ada sebuah plugin untuk ini sekarang di QGIS 2.0, yang disebut QChainage. Ambil plugin dan instal.
Willy

Perhatikan bahwa kotak alat "Sextante" disebut "Memproses" di QGIS 2.2.0+ dan geometri Densifikasi yang diberi interval "berada di bawah menu ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools. Perhatikan bahwa ini menunjukkan geometri dan tidak menghapus simpul. yang lebih dekat daripada interval yang dipilih
Dave X

Jawaban:


20

Di konsol Python:

1) membuat kelas lapisan memori (kelas lengkap (tanpa atribut) di 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) fungsi aljabar vektor (dari 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) arah cosinus

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

4) memproses garis atau segmen garis

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

Hasil

polyline, titik berjarak sama dengan Shapely atau PyQGIS2, dengan arah cosinus

polylinerupawanvector_algebra

Kemudian sesuaikan intervalnya


Dari melihat persimpangan, sepertinya itu membuat titik-titik simpul yang sudah ada sebelumnya di garis, sehingga tidak dapat menipiskan mereka ke resolusi kurang dari simpul yang sudah ada di garis. Dengan garis-garis melengkung yang rumit seperti pada OP, prosedur ini mungkin tidak banyak berpengaruh.
Dave X

Anda dapat dengan sempurna mengadaptasi skrip.
gen

17

Sekarang ada sebuah plugin bernama QChainage yang melakukan apa yang Anda inginkan. Anda menentukan jarak interval dan plugin menciptakan titik di sepanjang garis Anda pada interval yang ditentukan.


* Perhatikan bahwa ini tidak akan menangkap node garis Anda, jadi jika Anda membutuhkannya, Anda juga perlu menggunakan alat geometri - ekstrak node dan tambahkan ke poin rantai Anda.
Jason

1
Selamat datang di GIS SE! Saya pikir informasi yang telah Anda tambahkan di sini sebagai Komentar akan lebih baik dimasukkan ke dalam Jawaban Anda yang sebenarnya dengan menggunakan tombol edit di bawahnya. Anda dapat melakukan ini dengan Copy / Paste dan menghapus komentar Anda dengan mengklik tanda silang kecil di sebelahnya.
PolyGeo

11

Saya telah menulis sebuah skrip yang mengubah alat geometri Sextante Densify untuk menerima jarak tertentu. Itu disebut Densify geometri diberi interval .

Setelah menjalankan Densify, Anda dapat mengekstrak poin menggunakan alat Extract nodes .

Anda bisa mendapatkannya dari Github dan menginstal petunjuk ada di blog saya .

masukkan deskripsi gambar di sini


Tampaknya alat ini sekarang tersedia di QGIS tanpa instalasi Sextante (QGIS 2.18.7). Saya tidak melihatnya di menu, tetapi menemukannya sebagai geoalgoritma QGIS saat mencari di Toolbox Pemrosesan.
Nate Wanner

0

Jika Anda tidak ingin berkeliaran dengan skrip python, Anda cukup menginstal dan menggunakan plugin "Profile from line" dan mengabaikan / menghapus kolom nilai raster. Chainage akan menjadi apa pun yang Anda tetapkan untuk interval pengambilan sampel.


Di QGIS 2.2.0, saya melihat "Alat profil", "qProf" dan "VoGIS-ProfilTool", tetapi bukan alat "Profil dari garis".
Dave X

0

Yah tidak yakin apakah ini dalam rilis stabil, tetapi dalam kotak alat sextante pada 1,9 alpha di bawah Geoalgorithims-> Vector adalah opsi "Konversi Garis ke Poin". Bekerja memperlakukan, lebih baik jika menambahkan bidang untuk jarak di sepanjang garis juga.

Menariknya memang menambahkan bidang NAME dari lapisan vektor saya.

Saya mencoba membuat Script Python oleh Nathan Woodrow bekerja, tapi saya payah dengan python. Dan dengan kode pada umumnya sepertinya.


0

Saya menghabiskan banyak waktu berjuang dengan masalah ini, tetapi akhirnya mendapatkan lebih atau kurang apa yang saya cari menggunakan QChainage. Apa yang ingin saya bagikan adalah sesuatu yang dapat membantu orang lain. Saat menggunakan alat pelarut geoproses SAGA di telepon, QChainage menghasilkan hasil yang salah. Penggunaan alat pelarut yang berbeda menyebabkannya berfungsi dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.