在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')
可视化效果如下,