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.
SELECT PostGIS_Full_Version();
zurück?Antworten:
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.
quelle
Der Anhaltspunkt ist
Wie die Fehlermeldung besagt, können Sie st_intersection nicht auf diese Weise verwenden. Wenn Sie die anderen Antworten zusammenfassen, sollten Sie Folgendes verwenden:
AFAIK, es hat keinen Sinn, st_overlaps und st_intersects in demselben Satz zu verwenden, da sie ziemlich ähnlich sind .
quelle
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.
quelle
Versuchen Sie so etwas:
Quelle
quelle
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:
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.
quelle
Ich hatte mal dieses Problem.
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
quelle