Çokgenler arasındaki küçük boşlukların (şeritlerin) kaldırılması? [kapalı]


51

İdari bölgeleri temsil eden çokgenler var. İlçeler elle dijitalleştirildi ve çokgenlerin temas etmesi gereken çokgenler arasında küçük boşluklar var.

Çokgenlerin birbirine yapışıp boşlukları nasıl kaldırabilirim?

QGIS tercih edildi, ancak ArcGIS ve genel programlama da seçeneklerdir.

Yanıtlar:


27

Ortadan Kaldır'ı kullanın (ArcInfo Lisansı gerekir)

Çokgenleri, en geniş alana veya en uzun paylaşılan kenarlığa sahip olan komşu çokgenlerle birleştirerek ortadan kaldırır. Ortadan Kaldır, genellikle Intersect veya Union gibi bindirme işlemlerinin sonucu olan küçük şerit çokgenleri kaldırmak için kullanılır.

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

görüntü tanımını buraya girin

ArcGIS 10 Kullanıcıları Bu Aracın Seçeneklerinde YENİ Bir Özellik olduğuna dikkat edin.

Artık orijinal POLYGON veya POLYLINE'ı> ex_features (İsteğe bağlı) seçeneği ile korumak mümkündür: poligon sınırlarını veya bunların bölümlerini ortadan kaldırmaması gereken bir poligon veya poligon özellik sınıfı veya katmanı tanımlayın.


3
Bu hayvanat bahçesi davasında işe yarıyor mu? Veri setinde hiç şerit yok, sadece çokgenler arasındaki boşluklar var.
underdark

3
Poligonlar arasındaki boşlukları gidermek için bu aracı başarıyla kullandım. Yine de bu aracı kullanırken bir sorun var. Coğrafi işlem sırasında çokgenleri kırdığında, yeni oluşturulan çokgenleri genelleştirir. Bu nedenle, eğriler pürüzsüz olmayacak, keskin "pürüzlü" çizgilere sahip olacaklar. YMMV.
Amasephy

3
@ underdark İyi bir nokta. Bununla birlikte, bir kullanıcı her zaman şeritleri, veriyi bir monolitik çevre poligonu (veri setinin sınırlayıcı kutusu gibi) ile birleştirerek verebilmektedir. İlginç bir soru, “Ortadan Kaldır” ın şeritleri birleştirmek için hangi çokgenleri seçtiğidir. Bu sonuçları önyargılı hale getirebilir (önyargının çoğu uygulamada önemli olacağından şüpheliyim). Bu özel durumda, ideal bir çözüm şeritleri ayırır veya hataları ortalar.
whuber

Aracın seçeneklerinden biri, şeridi, en uzun kenarlıklı (varsayılan seçenek) veya en geniş alanlı komşu poligonla birleştirmektir.
kenbuja

4
Bir ArcInfo lisansınız yoksa, arcscripts.esri.com/details.asp?dbid=14672 adresinde bu komutu Python aracılığıyla otomatikleştiren bir komut dosyası vardır . Birkaç yıl önce başarıyla kullandım.
Stephen Lead

20

Bunu QGIS'de elle yapmak için, Settings|Project Properties...alttaki Generalsekmede On seçeneğine gidin. Snapping options...Yapmak istediğiniz katmanı kontrol edin, modu to vertexayarlayın ve toleransı sahip olduğunuz iki nokta arasındaki en kısa mesafeden daha düşük bir değere ayarlayın. Emin değilseniz, birimleri pixelsve 5 gibi bir şeye toleransı ayarlayın, böylece bazı yanlış ayrıntılar varsa, tam yakınlaştırıp doğru köşeye sığmadığınızdan emin olun.

Sonra vektör katmanınızı düzenleyin, düğüm aracını seçin ve hatalı noktaları benzerlerine taşıyın.

Otomatik olarak yapmak biraz daha zor. AFAIK QGIS'in bunu otomatikleştirmek için bir eklentisi yok ve PostGIS'in takma işlevi olan GEOS üzerine kurulmuş olmasına rağmen, PostGIS'e maruz kalmıyorlar. Bir poligonun her bir noktasını yapışma mesafesindeki komşular için kontrol etmek için bir sorgu yazmak mümkün olabilir, ancak bu şu an üzerinde genişlemek için olan zekamın ötesindedir.

GRASS, QGIS üzerinden erişebileceğiniz v.clean.snap dosyasına sahiptir, ancak bir GRASS veri kümesi oluşturmanın ilave bir adımı vardır.


Her zaman QGIS işleme araç kutusunu kullanabilir ve v.clean.snap dosyasını doğrudan shapefile'inize uygulayabilirsiniz.
SAnderka

v.clean.snap mevcut değil. Ben v.clean kullandım ve sonra snap aracını seçtim ve boş bir katman verdi. Belgelendirme, bu ekin, çizgileri tepe noktasına bağlamak olduğunu söylüyor. Köşe eşiğindeki başka bir köşeye katılmak istiyorum.
neogeomat

17

QGIS'e aşina iseniz: QGIS trunk 1.9'da (OSGEO yükleyici aracılığıyla qgis.dev olarak kurulabilir, bkz. Qgis ana sayfası), vektör menüsünde tam olarak ne yaptığını yapan "Şerit çokgenleri yok et" adlı yeni bir işlevdir. istemek. Sorunlu çokgenleri seçebilir ve bunları ortak bir sınır veya alan ilerlemesine dayanarak bitişik çokgenlerle birleştirebilirsiniz. Denemek!


