Pcshp kullanarak .csv dosyasını .shp'ye dönüştürmek için?


10

Nasıl python komut dosyası ile aynı klasörde bir csv dosyasını açmak için python csv modülünü anlamaya çalışıyorum ve sonra şekil dosya modülü pyshp kullanarak bir şekil dosyası oluşturmak için çalışıyorum.

Csv dosyası şöyle görünür, ancak birkaç bin satırlık kayıt olabilir:

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

Yanıtlar:


14

Pyshp modülü asmak için biraz zor, ama gittikten sonra gerçekten yararlı. Ben örnek verilerin bir csv okuyan ve doğru veri türlerinin öznitelikleri olarak depolanan veriler ile bir şekil dosyası yazıyor bir komut dosyası yazdım. Ben bunu bulana dek pyshp / xbase datatyping benim için her zaman zor olmuştur xbase formatı için kullanım kılavuzunu ve bu sorunun bir sonucu olarak ben küçük bir not yazdım bloguma aşağıda yapıştırdığınız ilgili pyshp veri türleri, kısmen ilgili :

  • C, ASCII karakterleri
  • N, yaklaşık 18 karakter uzunluğunda sınırlı bir çift duyarlıklı tam sayıdır
  • D, bölümler arasında boşluk veya kısa çizgi olmadan YYYYAAGG biçimindeki tarihler içindir.
  • F, N ile aynı uzunluk sınırlarına sahip kayan nokta sayıları içindir
  • L, şekil dosyasının öznitelik tablosunda 1 (doğru) veya 0 (yanlış) olarak kısa bir tamsayı olarak depolanan mantıksal veriler içindir. Alabileceği değerler 1, 0, y, n, Y, N, T, F veya python yerleşik True ve False

Listenin tamamı aşağıdaki gibidir:

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)

Umarım bu yardımcı olur.


Çok güzel bir senaryo. Metin olarak okumadığım için bir hata aldım, bu yüzden bu satırı değiştirdim: açık ('input.csv', 'rt') ile csvfile olarak:
akış

1
Bir if ifadesi kullanarak kontrol etmek yerine üstbilgiyi atlamak için for döngüsü önce next (r) kullanarak performansı artırabilirsiniz düşünüyorum.
rovyko

@sgrieve - bu komut dosyası, csv'yi önceden belirlenmiş belirli alanlarla dönüştürür. Herhangi bir csv bir özellik sınıfına dönüştürmek için genel bir komut dosyası istiyorum. Belki bunu başarmak için yararlı arkpy fonksiyonları vardır?
Waterman

2

Alternatif olarak, verileri listelerde tutmanıza gerek yoktur.

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

Bu uygulamanın çalışan bir örneğini burada bulabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.