miércoles, 14 de agosto de 2013

Scripting en gvSIG: Importar CSV y adjuntar la geometría a cada entidad



Teniendo un .csv con nuestros datos crearemos una nueva capa con estas entidades, y utilizando el valor de sus columnas X e Y crearemos una geometría que asociaremos a cada entidad.

creaCapaCsvPuntosRecorrido.py:

from gvsig import *
from commonsdialog import *
from geom import *
import csv
import os.path

def main():

  """Crea Capa de puntos desde un CSV cogiendo como coordenadas las
  dos ultimas columnas X e Y
  """
  #Introducir la dirección donde se encuentra el archivo .csv
  rpath = inputbox("Ruta del csv", "Seleccione Parth",QUESTION)
  if not rpath:
    msgbox("Introduzca la ruta al csv", "Error", FORBIDEN)
    return
  #Abre el fichero en modo de lectura
  input = open(rpath, 'r')

  #var reader coge los datos del .csv

  reader = csv.reader(input)

  #Variables auxiliares

  c = 2
  indice = 0

  #Creamos un esquema vacio para la capa, y valores necesarios

  # para crear la capa dentro del for
  schema = createSchema()
  crs = currentProject().getProjectionCode()
  capa = "csv_layer14.shp"
  ruta1 = "C:\gvsig\\"
  ruta = ruta1 + capa

  #For pasando por todas las lineas del csv. 
para agregar a la capa nueva
  for row in reader:
    #Primera linea la coge como esquema (solo se ejecutará una vez)
    if c == 2:
      #Añade todas las columnas
      for i in row:
        schema.append(i,"STRING", size=10, default=0)
      #Añadimos la geometria
      schema.append("GEOMETRY", "GEOMETRY")
      #Creamos la capa
      newLayer = createShape( schema, ruta, CRS = crs, geometryType = POINT)
      c -= 1
      #Preparamos los valores para añadir los datos a continuacion en el else
      values = dict()
      esquema = schema.getCopy()
    #Lineas en adelante como datos
    else:
      #Añadimos los datos
      for i in row:
        values[indice]=i
        indice += 1
      #Creamos la geometria para cada punto cogiendo las columnas
      #Las columnas X,Y son las dos últimas, usaremos el indice.
      x = indice - 2
      y = indice - 1
      punto = createPoint(int(values[x]),int(values[y]))
      buf = float(values[4])
      values[indice] = punto
      newLayer.append(values)
      indice = 0
  #Añadimos y guardamos la capa.
  currentView().addLayer(newLayer)
  newLayer.commit()
  input.close()


Ejemplo de csv que utilizaremos en este ejemplo y en los siguientes:

tornados.csv

ID,CODIGO,NOMBRE,FECHA,INTENSIDAD,VELOCIDAD,X,Y
1,X159,Gelir,23/06/09,5,30,0,0
2,X295,Ferla,24/08/09,4,20,10,15
3,X820,Vurla,25/10/10,7,35,23,44
4,X810,Bastir,26/04/11,5,24,25,38
5,X890,Cerstart,27/06/12,"3.5",15,32,14
6,X183,Xer,28/06/11,"8.1",35,65,73
7,X105,Gagmor,01/09/10,"7.5",17,13,5
8,X109,Tristi,30/06/09,"6.4",28,98,15
9,X852,Marme,20/07/11,"5.3",20,83,45





Síguenos en: @masquesig

No hay comentarios:

Publicar un comentario