使用python创建fishet网格
我正在尝试创建一个渔网网格来聚合一些地理空间数据。我使用了GDAL/OGR Python手册中的以下代码,但是它只返回一个多边形对象,基本上是一个巨大的矩形。请让我知道我做错了什么 资料来源: 导入操作系统,系统 导入ogr 从数学导入单元 def main(outputGridfn、xmin、xmax、ymin、ymax、gridHeight、gridWidth): #将sys.argv转换为float xmin=浮动(xmin) xmax=浮动(xmax) ymin=浮动(ymin) ymax=浮动(ymax) gridWidth=浮动(gridWidth) gridHeight=浮动(gridHeight) #吵架 行=天花板((ymax ymin)/网格高度 #获取列 cols=ceil((xmax xmin)/gridWidth) #启动网格单元信封 ringXleftOrigin=xmin ringXrightOrigin=xmin+gridWidth 环孢菌素=ymax ringYbottomOrigin=ymax网格高度 #创建输出文件 outDriver=ogr.GetDriverByName('ESRI Shapefile')) 如果os.path.exists(outputGridfn): 删除操作系统(outputGridfn) outDataSource=outDriver.CreateDataSource(outputGridfn) outLayer=outDataSource.CreateLayer(outputGridfn,geom_type=ogr.wkbPolygon) featureDefn=outLayer.GetLayerDefn() #创建网格单元 countcols=0 当countcols使用python创建fishet网格,python,gis,geopandas,ogr,Python,Gis,Geopandas,Ogr,我正在尝试创建一个渔网网格来聚合一些地理空间数据。我使用了GDAL/OGR Python手册中的以下代码,但是它只返回一个多边形对象,基本上是一个巨大的矩形。请让我知道我做错了什么 资料来源: 导入操作系统,系统 导入ogr 从数学导入单元 def main(outputGridfn、xmin、xmax、ymin、ymax、gridHeight、gridWidth): #将sys.argv转换为float xmin=浮动(xmin) xmax=浮动(xmax) ymin=浮动(ymin) yma
代码在我看来不错,可能是“刷新”问题。还可以尝试通过将图层设置为“无”来关闭该图层:
outLayer = None
您正在使用的代码非常复杂,很好地演示了OGR是如何工作的,但是您可以简单地使用它。考虑下面的例子:
定义网格和输出:
# settings
output_shp = r'D:\tmp_grid_v5.shp'
drv = ogr.GetDriverByName('ESRI Shapefile')
if os.path.exists(output_shp):
# DeleteDataSource will delete related files, compared to os.remove
drv.DeleteDataSource(output_shp)
# grid definition
# extent
ulx, uly, lrx, lry = -180, 90, 180, -90
# resolution 1 degree grid
xres = 1
yres = -1
# half the resolution
dx = xres/2
dy = yres/2
计算每个多边形的中心坐标。使用Numpy meshgrid很方便,但可以一次计算所有网格。如果内存是个问题,你可以一个接一个地做
# center coordinates
xx, yy = np.meshgrid(
np.arange(ulx+dx, lrx+dx, xres),
np.arange(uly+dy, lry+dy, yres),
)
初始化输出形状文件:
ds = drv.CreateDataSource(output_shp)
lyr = ds.CreateLayer(output_shp, geom_type=ogr.wkbPolygon)
fdefn = lyr.GetLayerDefn()
在每个中心坐标上循环并将多边形添加到输出:
for x,y in zip(xx.ravel(), yy.ravel()):
poly_wkt = f'POLYGON (({x-dx} {y-dy}, {x+dx} {y-dy}, {x+dx} {y+dy}, {x-dx} {y+dy}, {x-dx} {y-dy}))'
ft = ogr.Feature(fdefn)
ft.SetGeometry(ogr.CreateGeometryFromWkt(poly_wkt))
lyr.CreateFeature(ft)
ft = None
关闭输出
lyr = None
ds = None
代码在我看来很好,可能是“刷新”问题。还可以尝试通过将图层设置为“无”来关闭该图层:
outLayer = None
您正在使用的代码非常复杂,很好地演示了OGR是如何工作的,但是您可以简单地使用它。考虑下面的例子:
定义网格和输出:
# settings
output_shp = r'D:\tmp_grid_v5.shp'
drv = ogr.GetDriverByName('ESRI Shapefile')
if os.path.exists(output_shp):
# DeleteDataSource will delete related files, compared to os.remove
drv.DeleteDataSource(output_shp)
# grid definition
# extent
ulx, uly, lrx, lry = -180, 90, 180, -90
# resolution 1 degree grid
xres = 1
yres = -1
# half the resolution
dx = xres/2
dy = yres/2
计算每个多边形的中心坐标。使用Numpy meshgrid很方便,但可以一次计算所有网格。如果内存是个问题,你可以一个接一个地做
# center coordinates
xx, yy = np.meshgrid(
np.arange(ulx+dx, lrx+dx, xres),
np.arange(uly+dy, lry+dy, yres),
)
初始化输出形状文件:
ds = drv.CreateDataSource(output_shp)
lyr = ds.CreateLayer(output_shp, geom_type=ogr.wkbPolygon)
fdefn = lyr.GetLayerDefn()
在每个中心坐标上循环并将多边形添加到输出:
for x,y in zip(xx.ravel(), yy.ravel()):
poly_wkt = f'POLYGON (({x-dx} {y-dy}, {x+dx} {y-dy}, {x+dx} {y+dy}, {x-dx} {y+dy}, {x-dx} {y-dy}))'
ft = ogr.Feature(fdefn)
ft.SetGeometry(ogr.CreateGeometryFromWkt(poly_wkt))
lyr.CreateFeature(ft)
ft = None
关闭输出
lyr = None
ds = None