Python+OGR库学习(七):生成渔网


代码目的

输入四角范围,指定单个网格大小,自动生成渔网

代码关键点

1、整个渔网的生成和数组组成一样,只不过用一网格代替一个数,还是用两个嵌套循环完成
2、在1的基础上,从左上角开始,用四角范围中xmin和网格宽度控制列变化,ymax和网格高度控制行变化进行遍历

代码思路()

1、导入相关包
2、输入渔网范围,格网宽度和高度
3、计算行列数
4、初始化左上角格网四角范围,创建输出文件
5、遍历每一列:
	初始化第一行格网上下边界(放在行循环外,以便每次进入下一列定位到第一行)
	遍历每一行:
		计算单个格网范围
		创建ring,写入格网四点,创建polygon,写入ring,构成一个格网
		多边形写入图层
		本行单个格网写入完成,行数加一并向下计算下一格网上下边界
	本列格网全部写入,列数加一向右计算下一列格网左右边

代码

##创建渔网
import ogr,os,osr,sys
from math import ceil
#os.chdir(r'F:\Python+gdal\CookBook\results')

def Fishgrid(outfile,xmin,xmax,ymin,ymax,gridwidth,gridheight):
    #参数转换到浮点型
    xmin = float(xmin)
    xmax = float(xmax)
    ymin = float(ymin)
    ymax = float(ymax)
    gridwidth = float(gridwidth)
    gridheight = float(gridheight)

    #计算行数和列数
    rows = ceil((ymax-ymin)/gridheight)
    cols = ceil((xmax-xmin)/gridwidth)

    #初始化起始格网四角范围
    ringXleftOrigin = xmin
    ringXrightOrigin = xmin+gridwidth
    ringYtopOrigin = ymax
    ringYbottomOrigin = ymax-gridheight

    #创建输出文件
    outdriver = ogr.GetDriverByName('ESRI Shapefile')
    if os.path.exists(outfile):
        outdriver.DeleteDataSource(outfile)
    outds = outdriver.CreateDataSource(outfile)
    outlayer = outds.CreateLayer(outfile,geom_type = ogr.wkbPolygon)
    #不添加属性信息,获取图层属性
    outfielddefn  = outlayer.GetLayerDefn()
    #遍历列,每一列写入格网
    col = 0
    while col<cols:
        #初始化,每一列写入完成都把上下范围初始化
        ringYtop = ringYtopOrigin
        ringYbottom = ringYbottomOrigin
        #遍历行,对这一列每一行格子创建和写入
        row = 0
        while row<rows:
            #创建左上角第一个格子
            ring = ogr.Geometry(ogr.wkbLinearRing)
            ring.AddPoint(ringXleftOrigin,ringYtop)
            ring.AddPoint(ringXrightOrigin,ringYtop)
            ring.AddPoint(ringXrightOrigin,ringYbottom)
            ring.AddPoint(ringXleftOrigin,ringYbottom)
            ring.CloseRings()
            #写入几何多边形
            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)
            #创建要素,写入多边形
            outfeat = ogr.Feature(outfielddefn)
            outfeat.SetGeometry(poly)
            #写入图层
            outlayer.CreateFeature(outfeat)
            outfeat = None
            #下一多边形,更新上下范围
            row+=1
            ringYtop = ringYtop - gridheight
            ringYbottom = ringYbottom-gridheight
        #一列写入完成后,下一列,更新左右范围
        col+=1
        ringXleftOrigin = ringXleftOrigin+gridwidth
        ringXrightOrigin = ringXrightOrigin+gridwidth
    #写入后清除缓存
    outds = None

#代码测试
if __name__ == '__main__':
    os.chdir(r'F:\Python+gdal\CookBook\results')#切换路径到输出矢量文件夹
    if len(sys.argv)!=8:
        print('[ ERROR ] you must supply seven arguments: output-shapefile-name.shp xmin xmax ymin ymax gridHeight gridWidth')
        sys.exit(1)
    Fishgrid(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6], sys.argv[7])

使用说明

如果在命令行调用,输入:

python grid.py grid.shp 992325.66 1484723.41 494849.32 781786.14 10000 10000

直接在py文件运行,修改main为:

if __name__ == '__main__':
    os.chdir(r'F:\Python+gdal\CookBook\results')
    shp = 'fishgrid.shp'
    Fishgrid(shp,0,1000,0,500,10,10)

代码修改

1、可以根据需要,读取栅格或者矢量文件四角范围作为渔网范围,指定行列数计算单个格网大小,生成渔网
2、可根据输入文件,添加空间参考

结果

在这里插入图片描述

转载自:https://blog.csdn.net/weixin_42924891/article/details/85865260

You may also like...