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