回答:
pyshpモジュールはコツをつかむのに少しトリッキーですが、一度始めたら本当に便利です。サンプルデータのcsvを読み取り、データを正しいデータ型の属性として保存してシェープファイルを書き出すスクリプトを作成しました。pyshp / xbaseデータタイプは、xbase形式のこのユーザーガイドを見つけるまで常にトリッキーでした。この質問の結果、関連するpyshpデータタイプについてブログに小さなメモを書きました。その一部を以下に貼り付けました。 :
完全なリストは次のとおりです。
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)
これがお役に立てば幸いです。
別の方法として、リストにデータを保持する必要はありません。
# import libraries
import shapefile, csv
# create a point shapefile
output_shp = shapefile.Writer(shapefile.POINT)
# for every record there must be a corresponding geometry.
output_shp.autoBalance = 1
# create the field names and data type for each.
# you can insert or omit lat-long here
output_shp('Date','D')
output_shp('Target','C',50)
output_shp('ID','N')
# count the features
counter = 1
# access the CSV file
with open('input.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
# skip the header
next(reader, None)
#loop through each of the rows and assign the attributes to variables
for row in reader:
id= row[0]
target= row[1]
date = row[2]
# create the point geometry
output_shp.point(float(longitude),float(latitude))
# add attribute data
output_shp.record(id, target, date)
print "Feature " + str(counter) + " added to Shapefile."
counter = counter + 1
# save the Shapefile
output_shp.save("output.shp")
この実装の実際の例はここにあります。