Pregunta

Tengo la siguiente tabla simple:

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

Luego trato de 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:

  

columna '' poli '' es de tipo polígono pero la expresión es de tipo geometría

Que es cojo. Entonces mi primera pregunta es:

  1. ¿Realmente tengo que lanzar?

De todos modos, después de lanzarlo funciona. Y ahora estoy tratando de hacer una simple consulta ST_Contains:

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

Lo 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 debo hacer?

Los siguientes trabajos:

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 de tipo Geometry. 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 el DB de plantilla postgis (y por lo tanto no tenía las funciones relevantes y las tablas de columnas de geometría, etc.). Puedo concluir, en conclusión, que la forma en que PostGIS requiere que agregue cientos de funciones, filas y algunas tablas a su base de datos solo para que tenga soporte GIS es completamente lamentable. Hace que la copia de seguridad del esquema sea mucho más compleja y es muy propensa a errores (Dios no lo quiera si no llama a AddGeometryColumn y simplemente agrega una columna de geometría usted mismo).

¿Fue útil?

Solución

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

=> 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 de límite mínimo del polígono, expresado como un tipo circle de Postgres. Todos los operadores geométricos están documentados aquí: 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 solo tenga valores predeterminados y tenga suerte. Pero, por supuesto, hay toneladas de casos en los que simplemente necesita geometría en una escala subespacial.

Otros consejos

Ok, raro, descubrí los siguientes trabajos de sintaxis mucho más simples:

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 por descubrir 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.?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top