前面部分我们详细地介绍了如何读取矢量数据,包括数据源、图层、要素、几何形状、字段属性等各个部分。
下面来看一下如何使用OGR来创建矢量数据,亦即使用OGR写GIS矢量文件。首先先看一下写文件的示意。在这里先不对这个图做太多的解释,但是在后面介绍各个部分的时候,请自行参考此图。
建立空的geometry对象:
org.Geometry
ogr中提供了不同的类型,常用的有:ogr.wkbPoint,ogr.wkbLineString,ogr.wkbPolygon。
定义各种不同的geometry使用的方法是不一样的。在构建这三种不同的要素时,要注意使用的格式。
创建点要素
下面我们先来看一下如何创建一个点。注意,此时只是在内存中将对象创建出来,跟文件没有关系。
# -*- coding: utf-8 -*-
from osgeo import ogr
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
print(type(point))
print(point)
注意,向point中添加多个点,并不会出错,但最后的结果只会用最后添加的点。
创建线要素
新建Line的方法与点基本一致。与点不同的是,线需要添加多个点。
from osgeo import ogr
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,20)
line.AddPoint(20,30)
line.AddPoint(10,30)
print(type(line))
print(line)
可以使用线对象的SetPoint方法来修改点的坐标,譬如:
line.SetPoint(1,50,50)
print(line)
另外,还有其他一些有用的函数:
统计所有点的数目:
1 | print line . GetPointCount ( ) |
读取0号点的x坐标和y坐标
1 2 | print line . GetX ( 0 ) print line . GetY ( 0 ) |
创建多边形要素
创建多边形要素与创建点和线的方法的区别就比较大了。
新建多边形,首先要新建环(ring),然后把环添加到多边形对象中。
那么怎样创建一个ring呢?这个与创建线比较类似:先新建一个ring对象,然后向里面逐个添加点。
from osgeo import ogr
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(10,10)
ring.AddPoint(50,0)
ring.AddPoint(50,50)
ring.AddPoint(0,10)
与创建线不同的是,ring是需要封闭的,这可以使用CloseRings()方法,或者将最后一个点的坐标设置成与第一个点相同。一般情况下,最好是使用CloseRings()方法。
1 | ring . CloseRings ( ) |
然后,使用下面的语句,将ring对象添加到多边形中。
1 2 3 | polygon = ogr . Geometry ( ogr . wkbPolygon ) polygon . AddGeometry ( outring ) polygon . AddGeometry ( inring ) |
对于polygon对象,没法直接打印它里面的坐标,而是需要先获取它其中的几何对象,也就是ring。
1 2 | ring = polygon . GetGeometryRef ( 0 ) print ( outring ) |
这样,我们就学会了使用OGR创建最简单的点、线、多边三种几何形状了。