Python与开源GIS:使用OGR创建数据集的几何形状

下面我们来看一下使用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()