Loại bỏ khoảng cách nhỏ (slivers) giữa các đa giác? [đóng cửa]


51

Tôi có một bộ đa giác đại diện cho các khu hành chính. Các quận được số hóa bằng tay và có những khoảng trống nhỏ (các phần tử) giữa các đa giác nơi các đa giác sẽ được chạm vào.

Làm thế nào tôi có thể có các đa giác dính lại với nhau, loại bỏ khoảng trắng?

QGIS ưa thích, nhưng ArcGIS và lập trình chung cũng là những lựa chọn.

Câu trả lời:


27

Sử dụng Loại bỏ (Yêu cầu phải có Giấy phép ArcInfo)

Loại bỏ đa giác bằng cách hợp nhất chúng với các đa giác lân cận có diện tích lớn nhất hoặc đường viền chung dài nhất. Loại bỏ thường được sử dụng để loại bỏ các đa giác mảnh nhỏ là kết quả của các hoạt động lớp phủ, chẳng hạn như Intersect hoặc Union.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htmlm

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

Người dùng ArcGIS 10 Lưu ý rằng có một Tính năng MỚI trong Tùy chọn cho Công cụ này.

Bây giờ có thể bảo vệ POLYGON hoặc POLYLINE ban đầu với tùy chọn> ex_features (Tùy chọn) Một lớp hoặc lớp tính năng đa giác hoặc đa giác đầu vào xác định ranh giới đa giác hoặc các phần của chúng, không nên loại bỏ.


3
Nó có hoạt động trong trường hợp của sở thú không? Dường như không có phần nào trong tập dữ liệu, chỉ là khoảng cách giữa các đa giác.
underdark

3
Tôi đã sử dụng công cụ này thành công để xóa khoảng cách giữa các đa giác. Có một vấn đề với việc sử dụng công cụ này mặc dù. Khi nó phá vỡ các đa giác trong quá trình địa vật lý, nó sẽ tổng quát hóa các đa giác mới được tạo. Vì vậy, các đường cong sẽ không bằng phẳng, thay vào đó có các đường "lởm chởm" sắc nét. Ymmv.
amasephy

3
@underdark Điểm tốt. Tuy nhiên, người ta luôn có thể giới thiệu các phần tử thông qua sự kết hợp dữ liệu với một đa giác xung quanh nguyên khối (chẳng hạn như hộp giới hạn của bộ dữ liệu). Một câu hỏi thú vị là làm thế nào "Loại bỏ" chọn đa giác để hợp nhất các phần tử vào. Điều này có thể sai lệch kết quả (mặc dù tôi nghi ngờ sự thiên vị sẽ quan trọng trong hầu hết các ứng dụng). Trong tình huống cụ thể này, một giải pháp lý tưởng sẽ phân chia các phần tử, hoặc tính trung bình các lỗi.
whuber

Một trong các tùy chọn của công cụ là hợp nhất mảnh cúi với đa giác lân cận với đường viền dài nhất (tùy chọn mặc định) hoặc khu vực lớn nhất.
kenbuja

4
Nếu bạn không có giấy phép ArcInfo, có một tập lệnh tại arcscripts.esri.com/details.asp?dbid=14672 sẽ tự động hóa việc này thông qua Python. Tôi đã sử dụng nó thành công một vài năm trước đây.
Stephen chì

20

Để thực hiện điều này bằng tay trong QGIS, hãy chuyển đến Settings|Project Properties...Trên Generaltab ở dưới cùng là Snapping options...Kiểm tra lớp bạn muốn chụp, đặt chế độ thành to vertexvà đặt dung sai cho một số giá trị nhỏ hơn khoảng cách ngắn nhất giữa hai điểm bạn có. Nếu bạn không chắc chắn, hãy đặt đơn vị thành pixelsvà dung sai thành 5 để nếu có một số chi tiết khó hiểu, bạn có thể phóng to ngay và chắc chắn rằng bạn không chụp nhầm vào đỉnh.

