QGISを使用してラインでポイントを接続しますか?


9

すべてのポイント(約100)を線で接続したい.shpファイルがあります。順序(つまり、1、2、3、...)のデータフィールドがあります。

PointConnectorとPoints2Oneを試しましたが、間違って使用している可能性がありますが、結果を得ることができません。

私の検索では、プラグインがパスを指しているという言及を見つけましたが、それはなくなったようです?

QGIS 2.6.1を使用しています

回答:


8

まず、引き続きPointsToPaths-Plugin(https://plugins.qgis.org/plugins/pointstopaths_v02/)を使用できます。[プラグイン]> [プラグインの管理とインストール(プラグインマネージャ)]> [設定]で[実験的なプラグインも表示]オプションを有効にする必要があるかもしれません。

次に、注文のあるデータフィールドが数値タイプ(整数など)であることを確認します。

QGISバージョン(2.0.1)を使用してポイントシェイプからラインを作成しようとしましたが、すべて問題ありませんでした。ここにスクリーンショットがあります:ここに画像の説明を入力してください

多分これは役に立ちます!

test_coordsシェイプの結果のスクリーンショット: ここに画像の説明を入力してください


ありがとう-少なくともPointsToPathsを見つけてインストールしましたが、ポイントグループフィールドとポイント順序フィールドの組み合わせでデータが生成されないようです。ここにはどのフィールドが必要ですか?
Magnus

「ポイントグループフィールド」には2つのオプションがあります。既存のフィールドを使用するか、フィールド計算機(文字列型)で新しいフィールドを作成できます。新しいフィールドを作成する場合は、列にdefault-textを書き込む必要があります。「NULL」のままにすると、エラーが発生します。「ポイント注文フィールド」には、「注文フィールド」とシリアル番号(1、2、3、...)を使用できます。これが数値フィールドであることを確認してください!とにかく、それでも問題が解決しない場合は、シェープファイルを投稿してください。データで試してみます。
anja 2015年

ありがとうございました。「ポイントグループフィールド」のテキストフィールドと整数フィールドの両方を使用し、「ポイントの順序フィールド」の整数を、「ギャップ期間」の異なる値(および空白)と組み合わせて、問題なく使用しました。:私がテストしている.shpのある添付drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/...
マグナス

私はあなたの形状ファイルでそれをテストしました、そして私は問題を見つけました。「ポイント順序フィールド」は、グループフィールド内の同じ「テキスト」を持つポイントのみを組み合わせます。上記の回答に結果のスクリーンショットを添付しました。
anja

ああ、だから私はすべてのポイントに同じテキストのフィールドを追加する必要がありますか?
Magnus

5

MMQGISプラグインは、メニュー項目がありますCreate -> Hub Lines。これはあなたが望むことをするはずです。

2つのレイヤー(開始と宛先)が必要なため、キャンバスにポイントレイヤーを2回追加する必要がある場合があります。


完璧です。小規模なテストが機能しているようです。2つの異なる属性が必要です。数値と数値+1のフィールドを作成し、これらをtoおよびfromとして使用しました。
Magnus

4

基本的なアプローチは次のとおりです。

  1. 新しいシェープファイル用のベクターライターを作成します(クックブックの「ベクターレイヤーの書き込み」セクションの2番目の例を参照)。(multi)line / polygonまたは必要なもの(列挙型を参照)として
  2. ポイントレイヤーを読み込む iface.legendInterface().layers()
  3. ポイントを反復処理して、新しい形状にジオメトリフィーチャーを追加します

€:楽しみのために:

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

すみません-私は上級ユーザーではないので、ステップ1で私を失いました。詳しく説明するか、より簡単なアプローチを提案できますか?
Magnus

私はあなたがより簡単な解決策を得たと思います-しかし私はあなたに小さなスクリプトを書いた.. just4fun;)
ymirsson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.