ポリラインに沿った距離を指定して、エンドポイントからポリライン上のポイントを取得します


10

ポリラインの始点と終点があります。特定の距離で指定された端点からそのポリライン上の点を取得するにはどうすればよいですか。

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

このスクリプトがモジュールをインポートせずにArcViewで機能するという条件で、arcpyを使用してこれを取得するにはどうすればよいですか(この回答のように)。値をハードコードしないようにしています。

関連質問:


object.interpolate(distance [、normalized = False])を使用して結果を取得していませんか?
ビナヤン

1
どこで入手しobject.interpolate(distance[, normalized=False])たの?それはarcpyの方法ですか?もしそうなら、リンクを投稿してください。グーグルで検索しましたが、見つかりませんでした。
ユーザーは

形の良いの方法..さtoblerity.github.com/shapely/...は ..あなたが結果を得た場合は、必ず他のquestion..notでそれを試してみましたと思う
ビナヤン

2
もう1つの関連する質問は、gis.stackexchange.com / questions / 6476 /…です。これは、この問題の逆に関係します(ポイントを指定して距離を見つける)。2つのソリューションは密接に関連しています。ポリラインが測定可能になると、ポリラインに沿ったすべてのポイントは、それらの距離でアドレス指定できます(それに沿った任意のセグメントは距離範囲でアドレス指定できます)。
whuber

回答:


7

これは「線形参照」に似ており、そのツールセットはArcViewで利用できます。さらに、このツールは非常に簡単にスクリプト化できます。

線形参照のESRIヘルプへのリンク


1
+1これは、この問題のために明示的に作成された成熟した機能を使用するという意味で「正しい」アプローチです。
whuber

6

@LouisHが言及したように、ニーズに基づいて、線形参照を使用することは間違いなく進むべき道です。要素をハードコーディングするのではなく、パラメーターとして要求するというニーズを満たす必要があるいくつかのコードをまとめました。

説明として、以下で使用する線形参照ツールは、ラインフィーチャの場合は「ルート」を受け取り、距離フィールドに基づいてポイントに沿って「イベント」を配置します。これにより、メモリに格納されるFeatureLayerが作成されます。これが、最後の関数が機能を出力フィーチャクラスにコピーする理由です。

import arcpy
import os
from arcpy import env

#Working directory
wkspace        = arcpy.GetParameterAsText(0)
#Line feature class
rtecls         = arcpy.GetParameterAsText(1)
#Line Unique ID
rtecls_ID      = arcpy.GetParameterAsText(2)
#Table of points to be located
pnttbl         = arcpy.GetParameterAsText(3)
#Field in point table that references line point will be located along
pttbl_rteid    = arcpy.GetParameterAsText(4)
#Distance field in point table
pttbl_dst      = arcpy.GetParameterAsText(5)
#Output Layer, layer is stored in memory.  Features still need to be copied to feature class saved to disk
outlayer       = arcpy.GetParameterAsText(6)
#Output Feature Class - If shapefile, make sure to include ".shp" at the end.
outclass       = arcpy.GetParameterAsText(7)

#Type of feature being located
fttype = "POINT"

#Set Workspace
env.workspace = wkspace

#Build String for input parameters in Linear Referencing tool
pt_props = pttbl_rteid + " " + fttype + " " + pttbl_dst

#Output featureclass path
outfclass = wkspace + os.sep + outclass

# Execute MakeRouteEventLayer
arcpy.MakeRouteEventLayer_lr (rtecls, rtecls_ID, pnttbl, pt_props, outlayer)

#Save feature layer to feature class on disk
arcpy.CopyFeatures_management(outlayer, outfclass)

編集-このツールで考えるべき1つのこと、そしておそらくラインの端からの距離に基づいてポイントを見つけるための操作は、ラインのどちらの端から始めるかです。たとえば、線形参照ツールは、線のデジタル化された方向に基づいて機能します。測定の基準となるエンドポイントを特定する方法があることを確認することが重要です。


5

このような線形参照問題の解決without importing any modulesは私の範囲を超えています。

私はShapely(2D地理空間ジオメトリの操作と分析用のPythonパッケージを使用しています。また、BSDライセンスです:-))

こちらからダウンロードしてください。2.6バージョンは、arcgis 10 arcpyをサポートする唯一のバージョンです。簡単なインストールです(1.5 MBサイズ)。

そして今ここに目的を達成するためのarcpyスクリプトがあります..私のpythonを許してください..今日だけ私はループ、タプルなどについて学びました:)

import arcpy
import math
from arcpy import env

env.workspace = r"C:\testshape"

