访问量: 132 次浏览
下面我们来看一下使用OGR创建数据集的更常用的情形。这一部 分重点说明一下如何使用OGR创建数据集的几何形状,对于字段、 属性的处理,放到后面。
对于创建Geometry来讲,wkt是最直观的。wkt是最简单的字符 串格式,Python提供了丰富的函数来对字符串进行处理。 使用 wkt创建矢量数据集与使用拷贝的方法创建数据集的基本步骤是 一样的。首先是创建Driver,然后创建dataSource,再创建 Layer,接下来就创建Feature了。
这是分别创建点、线、与多边形,使用extent变量来存储多边 形的四个角点,点、线的坐标根据extent变量来生成。 下面先看一下生成的数据的图,可能会更加有助于理解。

下面是生成点状要素的Python代码。 一般情况不会生成一个 单独的点, 需要使用For循环来对数组参数进行遍历,得到 想要的结果。
from osgeo import ogr
import os,math
driver = ogr.GetDriverByName("ESRI Shapefile")
extfile = 'point_demo.shp'
point_coors = [[300,450], [750, 700], [1200, 450], [750, 200], [750, 450]]
print point_coors
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.access( extfile, os.F_OK ):
driver.DeleteDataSource( extfile )
newds = driver.CreateDataSource(extfile)
layernew = newds.CreateLayer('point',None,ogr.wkbPoint)
for aa in point_coors:
wkt = 'POINT (' + str(aa[0]) + ' ' + str(aa[1]) + ')'
geom = ogr.CreateGeometryFromWkt(wkt)
feat = ogr.Feature(layernew.GetLayerDefn())
feat.SetGeometry(geom)
layernew.CreateFeature(feat)
newds.Destroy()
下面解释一下如何单独创建一个线状数据集。
from osgeo import ogr
import os,math
driver = ogr.GetDriverByName("ESRI Shapefile")
extfile = 'line_demo.shp'
point_coors = [300,450, 750, 700, 1200, 450, 750, 200]
print point_coors
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.access( extfile, os.F_OK ):
driver.DeleteDataSource( extfile )
newds = driver.CreateDataSource(extfile)
layernew = newds.CreateLayer('point',None,ogr.wkbLineString)
wkt = 'LINESTRING (%f %f,%f %f,%f %f,%f %f,%f %f)' % (point_coors[0],point_coors[1],
point_coors[2],point_coors[3], point_coors[4],point_coors[5],
point_coors[6],point_coors[7], point_coors[0],point_coors[1])
print(wkt)
geom = ogr.CreateGeometryFromWkt(wkt)
feat = ogr.Feature(layernew.GetLayerDefn())
feat.SetGeometry(geom)
layernew.CreateFeature(feat)
newds.Destroy()
注意坐标的格式:不同点的坐标之间用“,”分割,坐标的不同 维度用空格分割。
下面解释一下如何单独创建一个矢量的矩形,这里使用wkt来定义 一个矩形。矩形的范围由extend变量定义,把矩形四个角点坐标 根据extend生成,存储到wkt变量, 通过CreateGeometryFromWkt() 创建了一个矩形形状,然后放入Feature中,最后用调用Destroy(), 将数据写入磁盘。就构成了一个矩形的数据集。
from osgeo import ogr
import os,math
driver = ogr.GetDriverByName("ESRI Shapefile")
extfile = 'rect_demo.shp'
if os.access( extfile, os.F_OK ):
driver.DeleteDataSource( extfile )
extent = [400, 1100, 300, 600]
newds = driver.CreateDataSource(extfile)
layernew = newds.CreateLayer('rect',None,ogr.wkbPolygon)
width = math.fabs(extent[1]-extent[0])
height = math.fabs(extent[3]-extent[2])
tw = width/2
th = width/2
extnew = extent[0]+tw
wkt = 'POLYGON ((%f %f,%f %f,%f %f,%f %f,%f %f))' % (extent[0],extent[3],
extent[1],extent[3], extent[1],extent[2],
extent[0],extent[2], extent[0],extent[3])
geom = ogr.CreateGeometryFromWkt(wkt)
feat = ogr.Feature(layernew.GetLayerDefn())
feat.SetGeometry(geom)
layernew.CreateFeature(feat)
newds.Destroy()
返回目录:Python与开源GIS