创建Shapefile文件并写入数据的例子


Posted in Python onNovember 26, 2019

基本思路

使用GDAL创建Shapefile数据的基本步骤如下:

使用osgeo.ogr.Driver的CreateDataSource()方法创建osgeo.ogr.DataSource矢量数据集

使用osgeo.ogr.DataSource的CreateLayer()方法创建一个图层

使用osgeo.ogr.FieldDefn()定义Shapefile文件的属性字段

创建osgeo.ogr.Feature对象,设置每个属性字段的值,使用Feature对象的SetGeometry()定义几何属性

创建Feature对象以后,使用osgeo.ogr.Layer的CreateFeature()添加Feature对象到当前图层

重复步骤4和5依次添加所有的Feature到当前图层即可

代码实现

下面的例子中,我们读取GeoJSON表示的中国省区数据,然后其转为Shapefile格式。

GeoJSON编码片段如下:

创建Shapefile文件并写入数据的例子

可以看到每个Feature都有一个properties字段和geometry字段,我们需要根据properties字段的信息创建Shapefile数据的属性表,根据geometry字段创建Shapefile中的几何数据。

from osgeo import ogr
from osgeo import osr
import json
import os
os.environ['SHAPE_ENCODING'] = "utf-8"


with open('China.json') as f:
 china = json.load(f)

# 创建DataSource
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.CreateDataSource('China.shp')

# 创建WGS84空间参考
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)

# 创建图层
layer = ds.CreateLayer('province', srs, ogr.wkbPolygon)
# 添加属性定义
fname = ogr.FieldDefn('Name', ogr.OFTString)
fname.SetWidth(24)
layer.CreateField(fname)
fcx = ogr.FieldDefn('CenterX', ogr.OFTReal)
layer.CreateField(fcx)
fcy = ogr.FieldDefn('CenterY', ogr.OFTReal)
layer.CreateField(fcy)

# 变量GeoJSON中的features
for f in china['features']:
 # 新建Feature并且给其属性赋值
 feature = ogr.Feature(layer.GetLayerDefn())
 feature.SetField('Name', f['properties']['name'])
 feature.SetField('CenterX', f['properties']['cp'][0])
 feature.SetField('CenterY', f['properties']['cp'][1])

 # 设置Feature的几何属性Geometry
 polygon = ogr.CreateGeometryFromJson(str(f['geometry']))
 feature.SetGeometry(polygon)
 # 创建Feature
 layer.CreateFeature(feature)
 del feature
ds.FlushCache()

del ds

以上这篇创建Shapefile文件并写入数据的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python的Lambda函数与排序
Oct 25 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
django框架模板语言使用方法详解
Jul 18 Python
Opencv求取连通区域重心实例
Jun 04 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
宝塔更新Python及Flask项目的部署
Apr 11 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 #Python
使用Python实现 学生学籍管理系统
Nov 26 #Python
python redis 批量设置过期key过程解析
Nov 26 #Python
python3 tkinter实现添加图片和文本
Nov 26 #Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 #Python
Python小程序之在图片上加入数字的代码
Nov 26 #Python
基于Python获取城市近7天天气预报
Nov 26 #Python
You might like
深入extjs与php参数交互的详解
2013/06/25 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
DOM 事件流详解
2015/01/20 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
python+django快速实现文件上传
2016/10/24 Python
python读写csv文件实例代码
2019/07/05 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
python安装及变量名介绍详解
2020/12/12 Python
美国眼镜网站:LensCrafters
2020/01/19 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
护理专业大学生自我推荐信
2014/01/25 职场文书
生产厂长岗位职责
2014/02/21 职场文书
作文评语集锦大全
2014/04/23 职场文书
阳光体育活动总结
2014/04/30 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
Golang: 内建容器的用法
2021/05/05 Golang