建立空的geometry对象:ogr.Geometry

定义各种不同的geometry使用的方法是不一样的(point, line, polygon, etc)

新建点point,使用方法AddPoint( , , [])。其中的z坐标一般是省略的,默认值是0

例如:

point = ogr.Geometry(ogr.wkbPoint)

point.AddPoint(10,20)

新建line

使用AddPoint(, , [])添加点

使用SetPoint(, , , [])更改点的坐标

例如下面这段代码,更改了0号点的坐标:

line = ogr.Geometry(ogr.wkbLineString)

line.AddPoint(10,10)

line.AddPoint(20,20)

line.SetPoint(0,30,30) #(10,10) -> (30,30)

统计所有点的数目

print line.GetPointCount()

读取0号点的x坐标和y坐标

print line.GetX(0)

print line.GetY(0)

新建多边形,首先要新建环(ring),然后把环添加到多边形对象中。

如何创建一个ring?先新建一个ring对象,然后向里面逐个添加点。

ring = ogr.Geometry(ogr.wkbLinearRing)

ring.AddPoint(0,0)

ring.AddPoint(100,0)

ring.AddPoint(100,100)

ring.AddPoint(0,100)

结束的时候,用CloseRings关闭ring,或者将最后一个点的坐标设定为与第一个点相同。

ring.CloseRings()

ring.AddPoint(0,0)

下面举一个例子,创建一个方框。这是个polygon对象,又例外两层ring构成。

outring = ogr.Geometry(ogr.wkbLinearRing)

outring.AddPoint(0,0)

outring.AddPoint(100,0)

outring.AddPoint(100,100)

outring.AddPoint(0,100)

outring.AddPoint(0,0)

inring = ogr.Geometry(ogr.wkbLinearRing)inring = ogr.Geometry(ogr.wkbLinearRing)

inring.AddPoint(25,25)

inring.AddPoint(75,25)

inring.AddPoint(75,75)

inring.AddPoint(25,75)

inring.CloseRings()

polygon = ogr.Geometry(ogr.wkbPolygon)

polygon.AddGeometry(outring)

polygon.AddGeometry(inring)

最后三句话比较重要,就是先建立一个polygon对象,然后添加外层ring和内层ring

下面这句话可以帮你数数你的polygon能有几个ring

print polygon.GetGeometryCount()

从polygon中读取ring,index的顺序和创建polygon时添加ring的顺序相同

outring = polygon.GetGeometryRef(0)

inring = polygon.GetGeometryRef(1)

创建复合几何形状multi geometry

例如MultiPoint, MultiLineString, MultiPolygon

用AddGeometry把普通的几何形状加到复合几何形状中,例如:

multipoint = ogr.Geometry(ogr.wkbMultiPoint)

point = ogr.Geometry(ogr.wkbPoint)point = ogr.Geometry(ogr.wkbPoint)

point.AddPoint(10,10)

multipoint.AddGeometry(point)

point.AddPoint(20,20)

multipoint.AddGeometry(point)

读取MultiGeometry中的Geometry,方法和从Polygon中读取ring是一样的,可以说Polygon是一种内置的MultiGeometry。

不要删除一个已存在的Feature的Geometry,会把python搞崩溃的

只能删除脚本运行期间创建的Geometry,比方说手工创建出来的,或者调用其他函数自动创建的。就算这个Geometry已经用来创建别的Feature,你还是可以删除它。

例如:Polygon.Destroy()

关于投影Projections,使用SpatialReference对象

多种多样的Projections,GDAL支持WKT, PROJ.4, ESPG, USGS, ESRI.prj

可以从layer和Geometry中读取Projections,例如:

spatialRef = layer.GetSpatialRef()

spatialRef = geom.GetSpatialReference()

投影信息一般存储在.prj文件中,如果没有这个文件,上述函数返回None

建立一个新的Projection:

首先导入osr库,之后使用osr.SpatialReference()创建SpatialReference对象

之后用下列语句向SpatialReference对象导入投影信息

•ImportFromWkt()

•ImportFromEPSG()

•ImportFromProj4()

•ImportFromESRI()

•ImportFromPCI(, ,

)

