GDAL python教程(1)——用OGR读写矢量数据
本教程的讲义和源码都是取自Utah State University的openGIS课程
相关资料,包括讲义、源码、数据样例,请从此处下载http://www.gis.usu.edu/~chrisg/python/
本人只是做点翻译,写写学习体会而已,版权属于原作者。
欢迎转载,不过别忘了上面这段话。
==================================================
为什么用open source?
优点
- 免费,适合个人和小公司
- 强大的开发工具,找bug更容易
- 跨平台,windows和linux都能用
- 拉风!
缺点
- 没有内嵌地理处理器
- 用的人少
Open source RS/GIS模块
- OGR矢量库:简单的矢量数据读写,是GDAL的一部分
- GDAL地理空间数据抽象库:
a) 读写栅格数据
b) ArcGIS也是基于GDAL开发的
c) C++库,但是可以用python调用
相关模块
- Numeric:高速的数组处理,对栅格数据尤其重要
- NumPy:下一代的Numeric
- 更强大的gis库 http://www.gispython.org/
导入库:
import ogr
或者:
from osgeo import ogr
万能的方法是:
try:
from osgeo import ogr
except:
import ogr
要读取某种类型的数据,必须要先载入数据驱动,也就是初始化一个对象,让它“知道”某种数据结构。
import ogr
driver = ogr.GetDriverByName(‘ESRI Shapefile’)
数据驱动driver的open()方法返回一个数据源对象
open(<filename>, <update>)
其中update为0是只读,为1是可写
例如:
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
filename = 'C:/Users/gongwei/Documents/My eBooks/python_and_sage/GDAL python/test/ospy_data1/sites.shp'
dataSource = driver.Open(filename,0)
if dataSource is None:
print 'could not open'
sys.exit(1)
print 'done!'
注意filename一定要写绝对路径!
因为一定要用绝对路径,为了简化代码,经常会使用到os.chdir()
读取数据层
layer = dataSource.GetLayer(0)
一般ESRI的shapefile都是填0的,如果不填的话默认也是0.
再看看这个数据层里面有几个点呢?
n = layer.GetFeatureCount()
print 'feature count:', n
读出上下左右边界
extent = layer.GetExtent()
print 'extent:', extent
print 'ul:', extent[0], extent[3]
print 'lr:', extent[1], extent[2]
读取某一要素feature(总算切入正题了),这里读取的是一个点
feat = layer.GetFeature(41)
fid = feat.GetField('id')
print fid
feat = layer.GetFeature(0)
fid = feat.GetField('id') #should be a different id
print fid
另外还有按顺序读取feature,循环遍历所有的feature
feat = layer.GetNextFeature() #读取下一个
while feat:
feat = layer.GetNextFeature()
later.ResetReading() #复位
提取feature的几何形状
geom = feat.GetGeometryRef()
geom.GetX()
geom.GetY()
print geom.
释放内存
feature.Destroy()
关闭数据源,相当于文件系统操作中的关闭文件
dataSource.Destroy()
读完了再说怎么写
创建新文件
driver.CreateDataSource(<filename>)
但是这个文件不能已经存在了,否则会出错
创建新的layer
dataSource.CreateLayer(<name>,CreateLayer(<name>, geom_type=<OGRwkbGeometryType>, [srs])
举个例子:
ds2 = driver.CreateDataSource('test.shp')
layer2 = ds2.CreateLayer('test', geom_type=ogr.wkbPoint)
要删除一个shp文件
driver.DeleteDataSource('test.shp')
要添加一个新字段,只能在layer里面加,而且还不能有数据
添加的字段如果是字符串,还要设定宽度
fieldDefn = ogr.FieldDefn('id', ogr.OFTString)
fieldDefn.SetWidth(4)
layer.CreateField(fieldDefn)
添加一个新的feature,首先得完成上一步,把字段field都添加齐了
然后从layer中读取相应的feature类型,并创建feature
featureDefn = layer.GetLayerDefn()
feature = ogr.Feature(featureDefn)
设定几何形状
feature.SetGeometry(point)
设定某字段的数值
feature.SetField('id', 23)
将feature写入layer
layer.CreateFeature(feature)
GDAL python教程(1)——用OGR读写矢量数据的更多相关文章
- 使用GDAL/OGR读写矢量文件
感觉GIS中矢量相关内容还是挺庞杂的,并且由于版本迭代的关系,使用GDAL/OGR读写矢量的资料也有点不太一样.这里总结了一个读写矢量的示例,实现代码如下: #include <iostream ...
- 七. Python基础(7)--文件的读写
七. Python基础(7)--文件的读写 1 ● 文件读取的知识补充 f = open('file', encoding = 'utf-8') content1 = f.read() content ...
- Ubuntu中安装gdal python版本
安装过程: python包是从C++包中编译出来的,所以需要将源码下载进行编译安装 1.GDAL中的矢量数据处理OGR依赖于Geos,在安装GDAL之前要安装Geos Geos的下载地址:http:/ ...
- python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度
一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
- Python教程:连接数据库,对数据进行增删改查操作
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...
- Python教程:操作数据库,MySql的安装详解
各位志同道合的同仁请点击上方关注 本教程是基于Python语言的深入学习.本次主要介绍MySql数据库软件的安装.不限制语言语法,对MySql数据库安装有疑惑的各位同仁都可以查看一下. 如想查看学习P ...
- (原+转)简明 Python 教程:总结
简明 Python 教程 说明:本文只是对<简明Python教程>的一个总结.请搜索该书查看真正的教程. 第3章 最初的步骤 1. Python是大小写敏感的. 2. 在#符号右面的内容 ...
- Python教程百度网盘哪里有?
Python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象地称作"内置电池(batteries included)".带你快速入门的Py ...
随机推荐
- HDU2094(产生冠军)题解
HDU2094(产生冠军)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 根据给定现有比赛结果推断分析冠军.(这描述...我建议还是看题吧,题不长) [题目分析] 给出的 ...
- Python Challenge
0. 2的38次方 print 2**38 ##apply the result to the url 1. 看图是要right shift两位, 切片即可. import string intab ...
- fastjson的常用使用方法
package Demo; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import ...
- php 垃圾回收机制----写时复制和引用计数
PHP使用引用计数和写时复制来管理内存.写时复制保证了变量间复制值不浪费内存,引用计数保证了当变量不再需要时,将内存释放给操作系统. 要理解PHP内存管理,首先要理解一个概念----符号表. 符号表的 ...
- webform登录操作中正则表达式运用
关于正则表达式的运用,估计很多人都会觉得这很麻烦.确实很麻烦,太多表达式我也记不住,很多都是临时需要用的时候再去查,有点小学生读小说的架势,不认识的字再去翻字典. 正则表达式严格来说对于程序的功能实现 ...
- VS2010 CLR20r3 devenv.exe 错误的解决--vs重启解决方案
VS2010 CLR20r3 devenv.exe 错误的解决 最近我的vs2010经常过段时间就报CLR20r3错误的解决,出现这个异常我的vs2010就要重启,很是烦人,这么搞没法干活也. 搜 ...
- 【自学php】第三天 - 读写文件
这次的例子是把订单的数据保存起来,一般是用数据库来进行数据的存储最好,但是今天目的是为了学习读写文件,所以这次把数据存在文件里. 读写文件有一般有三个步骤: 1)打开文件.如果文件不存在,需要先创建它 ...
- ping-tool
https://serve.netsh.org/pub/ping-tool/ https://serve.netsh.org/pub/ipv4-hosts/
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- 解决Admob Banner首次展示不显示的问题
Admob banner在第一次虽然加载成功了,但是却不显示.然后等待60秒刷新自动刷新,banner就能正常显示. 如果你没遇到过这种情况,那可能你用的不是集成在play-services里的库,因 ...