Imprimir campos en archivo de texto, incluyendo coordenadas, con librería OGR de python

Programar en Python con GRASS-Script es equivalente a seleccionar un vehículo diferente para cada ocasión (paseo, transporte, trabajo en el campo, etc) mientras que hacerlo con la librería OGR de Python hay que construir primero el vehículo a partir de sus piezas. No obstante, los procedimientos se pueden encapsular en una función para ahorrar esfuerzos y una ventaja que tiene el uso de la librería OGR es un acceso inmediato a los datos sin necesidad de importarlos al ambiente de trabajo. En esta oportunidad se va a trabajar con el shapefile sites.shp que se provee con el curso ya referido en el artículo anterior.

Para ello, ya que se trabaja en Linux, el procedimiento involucraría, secuencialmente, lo siguiente:

    1. Incluir la instrucción para el procesamiento de caracteres especiales.
    2. Añadir los módulos (librerías) para acceder a los procedimientos OGR y a las funciones de control del sistema (os y sys) para borrar pantalla, cambiar de directorio e interrumpir el programa si se producen excepciones.
    3. Cambiarse al directorio donde se almacenan los shapefiles.
    4. Abrir archivo de texto (datos.dat), modo de escritura, para imprimir 4 campos (id, coordenadas x,y, cover). Se abre en el directorio posicionado.
    5. Establecer el driver para manejar los vectoriales (‘ESRI Shapefile’).
    6. Abrir la fuente de datos (‘sites.shp’).
    7. Establecer excepción para apertura de archivo.
    8. Establecer la capa de la cual se extraeran los rasgos.
    9. Establecer los campos que serán extraidos a partir de la capa (id, cover) con destrucción de rasgos (features).
    10. Establecer la referencia geometrica como rasgo.
    11. Impresión de campos en archivo de salida.
    12. Destrucción de fuente de datos y cierre de archivo de impresión.

El código para todo lo anterior sería:

#!/usr/bin/env python
# -*- coding: utf-8

from osgeo import ogr
from os import system
from os import chdir
import sys

#Borrar pantalla
system('clear') #En Win sería 'cls'

#Cambiarse al directorio donde se almacenan los shapefiles
path='/home/zeito/Desktop/PYTHON_GDAL/ospy_data1'
chdir(path)
print "Directorio donde se almacena el shapefile:\n", path

#Abrir archivo de texto modo escritura de datos
#Se abre en el directorio posicionado
file_output='datos.dat'
file = open(file_output, 'w')
print "El Archivo de impresión es " + file_output

#Establecer el driver para manejar los vectoriales
driver = ogr.GetDriverByName('ESRI Shapefile')

#Abrir la fuente de datos (sólo lectura = 0)
shapefile = 'sites.shp'
datasource = driver.Open(shapefile, 0)

#Establecer excepción para apertura de archivo
if datasource is None:
	print "El Shapefile no existe"
	sys.exit(1)
else:
	print "El Shapefile " + shapefile + " se abrió exitosamente"

#Establecer la capa de la cual se extraeran los rasgos
layer = datasource.GetLayer()

#Establecer los campos que serán extraidos a partir de la capa
feature = layer.GetNextFeature()

#Establecer la referencia geometrica como rasgo
geometria=feature.GetGeometryRef()

while feature:

	id = feature.GetFieldAsString('id')
	cover = feature.GetFieldAsString('cover')
	x = str(geometria.GetX())
	y = str(geometria.GetY())

	#Imprime id, coordenadas y cover en archivo datos.dat
	file.write(id + ' ' + x + ' ' + y + ' ' + cover + '\n')

	feature.Destroy()
	feature = layer.GetNextFeature()

datasource.Destroy()
file.close()

En la cónsola de ejecución se observa ésto:

Directorio donde se almacena el shapefile:
/home/zeito/Desktop/PYTHON_GDAL/ospy_data1
El Archivo de impresión es datos.dat
El Shapefile sites.shp se abrió exitosamente

y el archivo datos.dat producido (en el mismo directorio donde se almacena el shapefile) corresponde a:

1 455552.418361 4641822.05368 shrubs
2 449959.840851 4633802.50858 trees
3 441201.653431 4619029.66233 rocks
4 468214.858005 4608688.66995 grass
5 456713.141995 4617974.45902 shrubs
6 472330.150889 4619873.82497 trees
7 456396.581004 4627576.80909 bare
8 480033.135006 4628104.41074 bare
9 477395.126747 4633169.38659 trees
10 491429.330686 4635701.87452 grass
11 483093.224587 4642560.696 grass
12 490690.688374 4646781.50921 rocks
13 488580.281766 4629581.69536 grass
14 488791.322427 4616286.13374 trees
15 482671.143266 4603307.1331 shrubs
16 470114.223952 4603518.17376 bare
17 467898.297014 4597292.47427 grass
18 473068.793202 4592966.14072 bare
19 479716.574015 4591699.89676 trees
20 485098.110864 4596448.31163 trees
21 478766.891042 4601091.20616 shrubs
22 474018.476175 4603518.17376 trees
23 457029.702986 4603412.65343 rocks
24 443312.060038 4599613.92154 grass
25 435503.555591 4606050.66169 rocks
26 432548.986341 4612276.36118 trees
27 445000.385324 4611432.19854 shrubs
28 456607.621665 4611221.15788 grass
29 451437.125476 4619451.74365 bare
30 445422.466645 4628948.57338 rocks
31 440779.572109 4638023.32179 grass
32 441096.1331 4647836.71252 rocks
33 448377.035896 4653007.2087 shrubs
34 458190.42662 4652690.64771 trees
35 447110.791931 4646148.38723 bare
36 462938.841487 4634541.15089 trees
37 466209.971728 4625782.96347 grass
38 470536.305273 4639817.16741 water
39 470958.386595 4651635.44441 water
40 474651.598158 4623039.43488 grass
41 428117.132465 4641083.41137 trees
42 443628.621029 4593493.74238 grass
Esta entrada fue publicada en Código Python, GDAL/OGR, SIG, Software Libre. Guarda el enlace permanente.

2 respuestas a Imprimir campos en archivo de texto, incluyendo coordenadas, con librería OGR de python

  1. Pingback: Copia parcial de un vectorial de puntos con generación de nuevos campos, incluyendo coordenadas, con librería OGR de python |

  2. Pingback: Cómo extraer las coordenadas x, y de un polígono mediante el módulo OGR de Python |

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