Ich habe die folgende einfache Tabelle:SQL-Abfrage für Point-in-Polygon mit PostgreSQL
CREATE TABLE tbl_test
(
id serial NOT NULL,
poly polygon NOT NULL
)
WITH (OIDS=FALSE);
ich dann versuchen, eine Zeile mit einem Polygon einzufügen:
insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))
Und in diesen Fehler laufen :
column "poly" is of type polygon but expression is of type geometry
Welcher ist lahm. Also meine erste Frage ist:
- Muss ich wirklich werfen?
Wie auch immer, nach dem Gießen funktioniert es. Und jetzt versuche ich, eine einfache ST_Contains Abfrage zu tun:
select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))
, die den Fehler verursacht:
ERROR: function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Was soll ich denn tun sollen?
Die folgenden Werke:
select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))
Aber das ist wahrscheinlich, weil beide Argumente des Typs Geometrie sind. Die eigentliche Abfrage gegen die Tabellendaten funktioniert nicht.
Antwort:
Doi! Das Problem bestand darin, dass die von mir erstellte DB nicht auf der Postgis-Vorlagen-DB basierte (und daher nicht die relevanten Funktionen und Geometrie-Spaltentabellen usw. hatte). Darf ich nur abschließend feststellen, dass die Art und Weise, wie PostGIS Sie benötigt, Hunderte von Funktionen, Zeilen und ein paar Tabellen zu Ihrer Datenbank hinzuzufügen, nur damit Sie die GIS-Unterstützung vollständig lahmgelegt haben. Es macht die Sicherung des Schemas sehr viel komplexer und ist sehr fehleranfällig (Gott bewahre, wenn Sie es versäumen, AddGeometryColumn aufzurufen und nur eine Geometrie-Spalte hinzuzufügen).
Wenn Poly in Poly funktioniert, warum nicht ein „1-gon“ Polygon mit dem Punkt machen Sie versuchen zu finden? –
Ich bin nicht sicher, dass Polygone von 1 Punkt in Postgres unterstützt werden. Außerdem ist es eine Abhilfe für ein Problem, das ich nicht sicher bin, existiert .. –