Использование pyshp для преобразования файла .csv в .shp?

10

Я пытаюсь понять, как я могу использовать модуль CSV в Python, чтобы открыть файл CSV в той же папке, что и сценарий Python, а затем создать шейп-файл с помощью модуля шейп-файла pyshp.

Файл CSV выглядит следующим образом, но может содержать пару тысяч строк записей:

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
источник

Ответы:

14

Модуль pyshp немного сложен в освоении, но действительно полезен, как только вы его запустите. Я написал скрипт, который читает в CSV данных примера и записывает шейп-файл с данными, хранящимися как атрибуты правильных типов данных. Тип данных pyshp / xbase всегда был сложным для меня, пока я не нашел это руководство пользователя для формата xbase, и в результате этого вопроса я написал небольшую заметку в своем блоге относительно соответствующих типов данных pyshp, часть которых я вставил ниже :

  • C ASCII символов
  • N - целое число двойной точности, ограниченное длиной около 18 символов
  • D - для дат в формате ГГГГММДД без пробелов и дефисов между разделами.
  • F для чисел с плавающей запятой с теми же пределами длины, что и N
  • L - для логических данных, которые хранятся в таблице атрибутов шейп-файла в виде короткого целого числа, равного 1 (true) или 0 (false). Значения, которые он может получить: 1, 0, y, n, Y, N, T, F или встроенные в Python значения 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)

Надеюсь, это поможет.

sgrieve
источник
Очень хороший сценарий. Я получил сообщение об ошибке, так как он не прочитал его как текст, поэтому я изменил эту строку: с open ('input.csv', 'rt') как csvfile:
против потока
1
Я думаю, что вы можете улучшить производительность, используя next (r) перед циклом for, чтобы пропустить заголовок вместо проверки с помощью оператора if.
ровыко
@sgrieve - этот скрипт преобразует CSV с определенными предопределенными полями. Я хотел бы общий сценарий для преобразования любого CSV в класс объектов. Возможно, есть полезные функции arcpy для достижения этой цели?
Waterman
2

В качестве альтернативы вам не нужно хранить данные в списках.

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

Вы можете найти рабочий пример этой реализации здесь .

Clubdebambos
источник