将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文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...
随机推荐
- 如何在Python中让两个print()函数的输出打印在一行内?
1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用‘,’代替空格,且默认末尾加 ...
- smali与baksmali用法-基于2.2.2版本
下载地址:https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads 反编译dex java -jar baksmali-2.2.1 ...
- 8.1 图像API
8.1 图像API Routine Description Drawing related functions GUI_AddRect() 调整矩形框的大小 GUI_GetClientRect() R ...
- [已解决]报错Could not install packages due to an EnvironmentError
安装OpenCV过程中出现错误 代码: pip-conda install -i https://pypi.douban.com/simple/ opencv-python 报错内容如下: Could ...
- JDK在Win10与Ubuntu下的安装与配置
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 近段时间把自己电脑(win).虚拟机(Ubun ...
- 2018年初面试Java(1.5年经验)
xml文档如何解析 控制反转如何实现 http://www.cnblogs.com/qf123/p/8602972.html struts2和springmvc的区别 http://www.cnblo ...
- springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
- webstorm/vs取消eslint
vs ——preference ——setting,添加"eslint.enable": false webstorm ——setting ——language ——javascr ...
- wbinfo - 向winbind服务查询信息
总览 SYNOPSIS wbinfo [-a user%password] [-c username] [-C groupname] [--domain domain] [-I ip] [-s sid ...
- CentOS7.6编译安装openssl-1.1.1c
卸载旧版本OpenSSL # which openssl/usr/bin/openssl# mv openssl openssl.oldrm -rf /etc/ssl #删除配置文件 CentOS7. ...