10 votos

El uso de python biblioteca de forma: pyshp - cómo convertir .archivo csv .shp

Estoy tratando de entender cómo puedo usar el csv módulo en python para abrir un archivo csv en la misma carpeta que el script de python, y, a continuación, crear un shapefile utilizando el archivo de forma módulo de pyshp.

El archivo csv se parece a esto, pero puede tener un par de miles de filas de registros:

id_nr;date;target;start_lat;start_lon
1;2012-05-21;navpoint 25x;55.123654;13.456954
1;2012-05-23;navpoint 11f;55.143654;12.456954

14voto

sker Puntos 2670

El pyshp módulo es un poco complicado para conseguir la caída de, pero realmente útil una vez que se va. He escrito un script que lee en un csv de los datos de ejemplo y escribe un shapefile con los datos que se almacenan como atributos de los tipos de datos correctos. El pyshp/xbase datatyping siempre ha sido difícil para mí hasta que me encontré con esta guía de usuario para el formato xbase y como resultado de esta pregunta he escrito una pequeña nota en mi blog sobre el relevante pyshp tipos de datos, parte de la cual he copiado a continuación:

  • C son los caracteres ASCII
  • N es un entero de doble precisión limitada a alrededor de 18 caracteres de longitud
  • D es para las fechas en el formato AAAAMMDD, sin espacios ni guiones entre las secciones.
  • F es para números de punto flotante con los mismos límites de longitud N
  • L es por la lógica de los datos que se almacenan en el archivo shape de la tabla de atributos como un entero corto como 1 (verdadero) o 0 (falso). Los valores que puede recibir son 1, 0, s, n, S, N, T, F o python builtins Verdadero y Falso

El listado completo es el siguiente:

import shapefile as shp
import csv

out_file = 'GPS_Pts.shp'

#Set up blank lists for data
x,y,id_no,date,target=[],[],[],[],[]

#read data from csv file and store in lists
with open('input.csv', 'rb') as csvfile:
    r = csv.reader(csvfile, delimiter=';')
    for i,row in enumerate(r):
        if i > 0: #skip header
            x.append(float(row[3]))
            y.append(float(row[4]))
            id_no.append(row[0])
            date.append(''.join(row[1].split('-')))#formats the date correctly
            target.append(row[2])

#Set up shapefile writer and create empty fields
w = shp.Writer(shp.POINT)
w.autoBalance = 1 #ensures gemoetry and attributes match
w.field('X','F',10,8)
w.field('Y','F',10,8)
w.field('Date','D')
w.field('Target','C',50)
w.field('ID','N')

#loop through the data and write the shapefile
for j,k in enumerate(x):
    w.point(k,y[j]) #write the geometry
    w.record(k,y[j],date[j], target[j], id_no[j]) #write the attributes

#Save shapefile
w.save(out_file)

Espero que esto ayude.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X