ST_Intersection nasıl kullanılır?


15

İşte yapmaya çalıştığım şeylerle ilgili kısa bir özet: Postgres'te 3 tablo var, 'a' ve 'b', her birinin bir Çokgen sütunu var ve 'c' bir Nokta sütununa sahip. Burada yapmaya çalıştığım şey 'a', 'b' ve 'c' arasındaki geometri kesişimlerini elde etmek ve bu geometrileri bir OpenLayers vektör katmanında görüntülemek.

Zaten OpenLayers bir String herhangi bir geometri görüntülemek nasıl biliyorum, ama PostGIS 'ST_Intersection işlevi ile sorun yaşıyorum, bunu yapıyorum:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

Burada a.geom ve b.geom her ikisi de geometri sütunlarıdır ve bu hata iletisini alıyorum:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

Ayrıca böyle geometri ST_AsText kullanarak metin olarak ortaya çıkan geometri ifade etmeye çalıştım:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

ama bana şu hata mesajını gönderdi:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Ne yaptığımı bilmiyorum, çokgenlerin WKT'sini OpenLayers'da görüntülemesini istiyorum, bir WKT'den bir geometriyi nasıl görüntüleyeceğim:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

GÜNCELLEME: Sonrakini denedim:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

ama bir sonraki hata mesajını alıyorum:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Yalnızca geçerli çokgenlerin değerlendirildiğini doğrulamak için geçersiz ekledim, ancak hatanın ST_Intersection'da (a, b) olduğunu söylüyor, hem a, b hem de c aynı SRID'ye sahip olduğunu söylüyor, bu yüzden gerçekten kafam karıştı, üzgünüm çok soruyorum, ama PostGIS ile oldukça yeniyim, umarım seni fazla rahatsız etmiyorum. Teşekkürler.


1
Ne SELECT PostGIS_Full_Version();dönüyor?
Mike T

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, 23 Eylül 2009" USE_STATS
Uriel

Yanıtlar:


8

Benim tahminim kavşak NULL döndürürse başarısız olurdu. Bu nedenle, WKT'yi oluşturmaya çalışmadan önce gerçekten bir kavşak olup olmadığını kontrol etmek için where cümlesi eklemelisiniz.


Bunu denedim: ST_Intersection (a, b) NEREDE ST_Overlaps (a.geom, b.geom) VE ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; ancak aynı hatayı döndürdü: ** HATA: st_intersection işlevi (a, b) mevcut değil. İPUCU: Verilen ad ve bağımsız değişken türleriyle eşleşen işlev yok. Açık tür yayınlar eklemeniz gerekebilir. ** Bu konuda gerçekten takıldım, eğer bana yardım edebilirsen gerçekten takdir edeceğim.
Uriel

Değerleri araştırmak için özeti (a.geom) ve özeti (b.geom) deneyin.
underdark

özet -------------------------- 1 halka halkalı 0 çokgen [BS] 4 puan var 1 halka halkalı 0 çokgen [BS] 5 var 1 halka halkalı 0 poligon [BS] 10 puan alır
Uriel

Evet, ST_Intersection (a, b) değil, ST_Intersection (a.geom, b.geom) olmalıdır
underdark

6

İpucu

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Hata mesajının dediği gibi st_intersection'ı bu şekilde kullanamazsınız. Diğer cevapları özetlerken şöyle bir şey kullanmalısınız:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK, st_overlaps ve st_intersects öğelerini oldukça benzer oldukları cümlede kullanmanın bir anlamı yoktur .


4

Farklı çokgen katmanları arasında test yapıyorum ve katmanın birinde en azından geçersiz bir geometri varsa başarısız oldu. Çokgenlerinizin geçerliliğini ST_isvalid (the_geom) kullanarak kontrol ettiniz mi? Anahtar olabilir.


Bunu denedim: ST_Intersection (a, b) NEREDE ST_Overlaps (a.geom, b.geom) VE ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; ancak aynı hatayı döndürdü: ** HATA: st_intersection işlevi (a, b) mevcut değil. İPUCU: Verilen ad ve bağımsız değişken türleriyle eşleşen işlev yok. Açık tür yayınlar eklemeniz gerekebilir. ** Neden çalışmadığı konusunda gerçekten kayboldum
Uriel

2

Bunun gibi bir şey deneyin:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

Kaynak


Ben de denedim ama aynı hata iletisini döndürür: İPUCU: Hiçbir işlev verilen ad ve bağımsız değişken türleri ile eşleşir. Açık tür yayınlar eklemeniz gerekebilir.
Uriel

"ST_Intersection'da (a.geom, b.geom) INNER JOIN b" seçeneğini kullanırsanız ne olur?
CaptDragon

HATA: JOIN / ON argümanı, tip geometrisi değil, boole türü olmalıdır.
Uriel

shizer ... verilerde yanlış bir şey olmalı ya da bu tür bir sorgu benim için çalışıyor
CaptDragon

AND ST_isvalid (a.geom) = 't' ekledim VE ST_isvalid (b.geom) = 't'; Sonunda sadece geçerli geometrileri değerlendirmek için bana ama bu hata st_intersection (a, b)
Uriel

1

Geçersiz geometrileri hariç tutmaya çalıştım ama işe yaramadı, bu yüzden sonunda her geçersiz geometriyi silmek ve bunu kullanmak zorunda kaldım:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

Gördüğünüz gibi ST_Intersection (a, b) kısmını atladım ve bu harika çalıştı, üzgünüm çünkü herhangi bir geçersiz geometri seçimimden hariç tutmanın bir yolunu bulamadım. Buradan dışarı.


0

Bu sorunu bir kez yaşadım.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

Bu hatayı bu yöntemi kullanarak çözmeyi başardım.
- QGIS kullanın
- Veritabanınızdan vektör katmanı ekleyin
- Hata mesajından noktayı alın ve QGIS içinde arayın
   "QuickWKT" (eklenti) bulmak için kullanılabilir
- O zaman sorun linestring göreceksiniz
- Düzenleme modunu açın
- Yeşil düğümü göstermek için "düğüm aracı" nı seçin (düğüm sorunu)
- Düğümü çakışan düğümden uzağa taşı
- Değişiklikleri kaydet

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.