Phân tích GIS để tìm hình học trùng lặp


9

Tôi có một shapefile lớn chứa tất cả các tòa nhà và nhà của thị trấn mà tôi làm việc (khoảng 90.000 tính năng). Dữ liệu của các tòa nhà / ngôi nhà được lưu bởi các kỹ sư khảo sát của thị trấn và do thực tiễn xấu và sự truy cập của các nhà khảo sát khác vào dữ liệu đó, nhiều tòa nhà / ngôi nhà đã được lưu hai lần và hiển thị trên bản đồ dưới dạng bản sao.

Một số trong số chúng được sao chép chính xác (chúng xuất hiện chồng lên nhau) trong khi một số khác được sao chép với khoảng trắng giữa hai đối tượng (giống như một đối tượng ở bên trong đối tượng khác - xem ảnh chụp màn hình đính kèm).

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

Tôi muốn xóa dữ liệu đó để tôi chỉ có các tòa nhà / nhà ở chính xác trong thị trấn nên câu hỏi của tôi là:

Có bất kỳ phân tích GIS hoặc biểu thức SQL nào mà tôi có thể chạy để tìm tất cả các tính năng trùng lặp (cả các tính năng chính xác và các tính năng được đặt bên trong các tính năng khác) không? Tôi có cả ArcGIS và QGIS vì vậy tôi sẵn sàng tiếp nhận mọi đề xuất của bạn.


Bạn có thể thử khám phá Công cụ xóa nhận dạng . Tuy nhiên, nó đòi hỏi một mức độ giấy phép doanh nghiệp. Bạn có thể xem lại một số tùy chọn khác có sẵn trong Điều khoản kỹ thuật 36031 ArcGIS có cung cấp cách xác định hoặc xóa các tính năng với hình học trùng lặp mà đặt cược tốt nhất của bạn là Extenstion dữ liệu . mặc dù không có công cụ nào trong số này sẽ giải quyết hình học phân chia của bạn
MDHald

Ngoài ra, bạn sẽ phải xem xét rằng các thành phần bảng sẽ không được so sánh trong công cụ xóa giống hệt nhau. Tôi biết nó không phải là một câu trả lời nhưng hy vọng nó sẽ giúp giải quyết vấn đề.
MDHald

Là dữ liệu trong cơ sở dữ liệu? Loại nào?
Russell tại ISC

Một tùy chọn có thể đang sử dụng Công cụ Intersect (như được mô tả trong câu trả lời này ) trong ArcMap, sẽ xuất ra bất kỳ vị trí chồng lấp nào. Điều đó sẽ yêu cầu kiểm tra thủ công và quyết định xóa đa giác nào, nhưng trong trường hợp trùng lặp không chính xác, tôi nghĩ rằng dù sao bạn cũng cần phải làm điều đó.
Erica

4
Việc sử dụng thuật ngữ 'trùng lặp' là một chút sai lệch trong câu hỏi này. Đối với trường hợp các bản sao chính xác, giống hệt nhau, được xếp chồng lên nhau, thì có, chúng là (hoặc có thể - các thuộc tính có thể thay đổi) và như những người khác đã đề xuất công cụ Xóa hoặc Tìm nhận dạng có thể hữu ích nếu bạn có cấp giấy phép đó. Nhưng nếu chúng hoàn toàn bù đắp hoặc hình dạng khác, chúng không thực sự trùng lặp. Nếu bạn có giấy phép Nâng cao, tôi sẽ xem cấu trúc liên kết cơ sở dữ liệu địa lý, chạy kiểm tra Phải không chồng chéo. Nếu không có Advanced, có lẽ điều tương tự cũng có thể được thực hiện với QGIS và một plugin như câu trả lời của Luigi gợi ý.
Chris W

Câu trả lời:


4

trong QGIS, plugin Topology Checker có thể giải quyết vấn đề của bạn


3
Tôi đồng ý một cấu trúc liên kết có lẽ là giải pháp duy nhất tốt nhất cho vấn đề làm sạch dữ liệu. Tuy nhiên, bạn có thể muốn mở rộng câu trả lời của mình một chút bằng cách cung cấp liên kết đến plugin và mô tả ngắn gọn về cấu trúc liên kết là gì hoặc làm gì và kiểm tra xem bạn sẽ chạy gì. Tôi sợ câu trả lời của bạn khi được gõ sẽ có khả năng bị đánh dấu là chất lượng thấp.
Chris W

ok: một mô tả về plugin có ở đây: docs.qgis.org/2.2/en/docs/user_manual/plugins/ Kẻ và "không được chồng chéo" có thể tiếp cận vấn đề. Hướng dẫn bằng video về plugin có tại đây: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli

6

Tôi sẽ sử dụng itertools của Python và SearchCoder cho một cách rất hiệu quả để tìm các mối quan hệ không gian mà bạn đang theo đuổi. Bạn có thể kết hợp các phương pháp hình học overlaps , containsequalđể có được các tính chất hình học.

  1. Bắt đầu bằng cách tạo một chức năng để tổ chức tốt hơn quy trình làm việc và để lặp lại

    def findOverlaps(x):

  2. Mở một con trỏ tìm kiếm để lặp qua hình học tính năng cá nhân

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. sử dụng itertools.combinations()để trả về các phần tử của phần tử từ lần lặp đầu vàocur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Truy cập các tính chất hình học với các phương pháp sau: equals(), overlaps(), và contains(). Đây là những thiết lập theo trình tự hợp lý - bạn có thể điều chỉnh điều này để đáp ứng các mục tiêu cụ thể của bạn nếu cần thiết.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. Chạy nó ...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

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

Ảnh chụp màn hình cho thấy một loạt các tính năng chồng chéo, chồng chéo & giống hệt nhau và duy nhất.

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


2

Tôi có một ý tưởng những gì có thể làm việc cho bạn. Nó sẽ được dựa trên một số giả định, nhưng nó sẽ giúp thu hẹp danh sách các tính năng giống hệt nhau của bạn. Đây không phải là một quá trình tự động, nhưng nó sẽ yêu cầu xem xét thủ công các bản sao. Dựa trên các nhận xét, có vẻ như các công cụ tự động không so sánh các thuộc tính vì vậy điều này sẽ giúp bạn không vô tình xóa các tính năng.

Sử dụng ArcMap

(1) Tạo một bản sao của shapefile của bạn trong trường hợp có sự cố.

(2) Thêm một cột vào shapefile của bạn dưới dạng gấp đôi.

(3) Tính diện tích cho từng tính năng bằng cách sử dụng định dạng mô tả (chính xác nhất) mà bạn có thể. Một cái gì đó mà làm tròn có thể không phải là một vấn đề.

(4) Chạy một bản tóm tắt (tóm tắt) trên cột đó. Hãy chắc chắn rằng bạn chọn một mã định danh duy nhất trong phần tóm tắt và đánh dấu cả đầu tiên và cuối cùng.

(5) Trong bảng đầu ra của bạn, hãy tìm những bản ghi có trường đếm cao hơn 1.

(6a) Kiểm tra thủ công các tính năng và lặp lại quy trình cho đến khi không còn bản sao nữa.

(6b) Bạn chỉ có thể tạo một danh sách các id duy nhất đó và xóa các tính năng thông qua arcpy, nhưng bạn có khả năng có thể có hai tính năng không xác định với cùng một khu vực.

Một kỹ thuật khác sử dụng ArcPy

Khi tôi đang xây dựng câu trả lời ở trên, tôi nghĩ đến khả năng nhiều tác giả của dữ liệu này có thể đã thực sự sử dụng cùng một mã định danh duy nhất cho các tính năng trùng lặp. NẾU đó là trường hợp, bạn có thể tìm thấy các bản sao thông qua việc lặp trong arcpy.

Cách tôi nghĩ về việc làm điều này bằng ArcPy có thể đánh thuế vào hệ thống của bạn và mất một chút.

(1) Tạo một bản sao của shapefile của bạn (trong trường hợp một lần nữa)

(2) Thêm một cột mới để biểu thị các bản sao. Một cái gì đó giống như 'y' hoặc 'n' hoặc 0 hoặc 1 hoặc bất cứ thứ gì sẽ hoạt động.

(3) Tạo một danh sách trong python để lưu trữ định danh duy nhất.

(4) Chạy một con trỏ cập nhật ( arcpy.UpdateCursor('LAYERNAME')). Đối với mỗi bản ghi, hãy kiểm tra danh sách của bạn để xem nó có chứa định danh đó không và đánh dấu cột của bạn để tìm bản sao nếu nó ở đó.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) Sau đó, bạn có thể so sánh hoặc làm bất cứ điều gì bạn muốn với các cột được đánh dấu.

Có lẽ có nhiều cách tốt hơn để thực hiện những so sánh này, nhưng đó là hai cách mà tôi tin rằng nên hoạt động hoặc ít nhất là giúp bạn bắt đầu.

Biên tập

Dựa trên nhận xét của elrobis , bạn có thể sử dụng hình chữ nhật giới hạn tối thiểu để giảm thêm cơ hội xóa các tính năng không chính xác.

Sử dụng ArcMap, bạn có thể chạy công cụ Hình học giới hạn tối thiểu trong Quản lý dữ liệu. Sau khi kiểm tra các tùy chọn, tôi nghĩ rằng sử dụng tùy chọn CONVEX_HULL có lẽ là tốt nhất.

