ArcMapジオメトリックネットワークで反転した線を見つけますか?


8

ジオメトリックネットワークのプロジェクトトレーシングラインで作業しています。トレースを機能させるために、多くのラインでライン(フロー)方向を逆にする必要がありました。これで、マスターデータセットを更新する必要があるので、データベースで同じ行反転を行います。

私の考えは、小さなarcpyスクリプトを実行して、マスターデータセットの一致する行のto / fromに対してすべての行のto / from XYをチェックすることです-to XYがXYからマスターに一致する(およびその逆) -versa)フリッピングのために記録されます。

このスクリプトはそれほど難しくないはずですが、反転した行を識別するためのツールがすでに利用できるかどうか疑問に思っています。ArcToolboxでまだ見つけることができませんが、間違ったものを探している可能性があります。

データセットに他のジオメトリの変更はありませんが、検出したくないことに注意してください。唯一の違いは方向である、一致する同一のライン(IDで一致)だけです。XYが異なる行は無視したい。

たとえば、行の方向を示す次の行

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

注意したい青い領域の線、唯一の違いは線の方向です。線が実際に移動したため、記録したくない赤い領域の線。

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

ArcGIS Desktop(10.5)には、フリップされたラインを識別できるが、他のジオメトリの変更は無視できるツールはありますか?もしそうなら、どれですか?

「機能の変更の検出」ツールを見つけました。これは現在テスト中です(非常に時間がかかります)。これが反転した行だけを見つけるのか、それともすべてを見つけるのかわかりません。もちろん、パラメーターを誤って設定した可能性があります。

フィーチャ変更の検出ツールの処理が終了しました-実行に約20分かかりましたが、ラインの方向が変更された9つのフィーチャのみが見つかりました。少なくとも10000のフリップ機能を期待しています。


フリップされたラインを同一のものとして扱うので、それが見つかったのは驚きです。
FelixIP

1
@FelixIPフリップされたラインのチェックはツールのオプションの1つであり、出力でそれらを異なる方法で識別します
ミダバロ

そうですか。とにかく、あなたの最初のアイデアは私がすることです。両方のセットにノードからとノードへの割り当てを行い、古いペアを新しいペアにします。fgdb内のツールを反転すると、頂点がわずかに異なる可能性があります。シェープファイルの場合ではありません。
FelixIP 2017

ラインの方位角でフィールドを更新し、それを元のフィールドに結合して、そのフィールドの違いを比較できますか?
Fezter

同一のものを選択し、SHAPE @ cusrorとarcpy.geometryオブジェクトを使用すると、line.firstPointを取得できます。これにより、必要なものが再選択されます。
ベンSナドラー2017

回答:


3

それには辞書を使います。彼らがどれほど速いか私は驚いています。

import arcpy 

def GetDict(fc,precision):
    fields = ['SHAPE@','OID@']
    # use a dictionary with x1-y1-xn-yn key
    dict = {}
    with arcpy.da.SearchCursor(fc, fields) as cursor:
        for row in cursor:
            fpx = round(row[0].firstPoint.X,precision)
            fpy = round(row[0].firstPoint.Y,precision)
            lpx = round(row[0].lastPoint.X,precision)
            lpy = round(row[0].lastPoint.Y,precision)
            key= u'{0}-{1}-{2}-{3}'.format(fpx,fpy,lpx,lpy)
            if not dict.has_key(key):
                dict[key] = row[0]
    return dict

def GetOIDsOfLinesInNeedofFlipping(fc,dict,precision):
    fields = ['SHAPE@','OID@']
    flipoids = []
    changedoids = [] # polyline has been more than just flipped
    with arcpy.da.SearchCursor(fc, fields) as cursor:
        for row in cursor:
            fpx = round(row[0].firstPoint.X,precision)
            fpy = round(row[0].firstPoint.Y,precision)
            lpx = round(row[0].lastPoint.X,precision)
            lpy = round(row[0].lastPoint.Y,precision)
            ftkey= u'{0}-{1}-{2}-{3}'.format(fpx,fpy,lpx,lpy)
            tfkey= u'{0}-{1}-{2}-{3}'.format(lpx,lpy,fpx,fpy)
            if not dict.has_key(ftkey):
                if dict.has_key(tfkey):
                    flipoids.append(row[1])
                else:
                    changedoids.append(row[1])
    if len(changedoids) > 0:
        print(u'these are not the {0} oids you are looking for'.format(len(changedoids)))
    return flipoids

def FlipPolylines(fc,oids):
    fields = ['SHAPE@','OID@']
    with arcpy.da.UpdateCursor(fc, fields) as cursor:
        for row in cursor:
            if row[1] in oids:
                # https://gis.stackexchange.com/a/67422/59
                if row[0].partCount > 1: 
                    print "Warning: multiple parts! extra parts are automatically trimmed!"
                lp= row[0].getPart(0)
                rPnts=arcpy.Array()
                for i in range(len(lp)): rPnts.append(lp[len(lp)-i-1])
                rPoly=arcpy.Polyline(rPnts)
                row[0] = rPoly
                cursor.updateRow(row)
    return

def main():
    precision = 1
    dict = GetDict(r'H:\filegdbs\sewer.gdb\sewermains',precision) #the "master"
    print(u'keys = {0}'.format(len(dict)))
    oids = GetOIDsOfLinesInNeedofFlipping(r'H:\filegdbs\sewer.gdb\sewermainsflipped',dict,precision)
    print(u'{0} polylines need flipping'.format(len(oids)))
    if len(oids) > 0:
        FlipPolylines(r'H:\filegdbs\sewer.gdb\sewermainsflipped',oids)
    else:
        print("none need flipping")
    return


if __name__ == '__main__':
    main()

私はそのとき実際に自分でこれを解決することができましたが、答えを更新するのを忘れていました。私が作成したものを見つけてこれと比較できるかどうかを確認します:)
ミダバロ

「これらはあなたが探している{0} oidsではありません」!笑。
Fezter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.