使用Python实现栅格划分(渔网)

在QGIS中,“渔网”(Fishnet)是指一种创建规则网格(通常是矩形或正方形)的工具,这些网格可以用于空间数据的采样、分区或作为其他地理空间分析的基础。渔网工具可以生成一个由多边形组成的图层,每个多边形代表网格中的一个单元。

欢迎关注本人公众号--交通数据探索师

本文使用Python实现渔网,但只实现正方形网格

话不多说,直接上代码

import geopandas as gpd
from shapely.geometry import box
import matplotlib.pyplot as plt
import numpy as np
​
def to_fishnet(shp, scale):
    """划分网格
    :param shp: 要划分网格的shp文件
    :param scale: 网格大小  这里定义的网格为正方形, scale为正方形的边长, 单位为度
    :return: 网格的GeoDataFrame
    """
    
    # 划分网格, 以scale度为网格划分
    bounds = shp.total_bounds
    start_lon = bounds[0]
    start_lat = bounds[1]
​
    # 计算可划分的网格数
    # 即: 向上取整(经度范围/网格大小) = 经度网格数,纬度同理
    grid_num_lon = int(np.ceil((bounds[2] - bounds[0]) / scale))
    grid_num_lat = int(np.ceil((bounds[3] - bounds[1]) / scale))
​
    gdf = {
        'number': [],    # 网格编号
        'start_lon': [], # 网格左下角经度
        'end_lon': [],   # 网格右上角经度
        'start_lat': [], # 网格左下角纬度
        'end_lat': [],   # 网格右上角纬度
        'geometry': []   # 网格形状
    }
    
    for lon in range(grid_num_lon):
        for lat in range(grid_num_lat):
            gdf['number'].append((lon+1) * (lat+1))
            gdf['start_lon'].append(start_lon + lon * scale)
            gdf['end_lon'].append(start_lon + (lon+1) * scale)
            gdf['start_lat'].append(start_lat + lat * scale)
            gdf['end_lat'].append(start_lat + (lat+1) * scale)
            gdf['geometry'].append(box(start_lon + lon * scale, 
                                       start_lat + lat * scale, 
                                       start_lon + (lon+1) * scale, 
                                       start_lat + (lat+1) * scale))
    gdf = gpd.GeoDataFrame(gdf, geometry='geometry', crs='epsg:4326')
    # 保留研究范围
    gdf = gdf[gdf.intersects(shp.union_all())]
    return gdf

具体使用如下,

import geopandas as gpd
from shapely.geometry import box
import matplotlib.pyplot as plt
import numpy as np
​
fig, ax = plt.subplots(1)
​
# 读取要划分栅格的数据
data = gpd.read_file(r'kaifeng.shp')
to_fishnet(data, 0.05).boundary.plot(edgecolor='orange', ax=ax, linewidth=0.5)
data.plot(ax=ax, color='green')

可视化效果如下,

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煮雨小筑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值