Ücretsiz CBS yazılımında sahte düğümler mi buldunuz?


16

Yazılım gvSIG OA Digital Edition 2010, doğrusal geometride sahte düğümleri bulmak için araçlar topolojisine sahiptir. 20000 bağlantı sayısı doğrusal geometrisi için küme toleransı 0.00002 ve maksimum hata sayısı -10000 ayarladım. Ancak başarısız sonuç.

Ücretsiz GIS yazılımında sözde düğümleri bulan çözümler var mı?

Ben sahte düğümler katman gerekiyor (bu sorunun bir çözüm - ArcInfo araç topolojisi kullanmak, ama benim için öncelik özgür yazılım kullanmaktır). Doğrusal geometri, PostGIS (v. 2.0.1) veritabanında QGIS 1.8.0'da birkaç kullanıcı oluşturdu.

Yeni resim ekle: A (satır 4/5), B (satır 6/7), C (satır 9/10) içinde üç sahte düğümlü 12 doğrusal özellik. Bunun yerine sözde düğümler nokta olmalıdır - bir noktadan (düğüm) kesişen iki doğrusal özellik bir doğrusal özellik olmalıdır (satır 4/5 - satır 4, ...).

PostGIS'te sözde düğüm katmanıyla sonuçlanacak bir istekte bulunmak mümkün müdür?

Örneklerin sözde düğümlerinin yeni görüntüsünü ekleyin: doğrusal katman noktası katmanı için sözde düğümler alırsam (mavi rects) Doğrusal katmandaki aşağıdaki hataları düzelttim: A - eksik geometri ekleyin, B - kesişimdeki kopuk çizgi, C - sözde düğümü kaldırın.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin


