ポリラインのすべてのポイントを取得する


10

Pythonにいくつかのポリラインフィーチャオブジェクトがあります。次に、ポリラインのすべてのポイントを取得します。

たとえば、ポリラインがある場合はポイント開始[0,0]エンドポイントを[5,5]。結果:[1,1];[2,2];[3,3];[4,4];[5,5]

端点を含むその線上のすべての整数点を見つけたいのですが。直線の場合、これは非常に単純ですが、ポリラインにBeizer Curve、Circular Arc、Elliptic Arcジオメトリタイプがある場合、どのようにすればよいですか?

編集:

ArcGISのすべてのライセンスレベルで利用できるツールのみを使用できます。たとえば、ArcGIS Basic。


2
一般に、「整数」ポイントが得られることはあまりありません。それはあなたの例では機能しますが、実際の生活ではあまり機能しません。通常、頂点の位置を取得するだけなので、[0,0]と[5,5]を取得します。「中間」ポイントは「仮定」することができます。Pythonでこれを行う方法はわかりませんが、いくつかのツールを使用すると、ラインから頂点のポイントファイルを作成できます。
ダレン・コープ

回答:


17

これは古いことはわかっていますが、FeatureVerticesToPointsツール用のArcInfoがないので、同じものを探していました。上記の検索カーソルソリューションを使用した後、コードを簡略化するために進んで、データアクセスモジュールでNumPy配列を使用すると、シンプルで非常に迅速なスクリプトを作成できることがわかりました。これをスクリプトツールとして使用しています。

注:キーはのexplode_to_pointsパラメーターですarcpy.da.FeatureClassToNumPyArray

これは、ArcGISリポジトリの場所へのリンクです:ポイントへのフィーチャクラス

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

GIS.se Paulへようこそ:)ブートするコードを使用して、十分に丸く、平均よりも優れた最初の貢献に対して+1します。ありがとう!いくつかの編集のヒント:テキスト、インライン、またはブロックを選択してctrl-kから、コードの書式を適用します(b古いものとiタリックについても同じ)。慣例により、「こんにちは」、「ありがとう」、「乾杯」のようなおしゃべりな言葉は避ける傾向があります。これらは常に存在するものであり、この場所が通常のフォーラムやメールとは異なるという考えを強化するのに役立ちます。ようこそ。
マットウィルキー

コード配列のこの行にwhere_clauseのプレースホルダーを配置する必要があります= arcpy.da.FeatureClassToNumPyArray(InFc、["SHAPE @ XY"]、 ""、spatial_reference = SR、explode_to_points = True)
Tristan Forward

4

私が理解したように、ポリラインフィーチャの頂点の数を増やす必要があります。また、「Beizer Curve、Circular Arc、Elliptic Arc」のすべてのセグメントをいくつかのラインセグメントに変換します。

ArcGISのこのタスクでは、ArcToolboxのDensify(編集)ツールを使用できます。

次に、ポリラインの頂点をポイントフィーチャに変換できます。

ArcMapで行う場合は、ラインヘルプトピックに沿った新しいポイントの作成をご覧ください。


3

以下は、ポリラインとポリゴンで機能するはずです。

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

いくつかの英国の道路データについては、これを取得します。ポリラインを構成する各頂点のX、Yペアのネストされたリスト:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

ESRIのページでこれを見てきました。しかし、それらの説明を注意深く見ると、このコードはエンドポイントのみを返し、エンドポイント間のポイントは返しません。
ユーザーの

2
@crucifiedsoul-はい、これはESRIサンプルのバリエーションですが、エンドポイントだけでなく、すべてのポイントのX、Yペアを提供します。それはあなたが望むことです、正しいですか?
チャドクーパー

わかりません。唯一のことは、あなたが交換されて変化しているprint pnt.X, pnt.Ypart_list.append([pnt.X, pnt.Y])。そしてあなたはこれをループの終わりに印刷しています。どのようにしてコードで行のすべてのポイントを取得できますが、ESRIコードでは取得できませんか?
ユーザー

describeメソッドは私にとってはうまくいきませんでした。シェイプフィールドを指定するだけでした-arcpy.da.SearchCursor(fc、["SHAPE @"])
jbalk

1

Darren Copeが示唆したように、レイヤーを点の頂点に変換するには、[ 頂点を点にフィーチャ]ツールを使用します。

Pythonコードのsnippedtは次のとおりです。

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.