2009-06-18 76 views
7

tengo la siguiente tabla sencilla:consulta SQL para el punto en el polígono usando PostgreSQL

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

entonces intenta insertar una fila con un polígono:

insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))')) 

Y se encuentra con este error :

column "poly" is of type polygon but expression is of type geometry

Cual es lame. Así que mi primera pregunta es:

  1. ¿De verdad tengo que elegir?

De todos modos, después de la fundición funciona. Y ahora que estoy tratando de hacer una simple consulta ST_Contains:

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

que da el error:

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. 

¿Qué se supone que haga?

las siguientes obras:

select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)')) 

pero eso es probablemente porque ambos argumentos son del tipo de geometría. La consulta real contra los datos de la tabla no funciona.

Respuesta:

Doi! El problema era que el DB que creé no estaba basado en la plantilla DB postgis (y por lo tanto no tenía las funciones relevantes y las tablas de columnas de geometría, etc.). Debo comentar, en conclusión, que la forma en que PostGIS requiere que usted agregue cientos de funciones, filas y algunas tablas a su base de datos para que tenga compatibilidad GIS es completamente coja. Hace la copia de seguridad del esquema mucho más compleja y es muy propensa a errores (no lo permita el cielo si omite llamar a AddGeometryColumn y simplemente agrega una columna de geometría).

+0

Si funciona poly in poly, ¿por qué no hacer un polígono de "1 gon" con el punto que está tratando de encontrar? –

+0

No estoy seguro de que los polígonos de 1 punto sean compatibles con postgres. Además, es una solución para un problema del que no estoy seguro. –

Respuesta

8

El polígono es un tipo Postgres fundamental sobre el que PostGIS construye. Habilita las columnas de geometría con la función PostGIS select AddGeometryColumn(...). De lo contrario, se está trabajando con polígonos rectas:

=> 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) 

Este es el punto central del polígono

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

Este es el círculo delimitador mínimo del polígono, expresado como Postgres circle tipo. Todos los operadores geométricos están documentados here: http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html El polígono base no tiene ningún dato de proyección, SRID, etc., por lo que si funciona con PostGIS, es probable que simplemente esté en default y tenga suerte.Pero, por supuesto, hay toneladas de casos en los que simplemente se necesita geometría en una escala subespacial.

+0

¿Hay alguna página que resuma la diferencia entre PostGIS y el soporte de datos geométricos nativos en PG? Los datos que guardo son geográficos (2D) y no estoy seguro de si realmente necesito PostGIS. –

+0

Me gusta mucho PostGIS, sin duda le dará más opciones a largo plazo, le permitirá interactuar con qgis o incluso esri e implementará millones de funciones (reglas especiales para los datos del gobierno finlandés y sueco, etc.). En cuanto a cómo PostGIS utiliza y diverge de los otros tipos de Postgres, eso suena como una pregunta para SO. No se pudo encontrar una explicación clara en Google, o simplemente mirando a través de la fuente de Postgis. – unmounted

+0

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

4

Ok, raro, me encontré con el siguiente sintaxis mucho más simple funciona:

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

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

Pero estoy luchando para averiguar la diferencia entre estos conjuntos de funciones y operadores. ¿Esta sintaxis más corta (que no es realmente compatible con OpenGIS) aprovecha los mismos índices espaciales, etc.?

+0

Sé que es una pregunta muy antigua ... pero parece que tienes una muy buena idea sobre opengis y postgre ... ¿puedes decirme si puedo consultarla? como encontrar si hay un punto en "cualquiera" de polígonos. como 'select poli from poly_table donde point (x, y)' –

+0

@JigarShah, dos cosas. 1, es "postgres" y, en segundo lugar, eso es exactamente lo que hace la consulta. –

Cuestiones relacionadas