โมดูล pyshp นั้นยุ่งยากเล็กน้อยในการทำให้เป็นเรื่องง่าย แต่ก็มีประโยชน์จริงๆเมื่อคุณทำเสร็จ ฉันเขียนสคริปต์ที่อ่านใน csv ของข้อมูลตัวอย่างและเขียน shapefile ด้วยข้อมูลที่เก็บไว้เป็นแอตทริบิวต์ของประเภทข้อมูลที่ถูกต้อง pyshp / xbase datatyping นั้นค่อนข้างยุ่งยากสำหรับฉันจนกระทั่งฉันพบคู่มือผู้ใช้สำหรับรูปแบบ xbaseและจากคำถามนี้ฉันได้เขียนโน้ตเล็ก ๆ ลงในบล็อกของฉันเกี่ยวกับประเภทข้อมูล pyshp ที่เกี่ยวข้องซึ่งเป็นส่วนหนึ่งที่ฉันวางไว้ด้านล่าง :
- C คืออักขระ ASCII
- N เป็นจำนวนเต็มความแม่นยำสองเท่าจำกัดความยาวได้ประมาณ 18 อักขระ
- D สำหรับวันที่ในรูปแบบ YYYYMMDD โดยไม่มีช่องว่างหรือยัติภังค์ระหว่างส่วน
- F สำหรับตัวเลขจำนวนจุดลอยตัวที่มีการจำกัดความยาวเท่ากับ N
- L สำหรับข้อมูลโลจิคัลที่เก็บอยู่ในตารางแอ็ตทริบิวต์ของ shapefile เป็นจำนวนเต็มแบบสั้นเป็น 1 (true) หรือ 0 (false) ค่าที่สามารถรับได้คือ 1, 0, y, n, Y, N, T, F หรือไพ ธ อนบิวด์อิน True และ False
รายชื่อเต็มมีดังนี้:
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)
ฉันหวังว่านี่จะช่วยได้.