2ndo tutorial rápido de OGR

14 de Junio de 2012

Hace algunas semanas, hice un primer tutorial de OGR. Este tutorial enseñaba la manera de cambiar la proyección de varios archivos shape en batch.

Hoy voy a enseñarles como hacer una selección según los atributos y según la ubicación y, tal vez la función más usada de OGR, como convertir un archivo vector a un otro formato, en mi caso de shape a KML.

Como la última vez, usaré los datos en formato shape de OSM de CloudMade. Pero esa vez, trabajaré solamente con el archivo lima_poi.shp. Este archivo contiene todos los puntos de interés de Lima, es decir los bancos, restaurantes, estacionamientos, etc...

Selección por atributo

Antes de hacer mi selección, necesito saber la arquitectura de mi archivo. Para eso, uso la comanda ogrinfo.

$ ogrinfo -so lima_poi.shp lima_poi


INFO: Open of `lima_poi.shp'

using driver `ESRI Shapefile' successful.

Layer name: lima_poi

Geometry: Point

Feature Count: 1093

Extent: (-77.842455, -13.023281) - (-75.645698, -10.192468) 

Layer SRS WKT: GEOGCS["WGS 84", 

DATUM["WGS_1984",

SPHEROID["WGS 84",6378137,298.257223563,

AUTHORITY["EPSG","7030"]],

TOWGS84[0,0,0,0,0,0,0],

AUTHORITY["EPSG","6326"]],

PRIMEM["Greenwich",0,

AUTHORITY["EPSG","8901"]],

UNIT["degree",0.01745329251994328,

AUTHORITY["EPSG","9122"]],

AUTHORITY["EPSG","4326"]]

 

CATEGORY: String (30.0)

NAME: String (74.0)

Veo que esta capa contiene 1093 puntos y 2 atributos (CATEGORY y NAME). La opción -so significa Summary Only y permite obtener únicamente la información de base sobre la capa.

Estoy interesado en saber cuantos restaurantes hay en la base OSM en Lima, así que buscaré los puntos que contienen la palabra "Restaurante" en el atributo NAME. Para eso uso la opción -sql que permite ejecutar una consulta SQL sobre la capa.

$ ogrinfo -so -sql "select * from lima_poi where NAME like '%Restaurant%'" lima_poi.shp lima_poi 

INFO: Open of `lima_poi.shp'

using driver `ESRI Shapefile' successful.

layer names ignored in combination with -sql.

Layer name: lima_poi

Geometry: Point

Feature Count: 93

Extent: (-77.842455, -13.023281) - (-75.645698, -10.192468)

...

...

Solamente 93 restaurantes en Lima ?! Pero qué hace la comunidad OSM de Lima Laughing ?

Selección por ubicación

Y cuantos hay en el centro de Lima? Buena pregunta! OGR tiene la respuesta, usando un rectángulo de búsqueda que tomara en cuenta solamente los puntos contenidos dentro de este rectángulo. Es decir que no tendremos los restaurantes del distrito de Lima pero si no los que estan en la bounding box de este distrito.

Esa vez uso la opción -spat con los parametros xmin ymin xmax ymax que agrego a mi comanda anterior:

$ ogrinfo -so -sql "select * from lima_poi where NAME like '%Restaurant%'" -spat -77.0882 -12.0798 -77.003 -12.0304 lima_poi.shp lima_poi


INFO: Open of `lima_poi.shp'

using driver `ESRI Shapefile' successful.

layer names ignored in combination with -sql.

Layer name: lima_poi

Geometry: Point

Feature Count: 16

Extent: (-77.842455, -13.023281) - (-75.645698, -10.192468)

...

...

Lo que nos da 16 restaurantes en el distrito de Lima y sus alrededores.

Conversión

Para terminar, quiero convertir esta selección en el formato KML para compartirla más facilmente. Se hace al toque con la famosa comanda ogr2ogr.

$ ogr2ogr -f KML -sql "select * from lima_poi where NAME like '%Restaurant%'" -spat -77.0882 -12.0798 -77.003 -12.0304 restaurantes_lima.kml lima_poi.shp lima_poi


layer names ignored in combination with -sql.

Uso la opción -f (para formato) con el parametro KML para decirle de convertir mi archivo en este formato y lo llamo restaurantes_lima.kml. El resto es lo mismo que en comanda anterior.

Twittear