创建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 相关文章推荐
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
python保存网页图片到本地的方法
Jul 24 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
详解Python 循环嵌套
Jul 09 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
怎样在php中使用PDF文档功能
2006/10/09 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
php header()函数使用说明
2008/07/10 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php短信接口代码
2016/05/13 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
软件测试常见笔试题
2012/02/04 面试题
见习报告的格式
2014/11/04 职场文书
安全第一课观后感
2015/06/18 职场文书
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python