Oto krótkie podsumowanie tego, co próbuję zrobić: mam 3 tabele w Postgresie, „a” i „b”, każda ma kolumnę Wielokąt, a „c” ma kolumnę Punkt. Usiłuję uzyskać przecięcia geometrii między „a”, „b” i „c” oraz wyświetlić takie geometrie na warstwie wektorowej OpenLayers.
Wiem już, jak wyświetlać dowolną geometrię z łańcucha w OpenLayers, ale mam problemy z funkcją ST_Intersection PostGIS, robię to:
SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;
gdzie a.geom i b.geom są kolumnami geometrii i pojawia się następujący komunikat o błędzie:
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!
Próbowałem także wyrazić wynikową geometrię jako tekst za pomocą ST_AsText w następujący sposób:
SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;
ale wysyła mi ten komunikat o błędzie:
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Nie wiem, co robię źle, chcę tylko, aby WKT wielokątów wyświetlał je na OpenLayers, oto jak wyświetlam geometrię z WKT:
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);
AKTUALIZACJA: Próbowałem następnego:
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';
ale pojawia się następny komunikat o błędzie:
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.
Dodałem isvalid, aby sprawdzić, czy sprawdzane są tylko poprawne wielokąty, ale to mówi, że błąd znajduje się w ST_Intersection (a, b), oba a, b i c mają ten sam SRID, więc jestem naprawdę zdezorientowany, przepraszam, jeśli jestem pytam za dużo, ale jestem całkiem nowy w PostGIS, więc mam nadzieję, że nie przeszkadzam zbytnio. Dzięki.
SELECT PostGIS_Full_Version();
zwraca