将excel表格或csv转换为Shapefile文件
读取csv转为shp
构造读取csv函数
def read_csv(fp):
ret = []
with open(fp, 'rb') as f:
for line in f:
ret.append(line.decode('utf-8').strip().split(","))
return ret
原始数据如下


from _datetime import datetime
import shapefile data = read_csv("test3.csv") #打开shp
w=shapefile.Writer(shapefile.POINT)
#shapefile文件要求”几何数据”与”属性数据”要有一一对应的关系,如果有”几何数据”而没有相应的属性值存在,那么在使用ArcGIS软件打开所创建的shapefile文件时会出错
#为了避免这种情况的发生,可以设置 sf.autoBalance = 1,以确保每创建一个”几何数据”,该库会自动创建一个属性值(空的属性值)来进行对应。
#autoBalance默认为0 w.autoBalance = 1 #增加属性字段 设置类型与长度
w.field('id', 'N', 12)
w.field('date', 'D')
w.field('city', 'C', 100)
w.field('location', 'C', 100)
w.field('lng', 'F', 10, 5)
w.field('lat', 'F', 10, 5) for r in data[1:]: #从第二行开始
record = [
int(r[0]),
datetime.strftime(datetime.strptime(r[1], '%d/%m/%Y'),'%Y%m%d'),#把日/月/年转为年\月\日格式
r[2],
r[3],
float(r[4]),
float(r[5])]
w.record(*record)
w.point(float(r[-2]), float(r[-1]))
w.save("sites.shp")
读取excel文件转为shp
import xlrd
import shapefile
xls=xlrd.open_workbook("sites.xlsx")
sheet=xls.sheet_by_index(0)
#打开shp
w=shapefile.Writer(shapefile.POINT)
#shapefile文件要求”几何数据”与”属性数据”要有一一对应的关系,如果有”几何数据”而没有相应的属性值存在,那么在使用ArcGIS软件打开所创建的shapefile文件时会出错。
#为了避免这种情况的发生,可以设置 sf.autoBalance = 1,以确保每创建一个”几何数据”,该库会自动创建一个属性值(空的属性值)来进行对应。
#autoBalance默认为0。
w.autoBalance = 1 #将数据从excel移动到shp
for i in range(sheet.ncols):#读取第一行表头信息 遍历第一行表头每一列
w.field(str(sheet.cell(0,i).value),"C",40) #对每一列构造属性字段 字符类型
for i in range(1, sheet.nrows):#从第二行开始遍历每一行
values=[]
for j in range(sheet.ncols):
values.append(sheet.cell(i,j).value)
w.record(*values)
#以最后两列获取经纬度信息
w.point(float(values[-2]),float(values[-1]))
w.save("sites_.shp")
注意
在ArcGIS中打开属性表或许会出现乱码问题

原因
1.Arcgis本身问题
2.Pyshp库不支持中文内容
解决方案
方案1:最简单的方法——分析是否还需要用到含有中文的字段,若后续不需要则可以删去相应中文字段。再用print(type(...))查看数据类型,你可以把所有的非str类型转换成str,不过更推荐根据数据类型设置你的字段属性
代码改为
import shapefile def read_csv(fp):
ret = []
with open(fp, 'rb') as f:
for line in f:
ret.append(line.decode('utf-8').strip().split(","))
return ret data = read_csv("sites.csv")
w=shapefile.Writer(shapefile.POINT) w.autoBalance = 1
w.field('id', 'N', 12)
w.field('lng', 'F', 10, 5)
w.field('lat', 'F', 10, 5) for r in data[1:]:
record = [
int(r[0]),
float(r[4]),
float(r[5])]
w.record(*record)
w.point(float(r[-2]), float(r[-1]))
w.save("sites.shp")

