Transformar el sistema de referencia espacial de la columna de geometría de una base PostGis

Continuando con los aspectos relativos a PostGis, hoy vamos a reproyectar los rasgos correspondientes a una base de datos con componente espacial que ha sido incorporada mediante shp2pgsql-gui y que constituye un shapefile (Geometría: MULTILINESTRING) de la red vial de los Estados Unidos. La proyección corresponde a longlat NAD83 cuyo SIRD (EPSG) es 4269. El cambio de proyección será a “US National Atlas Equal Area”, EPSG: 2163, cuyas unidades vienen expresadas en metros.

En la ventana del importador de shapefiles de PostGis, a la base de datos world_borders, se puede observar que se han modificado los valores por defecto de ‘Table’, ‘Geo Column’ y ‘SRID’ a, respectivamente, roads, geom_4269 y 4269; tal como se encuentra en la imagen siguiente:

roads1

Con el DB Manager de QGIS se han cargado al Map Canvas los rasgos espaciales; tal como se visualiza a continuación:

roads2

En consola de PostgreSQL, averiguamos las variables que presenta roads en su tabla de atributos:

\d roads
                                            Tabla «public.roads»
  Columna   |              Tipo              |                         Modificadores                         
------------+--------------------------------+---------------------------------------------------------------
 gid        | integer                        | not null valor por omisión nextval('roads_gid_seq'::regclass)
 fnode_     | double precision               | 
 tnode_     | double precision               | 
 lpoly_     | double precision               | 
 rpoly_     | double precision               | 
 length     | double precision               | 
 roadtrl020 | double precision               | 
 feature    | character varying(80)          | 
 name       | character varying(120)         | 
 state_fips | character varying(2)           | 
 state      | character varying(2)           | 
 geom_4269  | geometry(MultiLineString,4269) | 
Índices:
    "roads_pkey" PRIMARY KEY, btree (gid)
    "roads_geom_4269_idx" gist (geom_4269)

Antes de la reproyección, vamos a hacer algunas consultas a la base de datos. La variable ‘feature’ es la que contiene el nombre del tipo de vialidad. Hay 34 de ellas; tal como se visualiza a continuación:

SELECT DISTINCT feature, COUNT(feature) 
    FROM roads 
GROUP BY feature;

                         feature                          | count 
----------------------------------------------------------+-------
 Principal Highway                                        | 15718
 Other Highway   Bypass Route                             |     2
 Other Highway   Alternate Route                          |    31
 Ferry Crossing   Toll Road                               |     2
 Limited Access Highway                                   |  9360
 Other Through Highway   Truck Route                      |     6
 Ferry Crossing                                           |   111
 Other Through Highway   Toll Road                        |    28
 Other Through Highway   Alternate Route   Bypass Route   |     2
 Other Highway   Toll Road                                |     9
 Limited Access Highway   Bypass Route                    |    27
 Limited Access Highway   Business Route                  |    34
 Other Through Highway   In Tunnel   Alternate Route      |     1
 Other Highway   Business Route                           |   124
 Principal Highway   Alternate Route   Bypass Route       |     2
 Other Through Highway   Business Route                   |   587
 Limited Access Highway   Truck Route                     |     6
 Other Through Highway                                    | 14883
 Principal Highway   In Tunnel                            |     1
 Limited Access Highway   Toll Road                       |   790
 Principal Highway   Business Route                       |   365
 Principal Highway   Alternate Route                      |   280
 Other Through Highway   Business Route   Alternate Route |     5
 Other Highway                                            |  4368
 Limited Access Highway   In Tunnel   Toll Road           |     9
 Limited Access Highway   Alternate Route                 |    38
 Other Through Highway   Alternate Route                  |   136
 Principal Highway   Truck Route                          |     4
 Principal Highway   Business Route   Alternate Route     |     1
 Limited Access Highway   In Tunnel                       |     3
 Principal Highway   In Tunnel   Toll Road                |     1
 Principal Highway   Toll Road                            |    24
 Principal Highway   Bypass Route                         |    37
 Other Through Highway   Bypass Route                     |    19
(34 filas)

Si la consulta se restringe a los diferentes tipos de ‘Principal Highway’ se tiene entonces que:

SELECT DISTINCT feature, COUNT(feature) 
    FROM roads AS r WHERE feature LIKE 'Principal Highway%' 
GROUP By r.feature;
                       feature                        | count 
------------------------------------------------------+-------
 Principal Highway                                    | 15718
 Principal Highway   In Tunnel                        |     1
 Principal Highway   Business Route                   |   365
 Principal Highway   Alternate Route                  |   280
 Principal Highway   Truck Route                      |     4
 Principal Highway   Business Route   Alternate Route |     1
 Principal Highway   Alternate Route   Bypass Route   |     2
 Principal Highway   In Tunnel   Toll Road            |     1
 Principal Highway   Toll Road                        |    24
 Principal Highway   Bypass Route                     |    37
(10 filas)

Después de estas pequeñas consultas ahora procederemos a hacer la transformación pautada para los componentes geométricos en la columna geom desde la columna geom_4269. Después de la transformación, se elimina esta última columna de geometría y se crea un índice espacial sobre geom.

SELECT AddGeometryColumn('public', 'roads', 'geom', 2163, 'MULTILINESTRING',2);
UPDATE roads
    SET geom = ST_Transform(geom_4269, 2163);
SELECT DropGeometryColumn('roads', 'geom_4269');
CREATE INDEX idx_roads_geom ON roads USING gist(geom);

Una vez reproyectada la geometría la cargamos en QGIS donde, en la próxima imagen, se vislumbra que esta ha tenido lugar:

roads3

Esta entrada fue publicada en Postgres+postgis, SIG. Guarda el enlace permanente.

2 respuestas a Transformar el sistema de referencia espacial de la columna de geometría de una base PostGis

  1. Juan Garriz dijo:

    gran articulo, me ha sido de gran ayuda, abrazo

  2. Juan Garriz dijo:

    Gran articulo, me ha sido de mucha ayuda, saludos

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s