Sau đó chỉnh sửa lớp vectơ của bạn, chọn công cụ nút và di chuyển các điểm sai lầm sang đối tác của chúng.

Làm nó tự động là một chút khó khăn hơn. AFAIK QGIS không có plugin để tự động hóa nó và mặc dù PostGIS được xây dựng trên GEOS có chức năng chụp nhanh, nhưng chúng không được tiếp xúc với PostGIS. Có thể viết một truy vấn để kiểm tra từng điểm của đa giác cho hàng xóm trong khoảng cách chụp nhanh, nhưng điều đó hiện vượt quá khả năng của tôi để mở rộng.

GRASS có v.clean.snap mà bạn có thể truy cập thông qua QGIS, nhưng có thêm bước tạo bộ dữ liệu GRASS.


Bạn luôn có thể sử dụng hộp công cụ xử lý QGIS và áp dụng trực tiếp v.clean.snap vào shapefile của bạn.
SAnderka

v.clean.snap không có sẵn. tôi đã sử dụng v.clean và sau đó chọn công cụ snap và nó đưa ra một lớp trống. Tài liệu nói rằng snap là để nối các dòng với đỉnh. Tôi muốn nối đỉnh này đến đỉnh khác trong ngưỡng.
neogeomat

17

Nếu bạn quen thuộc với QGIS: Trong trung kế QGIS 1.9 (có thể được cài đặt dưới dạng qgis.dev thông qua trình cài đặt OSGEO, hãy xem trang chủ của qgis) là một chức năng mới trong menu vectơ có tên "Loại bỏ đa giác cúi", chính xác là những gì bạn muốn Bạn có thể chọn các đa giác có vấn đề và hợp nhất chúng với các đa giác liền kề dựa trên một ranh giới chung hoặc khu vực đẩy. Hãy thử nó!


3
Để cập nhật câu trả lời này, trong QGIS 2.18.1 'Loại bỏ đa giác mảnh' có sẵn trong gói ổn định và được tìm thấy trong Vector -> Công cụ xử lý địa lý.
Valerie Anderson

Điều này áp dụng cho các đa giác phân tầng đi lạc hiện có ở giữa các đa giác chính, không phải trong trường hợp khoảng trắng giữa các đa giác.
stragu

15

Nếu bạn là người dùng QGIS hơn bạn sẽ nhận được tất cả sức mạnh của GRASS, vì đó là một hệ thống thông tin địa hình hoàn toàn. Bên trong QGIS kích hoạt plugin GRASS, tạo vị trí / bộ bản đồ để nhập dữ liệu của bạn.

Mở mapset và nhập cho bạn lớp bẩn bằng v.in.ogr: chơi với hai tham số nâng cao "ngưỡng chụp cho ranh giới" và "kích thước tối thiểu của khu vực được nhập".

Bạn cũng có thể sử dụng các tùy chọn mà mô-đun v.clean cung cấp.


10

ArcGIS có các quy tắc cấu trúc liên kết sẽ giúp bạn xác định và sửa các khoảng trống trong dữ liệu của bạn, chẳng hạn như những gì bạn đang đề cập đến. Để tạo Quy tắc cấu trúc liên kết, bạn sẽ cần giấy phép ArcEditor hoặc ArcInfo và lưu trữ Lớp tính năng của bạn trong Bộ dữ liệu tính năng trong cơ sở dữ liệu địa lý cá nhân hoặc tệp.

Bạn rất có thể muốn thực hiện quy tắc " Phải không có khoảng trống ". Khi bạn đã tạo cơ sở quy tắc với tất cả các quy tắc mà bạn cho là cần thiết, bạn sẽ muốn xác thực cấu trúc liên kết sẽ xác định tất cả các lỗi trong dữ liệu của bạn.

Sau đó, bằng cách sử dụng Trình kiểm tra lỗiCông cụ sửa lỗi cấu trúc liên kết , bạn có thể chọn riêng lẻ hoặc hàng loạt các lỗi bạn muốn sửa và cách bạn muốn sửa chúng (nghĩa là tạo đa giác mới để lấp đầy khoảng trống hoặc hợp nhất với đa giác lớn hơn gần đó) .


