今天发现之前的代码运行会报错,发现shapefile接口有更新,最近比较忙,没有去确认是否是因为python版本不同的问题。之前的代码是基于python2.7的,下面这部分更新后的代码是基于python3的。
#-*-coding:utf-8-*-
import shapefile as shp
import csv
import codecs
import os
def trans_point(folder, fn, delimiter=','):
'''transfer a csv file to shapefile'''
# create a point shapefile
output_shp = shp.Writer(folder + "%s.shp"%fn.split('.')[0], shp.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 omit fields here
# 顺序一定要与下面的保持一致
output_shp.field('photo_url', 'C', 50) # string, max-length
output_shp.field('longitude', 'F', 10, 8) # float
output_shp.field('latitude', 'F', 10, 8) # float
output_shp.field('scene', 'C', 20) # string, max-length
output_shp.field('scene_id', 'N') # int
counter = 1 # count the features
# access the CSV file
with codecs.open(folder + fn, 'rb', 'utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=delimiter)
next(reader, None) # skip the header
#loop through each of the rows and assign the attributes to variables
for row in reader:
try:
photo_url = row[0]
lng= float(row[1])
lat = float(row[2])
scene = row[3]
scene_id = int(row[4])
output_shp.point(lng, lat) # create the point geometry
output_shp.record(photo_url, lng, lat, scene, scene_id) # add attribute data
if counter % 10000 == 0:
print("Feature " + str(counter) + " added to Shapefile.")
counter = counter + 1
except:
print(row)
学地信的经常会有这样的需求,即将csv格式的文件转换为shapefile格式加载到arcMap中进行显示与分析,arcMap本身提供了这样的功能,即
文件->添加数据->添加XY数据:选择文件路径,指定X字段(longitude)、Y字段(latitude)即可,默认坐标系为WGS84坐标系。
arcMap的这个功能非常方便,但因为我的数据量较大,有接近100万条数据,故通过代码进行格式转换效率更高点。
下面的代码参考如下链接:Using pyshp to convert .csv file to .shp?
需要用到pyshp模块、csv模块、codecs模块,pip install 安装即可。
下面贴上代码:
目前只能转换point类型数据
#-*-coding:utf-8-*-
import shapefile as shp
import csv
import codecs
import os
def trans_point(folder, fn, idlng, idlat, delimiter=','):
# create a point shapefile
output_shp = shp.Writer(shp.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 omit fields here
# output_shp.field('id','N') # number
output_shp.field('longitude', 'F', 10, 8) # float
output_shp.field('latitude', 'F', 10, 8) # float
output_shp.field('locname','C',100) # string, max-length
# access the CSV file
with codecs.open(folder + fn, 'rb', 'utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=delimiter)
# skip the header
next(reader, None)
#loop through each of the rows and assign the attributes to variables
for row in reader:
# idx = row[0]
locname= row[1]
lng= float(row[idlng])
lat = float(row[idlat])
print lng, lat
# create the point geometry
output_shp.point(lng, lat)
# add attribute data
output_shp.record(lng, lat, locname)
output_shp.save(folder + "%s.shp"%fn.split('.')[0]) # save the Shapefile
if __name__ == '__main__':
folder = 'C:\Users\MaMQ\Desktop' + os.sep
fn = 'test.csv'
trans_point(folder, fn, 2, 3)
示例数据
id | locname | x | y |
---|---|---|---|
1 | Haryana, Haryana, India | 76.9806 | 29.6161 |
2 | Mumbai, Maharashtra, India | 72.8258 | 18.975 |
参考资料
[1] Using pyshp to convert .csv file to .shp?