Sử dụng pyshp để chuyển đổi tập tin .csv sang .shp?


10

Tôi đang cố gắng hiểu làm thế nào tôi có thể sử dụng mô-đun csv trong python để mở tệp csv trong cùng thư mục với tập lệnh python, sau đó tạo một shapefile bằng mô-đun shapefile pyshp.

Tệp csv trông như thế này, nhưng có thể có một vài nghìn hàng bản ghi:

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

Câu trả lời:


14

Mô-đun pyshp là một chút khó khăn để hiểu rõ, nhưng thực sự hữu ích một khi bạn thực hiện nó. Tôi đã viết một tập lệnh đọc trong một csv của dữ liệu mẫu và viết ra một shapefile với dữ liệu được lưu trữ dưới dạng các thuộc tính của các kiểu dữ liệu chính xác. Kiểu dữ liệu pyshp / xbase luôn luôn khó khăn đối với tôi cho đến khi tôi tìm thấy hướng dẫn sử dụng này cho định dạng xbase và do câu hỏi này tôi đã viết một ghi chú nhỏ trên blog của mình về các kiểu dữ liệu pyshp có liên quan, một phần mà tôi đã dán bên dưới :

  • C là ký tự ASCII
  • N là số nguyên có độ chính xác kép giới hạn trong khoảng 18 ký tự
  • D dành cho ngày ở định dạng YYYYMMDD, không có khoảng trắng hoặc dấu gạch nối giữa các phần.
  • F dành cho các số dấu phẩy động có cùng giới hạn độ dài với N
  • L dành cho dữ liệu lôgic được lưu trữ trong bảng thuộc tính của shapefile dưới dạng một số nguyên ngắn là 1 (đúng) hoặc 0 (sai). Các giá trị nó có thể nhận được là 1, 0, y, n, Y, N, T, F hoặc các nội dung python Đúng và Sai

Danh sách đầy đủ như sau:

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)

Tôi hi vọng cái này giúp được.


Kịch bản rất hay. Tôi đã gặp một lỗi vì nó không đọc được dưới dạng văn bản nên tôi đã thay đổi dòng này: với open ('input.csv', 'rt') là csvfile:
ngược dòng

1
Tôi nghĩ bạn có thể cải thiện hiệu suất bằng cách sử dụng next (r) trước vòng lặp for để bỏ qua tiêu đề thay vì kiểm tra bằng câu lệnh if.
dexgecko

@sgrieve - tập lệnh này chuyển đổi một csv với các trường được xác định trước cụ thể. Tôi muốn một tập lệnh chung để chuyển đổi bất kỳ csv nào thành một lớp đối tượng. Có lẽ có các chức năng Arcpy hữu ích để đạt được điều này?
Waterman

2

Thay vào đó, bạn không cần phải giữ dữ liệu trong danh sách.

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

Bạn có thể tìm thấy một ví dụ làm việc của việc thực hiện này ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.