Frage

Ich habe die folgende einfache Tabelle:

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 laufen in diesen Fehler:

  

Spalte „poly“ ist vom Typ Polygon aber Ausdruck vom Typ Geometrie

Was ist lahm. Also meine ersten Fragen sind:

  1. Sie warf ich wirklich?

Wie auch immer, nach dem Gießen es funktioniert. Und jetzt bin ich versuche, eine einfache ST_Contains Abfrage zu tun:

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

Das gibt den Fehler:

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 tun?

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 nicht funktioniert.

Antwort:

Doi! Das Problem war, dass die DB I erstellt wurde auf der postgis Vorlage nicht auf der Grundlage DB (und daher nicht über die entsprechenden Funktionen und Geometriespalt Tabellen, etc.). Darf ich abschließend nur bemerken, dass die Art und Weise PostGIS Sie erfordert nur Hunderte von Funktionen, Zeilen und ein paar Tische zu Ihrer DB hinzufügen, damit Sie GIS-Unterstützung haben würden, ist völlig lahm. Es macht Sicherung des Schemas, das viel komplexer und sehr fehleranfällig ist (Gott bewahre, wenn Sie vernachlässigen AddGeometryColumn anrufen und nur eine Geometriespalte selbst hinzufügen).

War es hilfreich?

Lösung

Das Polygon ist eine fundamentale Postgres Art, die PostGIS von oben aufbaut. Sie aktivieren die Geometriespalten mit der PostGIS Funktion select AddGeometryColumn(...). Ansonsten arbeiten Sie mit geraden Polygonen:

=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
    point    
-------------
 (2.25,3.25)
(1 row)

Dies ist der Mittelpunkt des Polygons

=> select circle(space) from gt where id = 1;
             circle             
--------------------------------
 <(2.25,3.25),1.93994028704315>
(1 row)

Dies ist der minimale Begrenzungs Kreis des Polygons, ausgedrückt als Postgres circle Typ. Alle geometrischen Operatoren werden dokumentiert hier: http://www.postgresql.org /docs/8.3/interactive/functions-geometry.html Die Basis Polygon hat keine Projektionsdaten, SRID, usw., also wenn es mit PostGIS funktioniert, ist es wahrscheinlich nur auf Presets säumige und Glück zu bekommen. Aber natürlich gibt es Tonnen von Fällen, in denen Sie müssen einfach nur Geometrie auf einer Unter geospatial Skala.

Andere Tipps

Ok, seltsam fand ich die folgende viel einfacher aus Syntax funktioniert:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

Aber ich kämpfe, um den Unterschied zwischen diesen Sätzen von Funktionen und Operatoren, um herauszufinden. Enthält diese kürzere Syntax (die nicht wirklich OpenGIS konform ist) nutzt den gleichen räumlichen Indizes etc.?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top