Nếu bạn so sánh các trường MBG_APodX / Y1 , MBG_APod_X / Y2 cùng với MBG_Orientation cho các bản sao, bạn sẽ có thể có được ý tưởng tốt về các tính năng trùng lặp. Tôi sẽ đề nghị sử dụng phương pháp Tóm tắt mà tôi đã mô tả ở trên để so sánh. Chọn một trong các đỉnh (tọa độ) từ hình chữ nhật giới hạn để tìm các bản sao. Bạn có thể nhận được một vài 'trận đấu' ngẫu nhiên, nhưng một khi bạn thêm vào các đỉnh khác cộng với định hướng, sẽ là một đặt cược khá an toàn rằng các tính năng kết quả là trùng lặp.

Mặc dù tôi chưa sử dụng nó và tôi không chắc chắn về kết quả từ công cụ này, nhưng bạn có thể thấy việc kiểm tra shapefile kết quả dễ dàng hơn nếu bạn sử dụng công cụ Tóm tắt Thống kê trong ArcMap. Có vẻ như bạn có thể tóm tắt nhiều cột theo cách đó thay vì tùy chọn cột đơn của tôi.

Tôi không nghĩ rằng sẽ có một cách hoàn toàn tự động để làm điều này mà không phải lo lắng về khả năng xóa một tính năng không trùng lặp. Các phương pháp này sẽ giúp giới hạn số lượng tính năng bạn cần xem xét thủ công.


Tôi giả sử đó là những đa giác. Nếu chúng là các dòng, bạn có thể sử dụng chiều dài. Điểm dễ nhất với tọa độ X / Y.
Branco

2
Tôi cũng nghĩ về "các tính năng diện tích bằng nhau", nhưng điều đó gây ấn tượng với tôi vì rất có thể dấu chân của bldg có thể có đủ các loại hình dạng giống nhau để tạo ra các kết quả khớp ngoài ý muốn. Tôi nghĩ rằng nó sẽ cải thiện tỷ lệ cược để tinh chỉnh thêm mọi thứ với giao điểm MBR của các tính năng. Đó là, nếu chúng có cùng một khu vực (và có thể là cùng một tính năng) VÀ MBR của chúng giao nhau, thì có lẽ chúng là hai thế hệ có cùng tính năng. Điều đó có ý nghĩa?
elrobis

2

Bạn có thể làm điều này trong SQL bằng cách sử dụng tự tham gia không gian. Bạn không nói rõ phương ngữ SQL nào bạn đang sử dụng, vì vậy ví dụ này sử dụng Postgres / Postgis, nhưng nó có thể dễ dàng thích nghi với Oracle hoặc SQL Server. Giả sử một bảng được gọi là các tòa nhà, với hình học được lưu trữ trong một cột được gọi là geom:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Điều này sẽ tìm thấy các giao điểm. Nếu bạn muốn có sự bình đẳng hoàn toàn thì hãy thay thế ST_Intersects bằng ST_Equals. Hoặc, chỉ cần kết hợp cả hai:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

Lưu ý, a.id <b.id có nghĩa là bạn chỉ xem xét một nửa các trường hợp trong tự tham gia, điều này làm cho nó a) nhanh hơn và b) cung cấp cho bạn một danh sách bạn có thể sử dụng để xóa một nửa đa giác chồng chéo mà không xóa tất cả . Rõ ràng, đây vẫn là một thuật toán O (n²), nhưng trên thực tế, sẽ nhanh hơn rất nhiều nếu bạn có một chỉ số không gian - đây thực sự là một yêu cầu tổng thể cho bất kỳ tập dữ liệu không tầm thường nào.

Bạn có thể cần xoa bóp điều này một chút để phù hợp với một số định nghĩa về sự chồng chéo - bạn không muốn xóa những ngôi nhà lân cận đã bị khảo sát xấu.


Nếu bạn đang thiếu một thuộc tính duy nhất trong shapefile, bạn có thể sử dụng a.rowidthay vì a.id. rowidlà một từ khóa trong SQLite sẽ cung cấp cho bạn ID nội bộ của bộ dữ liệu.
LuWi

1

Plugin Topology Checker là một công cụ tốt nếu được sử dụng đúng cách. Bạn vẫn phải có hiểu biết cơ bản về dữ liệu của mình VÀ bạn phải thực hiện 'chỉnh sửa' theo cách thủ công. Các plugin sẽ làm nổi bật những gì nó nghĩ là lỗi. Sau đó, tùy thuộc vào bạn để kiểm tra từng và đưa ra quyết định phù hợp cho bạn và dữ liệu của bạn. Với 90 000 mặt hàng trong lớp của bạn, bạn có thể về nhà vào Giáng sinh!

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.