SQL-Abfrage für Point-in-Polygon mit PostgreSQL

Ich habe die folgende einfache Tabelle:

<code>CREATE TABLE tbl_test
(
  id serial NOT NULL,
  poly polygon NOT NULL
)
WITH (OIDS=FALSE);
</code>

Ich versuche dann eine Zeile mit einem Polygon einzufügen:

<code>insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))
</code>

Und auf diesen Fehler stoßen:

Spalte "poly" ist vom Typ Polygon, aber Ausdruck ist vom Typ Geometrie

Welches ist lahm. Meine ersten Fragen sind also:

Muss ich wirklich gießen?

Jedenfalls funktioniert es nach dem Casting. Und jetzt versuche ich, eine einfache ST_Contains-Abfrage durchzuführen:

<code>select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))
</code>

Welches gibt den Fehler:

<code>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.
</code>

Was soll ich tun?

Die folgenden Arbeiten:

<code>select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))
</code>

Aber das liegt wahrscheinlich daran, dass beide Argumente vom Typ Geometrie sind. Die eigentliche Abfrage der Tabellendaten funktioniert nicht.

Antworten:

Doi! Das Problem bestand darin, dass der von mir erstellte DB nicht auf dem Postgis-Vorlagen-DB basierte (und daher nicht über die relevanten Funktionen und Geometriespaltentabellen usw. verfügte). Abschließend möchte ich zum Schluss bemerken, dass die Art und Weise, wie Sie in PostGIS Hunderte von Funktionen, Zeilen und ein paar Tabellen zu Ihrer Datenbank hinzufügen müssen, nur so lahm ist, dass Sie GIS-Unterstützung hätten. Dadurch wird die Sicherung des Schemas wesentlich komplexer und ist sehr fehleranfällig (Himmel verboten, wenn Sie AddGeometryColumn nicht aufrufen und einfach selbst eine Geometriespalte hinzufügen).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage