Python | 矢量点转栅格方法(以光子点云栅格化为例)

文摘   2024-08-29 14:53   天津  

LXX

读完需要

2
分钟

速读仅需 1 分钟

前言:

栅格数据和矢量数据是地理信息系统 (GIS) 中两种常见的数据表示方式。栅格数据以像素网格的形式组织数据,而矢量数据则使用点、线和面等基本几何对象来表示数据。它们在形态、存储方式、空间表示和分析能力等方面存在一些区别和联系。本文以 ICESat-2 的 ATL03 数据点为例,分享将点转换为栅格的方法。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)

1

   

栅格化

1.1

   

矢量栅格的区别

栅格数据是由固定大小的像素网格组成,每个像素都具有特定的数值。整个数据集由一个矩阵来表示,每个像素位置都有特定的值。矢量数据则是由基本几何形状(如点、线、面等)来表示的。每个对象都有自己独特的空间位置和属性信息。

栅格数据以图像或矩阵的形式存储,每个像素的位置和值都在数据集中有明确的位置和定义。矢量数据以数据库或文件的形式存储,每个对象都有自己的记录和属性信息。矢量数据可以使用不同的存储格式,如 shapefile、geojson 等。

栅格数据以像素为基本单位,每个像素都代表一定大小的区域,并且在每个像素中存储一个数值。矢量数据以点、线或面等几何对象来表示,并且每个对象都有自己的空间位置和属性信息。矢量数据可以更加准确地表示对象之间的空间关系。

栅格数据在分析方面具有一些优势,特别适合于表达连续的现象,如高程、降雨等。栅格数据可以进行基于像素的空间分析,如栅格叠加、栅格代数运算等。而矢量数据具有更好的几何精度和描述能力,适合于表示离散的对象,如建筑物、河流等。矢量数据可以进行拓扑关系分析、网络分析等。

1.2

   

矢量栅格的转换

由于栅格数据和矢量数据的不同形态和存储方式,常常需要将二者进行转换。栅格数据可以通过栅格化 (rasterization) 将矢量数据转换为栅格数据,而矢量数据可以通过矢量化 (vectorization) 将栅格数据转换为矢量数据。这些过程可以通过 Arcgis 或 QGIS 等专业软件完成。转换后的数据可以根据需求进行不同的空间分析和可视化。


2

   

实现方法

具体实现流程首先是读取点数据:通过 pandas 库读取 CSV 文件,将数据加载为 DataFrame;其次创建 GeoDataFrame:利用 geopandas 库将 DataFrame 转换为 GeoDataFrame,并将点数据的经纬度坐标转换为地理空间几何对象;之后经过地理变换等处理;最后使用 rasterio 库的 rasterize 函数来实现栅格化处理。


【完整代码:】

import pandas as pdimport geopandas as gpdimport rasteriofrom rasterio.transform import from_originfrom rasterio.features import rasterizeimport matplotlib.pyplot as pltfrom matplotlib.colors import Normalize
def points_to_raster(points_csv, output_raster, pixel_size=100): """ 将点数据转换为栅格 :param points_csv: 输入点数据的CSV文件路径 :param output_raster: 输出栅格图像的路径 :param pixel_size: 栅格像元大小(以米为单位) """ # 1. 读取点数据 df = pd.read_csv(points_csv)
# 2. 创建GeoDataFrame gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.Longitude, df.Latitude)) gdf.set_crs(epsg=4326, inplace=True) # 设置原始CRS为WGS84
# 3. 转换到适当的CRS gdf = gdf.to_crs(epsg=3857) # 使用Web Mercator投影
# 4. 定义栅格的边界和分辨率 bounds = gdf.total_bounds # [xmin, ymin, xmax, ymax] width = int((bounds[2] - bounds[0]) / pixel_size) height = int((bounds[3] - bounds[1]) / pixel_size)
# 5. 创建变换矩阵 transform = from_origin(bounds[0], bounds[3], pixel_size, pixel_size) # 从左上角开始
# 6. 创建栅格化的数组 raster = rasterize( ((geom, value) for geom, value in zip(gdf.geometry, gdf['Height (m HAE)'])), out_shape=(height, width), transform=transform, fill=0, # 背景值 dtype='float32' # 使用 float32 以存储浮点值 )
# 7. 保存栅格数据 with rasterio.open( output_raster, 'w', driver='GTiff', height=height, width=width, count=1, dtype='float32', crs='EPSG:3857', transform=transform ) as dst: dst.write(raster, 1)
def visualize_data(points_csv, raster_file): """ 可视化点数据和栅格数据 :param points_csv: 输入点数据的CSV文件路径 :param raster_file: 输入栅格图像的路径 """ # 1. 读取点数据 df = pd.read_csv(points_csv) gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.Longitude, df.Latitude)) gdf.set_crs(epsg=4326, inplace=True) gdf = gdf.to_crs(epsg=3857)
# 2. 加载栅格数据 with rasterio.open(raster_file) as src: raster = src.read(1) transform = src.transform
fig, ax = plt.subplots(1, 2, figsize=(8, 7)) plt.rcParams['font.sans-serif'] = ['STSong'] plt.rcParams['axes.unicode_minus'] = False # 3. 绘制原始点数据 ax[0].set_title('原始点数据') gdf.plot(ax=ax[0], color='black', markersize=5, alpha=0.5, edgecolor='k') ax[0].set_xlim(gdf.total_bounds[0], gdf.total_bounds[2]) ax[0].set_ylim(gdf.total_bounds[1], gdf.total_bounds[3]) ax[0].set_aspect('equal')
# 4. 绘制栅格数据 ax[1].set_title('栅格数据') cax = ax[1].imshow(raster, cmap='magma', norm=Normalize(vmin=raster.min(), vmax=raster.max())) fig.colorbar(cax, ax=ax[1], label='Height(m)') ax[1].set_aspect('equal') plt.rcParams['font.sans-serif'] = ['STSong'] plt.rcParams['axes.unicode_minus'] = False plt.tight_layout() plt.show()
# 使用示例points_csv = 'D:/data/ATL03.csv'output_raster = 'ATL03.tiff'points_to_raster(points_csv, output_raster)visualize_data(points_csv, output_raster)


3

   

结果


文字部分参考引用自:https://www.elecfans.com/d/2413985.html

遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章