建立空的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.php1.cn)!