jueves, agosto 07, 2008

MapServer, PostGIS y los OID

Trabajando con estas herramientas me encontré con un problema que me rompió la cabeza. La bug se producía cuando intentaba desplegar unas capas vectoriales que tenía almacenadas en PostGIS donde MapServer me daba el siguiente error:

prepare_database(): Query error. Error executing POSTGIS DECLARE (the actual query) statement: 'DECLARE mycursor BINARY CURSOR FOR SELECT asbinary(force_collection(force_2d(the_geom)),'NDR'),gid::text from

rencana.kawasanbencana WHERE () and (the_geom && setSRID( 'BOX3D(….)'::BOX3D,1) )'

Postgresql reports the error as 'ERROR: syntax error at or near ")" LINE 1: ...DR'),gid::text from rencana.kawasanbencana WHERE () and (the... ^ '

More Help: Error with POSTGIS data variable. You specified 'check your .map file'. Standard ways of specifiying are :

(1) 'geometry_column from geometry_table'

(2) 'geometry_column from (sub query) as foo using unique column name using SRID=srid#' Make sure you put in the 'using unique column name' and 'using SRID=#' clauses in. For more help, please see http://postgis.refractions.net/documentation/
Mappostgis.c - version of Jan 23/2004.

La primera pista para solucionar el problema la encontré en la lista de MapServer (post del día 6/8/2008), donde dice que el error se debe a que la tabla donde están los datos a mostrar no tiene definido un OID.

Por último, del tutorial de PostGIS y de la data que me paso mi colega Bordignon encontre que Mapserver requiere un identificador único para cada uno de los registros espaciales y que PostgreSQL usa para eso OID.

La solución es crear un índice con el oid que tengamos definido.

CREATE INDEX [indexname] ON [tablename] ( oid );

Otra solución es que la tabla ya tenga definido el oid al momento de la creación. En este link se explica cómo hacerlo.

Por último, el error también se genera cuando se usa en el archivo .map la instrucción FILTER sin parámetros, es decir FILTER = ''. Esto produce que el query que se envía a PostgreSQL tenga un WHERE sin argumentos que dispara el error citado.