方案2:(从根本解决)更改arcgis注册表并根据版本安装补丁+修改pyshp库中的shapefile.py
STEP1:
修改arcgis注册表并根据版本安装补丁(目前esri仅提供10.2.1与10.2.2版本的补丁)
10.2.1与10.2.2版本:
教程:https://blog.csdn.net/kikitaMoon/article/details/19116415
10.3及以后:
http://www.cnblogs.com/liweis/p/4629265.html
https://blog.csdn.net/hailiannanhai/article/details/78099074
STEP2:
修改pyshp库中的shapefile.py(由于pycharm可以很方便修改编码格式,因此强烈建议用pycharm进行修改)
Pycharm安装(Professional Edition)与使用教程:
https://blog.csdn.net/qsir/article/details/79362549
特别注意:在教程中的第11步:软件激活方式中,在IntelliJ IDEA 注册码网站,我们可以用学校的邮箱注册,即可免费获取激活码,使用专业版pycharm。不然只有30天试用期。不推荐用教程中的激活码。
在Pycharm中,左上角点击file-setting-file encodings按下图修改,保证输出是utf格式:

在Pycharm中,用英文输入修改pyshp中的shapefile.py(992-999行红框中内容):

将excel表格或csv转换为Shapefile文件的更多相关文章
- geoserver源码学习与扩展——CSV转shapefile文件
基于geotools实现csv转换为shapefile文件. 1.读取CSV文件,将其装入FeatureCollection: 2.利用ShapefileDumper类将FeatureCollecti ...
- csv 转换为DBF文件的方法
转至:https://www.cnblogs.com/hssbsw/archive/2012/12/01/2797140.html csv 转换为DBF文件的方法 最近从SQL导出了许多CSV文件发到 ...
- 【游戏开发】Excel表格批量转换成CSV的小工具
一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...
- Oracle数据表转换为Shapefile(一)
严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...
- 怎么把excel表格内的数据导入数据库?
第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...
- geoserver源码学习与扩展——kml/kmz转shapefile文件
geoserver通过工作空间Workspace-数据源DataStore-图层Layer管理地理数据,默认只支持shapefile格式的文件发布,不支持kml/kmz.csv的文件格式,所以存在将这 ...
- Excel表格数据导入MySQL数据库
有时候项目需要将存在表格中的批量数据导入数据库,最近自己正好碰到了,总结一下: 1.将excel表格另存为.csv格式文件,excel本身的.xlsx格式导入时可能会报错,为了避免不必要的格式错误,直 ...
- 使用Excel表格导入数据到Oracle表
在工作中我们会遇到将通过数据手动录入到系统中的需求,如果数据量比较小,那么手动输入是可行的,倘若数据量很大,那么这些数据手动录入将会是一个很大的工作量,为了简化这个手动录入的操作流程,我们可以使用Ex ...
- PDF文件转换成Excel表格的操作技巧
我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...
随机推荐
- 关闭windows的DEP
1.与开启dep时一样,按组合键win+r打开运行窗口,输入cmd并按回车,如图所示: 2.调出命令提示符窗口后,输入bcdedit.exe/set {current} nx AlwaysOff ...
- Openstack组件实现原理 — Glance架构(V1/V2)
目录 目录 Glance 安装列表 Glance Image service Image service 的组件 Glance-Api Glance-Registry Glance-db Image ...
- shell cat 合并文件,合并数据库sql文件
> 覆盖写入 >> append模式写入 ###################################################################合并数 ...
- 【Java多线程系列一】Java实现线程方法
Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用 Thr ...
- (转载)理解和使用Promise.all和Promise.race
声明:本文转载自:https://www.jianshu.com/p/7e60fc1be1b2 一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Prom ...
- 常用的一些js事件及案例
比如金额需要显示的时候转换成有千分位,小数点后保留2位等.去编辑的时候,又要格式化,把逗号都去掉.网上找了段代码,但是再次编辑会有问题,修改了一下,代码如下: function outputMoney ...
- vim对行进行排序
vim自带排序函数sort, 在命令行模式下执行:help sort 可查看其具体用法,摘录如下: Vim has a sorting function and a sorting command. ...
- 关于Swagger @ApiModel 返回内容注释不显示问题
今天做了一天@ApiModel希望Swagger生成的文档出现返回的内容注释,发现需要用到@ApiModel注解到你需要返回的类上 @ApiModelProperty作为字段的描述 例如 之后文档还 ...
- 在当前对象中可以使用this关键字指代当前对象
在当前对象中可以使用this关键字指代当前对象
- Wordpress 文章编辑页面添加 metabox
add_meta_box($id,$title,$callback,$screen,$context:,$priority); 参数 $id (字符串)(必需)Meta模块的 HTML"ID ...