7

Có một chức năng "Loại bỏ đa giác cúi" trong Hộp công cụ QGIS 2.12 (Lyon). Tôi chắc chắn rằng nó cũng có trong một số phiên bản trước đó.


2

Chà, tôi đã sử dụng chức năng PostGIS (tôi sử dụng trực tiếp trên QGIS của tôi) để thực hiện một snap đệ quy để giải quyết vấn đề này. Kết quả khá tốt, nó chỉ đòi hỏi một giá trị khoan dung tốt để có kết quả tốt nhất. Nếu bạn sẵn sàng thử, hãy kiểm tra nó (trong trường hợp của tôi hình học là tất cả, do đó st_multi trong thực thi của tôi):

CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS 
        $BODY$
            DECLARE
            id int;
            BEGIN
                FOR id in execute('select id from '||tabela)
                LOOP
                    EXECUTE     
                'update '||tabela||' as classe set geom = st_multi(res.geom) 
                from 
                    (
                        select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id 
                        from '||tabela||' a, '||tabela||' b 
                        where a.id != b.id and a.id = '||id||' 
                        group by a.id, a.geom
                    ) as res 
                where res.id = classe.id';
                END LOOP;
                RETURN;                        
            END
        $BODY$
        LANGUAGE plpgsql;

1

Không phải là một giải pháp hoàn hảo, nhưng một trong hai điều này hiệu quả với tôi trong hầu hết các trường hợp:

  1. Trong QGIS, lưu lớp ở định dạng GEOJSON. Nhưng trước khi lưu, trong hộp thoại "lưu lớp dưới dạng", đặt độ chính xác tọa độ thành 3 (15 là mặc định). Điều này sẽ có tác dụng hợp nhất các đỉnh rất gần nhau.

  2. Tới Mapshaper , tải lên các tập tin, và nhấn "đơn giản hóa". Ở góc trên bên trái, nó sẽ cho bạn biết có bao nhiêu giao điểm đường mà nó tìm thấy và sẽ cung cấp cho bạn tùy chọn để sửa chúng. Tôi thấy sửa chữa này hoạt động khoảng một nửa thời gian.


0

Tôi đã không sử dụng nó, nhưng ET Geowizards , mà mang lại nhiều ArcEditor và ArcInfo chỉ cụ chế biến giấy phép mức ArcView (aka ArcGIS Standard) đã một Loại bỏ thuật sĩ rằng "Loại bỏ đa giác không mong muốn (miếng) bằng cách kết hợp chúng thành các đa giác láng giềng hoặc xóa chúng " . Bộ công cụ thuật sĩ sẽ đặt lại cho bạn $ 250 usd ( pricelist ).


0

Tôi đã đối mặt với cùng một vấn đề, bằng cách khám phá các công cụ tôi đã giải quyết khá dễ dàng mặc dù tôi không biết logic. ! [Trong các công cụ, hãy chuyển đến hộp công cụ Quản lý dữ liệu, đi đến Lớp tính năng và chạy tập lệnh Tích hợp bằng cách nhấp đúp] [1]

trong cửa sổ Script chọn lớp tính năng có vấn đề và trong dung sai XY thêm vale bằng cách đo khoảng cách với sự trợ giúp của công cụ đo tại nhiều điểm và lấy một vale trung bình đặt giá trị đó vào môi trường dung sai và áp dụng giải quyết vấn đề không phải bây giờ làm thế nào nhưng giải quyết với độ chính xác khoảng 90%. ! [nhập mô tả hình ảnh ở đây] [2]

Tôi đã thử tất cả các phương pháp khác được mô tả trong các câu trả lời ở trên nhưng thật khó khăn và cồng kềnh để có được các hiệu chỉnh tự động cho các khoảng trống giữa các đa giác liền kề.


1
Nếu bạn dán một liên kết đến các hình ảnh mà bạn đang đề cập đến, tôi có thể thêm chúng vào.
djq
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.