Tìm đường lật trong mạng hình học ArcMap?


8

Tôi đã làm việc trên một đường theo dõi dự án trong một mạng hình học. Tôi đã phải đảo ngược hướng (dòng) trên nhiều dòng để làm cho dấu vết hoạt động. Bây giờ tôi đang ở thời điểm mà tôi phải cập nhật tập dữ liệu chính, và do đó thực hiện các đảo ngược dòng tương tự trong cơ sở dữ liệu.

Tôi nghĩ rằng tôi sẽ chạy một tập lệnh nhỏ gọn để kiểm tra đến / từ XY cho mỗi dòng so với / đến của các dòng khớp trong tập dữ liệu chính - bất kỳ tập lệnh nào có XY khớp với chủ từ XY (và ngược lại -versa) sẽ được ghi lại để lật.

Mặc dù tôi nghĩ rằng kịch bản này không quá khó để viết, nhưng bây giờ tôi đang tự hỏi liệu có một công cụ nào đó có sẵn để xác định các dòng lật cho tôi không? Tôi chưa thể tìm thấy một cái trong ArcToolbox, nhưng tôi có thể đang tìm kiếm thứ sai.

Lưu ý rằng có những thay đổi hình học khác trong tập dữ liệu của tôi mà tôi không muốn tìm, chỉ là các dòng khớp giống hệt nhau (khớp trên ID) trong đó sự khác biệt duy nhất là hướng. Các dòng mà XY khác nhau tôi muốn bỏ qua.

Ví dụ: các dòng sau hiển thị hướng dòng

nhập mô tả hình ảnh ở đây

Các dòng trong khu vực màu xanh tôi muốn lưu ý, sự khác biệt duy nhất là hướng dòng. Dòng trong khu vực màu đỏ tôi không muốn ghi lại vì dòng đã thực sự di chuyển.

nhập mô tả hình ảnh ở đây

Có một công cụ nào trong ArcGIS Desktop (10.5) có thể xác định các dòng đã được lật, nhưng bỏ qua các thay đổi hình học khác không? Nếu vậy thì cái nào?

Tôi vừa tìm thấy công cụ "Phát hiện thay đổi tính năng" mà tôi đang thử nghiệm ngay bây giờ (nó rất rất chậm). Tôi không chắc chắn liệu điều này sẽ tìm thấy chỉ là lật dòng, hoặc tất cả mọi thứ. Tất nhiên tôi có thể đã đặt các tham số không chính xác.

Công cụ Phát hiện Thay đổi Tính năng đã hoàn tất xử lý - mất gần 20 phút để chạy - nhưng chỉ tìm thấy 9 tính năng trong đó hướng dòng đã thay đổi. Tôi đang mong đợi ít nhất 10000 tính năng lật.


Tôi ngạc nhiên khi nó tìm thấy bất kỳ, bởi vì nó coi các đường lật là giống hệt nhau.
FelixIP

1
@FelixIP Kiểm tra các dòng lật là một trong các tùy chọn trong công cụ và nó xác định chúng ở đầu ra khác nhau
Midavalo

Tôi hiểu rồi. Dù sao ý tưởng đầu tiên của bạn là những gì tôi làm. Gán từ và cho các nút cho cả hai bộ và đưa cặp cũ sang mới. Có thể công cụ lật bên trong fgdb Kết quả ở các đỉnh hơi khác nhau. Không phải là một trường hợp với shapefiles.
FelixIP

Bạn có thể cập nhật một trường với góc phương vị của dòng và nối nó với bản gốc và so sánh sự khác biệt trong trường đó không?
Fezter

Chọn giống hệt nhau, sau đó Sử dụng SHAPE @ cusror và đối tượng arcpy.geometry bạn có thể nhận được dòng.firstPoint. cái này sẽ chọn lại cái bạn muốn
Ben S Nadler

Câu trả lời:


3

Tôi sẽ sử dụng một từ điển để làm điều đó. Tôi ngạc nhiên khi thấy chúng nhanh như thế nào.

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()

Tôi thực sự đã tự mình giải quyết vấn đề này nhưng quên cập nhật với câu trả lời. Tôi sẽ xem liệu tôi có thể tìm thấy những gì tôi sản xuất và so sánh nó với cái này không :)
Midavalo

'đây không phải là {0} oids bạn đang tìm kiếm'! CƯỜI LỚN.
Fezter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.