Menghubungkan titik dengan garis menggunakan QGIS?

9

Saya memiliki file .shp, tempat saya ingin menghubungkan semua titik (sekitar 100) dengan baris. Saya memiliki bidang data dengan urutan (yaitu 1, 2, 3, ...).

Saya sudah mencoba PointConnector dan Points2One, mungkin saya salah menggunakannya, tetapi saya tidak bisa mendapatkan hasil apa pun.

Dalam pencarian saya, saya telah menemukan penyebutan poin plugin ke jalur, tetapi tampaknya sudah hilang?

Saya menggunakan QGIS 2.6.1

Magnus
sumber

Jawaban:

8

Pertama, Anda masih dapat menggunakan PointsToPaths-Plugin ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ). Mungkin Anda harus mengaktifkan opsi "Tampilkan juga plugin eksperimental" di bawah Plugin> Kelola dan Instal Plugin (Manajer Plugin)> Pengaturan.

Kedua, pastikan bidang data Anda dengan pesanan memiliki tipe numerik (mis. Integer, ...)

Saya mencoba membuat garis dari bentuk titik dengan QGIS-Version (2.0.1) saya dan semuanya baik-baik saja. Berikut tangkapan layar:masukkan deskripsi gambar di sini

Mungkin ini bisa membantu!

Cuplikan layar dengan hasil bentuk test_coords: masukkan deskripsi gambar di sini

anja
sumber
Terima kasih - sekarang saya setidaknya menemukan dan menginstal PointsToPaths, tetapi tidak ada kombinasi bidang grup Point dan bidang Order poin yang tampaknya menghasilkan data apa pun, bidang apa yang diperlukan di sini?
Magnus
Untuk "Bidang kelompok titik" Anda memiliki dua opsi: Anda bisa menggunakan bidang yang sudah ada atau Anda bisa membuat bidang baru dengan kalkulator bidang (tipe-string). Jika Anda membuat bidang baru, Anda harus menulis teks default di kolom. Jika Anda membiarkannya "NULL", Anda akan mendapatkan kesalahan. Untuk "Bidang pesanan poin" Anda dapat menggunakan "bidang pesanan" Anda dengan nomor seri (1,2,3, ...). Pastikan, ini bidang angka! Bagaimanapun, jika Anda masih memiliki masalah, posting file bentuk Anda dan saya akan mencobanya dengan datat Anda.
anja
Terima kasih. Saya telah mencoba menggunakan bidang teks dan bilangan bulat untuk "Bidang grup titik", dan bilangan bulat untuk "Bidang urutan poin" yang digabungkan dengan nilai yang berbeda (dan kosong) dari "Periode gap" tanpa berhasil. Terlampir adalah .shp yang telah saya uji dengan: drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/…
Magnus
Saya mengujinya dengan file bentuk Anda dan saya menemukan masalahnya. "Bidang urutan titik" hanya menggabungkan titik dengan "teks" yang sama di bidang grup. Saya melampirkan tangkapan layar dengan hasil pada jawaban di atas.
anja
Ah, jadi saya perlu menambahkan bidang dengan teks yang sama ke setiap titik?
Magnus
5

The MMQGISplugin memiliki entri menu Create -> Hub Lines. Ini harus melakukan apa yang Anda inginkan.

Ini membutuhkan dua lapisan (mulai dan tujuan), jadi Anda mungkin harus menambahkan layer titik Anda dua kali ke kanvas.

AndreJ
sumber
Sempurna, tes skala kecil saya tampaknya berhasil - Saya hanya perlu dua atribut yang berbeda, saya telah membuat bidang angka dan angka +1, dan menggunakannya untuk dan dari.
Magnus
4

Pendekatan dasar adalah:

  1. buat vektor-penulis untuk shapefile baru (lihat Cookbook , Bagian "Menulis Layer Vektor", contoh ke-2) sebagai (multi) garis / poligon atau apa pun yang Anda butuhkan (lihat enum )
  2. muat layer titik Anda dari iface.legendInterface().layers()
  3. beralih melalui poin Anda dan tambahkan fitur geometri di bentuk baru Anda

€: hanya untuk bersenang-senang:

from PyQt4.QtCore import *

# easy 2 config vars
myPath = "/media/ymirsson/MyData/GIS/tmp/"
myPts = "test_coords.shp"
myLines = "test_lines.shp"
sortField = "No"
myCRS = "25832"

# load the points layer
myPtsLayer = QgsVectorLayer(myPath + myPts, "My Points", "ogr")

# field def. 4 lines-layer
fields = QgsFields()
fields.append(QgsField("id", QVariant.Int))
fields.append(QgsField("name", QVariant.String))

# create writer
writer = QgsVectorFileWriter(myPath + myLines, "utf-8", fields, QGis.WKBLineString, QgsCoordinateReferenceSystem(int(myCRS), QgsCoordinateReferenceSystem.EpsgCrsId), "ESRI Shapefile")

if writer.hasError() == QgsVectorFileWriter.NoError:
    # featureobject to list
    features = myPtsLayer.getFeatures()
    Points=([])
    for feature in features:
        geom = feature.geometry().asPoint()
        sortID = feature.attributes()[myPtsLayer.fieldNameIndex(sortField)]
        Points.append([sortID,geom])
    Points.sort()

    # create lines
    for i in range(1,len(Points)):
        Line = QgsFeature()
        Line.setGeometry(QgsGeometry.fromPolyline([Points[i-1][1], Points[i][1]]))
        Line.setAttributes([i,str(Points[i-1][0]) + " to " + str(Points[i][0])])
        writer.addFeature(Line)
    # don't forget the last one -.-
    Line = QgsFeature()
    Line.setGeometry(QgsGeometry.fromPolyline([Points[len(Points)-1][1], Points[0][1]]))
    Line.setAttributes([len(Points),str(Points[len(Points)-1][0]) + " to " + str(Points[0][0])])
    writer.addFeature(Line)

# flush 2 disk
del writer

# load both layers into qgis-project
QgsMapLayerRegistry.instance().addMapLayer(myPtsLayer)
QgsMapLayerRegistry.instance().addMapLayer(QgsVectorLayer(myPath + myLines, "My Lines", "ogr"))

print "Done .. "
ymirsson
sumber
Maaf - saya bukan pengguna tingkat lanjut dan Anda kehilangan saya di langkah pertama. Bisakah Anda menguraikan atau menyarankan pendekatan yang lebih sederhana?
Magnus
saya melihat Anda punya solusi yang lebih sederhana - tetapi saya menulis Anda sebuah skrip kecil .. just4fun;)
ymirsson