•ImportFromUSGS(, )

•ImportFromXML()

导出Projection,使用下面的语句可以导出为字符串

•ExportToWkt()

•ExportToPrettyWkt()

•ExportToProj4()

•ExportToPCI()

•ExportToUSGS()

•ExportToXML()

对一个几何形状Geometry进行投影变换,要先初始化两个Projection,然后创建一个CoordinateTransformation对象,用它来做变换

sourceSR = osr.SpatialReference()

sourceSR.ImportFromEPSG(32612) #UTM 12N WGS84

targetSR = osr.SpatialReference()

targetSR.ImportFromEPSG(4326) #Geo WGS84

coordTrans = osr.CoordinateTransformation(sourceSR, targetSR)

geom.Transform(coordTrans)

但是这段代码很让人蛋疼!在windows里面跑不通。老外的论坛里面有讨论,说在linux里面没问题,windows死活不行,哎。。。

另外还有几个要注意的地方:

要在适当的时候编辑Geometry,投影变换之后最好就不要再动了吧。

对一个数据源DataSource里面的所有Geometry做投影变换,你得一个一个来。用个循环吧。

将你的投影写入.prj文件,其实很简单。首先MorphToESRI(),转成字符串,然后开个文本文件往里面写就行了。例如:

targetSR.MorphToESRI()

file = open('test.prj', 'w')

file.write(targetSR.ExportToWkt())

ffile.close()

以上就是python gdal教程之:几何形状geometry与投影projection的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

python中geometry用法_pythongdal教程之:几何形状geometry与投影projection相关推荐

  1. python修饰符用法_c#教程之C#语言中的修饰符汇总

    https://www.xin3721.com/eschool/python.html 修饰符是用于限定类型以及类型成员的申明的一种符号. 下面主要从C#中的访问修饰符,作用于类和结构的修饰符,用在方 ...

  2. python 几何教学_python gdal教程之:几何形状geometry与投影projection

    建立空的geometry对象:ogr.Geometry 定义各种不同的geometry使用的方法是不一样的(point, line, polygon, etc) 新建点point,使用方法AddPoi ...

  3. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  4. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  5. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  6. python讲解-详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,"@function"作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是 ...

  7. 【 Python 中 int 用法详解】(转载)

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  8. Python 中 int 用法详解

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  9. python中“end=”用法

    python中"end="用法:例如print("#",end=" \n"),默认换行,print("#",end=&q ...

最新文章

  1. C++难题之多态性详细解释
  2. IntellIJ IDEA 导入 Java 项目后无法运行 main 方法的解决方案
  3. android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类
  4. OS_FLAG.C(3)
  5. Hlg 1750 【树的最长路径】.cpp
  6. 【每日一题】4月27日题目精讲 Removal
  7. 大数据之-Hadoop之HDFS_HDFS的内容介绍---大数据之hadoop工作笔记0047
  8. 【SKILLS】About the phonetics
  9. 计算机软考网络工程师,软考之网络工程师总结
  10. 2021大厂Java面试真题(分布式 )
  11. POJ题目分类(转)
  12. 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
  13. reference to ‘ max‘ is ambiguous
  14. 电脑网络经常掉线怎么办
  15. Unity3D 异步加载
  16. 企业/工作室官网 期末作业
  17. 华为matebook笔记本鸿蒙,聊聊鸿蒙对笔记本电脑行业的影响
  18. CICE海冰模式的编译
  19. 关于国家计算机二级C程序设计考点
  20. MediaPlayer基础

热门文章

  1. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)
  2. Matlab:实现绘制启动超音速风洞的稳定条件(附完整源码)
  3. 关于weight_decay的设定
  4. html表单新增类型,HTML5表单设计——新增输入类型和新增表单属性
  5. URLEncoder.encode(String url)和URLDecoder.decode(String url)
  6. 教程 | 使用小O地图制作文字标注地图
  7. 手机刷机是什么意思?快速了解手机刷机基本概念
  8. 计算机视觉公司「诠视科技 」获千万级Pre-A轮融资,君盛投资领投
  9. 全国马术场地障碍锦标赛
  10. VS中无法解析的外部命令的解决办法