pyshp를 사용하여 .csv 파일을 .shp로 변환 하시겠습니까?


10

파이썬에서 csv 모듈을 사용하여 python 스크립트와 동일한 폴더에서 csv 파일을 열고 shapefile 모듈 pyshp를 사용하여 shapefile을 만드는 방법을 이해하려고합니다.

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

답변:


14

pyshp 모듈은 약간 까다 롭지 만 일단 사용하면 실제로 유용합니다. 예제 데이터의 CSV로 읽고 올바른 데이터 유형의 속성으로 저장된 데이터로 shapefile을 작성하는 스크립트를 작성했습니다. pyshp / xbase 데이터 타이핑은 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)

이게 도움이 되길 바란다.


아주 좋은 스크립트입니다. 텍스트로 읽지 않아 오류가 발생하여 다음 줄을 변경했습니다. csvfile로 open ( 'input.csv', 'rt') 사용 :
againstflow

1
if 문을 사용하여 확인하는 대신 for 루프 앞에 next (r)을 사용하여 헤더를 건너 뛰면 성능을 향상시킬 수 있다고 생각합니다.
rovyko

@sgrieve-이 스크립트는 csv를 특정 미리 결정된 필드로 변환합니다. csv를 기능 클래스로 변환하는 일반 스크립트를 원합니다. 아마도 이것을 달성하는 데 유용한 arcpy 함수가 있습니까?
워터맨

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

이 구현의 실제 예제는 여기에서 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.