ArcPyでポイントペア座標からラインを作成しますか?


11

いくつかのポイントペア座標(開始ポイントと終了ポイント)があり、それらを線に変換する必要があります。これまで、a pippo.Point()、a の両方の座標のアペンドを使用してpippo.CalculateGeometry()各ピオントのジオメトリを定義し、pippo.append(defined geometry)ポイントのペアを識別してから、PointsToLineを使用してラインを取得しました。これは、数百の行に対して非常に時間がかかります。

これを行う簡単な方法はありますか?

たとえば、各行の開始点と終了点を単一のテーブルの異なるフィールドに配置し、ポイントジオメトリを渡さずに行を直接インポートします。

回答:


8

次のようなテーブル(この場合はExcelシートですが、任意のテーブルタイプ)を読み取ります。

ここに画像の説明を入力してください

S_Xは開始Xポイント、E_X終了Xポイントで、Yについても同じです。入力テーブルを反復処理し、行ごとに開始/終了X / Yをポイントに設定し、そのポイントを配列に追加してから、2つのポイントの配列からポリラインを作成します。次に、フィーチャクラスに挿入します。すすぎ、繰り返します。

import arcpy

in_rows = arcpy.SearchCursor(r"D:\Temp\Lines.xls\Sheet1$")

point = arcpy.Point()
array = arcpy.Array()

featureList = []
cursor = arcpy.InsertCursor(r"D:\Temp\Lines.shp")
feat = cursor.newRow()

for in_row in in_rows:
    # Set X and Y for start and end points
    point.X = in_row.S_X
    point.Y = in_row.S_Y
    array.add(point)
    point.X = in_row.E_X
    point.Y = in_row.E_Y
    array.add(point)   
    # Create a Polyline object based on the array of points
    polyline = arcpy.Polyline(array)
    # Clear the array for future use
    array.removeAll()
    # Append to the list of Polyline objects
    featureList.append(polyline)
    # Insert the feature
    feat.shape = polyline
    cursor.insertRow(feat)
del feat
del cursor

そして、あなたの行を取得します:

ここに画像の説明を入力してください


ありがとう、私は私の分析の持続時間を試してみます。それは私がやろうとしていたことでした:
アンナリサミネリ

行point.X = in_row.S_Xの場合、入力値が数値ではないことを示すエラーを返します。私はそれをintまたはfloatまたはさらに数値にしようとしましたが、フィールドが数値ではないため動作しませんNonetypeです。何か助け?
フェデリコゴメス

5

先週、Pythonスクリプトを作成しました(ただし、ArcPyは使用しません)。これは、連続番号フィールド(「SEQ」)に従ってバスラインのジオメトリ(ポイントshp)を作成するポイントを取ります。簡単に微調整して、同じフィーチャのフィールドから座標を取得できます(ジオメトリの代わりにフィールド値を使用)。

# -*- coding: utf-8 -*-
###############################################################################
from sys import argv
import osgeo.ogr
import os, os.path
###############################################################################

script, srcSHP = argv

#-- Open source shapefile
shapefile = osgeo.ogr.Open(srcSHP)
layer = shapefile.GetLayer(0)
spatialRef = layer.GetSpatialRef()

#-- Output directory
outDir = os.path.dirname(srcSHP)
outDirName = os.path.basename(outDir)

driver = osgeo.ogr.GetDriverByName("ESRI Shapefile")
outFile = driver.CreateDataSource(os.path.join(outDir,outDirName + "_lines.shp"))
outLayer = outFile.CreateLayer("layer", spatialRef)

#-- Adding fields to the output shapefile
fieldDef = osgeo.ogr.FieldDefn("line_no", osgeo.ogr.OFTString)
fieldDef.SetWidth(12)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("From_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("To_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

#-- Going through each feature, one by one
#-- The last point is the end of the line so I don't want to iterate through that one
for i in range(layer.GetFeatureCount()-1):
    lString = osgeo.ogr.Geometry(osgeo.ogr.wkbLineString)  

    feature1 = layer.GetFeature(i)
    feature2 = layer.GetFeature(i+1)

    # When it's a new line, the sequential number restart to 1, so we don't want that line
    if feature1.GetField("SEQ") < feature2.GetField("SEQ"):
        geom1 = feature1.GetGeometryRef()
        geom2 = feature2.GetGeometryRef()

        geom1x = geom1.GetX()
        geom1y = geom1.GetY()
        geom2x = geom2.GetX()
        geom2y = geom2.GetY()

        lString.AddPoint(geom1x, geom1y)
        lString.AddPoint(geom2x, geom2y)     # Adding the destination point

        #-- Adding the information from the source file to the output
        feat = osgeo.ogr.Feature(outLayer.GetLayerDefn())
        feat.SetGeometry(lString)
        feat.SetField("line_no", feature1.GetField("line_no"))
        feat.SetField("From_SEQ", feature1.GetField("SEQ"))
        feat.SetField("To_SEQ", feature2.GetField("SEQ"))
        outLayer.CreateFeature(feat)

print "The End"

ポイントの各ペアは、単一の線を作成します。よりエレガントな方法があるかもしれませんが、約15秒で3900行を作成したので、私にとってはうまくいきます...


おかげで、大規模な精巧さのように見えます..それは私にとって本当に役立つはずです。フィードバックしてみます。どうもありがとう。
アンナリサミネリ


1

これは@ChadCooperの答えの単なる更新です。これは、「da」カーソルが以前のカーソルを有利に置き換えているためです。

with arcpy.da.SearchCursor(input_table,[orig_namefield,x1,y1,x2,y2] ) as in_rows:
    with arcpy.da.InsertCursor(output_lines,["SHAPE@",name_field]) as cursor:
        for row in in_rows:
            # build array for line segment
            array = arcpy.Array([arcpy.Point(row[1],row[2]),arcpy.Point(row[3],row[4])])
            # Create a Polyline object based on the array of points
            polyline = arcpy.Polyline(array)
            # Insert the feature
            cursor.insertRow([polyline,row[0]])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.