创建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使用metaclass实现Singleton模式的方法
May 05 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
对python中的*args与**kwgs的含义与作用详解
Aug 28 Python
Python流程控制 while循环实现解析
Sep 02 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
python SOCKET编程基础入门
Feb 27 Python
Python绘制散乱的点构成的图的方法
Apr 21 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP安全配置详细说明
2011/09/26 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python数据类型之Number数字操作实例详解
2019/05/08 Python
使用python实现简单五子棋游戏
2019/06/18 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
就业推荐表自我鉴定
2013/10/29 职场文书
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
找工作最新求职信
2013/12/22 职场文书
大学生应聘求职信
2014/05/26 职场文书
测控技术自荐信
2014/06/05 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书