2009-06-18 9 views
7

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:

  1. 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).

+0

Wenn Poly in Poly funktioniert, warum nicht ein „1-gon“ Polygon mit dem Punkt machen Sie versuchen zu finden? –

+0

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 .. –

Antwort

8

Das Polygon ist ein grundlegender Postgres-Typ, den PostGIS 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 sind dokumentiert here: http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html Das Basispolygon hat keine Projektionsdaten, SRID, usw., wenn es mit PostGIS arbeitet, ist es wahrscheinlich nur voreingestellt und hat Glück.Aber natürlich gibt es Tonnen von Fällen, in denen Sie Geometrie auf einer sub-geospatialen Skala benötigen.

+0

Gibt es eine Seite, die den Unterschied zwischen PostGIS und nativer Geometriedatenunterstützung in PG zusammenfasst? Die Daten, die ich behalte, sind geografisch (2D), und ich bin mir nicht sicher, ob ich PostGIS wirklich brauche. –

+0

Ich mag PostGIS, sicherlich wird es Ihnen mehr Möglichkeiten auf lange Sicht geben, Sie mit qgis oder sogar esri interagieren lassen und setzt Millionen von Funktionen (spezielle Regeln für die finnische und die schwedische Regierung Daten, etc.). Was PostGIS angeht und von den anderen Postgres-Typen abweicht, klingt das nach einer Frage für SO. Konnte keine klare Erklärung finden, googeln oder gerade jetzt durch die Postgisquelle schauen. – unmounted

+0

fragte: http://stackoverflow.com/questions/1023229/spatial-data-in-postgresql –

4

Ok, seltsam, fand ich heraus, die folgende viel einfachere 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ämpfen, um den Unterschied zwischen diesen Sätzen von Funktionen und Operatoren, um herauszufinden. Hat diese kürzere Syntax (die nicht wirklich OpenGIS-kompatibel ist) die gleichen räumlichen Indizes usw.?

+0

ich seine sehr alte Frage wissen ... aber es scheint, Sie haben eine sehr gute Idee, über OpenGIS und postgre .... können Sie mir sagen, wenn ich abfragen Wie finde ich heraus, ob ein Punkt in "beliebigen" Polygonen vorhanden ist. like 'Wählen Poly aus Poly_Tabelle wobei Punkt (x, y)' –

+0

@JigarShah, zwei Dinge. 1, es ist "Postgres" und zweitens ist genau das, was die Abfrage tut. –