Menggunakan pyshp untuk mengonversi file .csv ke .shp?

10

Saya mencoba memahami bagaimana saya dapat menggunakan modul csv di python untuk membuka file csv di folder yang sama dengan skrip python, dan kemudian membuat shapefile menggunakan modul pyshp shapefile.

File csv terlihat seperti ini, tetapi dapat memiliki beberapa ribu baris catatan:

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
kogia
sumber

Jawaban:

14

Modul pyshp agak sulit untuk dipahami, tetapi sangat berguna setelah Anda melakukannya. Saya telah menulis sebuah skrip yang membaca dalam csv dari contoh data dan menulis sebuah shapefile dengan data yang disimpan sebagai atribut dari tipe data yang benar. Datatyping pyshp / xbase selalu sulit bagi saya sampai saya menemukan panduan pengguna ini untuk format xbase dan sebagai hasil dari pertanyaan ini saya telah menulis catatan kecil di blog saya mengenai tipe data pyshp yang relevan, bagian yang telah saya tempel di bawah ini :

  • C adalah karakter ASCII
  • N adalah bilangan bulat presisi ganda yang panjangnya sekitar 18 karakter
  • D adalah untuk tanggal dalam format YYYYMMDD, tanpa spasi atau tanda hubung di antara bagian.
  • F adalah untuk angka floating point dengan batas panjang yang sama dengan N
  • L adalah untuk data logis yang disimpan dalam tabel atribut shapefile sebagai integer pendek sebagai 1 (benar) atau 0 (salah). Nilai yang dapat diterimanya adalah 1, 0, y, n, Y, N, T, F atau python builtins Benar dan Salah

Daftar lengkapnya adalah sebagai berikut:

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)

Saya harap ini membantu.

sgrieve
sumber
Skrip yang sangat bagus. Saya mendapat kesalahan karena tidak membacanya sebagai teks jadi saya mengubah baris ini: dengan open ('input.csv', 'rt') sebagai csvfile:
terhadap arus
1
Saya pikir Anda dapat meningkatkan kinerja dengan menggunakan next (r) sebelum loop for untuk melewati header daripada memeriksa menggunakan pernyataan if.
rovyko
@sgrieve - skrip ini mengonversi csv dengan bidang yang telah ditentukan sebelumnya. Saya ingin skrip generik untuk mengkonversi csv menjadi kelas fitur. Mungkin ada fungsi arcpy berguna untuk mencapai ini?
Waterman
2

Sebagai alternatif, Anda tidak perlu menyimpan data dalam daftar.

# 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")

Anda dapat menemukan contoh kerja implementasi ini di sini .

Clubdebambos
sumber