desc = arcpy.Describe("Rivers.shp")
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor("Rivers.shp")

temptup = ()

# get ESRI geometries out of their cage..
for row in rows:

    feat = row.getValue(shapefieldname)
    partnum = 0
    for part in feat:
        for pnt in feat.getPart(partnum):
            if pnt:
                temptup += ((pnt.X, pnt.Y),)
            else:
                print "Interior Ring:"
        partnum += 1    

# and now the shapely magic :)

import shapely
from shapely.geometry import LineString
lnstr = LineString(temptup)
rsltPoint = lnstr.interpolate(0.5)
print(rsltPoint.x,rsltPoint.y)

:フィーチャーに曲線セグメントがある場合、これは機能しません


2

この質問は、私が同じことだと思うことを実行しようとしているのに気づきました。私はそれをすべてarcpyで実行したかった。ポイントイベントがまだないため(そしてLRを使用してそれらを取得する方法を理解できなかったため)、線形参照の使用は意味がありませんでした。最終的に私が使用したものの核心は

    line = arcpy.Polyline(arrayPts)
    pt = line.positionAlongLine (0.99, 'True')

これには、Arc 10.1以降が必要です。私が持っているArcInfoライセンスレベル(OPで指定されたArcView)よりも低いレベルで利用できるかどうかを確認できませんでした。

上記の例では、一定の距離ではなく、ライン全体の長さの割合でポイントが必要でした。これを行うために、2番目のオプションの引数をに指定しましたpositionAlongLine。絶対距離を指定するだけの場合は、2番目の引数をスキップします。こちらがドキュメントです。

完全なコードサンプルは

import numpy
ptsList = list()
id = 0

with arcpy.da.SearchCursor('flFL', ["SHAPE@"]) as cursor:
    for row in cursor: 
        arrayPts = row[0].getPart()
        line = arcpy.Polyline(arrayPts)
        pt = line.positionAlongLine (0.99, 'True')
        ptsList.append((id, (pt.getPart().X, pt.getPart().Y)))
        id += 1

array = numpy.array([ptsList], \
numpy.dtype([('idfield',numpy.int32),('XY', '<f8', 2)]))

SR = arcpy.Describe("flFL").spatialReference
arcpy.da.NumPyArrayToFeatureClass(array, 'nsegSamplePts', ['XY'], SR)

'flFL'ポイントを配置するラインのfeatureLayerです。かなり速く走る。NumPyArrayToFeatureClassすべてのポイントをfeatureClassに戻す非常に良い方法でした(その部分については同僚のCurtisに感謝します!)。と実験してAppend_managementいたが、それはかなり遅い。


+1共有いただきありがとうございます。計測ポリラインの設定に労力を費やしたくない場合は、1回限りの優れたソリューションのように見えます。このソリューションでは、座標が格納されている順序によって決定されるポリラインの暗黙的な方向を使用することに注意してください。その点に注意が払われていなかった場合、間違った端から計算されたポイントに巻き込まれる可能性があります。したがって、ユーザーが(どういうわけか)ポリラインの始点である(おそらく一方の端の近くの点を入力することによって)規定できるように、このソリューションを拡張するとよいでしょう。
whuber

1
それは間違いなく真実です。私はすべて(おそらく)下流に向けられている排水ネットワークからのラインを使用しているため、これに対処する必要はありませんでした。ラインの方向が意図的でない場合は、上記の提案の前処理として調整できます。向きが意図的である場合、コピーを作成し、向きを変えて、私のレシピを使用できます。ポイントの向きが現在の分析に役立たない場合でも、ポイントは元のラインフィーチャクラスに正しく整列します。
Roland

1

やり過ぎかもしれませんが、ネットワーク分析拡張機能にアクセスできる場合は、ポリラインからネットワークを作成し、SAのサイズを対象の距離として指定して、入力ポイントの周囲に到達圏を作成できます。これは、ポイントからSAが111メートルの簡単な例です。

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

次に、SAがラインと交差するポイントを見つける必要があります。


-1

Feature Vertices To Points(Data Management)メソッドで取得できると思います。あなたはここでより多くの情報を得ることができます

または、ここでライン分割ポイント(データ管理)を確認できます

それらは完全に十分ではありませんが、あなた自身のコードを書くことができます...

お役に立てば幸いです...


2
これらのオプションの問題は、ラインを分割するために、またはラインを分割する前にラインに頂点を追加するために、ポイントの場所の事前知識が必要であるように思われます。その点の位置は、上記の質問では不明であるため、これらのソリューションのいずれかを適用することは困難です。
空間を取得
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.