Moduł pyshp jest nieco trudny do zrozumienia, ale naprawdę przydatny, gdy go uruchomisz. Napisałem skrypt, który wczytuje w pliku CSV przykładowe dane i zapisuje plik kształtu z danymi przechowywanymi jako atrybuty prawidłowych typów danych. Tworzenie danych pyshp / xbase zawsze było dla mnie trudne, dopóki nie znalazłem tego podręcznika użytkownika dla formatu xbase i w wyniku tego pytania napisałem na moim blogu notatkę dotyczącą odpowiednich typów danych pyshp, z których część wkleiłem poniżej :
- C to znaki ASCII
- N jest liczbą całkowitą podwójnej precyzji ograniczoną do około 18 znaków
- D jest datą w formacie RRRRMMDD, bez spacji i łączników między sekcjami.
- F jest dla liczb zmiennoprzecinkowych o takich samych limitach długości jak N
- L jest dla danych logicznych, które są przechowywane w tabeli atrybutów pliku kształtu jako krótka liczba całkowita jako 1 (prawda) lub 0 (fałsz). Wartości, które może otrzymać, to 1, 0, y, n, Y, N, T, F lub wbudowane python True i False
Pełny wykaz jest następujący:
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)
Mam nadzieję, że to pomoże.