【代码】使用Python的GDAL/OGR库来创建渔网格

什么是GIS渔网

在GIS里,渔网格是一种常见的地理空间数据分析和可视化工具,它可以将地理空间数据划分为规则的网格,便于进行进一步的统计和分析。

在arcgis中很容易实现这个功能。

在搜索框搜索“fishnet”,如果你的版本是中文,则搜索‘’渔网‘。

image-20240318133548638

然后在’创建渔网的界面‘,输入范围文件,然后设置分割渔网的参数。

image-20240318133606543

在arcgis中很容易实现这个功能。但是怎么用代码实现呢?

代码

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
# @Time : 2024/3/17 9:13 
# @File : create_fishnet.py 
# 创建渔网
from osgeo import ogr
import os

def create_fishnet(input_vector_file, output_grid_file, grid_size=10):
    # 打开矢量文件
    input_source = ogr.Open(input_vector_file)
    input_layer = input_source.GetLayer()

    # 获取矢量文件的空间参考
    srs = input_layer.GetSpatialRef()

    # 获取矢量文件的范围
    x_min, x_max, y_min, y_max = input_layer.GetExtent()

    # 计算网格大小
    x_size = (x_max - x_min) / grid_size
    y_size = (y_max - y_min) / grid_size

    # 创建输出文件
    driver = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(output_grid_file):
        driver.DeleteDataSource(output_grid_file)
    output_source = driver.CreateDataSource(output_grid_file)
    output_layer = output_source.CreateLayer(output_grid_file, srs, ogr.wkbPolygon)

    # 创建ID字段
    id_field = ogr.FieldDefn("id", ogr.OFTInteger)
    output_layer.CreateField(id_field)

    # 创建网格
    id = 0
    y = y_min
    while y < y_max:
        x = x_min
        while x < x_max:
            ring = ogr.Geometry(ogr.wkbLinearRing)
            ring.AddPoint(x, y)
            ring.AddPoint(x + x_size, y)
            ring.AddPoint(x + x_size, y + y_size)
            ring.AddPoint(x, y + y_size)
            ring.AddPoint(x, y)

            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)

            feature = ogr.Feature(output_layer.GetLayerDefn())
            feature.SetField("id", id)
            feature.SetGeometry(poly)
            output_layer.CreateFeature(feature)

            feature = ring = poly = None

            id += 1
            x += x_size
        y += y_size

    input_source = output_source = None

if __name__ == '__main__':
    # 输入矢量文件路径
    input_vector_file = "scope.shp"
    # 输出渔网文件路径
    output_grid_file = "scope10x10.shp"
    grid_size = 8
    create_fishnet(input_vector_file, output_grid_file, grid_size=grid_size)

结果展示

animated

代码解释

这是一个使用Python的GDAL/OGR库来创建渔网格(fishnet)的脚本。

这个脚本的主要功能是读取一个输入的矢量文件(如shapefile),并在该文件的空间范围内创建一个规则的网格。每个网格都是一个多边形,包含四个顶点,代表了网格的四个角。每个网格都有一个唯一的ID,这个ID是在创建网格的过程中自动生成的。

这个脚本的主要步骤如下:

  1. 打开输入的矢量文件,并获取其空间参考和范围。
  2. 根据输入的网格大小,计算每个网格的大小。
  3. 创建输出的矢量文件,该文件的空间参考与输入的矢量文件相同。
  4. 在输出的矢量文件中创建一个新的图层,并在该图层中添加一个ID字段。
  5. 在输入的矢量文件的范围内,创建规则的网格。每个网格都是一个多边形,包含四个顶点。每个网格都有一个唯一的ID。
  6. 将创建的网格添加到输出的矢量文件中。

这个脚本可以作为一个独立的Python脚本运行,也可以作为一个函数在其他的Python脚本中调用。

收获

使用Python的GDAL/OGR库来创建渔网格是一个非常有效和灵活的方法,特别适合需要大量或定期创建渔网格的场景。

通过编写Python脚本,实现了渔网格的自动化创建和批处理,不仅提高了工作效率,也帮助能解决了一些复杂和重复的任务。