Importando datos tabulares no espaciales (CSV) utilizando funciones PostGIS

Continuando con la temática relativa a PostgreSQL+PostGIS, en esta ocasión voy a considerar la importación de datos no espaciales (CSV) utilizando funciones PostGIS y basado en los contenidos expuestos en el libro PostGIS Cookbook. No obstante, he creado y utilizado mi propio ejemplo (ciudad_espana) construido con las coordenadas geográficas de las principales ciudades españolas a las cuales les he añadido, además, la Comunidad Autónoma a la cual pertenecen.

Explorando con ogrinfo la validez del driver CSV y con head los 5 primeros registros del archivo ciudad_espana.csv:

ogrinfo ciudad_espana.csv
INFO: Open of `ciudad_espana.csv'
      using driver `CSV' successful.
1: ciudad_espana (None)
head -n 5 ciudad_espana.csv
id,x,y,comun_auto,provincia,ciudad
1,-3.00,43.03 ,País Vasco,Alava,Amurrio
2,-2.35,42.33 ,País Vasco,Alava,Laguardia
3,-2.41,42.51 ,País Vasco,Alava,Vitoria
4,-1.52,39.00 ,Castilla-La Mancha,Albacete,Albacete

Esto último nos señala que las variables a considerar son, en este orden, id, x, y, comun_auto, provincia y ciudad.

La base de datos que voy a utilizar es world_borders y la forma de crearla y acceder a ella, en Debian, está contemplada aquí (aunque he utilizado un ejemplo diferente pero equivalente):

PostgresSql y PostGis en Debian

Resumiendo tendríamos:

su
************ #my_password
# su - zeito #my user
psql world_borders #my database
Contraseña: 
psql (9.4.1)
conexión SSL (protocolo: TLSv1.2, cifrado: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compresión: desactivado)
Digite «help» para obtener ayuda.

world_borders=#

Ahora creamos la tabla ciudad_espana y verificamos que fue exitoso el procedimiento:

CREATE TABLE ciudad_espana
(
    id integer,
    x float8,
    y float8,
    comun_auto varchar(100),
    provincia varchar(100),
    ciudad varchar(100),
    the_geom geometry(POINT, 4326); [Enter]
CREATE TABLE  #indicando la creación de la tabla
world_borders=# \d ciudad_espana [Enter]
            Tabla «public.ciudad_espana»
  Columna   |          Tipo          | Modificadores 
------------+------------------------+---------------
 id         | integer                | 
 x          | double precision       | 
 y          | double precision       | 
 comun_auto | character varying(100) | 
 provincia  | character varying(100) | 
 ciudad     | character varying(100) | 
 the_geom   | geometry(Point,4326)   | 

Copiamos los registros del archivo CSV a la tabla PostgreSQL utilizando el comando COPY (el CSV está en mi home de usuario y de allí el root path ‘/home/zeito’.):

COPY ciudad_espana (id, x, y, comun_auto, provincia, ciudad)  [Enter]
FROM '/home/zeito/ciudad_espana.csv' WITH CSV HEADER; [Enter]
COPY 664 #indicando que la importación fue exitosa

Conectando a la tabla ciudad_espana mediante QGIS es posible observar los atributos pero no existe ningún rasgo espacial desplegado:

csv1

Para desplegar los rasgos espaciales primero hay que importar los puntos en la columna de geometría utilizando cualquiera de las dos funciones siguientes: ST_MakePoint o ST_PointFromText.

Utilizando la primera de ellas:

UPDATE ciudad_espana SET the_geom = ST_SetSRID(ST_MakePoint(x,y), 4326); [Enter]
UPDATE 664 #indicando que se ha producido la actualización

Haciendo zoom a la capa en QGIS ahora si se obtiene el despliegue de los rasgos espaciales:

csv2

Verificando por otra vía, en los 5 primeros registros de la tabla (ordenados por ciudad), cómo se ha actualizado el campo de geometría:

SELECT id, comun_auto, provincia, ciudad, ST_AsText(the_geom) AS wkt_geom   [Enter]
FROM ciudad_espana ORDER BY ciudad LIMIT 5;  [Enter]

El resultado es:

 id  |   comun_auto    | provincia |  ciudad  |      wkt_geom      
-----+-----------------+-----------+----------+--------------------
  31 | Andalucía       | Almeria   | Adra     | POINT(-2.52 36.45)
 393 | Cataluña        | Lleida    | Ager     | POINT(0.45 42)
 394 | Cataluña        | Lleida    | Agramunt | POINT(1.06 41.47)
 546 | Castilla y León | Soria     | Agreda   | POINT(-1.54 41.49)
 220 | Andalucía       | Cordoba   | Aguilar  | POINT(-4.39 37.31)
(5 filas)

Observe la geometría en el formato WKT (Well Known Text).

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

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