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.