Temukan garis terbalik di jaringan geometrik ArcMap?

8

Saya telah mengerjakan proyek menelusuri garis dalam jaringan geometris. Saya harus membalikkan arah garis (aliran) pada banyak garis untuk membuat jejak bekerja. Sekarang saya berada pada titik di mana saya harus memperbarui dataset master, dan dengan demikian membuat pembalikan garis yang sama dalam database.

Pikir saya adalah bahwa saya akan menjalankan skrip arcpy kecil untuk memeriksa ke / dari XY untuk setiap baris terhadap ke / dari baris yang cocok dalam dataset master - semua yang memiliki ke XY yang cocok dengan master dari XY (dan sebaliknya -versa) akan direkam untuk dibalik.

Meskipun saya pikir skrip ini seharusnya tidak terlalu sulit untuk ditulis, saya sekarang bertanya-tanya apakah ada alat yang sudah tersedia yang akan mengidentifikasi baris terbalik untuk saya? Saya belum dapat menemukannya di ArcToolbox, tetapi saya mungkin mencari yang salah.

Perhatikan ada perubahan geometri lain dalam dataset saya yang tidak ingin saya temukan, hanya garis pencocokan identik (cocok dengan ID) di mana satu-satunya perbedaan adalah arah. Baris di mana XY berbeda, saya ingin mengabaikan.

Misalnya, garis ikuti yang menunjukkan arah garis

masukkan deskripsi gambar di sini

Garis-garis di area biru yang ingin saya perhatikan, satu-satunya perbedaan adalah arah garis. Garis di area merah saya tidak ingin direkam karena garis sebenarnya telah dipindahkan.

masukkan deskripsi gambar di sini

Apakah ada alat di ArcGIS Desktop (10.5) yang dapat mengidentifikasi garis yang telah dibalik, tetapi mengabaikan perubahan geometri lainnya? Jika demikian, yang mana?

Saya baru saja menemukan alat "Detect Feature Changes", yang saya uji sekarang (sangat lambat). Saya tidak yakin apakah ini akan menemukan hanya garis terbalik, atau semuanya. Tentu saja saya mungkin salah mengatur parameter.

Alat Deteksi Fitur Perubahan selesai diproses - butuh hampir 20 menit untuk menjalankan - tetapi hanya menemukan 9 fitur di mana arah garis telah berubah. Saya mengharapkan setidaknya 10.000 fitur membalik.

Midavalo
sumber
Saya terkejut menemukan itu, karena memperlakukan garis terbalik sebagai identik.
FelixIP
1
@ Feliks Memeriksa garis terbalik adalah salah satu opsi dalam alat, dan mengidentifikasi mereka dalam output berbeda
Midavalo
Saya melihat. Pokoknya ide pertama Anda adalah apa yang saya lakukan. Tetapkan dari dan ke node untuk kedua set dan membawa pasangan lama ke yang baru. Mungkin saja alat flip di dalam fgdb Menghasilkan simpul yang sedikit berbeda. Tidak halnya dengan shapefile.
FelixIP
Bisakah Anda memperbarui bidang dengan azimuth baris dan bergabung dengan yang asli dan membandingkan perbedaan di bidang itu?
Fezter
Pilih identik, lalu Menggunakan SHAPE @ cusror dan objek arcpy.geometry Anda bisa mendapatkan line.firstPoint. ini akan memilih kembali yang Anda inginkan.
Ben S Nadler

Jawaban:

3

Saya akan menggunakan kamus untuk melakukan itu. Saya terkejut seberapa cepat mereka.

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()
Kirk Kuykendall
sumber
Saya sebenarnya berhasil menyelesaikan ini sendiri pada saat itu tetapi lupa untuk memperbarui dengan jawaban. Saya akan melihat apakah saya dapat menemukan apa yang saya hasilkan dan membandingkannya dengan yang ini :)
Midavalo
'ini bukan {0} tawaran yang kamu cari'! LOL.
Fezter