创建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中列表和元祖的使用方法
Apr 25 Python
Python Requests 基础入门
Apr 07 Python
VSCode下好用的Python插件及配置
Apr 06 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python装饰器用法实例分析
Jan 14 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
python pygame实现方向键控制小球
May 17 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
python两种注释用法的示例
Oct 09 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
php xml-rpc远程调用
2008/12/19 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
nodejs分页类代码分享
2014/06/17 NodeJs
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
vue实现放大镜效果
2020/09/17 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python实现自动更换ip的方法
2015/05/05 Python
Django中处理出错页面的方法
2015/07/15 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python ftplib模块使用代码实例
2019/12/31 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
基于Python实现简单学生管理系统
2020/07/24 Python
营销人才自我鉴定范文
2013/12/25 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
庆祝国庆节标语
2014/10/09 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
家长会主持词开场白
2015/05/29 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技