创建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 之编写简单乘法运算题
Feb 27 Python
Python进行数据提取的方法总结
Aug 22 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 Python
Python装饰器原理与用法分析
Apr 30 Python
Python3中的json模块使用详解
May 05 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
python 高阶函数简单介绍
Feb 19 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
python操作gmail实例
2015/01/14 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
python常见排序算法基础教程
2017/04/13 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
不拖欠农民工工资承诺书
2014/03/31 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书