2
GRASS komut rmdangle, ancak sonuç olarak sözde düğümler olmadan shp dosyası var. Sonuç olarak sözde düğümlerin shp dosyası (veya başka bir
biçimi

PostGIS 2.0 kullanıyor musunuz? Evet ise, Is_Valid ve Makevalid işlevlerini deneyin.
Giovanni Manghi

Evet, PostGIS 2.0 kullanıyorum. Sözde düğümleri aramak için bu işlevleri nasıl kullanmalıyım? "QGIS için PgQuery" ile bulmak mümkün mü?
HasT

evet, bunları QGIS içinde, örneğin DB Manager (sözdizimi vurgulama ve otomatik tamamlamayı destekleyen) gibi bir PostGIS sorgusu çalıştırmanıza izin veren herhangi bir araçta kullanabilirsiniz.
Giovanni Manghi

ikinci resimdeki kırmızı nokta iki geçerli geometrinin kesişimidir .. doğru mu?
vinayan

Yanıtlar:


8

Burada, PostGIS veya diğer OGC uyumlu yazılımlarla uygulayabileceğiniz genel bir çözüm.

NOT: daha önce söylediğim gibi , FOSS ve CBS'de kilit bir kavram standardizasyondur : en iyi çözümler OGC olanlar gibi standartları benimser .


Senin sorunun "sahte düğüm bulmak" ... Ama ben biraz daha fazla olduğunu düşünüyorum, "sahte olmayan düğümleri bulmak ve sahte düğüm satırları katılmak". Benim çözümüm her ikisi için de kullanılabilir.

OGC standartları şunları sunar:

  • ST_Boundary (geom) : çizgilerin düğümlerini tespit etmek için

  • ST_Dump (geom) : her bir düğümü SQL tablo kaydına koymak için.

  • ST_Dİçinde, ST_Equals, ST_SnapToGrid, ST_Snap değişiklik toleransı için kullanılabilir. ST_DWithin kullanıyorum.

Ana sorununuzun bu nesneler ve özelliklerle belirtilebileceğini varsayabiliriz,

  • bir LINESTRING geometrisi ile temsil edilen sadece çizgi bölümleri (bir tablo çizgisi ) vardır ... MULTILNE ile test edilmedim, geometri tip = MULTIPOINT varsa, MULTILINE'ları ST_Dump ve ST_LineMerge ile bölebilir ve dökebilirsiniz;

  • her çizgi parçası bir (geometri kimliği) gid ve (renk kimliği) idline sahiptir .

Yani, ilk adım, çizgilere katılmadan gelen düğümleri elde etmektir,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

NOT: önbellekleri kullanarak görünümlerden daha hızlıdırlar. CPU süresini kontrol etmek için "EXPLAIN SELECT ..." seçeneğini kullanın, uzun sürebilir.

Burada döngüler ve sürekli (aynı renk) çizgiler ncolors=1nokta olarak algılanır ve sözde düğümler ncolors=2noktalara göre belirlenir, böylece bu noktalara sahip bir katmanınız olur.

"İyi düğümler" tablonuz orijinal "sınırlayıcı noktalar" ile ve "sözde düğümler" olmadan.

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

Çözüm için teşekkürler! Sorguyu çalıştırmayı deniyorum (pgAdmin'de) ama istisna alıyorum: "function array_distinct (integer []) yok". Neyi yanlış yapıyorum?
HasT

Maalesef, belirtilmeyen array_distinctişlev bir postgres.cz kütüphanesinden . Diğer hatalar, lütfen rapor edin, buraya daha fazla açıklama ekleyebilirim.
Peter Krauss

Array_distinct işlevini ekledim. Veritabanı doğrusal katmanında "the_geom" geometri sütun adı bulunur (bunun yerine sorguda "geom"). Ben "geom" yerine "ST_Boundary (the_geom)" için "the_geom" yerine "renkler, geom FROM" yerde "sütun" geom "yok" iletisini alıyorum. Ben "renkler olarak, geom FROM" yerine "renkler, the_geom FROM" yerine, ama yine "sütun" the_geom "yok" iletisi alıyorum.
HasT

Tamam, değişmiş (düzenlenmiş cevap bakınız) geomiçin the_geom. (ST_Dump (x)) geom olarak kal, bir veritabanı özelliği değildir.
Peter Krauss

Teşekkürler! Sorgu işleri. ST_Desalleri üzerinde ST_DWithin'i değiştirdim ve ST_Buffer için 0.00002 DD toleransı verdim. Sonuç olarak doğru düğümleri aldım (bir düğümde 3 ve daha fazla doğrusal özelliği kesişir). Nerede bir düğüm 2 doğrusal özellikleri (FROM vw_joinnodes_full WHERE ncolors = 2;) kesiştiği sonuç almak istiyorum, ancak alınan nokta katmanı burada bir düğüm 2 ve daha fazla doğrusal özellikleri kesişir. Bir düğümde sadece 2 doğrusal özelliğin kesiştiği yerde sonuç nasıl alınır?
HasT

7

Refractions Research , istediğinizi yapan bir Çizgi Temizleyici aracı yaptı .

Çizgi Temizleyici, karmaşık, döngüsel, çok kısa ve sıfır uzunluklu geometrileri basitleştirerek ve sözde düğümleri ve önemsiz tepe noktalarını kaldırarak ağları temizler. En önemlisi, temizleme aşamasında, özellik eşleşmelerinin otomatik olarak dikkate alınmasını sağlayabilir

resim açıklamasını buraya girin

Kaynak kodu GitHub'dan bulunabilir.


Cevap için teşekkür ederim. Ancak hataların bir sonucu olarak sözde düğüm bir nokta katmanına ihtiyaç duyar. Bu hatalar kullanıcılar tarafından manuel olarak düzeltilmelidir, çünkü bir düğümde üç çizgiyle kesişmesi gereken zamanlar vardır, ancak çizgilerden biri tepe noktasına atlanır veya yapıştırılmaz.
HasT

Bu işe yarayacak gibi görünüyor. Tam olarak burada ne söylemeye çalıştığınızı anlamakta zorluk çekiyorsunuz. "Pseudo node'un bir nokta katmanına ihtiyacı olan hataların bir sonucu olarak" Bununla ne demek istediğini anlamıyorum. Bunun çalışması için her satırın sonuna nokta eklenmiş bir nokta katmanına mı ihtiyacınız var?
Rayner

@Rayner, örneklerin sözde düğümlerinin yeni görüntüsünü ekle (3): doğrusal katman noktası katmanı sözde düğümleri (mavi rects) için alırsam, doğrusal katmandaki sonraki hataları manuel olarak düzeltirim (otomatik olarak değil): A - eksik geometri ekle, B - yakalandı satır kesişme, C - sözde düğümü kaldır. Otomatik olarak sözde düğümleri düzeltirsem A, B yerlerinde hata bıraktım.
HasT

Tamam, B ve C'yi anlıyorum. "A - eksik geometri ekle" derken bu ne anlama geliyor? 2 hattın buluştuğu noktaya eklenmesi gereken bir nokta var mı?
Rayner

@Rayner, 'A' da doğrusal özellik (görüntülere göre cadde / yol) eklenmelidir. А - düğümde görüntülere göre yeni geometri eklemek için hazırlandı, ancak geometri eklenmedi (boyalı geometri bulamadığım katman sahte düğümlerini kullan)
HasT

2

Özgür olmayan çözüm: FME + MRF + SmartCleaner trafo

Ücretsiz çözüm GRASS v.clean (GRASS araçlarıyla en son QGIS 1.8.0, onu kullanmanın en kolay yoludur) ve diğer topoloji temizleme araçları


QGIS 1.8.0. SEXTANTE eklentisini C: \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins dizinine (1.0.7) yükleyin. QGIS projesine doğrusal shp dosyası yükleyin (CRS katmanı ve proje WGS1984, 'anında' dönüşüm açık). Sonra 'GRASS bölgesini tuval üzerine tanımla' (GRASS komutları - Araçlar) ve v.clean - rmdangle komutunu çalıştırıyorum (Thershold = 0, çıkış vektörü / hataları için dir / name girin). Çalıştırdıktan sonra işlem alma hatası 'Katman yüklenemedi: D: /error.shp Hatalara bakmak için SEXTANTE günlüğünü kontrol edin'. İçindekiler Tablosu yeni katman ekledi, hatalar içeren katman yüklenmedi.
HasT

1
GRASS komut v.build.polylines var - Ben bir tepe (kesilmiş sözde düğüm) kesişen iki satırdan birini alırım, ama bu komut SEXTANTE eklentisinde bulamıyorum
HasT

@simplexio Yalancı düğümleri tanımlamak için hangi v.clean seçeneğinin kullanılabileceğini önerebilir misiniz
osmjit 9:17

2

OpenJump'ı ücretsiz bir CBS kullanarak sahte düğümlerinizi bulma adımları.
QGIS ve gvSIG, Sextante Eklentisine sahiptir, bu nedenle bu adımların da çalışması gerekir
, Uzamsal Birleştirme biraz farklı olabilir.
Test için 1.2 sürümünü kullandım.

- Çizgi uç noktalarını
kaydet Sextante araç kutusu, Topoloji, Çizgilerin uç noktalarını çıkar -> endpt_0

- çizgilerinizi
ayırın Sextante araç kutusu, Çizgi katmanları için araçlar, Bitişik çizgileri birleştir

- Bölünmemiş çizgi uç noktalarını
Sextante araç kutusu, Topoloji, line -> endpt_1

- "Bitişik çizgilere katıl" tarafından kaldırılan uç noktalar, sözde düğümlerdir

Araçlar, Sorgular, Uzamsal Sorgu,
Kaynak katman "endpt_0"
İlişki " Kesişiyor "
Maske katmanı "endpt_1"

etkinleştirin veya Tamamlayıcı Sonuçları tıklayın


Cevap için teşekkürler! Ben QGIS Sextante tezler adımlar yapmaya çalışıyorum, ama orada "Satırların uç noktalarını ayıkla" ve "Bitişik satırları birleştir" komutları bulamıyorum. QGIS Sextante (gvSIG 1.12 tez komutlarında mevcuttur) veya v.build.polylines komutunda eklemek mümkün mü?
HasT

QGIS sextante eklentisini yeni yükledim. Ben de tam fonksiyonları görmüyorum, çoğu eksik. GvSIG'deki adımları şekil dosyasında test etmek kolay olmalıdır.
klewis

Yukarıdaki iş akışını gvSIG 2.4.0.2834'te doğruladım ve iyi çalışıyor. Son adımı diğer iki araç kutusu geoprocesses ile değiştirdim: ilk olarak, gvSIG "Uzamsal Birleştirme" , ikinci olarak "Filtre vektör katmanı"DIST > 0 ifadesini kullanarak . Dahası, yeni bir araç oluşturmak için tüm geoprocesses bir SEXTANTE modelinde zincirlenebilir, örneğin " Sahte kodları bul" .
Antonio Falciano


1

PostGIS ile, bu konuda tartışılan dangles'ı bulmak için sorgunun değiştirilmiş bir versiyonunu kullanabilirsiniz , çünkü sözde kodlar 2 linest'i kesen düğümler ve dangles 1 linesteyi kesen düğümlerdir.

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
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.