Kết nối điểm bằng đường bằng cách sử dụng QGIS?


9

Tôi có tệp .shp, nơi tôi muốn kết nối tất cả các điểm (khoảng 100) theo dòng. Tôi có một trường dữ liệu theo thứ tự (ví dụ 1, 2, 3, ...).

Tôi đã thử PointConnector và Points2One, có thể tôi đang sử dụng chúng sai, nhưng tôi không thể nhận được bất kỳ kết quả nào.

Trong các tìm kiếm của tôi, tôi đã thấy đề cập đến các plugin chỉ đường dẫn, nhưng dường như điều đó đã biến mất?

Tôi đang sử dụng QGIS 2.6.1

Câu trả lời:


8

Đầu tiên, bạn vẫn có thể sử dụng Plugin PointsToPaths ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ). Có thể bạn phải bật tùy chọn "Hiển thị các plugin thử nghiệm" trong Plugin> Quản lý và cài đặt plugin (Trình quản lý plugin)> Cài đặt.

Thứ hai, đảm bảo rằng trường dữ liệu của bạn với đơn hàng có kiểu số (ví dụ: số nguyên, ...)

Tôi đã cố gắng tạo các đường từ một hình dạng điểm với Phiên bản QGIS (2.0.1) của tôi và mọi thứ đều ổn. Đây là một ảnh chụp màn hình:nhập mô tả hình ảnh ở đây

Có lẽ điều này giúp!

Ảnh chụp màn hình với kết quả của hình dạng test_coords: nhập mô tả hình ảnh ở đây


Cảm ơn - bây giờ tôi ít nhất đã tìm thấy và cài đặt PointsToPaths, nhưng không có sự kết hợp nào giữa trường nhóm Điểm và trường thứ tự Điểm dường như tạo ra bất kỳ dữ liệu nào, trường nào cần thiết ở đây?
Magnus

Đối với "Trường nhóm điểm", bạn có hai tùy chọn: bạn có thể sử dụng một trường hiện có hoặc bạn có thể tạo một trường mới bằng máy tính trường (kiểu chuỗi). Trong trường hợp bạn đang tạo một trường mới, bạn phải viết một văn bản mặc định trong cột. Nếu bạn để nó "NULL", bạn sẽ gặp lỗi. Đối với "Trường thứ tự điểm", bạn có thể sử dụng "trường thứ tự" của mình với các số sê-ri (1,2,3, ...). Đảm bảo rằng đây là một trường số! Dù sao, nếu bạn vẫn gặp sự cố, hãy đăng tệp hình dạng của bạn và tôi sẽ thử nó với datat của bạn.
anja

Cảm ơn bạn. Tôi đã thử sử dụng cả trường văn bản và trường số nguyên cho "Trường nhóm điểm" và số nguyên cho "Trường thứ tự điểm" kết hợp với các giá trị khác nhau (và trống) của "Khoảng thời gian" mà không thành công. Kèm theo là .shp tôi đã thử nghiệm với: drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/
Magnus

Tôi đã thử nó với tập tin hình dạng của bạn và tôi tìm thấy vấn đề. "Trường thứ tự điểm" chỉ kết hợp các điểm với cùng một "văn bản" trong trường nhóm. Tôi đính kèm một ảnh chụp màn hình với kết quả cho câu trả lời ở trên.
anja

Ah, vậy tôi cần thêm một trường có cùng văn bản vào mọi điểm?
Magnus

5

Các MMQGISplugin có một mục menu Create -> Hub Lines. Điều này nên làm những gì bạn muốn.

Nó cần hai lớp (bắt đầu và đích), vì vậy bạn có thể phải thêm lớp điểm của mình hai lần vào khung vẽ.


Hoàn hảo, bài kiểm tra quy mô nhỏ của tôi dường như hoạt động - Tôi chỉ cần hai thuộc tính khác nhau, tôi đã tạo một số và số + 1 trường và sử dụng các thuộc tính này như là và từ.
Magnus

4

Một cách tiếp cận cơ bản sẽ là:

  1. tạo một trình soạn thảo vectơ cho một shapefile mới (xem Cookbook , Phần "Viết các lớp vectơ", ví dụ thứ 2) dưới dạng (đa) dòng / đa giác hoặc bất cứ điều gì bạn cần (xem enums )
  2. tải lớp điểm của bạn từ iface.legendInterface().layers()
  3. Lặp lại qua các điểm của bạn và thêm tính năng hình học trong hình dạng mới của bạn

€: chỉ để cho vui:

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 .. "

Xin lỗi - Tôi không phải là người dùng nâng cao và bạn đã mất tôi ở bước một. Bạn có thể xây dựng hoặc đề xuất một cách tiếp cận đơn giản hơn?
Magnus

tôi thấy bạn có một giải pháp đơn giản hơn - nhưng tôi đã viết cho bạn một kịch bản nhỏ .. just4fun;)
ymirsson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.