pyshpを使用して.csvファイルを.shpに変換しますか?


10

Pythonでcsvモジュールを使用して、pythonスクリプトと同じフォルダーにあるcsvファイルを開き、シェープファイルモジュール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

回答:


14

pyshpモジュールはコツをつかむのに少しトリッキーですが、一度始めたら本当に便利です。サンプルデータのcsvを読み取り、データを正しいデータ型の属性として保存してシェープファイルを書き出すスクリプトを作成しました。pyshp / xbaseデータタイプは、xbase形式のこのユーザーガイドを見つけるまで常にトリッキーでした。この質問の結果、関連するpyshpデータタイプについてブログに小さなメモを書きました。その一部を以下に貼り付けました。 :

  • CはASCII文字です
  • Nは、長さが約18文字に制限された倍精度整数です。
  • Dは、YYYYMMDD形式の日付用で、セクション間にスペースやハイフンはありません。
  • 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)

これがお役に立てば幸いです。


とても素晴らしいスクリプトです。:csvfile内として(「input.csv」、「RT」)オープンと:私はこの行を変更して、それがテキストとしてそれを読んでいないように私はエラーを得た
againstflow

1
ifステートメントを使用してチェックする代わりに、forループの前にnext(r)を使用してヘッダーをスキップすることで、パフォーマンスを改善できると思います。
dexgecko 2017年

@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.