3
Bu cevabı güncellemek için, QGIS 2.18.1'de 'Şerit Çokgenleri Ortadan Kaldırma' kararlı paket içinde bulunur ve Vektör -> Coğrafi İşleme Araçları altında bulunur.
Valerie Anderson

Bu, çokgenler arasındaki boşluklarda değil, ana olanlar arasındaki mevcut başıboş şerit çokgenler için geçerlidir.
stragu,

15

Eğer bir QGIS kullanıcısıysanız, GRASS'ın tüm gücüne sahip olursunuz, çünkü tamamen topolojik bir CBS'dir. QGIS içinde GRASS eklentisini etkinleştirin, verilerinizin alınacağı bir yer / harita oluşturun.

Mapset'i açın ve v.in.ogr ile kirli katmanı içe aktarın: "Sınırlar için eşik tutma eşiği" ve "içe aktarılacak alanın minimum boyutu" olmak üzere iki gelişmiş parametre ile oynayın.

V.clean modülünün sağladığı seçenekleri de kullanabilirsiniz.


10

ArcGIS, atıfta bulunduğunuz gibi verilerinizdeki boşlukları tanımlamanıza ve düzeltmenize yardımcı olacak topoloji kurallarına sahiptir . Topoloji Kuralları oluşturmak için bir ArcEditor veya ArcInfo lisansına ihtiyacınız olacak ve Özellik Sınıfınızı kişisel veya dosya bir coğrafi veritabanında bir Özellik Veri Kümesinde saklayacaksınız.

Büyük olasılıkla " Boşluk Olmamalı " kuralını uygulamak isteyeceksiniz . Rulebase'i gerekli olduğunu düşündüğünüz tüm kurallara göre oluşturduktan sonra, verilerinizdeki tüm hataları tanımlayacak topolojiyi doğrulamak istersiniz.

Ardından, Hata Denetçisi ve Topoloji Hatalarını Düzeltme Aracı'nı kullanarak, düzeltmek istediğiniz hataları ve nasıl düzeltmek istediğinizi tek tek veya toplu olarak seçebilirsiniz (örn. Boşlukları doldurmak veya yakındaki daha büyük çokgenlerle birleştirmek için yeni çokgenler oluşturun). .


7

QGIS 2.12 (Lyon) Araç Kutusunda "Şerit çokgenleri ortadan kaldır" işlevi bulunmaktadır. Daha önceki bir sürümde de olduğundan eminim.


2

Eh, ben bu sorunu çözmek için özyinelemeli bir çırpıda yürütür bir PostGIS işlevi (doğrudan benim QGIS üzerinde kullanıyorum) kullanıyorum. Sonuçlar oldukça iyi, sadece en iyi sonuçları elde etmek için tolerans değerlerinin iyi bir karışımını talep ediyor. Denemeye istekliysen, kontrol et (benim durumumda geometrilerin hepsi çoklu, bu yüzden benim çalıştırmamdaki st_multi):

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

Mükemmel bir çözüm değil, ancak bu iki şeyden biri çoğu durumda benim için çalışıyor:

  1. QGIS'te katmanı GEOJSON formatında kaydedin. Ancak kaydetmeden önce, "katmanı farklı kaydet" iletişim kutusunda koordinat hassasiyetini 3 olarak ayarlayın (varsayılan değer 15'tir). Bu, birbirine çok yakın olan köşeleri birleştirme etkisine sahip olacaktır.

  2. Mapshaper'a gidin , dosyayı yükleyin ve "basitleştir" e tıklayın. Sol üst köşede, kaç tane kesişme noktası bulduğunu size söyler ve bunları düzeltmek için seçenek sunar. Bu düzeltmenin yaklaşık yarısında işe yaradığını düşünüyorum.


0

Ben kullanmadım, ama ET Geowizards ArcView seviyesi lisans (aka ArcGIS Standardı) birçok ArcEditor ve Arcinfo sadece işleme araçları getiriyor, bir etmiştir Sihirbazı eleyin o komşu poligon bunları birleştirerek istenmeyen çokgenler (kıymık) ortadan kaldırır" ya da siliniyor " . Sihirbaz araç seti 250 $ usd ( fiyat listesi ) olarak ayarlayacaktır .


0

Aynı problemle karşılaştım, araçları inceleyerek mantığı bilmeme rağmen oldukça kolay bir şekilde yerleştim. ! [Araçlarda Veri Yönetimi araç kutusuna gidin, Özellik Sınıfına gidin ve Integrate betiğini çift tıklatarak çalıştırın] [1]

Script penceresinde problemli özellik sınıfını seçin ve XY toleransında, birden fazla noktadaki ölçüm aracı yardımıyla mesafeyi ölçerek vale ekleyin ve bu değeri tolerans ortamında koyup ortalama bir değer elde edin. Şimdi değil nasıl ama yaklaşık% 90 doğruluk ile çözüldü. ! [buraya görüntü açıklamasını girin] [2]

Yukarıdaki cevaplarda açıklanan diğer tüm yöntemleri denedim, ancak bitişik çokgenler arasındaki boşluklar için otomatik düzeltmeleri almak zor ve zahmetliydi.


1
Eğer bahsettiğiniz resimlere bir link yapıştırırsanız onları ekleyebilirim.
djq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.