读取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文件的更多相关文章

  1. geoserver源码学习与扩展——CSV转shapefile文件

    基于geotools实现csv转换为shapefile文件. 1.读取CSV文件,将其装入FeatureCollection: 2.利用ShapefileDumper类将FeatureCollecti ...

  2. csv 转换为DBF文件的方法

    转至:https://www.cnblogs.com/hssbsw/archive/2012/12/01/2797140.html csv 转换为DBF文件的方法 最近从SQL导出了许多CSV文件发到 ...

  3. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  4. Oracle数据表转换为Shapefile(一)

    严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...

  5. 怎么把excel表格内的数据导入数据库?

    第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...

  6. geoserver源码学习与扩展——kml/kmz转shapefile文件

    geoserver通过工作空间Workspace-数据源DataStore-图层Layer管理地理数据,默认只支持shapefile格式的文件发布,不支持kml/kmz.csv的文件格式,所以存在将这 ...

  7. Excel表格数据导入MySQL数据库

    有时候项目需要将存在表格中的批量数据导入数据库,最近自己正好碰到了,总结一下: 1.将excel表格另存为.csv格式文件,excel本身的.xlsx格式导入时可能会报错,为了避免不必要的格式错误,直 ...

  8. 使用Excel表格导入数据到Oracle表

    在工作中我们会遇到将通过数据手动录入到系统中的需求,如果数据量比较小,那么手动输入是可行的,倘若数据量很大,那么这些数据手动录入将会是一个很大的工作量,为了简化这个手动录入的操作流程,我们可以使用Ex ...

  9. PDF文件转换成Excel表格的操作技巧

    我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...

随机推荐

  1. 使用redis实现客户端和服务端token验证

    实在是思维江化啊,没有想到可以给redis设置不同的key值来实现不同key值存储不同的value值,而一直想着给一个名为token的key值新增不同的数据,并设置过期时间,然而这样却不能新增只能做到 ...

  2. Karaf基础知识

    Karaf 遵循OSGi开发规范的一个Apache框架 1.命令形如:scope:name   举例:feature:list 2 shell:completion tab键补齐 GLOBAL 补齐显 ...

  3. PostgreSQL——启动脚本

    <仅供参考,执行結果受环境影响> 如下: pgpath='/usr/local/pgsql/bin' pgdata='/usr/local/pgsql/data' #以 postgres ...

  4. [已解决]报错JSONDecodeError

    报错: 解决:

  5. LCA的 Trajan 算法

    参考博客 参考博客 根据博客的模拟,就可以知道做法和思想. 现在就是实现他. 例题 :hdu  2586  题意:m 个询问,x  到  y  的距离,我们的思想就是求出:x到根的距离+y到根的距离- ...

  6. Markdown测试2

    四级标题 内容测试 内容测试 内容测试 为知笔记发布博客时会添加一些HTML或CSS的标记,会影响文章的摘要显示. A B 一 二 α​" role="presentation&q ...

  7. Oracle之数据类型问题

    做项目涉及到Oracle数据库中数据类型:字符串型的问题 我不太清楚varchar(32)到底代表着什么? 通过搜索了解到:oracle中有三种常用的类型:varchar2(byte),varchar ...

  8. redis主从复制和哨兵

    摘自:https://www.cnblogs.com/leeSmall/p/8398401.html 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点 ...

  9. robotframework+python3+selenium之常用情景---第四集

    1.切换浏览器 2.切换frame/iframe 3.截图保存 3.1导入Screenshot包 3.2 编写自动化测试之截图 4.后续再补充

  10. python_django_中间件

    什么是中间件? 可以介入django的请求和响应的轻量级的底层插件,它其实就是一个python类,我们在settings配置文件中的↓↓↓↓,都是中间件 MIDDLEWARE = [ 'django. ...