domingo, 5 de febrero de 2012

¿Cómo configurar y saber que proyección tienen las tablas en PostGis?

En esta oportunidad hablaremos como saber que proyección tienen las tablas que están en PostGis y como configurarlas ya que son necesarias para ciertas funciones de transformación u operaciones geométricas que puede hacer esta herramienta. Pero antes hablaremos de unas tablas que son importantes para el funcionamiento de estas operaciones. Estas tablas son “spatial_ref_sys” y “geometry_columns”, estas tablas por lo general se crean por defecto cuando creamos una nueva base de datos.

En la tabla “spatial_ref_sys veremos las proyecciones soportadas por el PostGis. Y tiene estas columnas:

SRID: código único que está asociado a una única proyección en PostGis.

AUTH_NAME: aparece el nombre de la fuente de estos códigos que es EPSG que son las siglas de European Petroleum Survey Group (http://www.epsg.org/).

AUTH_SRID: son los códigos ideados por las organizaciones que están en la columna AUTH_NAME y en todos los casos son de la EPSG.

SRTEXT: parámetros de la proyección asociados a los códigos de las columnas SRID y AUTH_SRID.

PROJ4TEXT: parámetros de la proyección según el PROJ4

Quizá para nuestro ejemplo el más útil será el SRID y el SRTEXT ya que es un código único y nombre de la proyección la cual estará proyectada nuestra tabla

Para el caso de Perú, tenemos estas proyecciones que usamos:

srid

auth_name

auth_srid

Proyección Geográfica / UTM

4326

EPSG

4326

Geográficas WGS 84

4248

EPSG

4248

Geográficas PSAD 56

24877

EPSG

24877

PSAD 56 Zona 17 S

24878

EPSG

24878

PSAD 56 Zona 18 S

24879

EPSG

24879

PSAD 56 Zona 19 S

32717

EPSG

32717

WGS 84 Zona 17 S

32718

EPSG

32718

WGS 84 Zona 18 S

32719

EPSG

32719

WGS 84 Zona 19 S

En la tabla “geometry_columns” Veremos los nombres de las tablas, las proyecciones y el tipo de geometría que tienen, y está compuesta por 8 columnas de las cuales las más importantes para este momento son:

F_TABLE_NAME: nombre de una tabla que está en la base de datos de PostGis.

F_GEOMETRY_COLUMN: nombre de la columna que están contenidas las geometrías de la tabla.

SRID: código de proyección que está en la tabla “spatial_ref_sys”.

Recuérdese que estas tablas siempre deben estar presentes en las bases de datos que tengamos en el PostGis.

Ahora veremos 3 casos que nos podríamos encontrar al tratar de configurar y saber que proyección tienen las tablas en PostGis:

A) Cuando recién estoy por importar un archivo shp al Postgis:

El PostGis no lee los archivos prj asociados a los archivos shp, así que debemos de darle la proyección que se encuentran para que la tabla que será creada a partir de este shp herede su proyección. Si por ejemplo si queremos llevar el shape “aeródromos.shp” y si queremos que la tabla que crearemos con el nombre “OPCION_01” este con la proyección PSAD56 / Zona 18S, lo haremos de esta manera:

Para comprobar que tiene una proyección veremos que en la tabla “geometry_columns” se encuentre el nombre de la tabla que acabamos de importar con el código SRID de la proyección que le corresponde. Otra forma es hacer click derecho sobre la tabla creada y vamos a propiedades y luego aparecerá la ventana de las propiedades y vamos a la pestaña de “Constraints”, aparecerán 2 columnas, en la columna “Constraint_name” buscamos la entrada “enforce_srid_the_geom” y en la otra columna que dice “Definition” debe estar algo como “st_srid(the_geom) = 24878” donde 24878 la proyección PSAD56 / Zona 18S para es el código SRID de la proyección de la tabla “OPCION _01”.

Otra forma es poner esta sentencia en el SQL:

Select st_SRID(the_geom) from “OPCION_1”

Donde nos mostrara en el “Output pane” un mensaje que nos mostrara el 24878 para cada geometría de la columna the_geom.

B) Ya tengo una tabla en PostGis y tiene como proyección -1, ¿cómo configuro su proyección?

Para este caso, primero, verificamos la proyección que tiene esta tabla, usaremos la tabla “OPCION_2” que queremos evaluar, para esto usamos en el SQL esta secuencia:

Select st_SRID(the_geom) from “OPCION_2”

Donde nos mostrara en el “Output pane” un mensaje que nos mostrara -1

