Geçersiz geometrilerin etkileri nelerdir


15

Bir Postgis veritabanındaki bazı verileri içe aktardım ve bazı geometriler geçersiz olarak bildirildi (ST_IsValidReason kendinden kesişme veya halka kendinden kesişme raporları).

Gerçekleştirdiğim sorgular bu geometrilerin geçersiz yönlerinden etkilenmiyor gibi görünüyor (sadece ST_Distance sorgularını kullanıyorum).

Geometriler geçersiz olduğunda kırılan şeyler nelerdir?

Bu geometrileri "otomatik olarak" (arabellek (geom, 0) veya ST_SimplifyPreserveTopology (geom, 0.0001)) sabitlemek bir seçenek mi?

Yanıtlar:


19

Hatalı biçimlendirilmiş verileri tutmak kötü bir fikirdir, çünkü hatanın ne zaman ve nerede olacağını asla tahmin edemezsiniz. Ayrıca, hatalı biçimlendirilmiş veriler , en kısır ve yanıltıcı hata türü olan Heisenbugs'a neden olabilir .

Geçersiz geometrileri depolamanın olası sonuçlarını tartışmanın biraz anlamsız olduğunu düşünüyorum. Bunu söyledikten sonra, sonuçlar şunları içerebilir:

  • Yanlış sonuçlar (yani ST_Distanceyanlış veya basit yanlış rakamlar döndürür)
  • Veritabanı performans sorunları: Hatalı biçimlendirilmiş verilerin tutulması veritabanı performansına ciddi zarar verebilir ve büyük günlük dosyası oluşturabilir, çünkü her işlev çağrısı günlüğe bir hata yazar ve sıradan veritabanı çalışmasını bozar.
  • Veritabanı çöküyor.
  • Uygulama çöküyor - ya veritabanından hatalı biçimlendirilmiş veri alınmasından ya da mantıksız sonuç alınmasından (örneğin negatif mesafe) kaynaklanıyor.
  • Hayalet davranış (yukarıdaki bağlantıya bakın). Bu en kötü sonuçtur. Garip şeyler olacak. Yavaşlamalar, veri kaybı, çökmeler, mantıksız sonuçlar, uzun duraklamalar, yanıt vermeme ve diğer birçok lanet. Bunları tespit edemeyebilir veya çoğaltamayabilirsiniz, çünkü hepsi her belgede "tanımsız" kategorisine girer.

Benim tavsiyem - küçük arabellekler veri tutarlılığınıza önemli ölçüde zarar vermezse, yukarıdakilerden herhangi birinin olmasını önlemek için bunları kullanın. Verilerinizi geçerli tutun.


Küçük tamponlar kullanarak biraz ayrıntı verebilir misiniz? Bunu nasıl yaparım?
diciu

1
ST_Buffer(the_geom, 0.0000001)kendi kendine kesişme için hile yapabilir. Sadece biraz daha büyük bir geometrinin sonuçları şiddetli değilse kullanın.
Adam Matan

1
Deneyimlerim, hatalı biçimlendirilmiş verilerin düzeltilmesinin oldukça bir araştırma olduğu yönündedir. Ancak zaman alıcı olsa da, normalde çabaya değer. ST_Buffer(the_geom, 0.0000001)Hile kesinlikle çok yardımcı olur.
Chau

Mesele şu ki ST_Buffer geometriyi düzeltiyor ama sonuç gerçekten beklediğim gibi değil - buradaki bu çokgen için ( openstreetmap.org/browse/way/51954364 ) ST_Buffer sadece sol üstteki dikdörtgeni döndürüyor. ST_SimplifyPreserveTopology ihtiyacım olana daha yakın görünüyor (geçerli geometri ancak geçersiz orijinale olabildiğince yakın). ST_SimplifyPreserveTopology kullanımında herhangi bir olumsuzluk var mı?
diciu

Bu geometri MULTIPOLYGON, tek olarak değil, iki çokgenden biri olarak işlenmelidir POLYGON. Mümkünse orijinal WKT'yi almaya çalışın.
Adam Matan

13

Öncelikle veritabanınıza geçersiz geometrilerin girmesini önleyebilirsiniz. PostgreSQL / PostGIS kullanıcıları için, bunu kontrol kısıtlamaları ile yapmak kolaydır . Örneğin, public.my_valid_tableçokgen geometrileri içeren bir sütun düşünün geom, aşağıdaki SQL / DDL'yi kullanın:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Not: kısıtlamanın uygulanmasından önce bu tablonun geçerli çokgenleri olmalıdır.

Daha sonra geçersiz bir geometri eklemeye / eklemeye çalışırsanız bir hata görürsünüz:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
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.