Wie verwende ich ST_Intersection?

15

Hier ist eine kurze Zusammenfassung, was ich versuche: Ich habe 3 Tabellen in Postgres, 'a' und 'b', jede hat eine Polygonspalte und 'c' hat eine Punktspalte. Ich versuche hier, die Geometrieschnittpunkte zwischen 'a', 'b' und 'c' zu ermitteln und solche Geometrien auf einer OpenLayers-Vektorebene anzuzeigen.

Ich kann in OpenLayers bereits jede Art von Geometrie aus einem String anzeigen, habe jedoch Probleme mit der Funktion ST_Intersection in PostGIS.

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

Dabei sind a.geom und b.geom die Geometriespalten, und es wird folgende Fehlermeldung angezeigt:

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!

Außerdem habe ich versucht, die resultierende Geometrie mit ST_AsText wie folgt als Text auszudrücken:

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

aber es schickt mir diese Fehlermeldung:

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

Ich weiß nicht, was ich falsch mache. Ich möchte nur, dass das WKT der Polygone es auf OpenLayers anzeigt. So zeige ich eine Geometrie aus einem WKT an:

                    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);

UPDATE: Ich habe folgendes ausprobiert:

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';

aber ich bekomme die nächste fehlermeldung:

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.

Ich habe den Wert isvalid hinzugefügt, um zu überprüfen, ob nur gültige Polygone ausgewertet werden. Der Fehler befindet sich jedoch in der ST_Intersection (a, b). Sowohl a, b als auch c haben dieselbe SRID. Ich bin also wirklich verwirrt Ich frage zu viel, aber ich bin ziemlich neu in PostGIS, also hoffe ich, dass ich Sie nicht viel störe. Vielen Dank.

Uriel
quelle
1
Was kehrt SELECT PostGIS_Full_Version();zurück?
Mike T
POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, 23. September 2009" USE_STATS
Uriel

Antworten:

8

Ich vermute, dass es fehlschlägt, wenn die Schnittmenge NULL zurückgibt. Fügen Sie daher eine where-Klausel hinzu, die überprüft, ob tatsächlich eine Schnittmenge vorhanden ist, bevor Sie versuchen, die WKT zu erstellen.

Underdunkel
quelle
Ich habe Folgendes versucht: SELECT ST_Intersection (a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON ST_Intersection (a, b) WHERE 'AND ST_isvalid (b.geom) =' t '; aber es gab den gleichen Fehler zurück: ** FEHLER: Funktion st_intersection (a, b) existiert nicht. TIPP: Keine Funktion entspricht dem angegebenen Namen und den angegebenen Argumenttypen. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. ** Ich stecke wirklich in dieser Sache fest, wenn du mir helfen kannst, werde ich es wirklich zu schätzen wissen.
Uriel
Versuchen Sie Summary (a.geom) und Summary (b.geom), um die Werte zu untersuchen.
Underdunkel
Zusammenfassung -------------------------- Polygon [BS] mit 1 Ringen Ring 0 hat 4 Punkte Polygon [BS] mit 1 Ringen Ring 0 hat 5 Punkte Punkte Polygon [BS] mit 1 Ringe Ring 0 hat 10 Punkte
Uriel
Ja, es sollte ST_Intersection (a.geom, b.geom) sein, nicht ST_Intersection (a, b)
underdark
6

Der Anhaltspunkt ist

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.

Wie die Fehlermeldung besagt, können Sie st_intersection nicht auf diese Weise verwenden. Wenn Sie die anderen Antworten zusammenfassen, sollten Sie Folgendes verwenden:

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, es hat keinen Sinn, st_overlaps und st_intersects in demselben Satz zu verwenden, da sie ziemlich ähnlich sind .

Francisco Puga
quelle
4

Ich teste zwischen verschiedenen Ebenen von Polygonen und es ist fehlgeschlagen, wenn mindestens eine ungültige Geometrie in einer der Ebenen vorhanden ist. Haben Sie die Gültigkeit Ihrer Polygone mit ST_isvalid (the_geom) überprüft? Es kann der Schlüssel sein.

Fabien Ancelin
quelle
Ich habe Folgendes versucht: SELECT ST_Intersection (a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON ST_Intersection (a, b) WHERE 'AND ST_isvalid (b.geom) =' t '; aber es gab den gleichen Fehler zurück: ** FEHLER: Funktion st_intersection (a, b) existiert nicht. TIPP: Keine Funktion entspricht dem angegebenen Namen und den angegebenen Argumenttypen. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. ** Ich bin wirklich verloren, warum es nicht funktioniert
Uriel
2

Versuchen Sie so etwas:

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)
    ;

Quelle

CaptDragon
quelle
Ich habe es auch versucht, aber es wird dieselbe Fehlermeldung zurückgegeben: TIPP: Keine Funktion entspricht dem angegebenen Namen und den angegebenen Argumenttypen. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen.
Uriel
Wie wäre es, wenn Sie "INNER JOIN b ON ST_Intersection (a.geom, b.geom)" verwenden?
CaptDragon
Er sagt: FEHLER: Das Argument von JOIN / ON muss vom Typ Boolean sein, nicht vom Typ Geometrie.
Uriel
shizer ... irgendetwas muss mit den Daten nicht stimmen oder so, weil diese Art von Abfrage für mich funktioniert.
CaptDragon
Ich habe AND ST_isvalid (a.geom) = 't' hinzugefügt AND ST_isvalid (b.geom) = 't'; Am Ende nur die gültigen Geometrien zu bewerten, aber es sagt mir, der Fehler ist in diesem st_intersection (a, b)
Uriel
1

Ich habe versucht, die ungültigen Geometrien auszuschließen, aber es hat nicht funktioniert. Am Ende musste ich jede ungültige Geometrie löschen und dann Folgendes verwenden:

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';

Wie Sie sehen, habe ich den Teil ST_Intersection (a, b) weggelassen, und das hat sehr gut funktioniert. Ich bin traurig, weil ich keinen Weg gefunden habe, ungültige Geometrie von meiner Auswahl auszuschließen, jedenfalls danke an alle, die mir geholfen haben raus hier.

Uriel
quelle
0

Ich hatte mal dieses Problem.

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

Ich konnte diesen Fehler mit dieser Methode beheben.
- Verwenden Sie QGIS
- Add Vektorebene aus der Datenbank
- den Punkt aus der Fehlermeldung nehmen und es in QGIS suchen
   „QuickWKT“ (Plugin) kann es verwendet werden , zu finden
- dann werden Sie das Problem Linienzug sehen
- Schalten Sie den Bearbeitungsmodus
- Wählen Sie "Knotenwerkzeug", um den grünen Knoten anzuzeigen (Knotenproblem).
- Knoten von Überlappungsknoten entfernen.
- Änderungen speichern

Ruthe
quelle