Una segunda forma es ver en la tabla “geometry_columns” y en la columna F_TABLE_NAME ubicamos el nombre de la tabla “OPCION_02” y vemos que en la columna SRID está el valor -1.

Otra forma es hacer click derecho sobre la tabla creada y vamos a propiedades y luego aparecerá la ventana de las propiedades y vamos a la pestaña de “Constraints”, aparecerán 2 columnas, en la columna “Constraint_name” buscamos la entrada “enforce_srid_the_geom” y en la otra columna que dice “Definition” debe estar algo como “st_srid(the_geom) = (-1)” donde -1 es el código SRID de la proyección de la tabla “OPCION_02”.

Para proyectar esta tabla a la proyección PSAD56 / Zona 18S, usamos esta sentencia en el SQL:

Select UpdateGeometrySRID (‘OPCION_02’, ‘the_geom’, 24878)

Luego nuestra tabla quedara ya proyectada con el datum mencionado, debemos actualizar la tabla “geometry_columns y “OPCION_02” (click derecho en ambas tablas y dar Refresh) para ver los cambios efectuados.

C) Tengo una tabla en PostGis y no aparece nada en la pestaña “Constraints” y/o el nombre de la tabla no aparece en la tabla geometry_columns, ¿Cómo configuro su proyección?

En este caso usaremos la tabla “OPCION_03”, hacemos indistintamente ya que no importa el orden, en la tabla “geometry_columns agregamos una fila con estos valores en las siguientes columnas:

oid”: es un numero que automáticamente aparecerá al rellenar los demás campos siguientes. No hace falta poner nada acá.

f_table_catalog”: ‘’ , solo poner 2 comillas nada más.

f_tabla_schema:” public

f_table_name”: OPCION_03

f_geometry_column”: the_geom

coord_dimension”: 2

srid”: -1

type”: POINT

Y hacemos click derecho en la table “OPCION_03” y en properties, pestaña Constraints hacemos esto:

En la pestaña de parte de abajo, desglosamos la pestaña y seleccionamos “Primary key”, pulsamos el botón “add” y en la pestaña “columns” seleccionamos la columna “gid” de la lista desglosable debajo de esta pestaña, pulsamos “add” y luego “ok”.

En la misma pestaña “Constraints” y seleccionamos “check” (este proceso lo haremos 3 veces) , aparecerá una ventana con dos recuadros, en el recuadro Name ponemos enforce_dims_the_geom y en el recuadro Check ponemos st_ndims(the_geom) = 2 y presionamos ok.

Seleccionamos “check” otra vez, aparecerá la misma ventana con los dos recuadros, en el recuadro Name ahora ponemos enforce_geotype_the_geom y en el recuadro Check ponemos (the_geom) = 'MULTIPOLYGON'::text OR the_geom IS NULL y presionamos ok.


Seleccionamos “check” por última vez, aparecerá la misma ventana con los dos recuadros, en el recuadro Name ahora ponemos enforce_srid_the_geom y en el recuadro Check ponemos srid(the_geom) =( -1) y presionamos ok. AL final la pestaña “Constraints” debe verse así:

Luego de estos dos procesos que indistintamente pueden ser en cualquier orden, en el SQL hacemos este select que vimos anteriormente; en el caso que esta tabla sea proyectada a PSAD56 / Zona 18S, usamos esta sentencia en el SQL (recuérdese que nuestra tabla se llama “OPCION_03”):

Select UpdateGeometrySRID (‘OPCION_03’, ‘the_geom’, 24878)

Refrescamos las tablas “OPCION_03” y “geometry_columns”, y podemos ver los resultados como se muestra en la figura que sigue:

Nota: es posible que para esta tercera opción en el momento que ingresamos el check enforce_srid_the_geom con el valor srid(the_geom) =( -1) , y al estar en la pestaña “Constraints” nos aparezca este error “ERROR: la restricción check “enforce_srid_the_geom” es violada por alguna fila”, esto ocurre porque ya nuestra tabla tiene una proyección diferente de -1.

Para averiguarlo vamos al SQL y hacemos:

Select st_SRID(the_geom) from “OPCION_2”

Donde nos mostrara en el “Output pane” un mensaje que nos mostrara el verdadero valor de SRID de la tabla.

En este caso el valor es de 24878 para el SRID. Luego de esto, vamos a la pestaña “Constraints” y ahora si agregamos el check que nos falta. En Name ponemos enforce_srid_the_geom y en Check ponemos srid(the_geom) =24878 y listo (no lleva los paréntesis el 24878).

Esperando que sea muy útil este post. Los espero en marzo para un nuevo Tip. Nos vemos.

ª