空气质量仿真软件:ADMS (Atmospheric Dispersion Modelling System)_(7).地形与地表特征处理

地形与地表特征处理

在空气质量仿真软件中,地形与地表特征的处理是至关重要的一步。这些特征对大气污染物的扩散和传输有着显著的影响,因此在建模过程中必须准确地表示这些特征。本节将详细介绍如何在ADMS中处理地形和地表特征,包括地形数据的准备、地表特征的定义以及如何将这些数据集成到模型中。

在这里插入图片描述

地形数据的准备

地形数据的获取

地形数据通常需要从高分辨率的数字高程模型(Digital Elevation Model, DEM)中获取。这些数据可以通过多种渠道获得,例如从地理信息系统(GIS)中导出,或者从在线数据源下载。ADMS支持多种地形数据格式,包括ASCII格式、ArcInfo格式和BMP格式等。

示例:从GIS中导出地形数据

假设我们使用QGIS来导出地形数据,以下是具体步骤:

  1. 加载DEM数据

    在QGIS中加载高分辨率的DEM数据。

  2. 选择导出区域

    使用矩形选择工具选择所需的地形区域。

  3. 导出数据

    选择 Layer -> Save As...,选择输出格式为ASCII,并保存文件。


# 示例代码:使用QGIS Python API导出DEM数据

from qgis.core import QgsProject, QgsRasterLayer, QgsRectangle



# 加载DEM数据

dem_path = 'path/to/your/dem/file.tif'

dem_layer = QgsRasterLayer(dem_path, 'DEM')



# 检查是否加载成功

if not dem_layer.isValid():

    raise ValueError(f"DEM layer {dem_path} failed to load")



# 添加DEM层到项目

QgsProject.instance().addMapLayer(dem_layer)



# 定义导出区域

export_extent = QgsRectangle(x_min, y_min, x_max, y_max)



# 导出地形数据

output_path = 'path/to/output/dem_data.asc'

dem_layer.saveAs(output_path, export_extent, 'ASCII')

地形数据的处理

地形数据处理包括数据格式转换、数据插值和数据验证等步骤。这些处理步骤确保数据可以被ADMS软件正确读取和使用。

示例:数据格式转换

假设我们有一份ASCII格式的地形数据,需要将其转换为ADMS支持的格式。可以使用Python脚本来完成这一任务。


# 示例代码:将ASCII格式的地形数据转换为ADMS支持的格式

import numpy as np



def read_ascii_dem(file_path):

    """

    读取ASCII格式的DEM数据

    :param file_path: ASCII文件路径

    :return: 高程数据数组

    """

    with open(file_path, 'r') as file:

        lines = file.readlines()

        # 读取元数据

        meta = lines[:6]

        nx = int(meta[0].split()[1])

        ny = int(meta[1].split()[1])

        xll = float(meta[2].split()[1])

        yll = float(meta[3].split()[1])

        cell_size = float(meta[4].split()[1])

        nodata_value = float(meta[5].split()[1])

        

        # 读取高程数据

        data = np.array([line.split() for line in lines[6:]], dtype=float)

        data[data == nodata_value] = np.nan  # 将无效值替换为NaN

    return data, xll, yll, cell_size



def write_adms_dem(file_path, data, xll, yll, cell_size):

    """

    将高程数据写入ADMS支持的格式

    :param file_path: 输出文件路径

    :param data: 高程数据数组

    :param xll: 左下角x坐标

    :param yll: 左下角y坐标

    :param cell_size: 像元大小

    """

    with open(file_path, 'w') as file:

        file.write(f"NX = {data.shape[1]}\n")

        file.write(f"NY = {data.shape[0]}\n")

        file.write(f"DLON = {cell_size}\n")

        file.write(f"DLOF = {cell_size}\n")

        file.write(f"LON0 = {xll}\n")

        file.write(f"LOF0 = {yll}\n")

        for row in data:

            file.write(' '.join(map(str, row)) + '\n')



# 读取ASCII格式的DEM数据

ascii_dem_path = 'path/to/ascii_dem.asc'

data, xll, yll, cell_size = read_ascii_dem(ascii_dem_path)



# 写入ADMS支持的格式

adms_dem_path = 'path/to/adms_dem.dat'

write_adms_dem(adms_dem_path, data, xll, yll, cell_size)

地形数据的验证

地形数据的验证是确保数据准确性和完整性的关键步骤。可以通过可视化工具来检查地形数据是否正确表示了地形特征。

示例:使用Matplotlib验证地形数据

使用Matplotlib库来绘制地形数据,检查其准确性和完整性。


# 示例代码:使用Matplotlib验证地形数据

import matplotlib.pyplot as plt

import numpy as np



def plot_dem(data):

    """

    绘制高程数据

    :param data: 高程数据数组

    """

    plt.figure(figsize=(10, 8))

    plt.imshow(data, cmap='terrain', aspect='auto')

    plt.colorbar(label='Elevation (m)')

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Digital Elevation Model')

    plt.show()



# 读取ASCII格式的DEM数据

ascii_dem_path = 'path/to/ascii_dem.asc'

data, xll, yll, cell_size = read_ascii_dem(ascii_dem_path)



# 绘制地形数据

plot_dem(data)

地表特征的定义

地表特征包括土地利用类型、植被覆盖、建筑物分布等。这些特征对大气污染物的扩散和沉降有着显著的影响。ADMS支持多种地表特征数据格式,包括Shapefile和ASCII格式。

土地利用类型

土地利用类型数据可以通过Shapefile格式获取。这些数据通常包括不同土地利用类型的多边形区域。

示例:从Shapefile中读取土地利用类型数据

假设我们有一个包含土地利用类型数据的Shapefile文件,可以使用Python的geopandas库读取并处理这些数据。


# 示例代码:从Shapefile中读取土地利用类型数据

import geopandas as gpd



def read_land_use(file_path):

    """

    读取Shapefile格式的土地利用类型数据

    :param file_path: Shapefile文件路径

    :return: 土地利用类型数据的GeoDataFrame

    """

    land_use = gpd.read_file(file_path)

    return land_use



# 读取土地利用类型数据

land_use_path = 'path/to/land_use.shp'

land_use_data = read_land_use(land_use_path)



# 打印土地利用类型数据的前几行

print(land_use_data.head())

建筑物分布

建筑物分布数据可以通过Shapefile格式获取。这些数据通常包括建筑物的多边形区域和高度信息。

示例:从Shapefile中读取建筑物分布数据

假设我们有一个包含建筑物分布数据的Shapefile文件,可以使用Python的geopandas库读取并处理这些数据。


# 示例代码:从Shapefile中读取建筑物分布数据

import geopandas as gpd



def read_buildings(file_path):

    """

    读取Shapefile格式的建筑物分布数据

    :param file_path: Shapefile文件路径

    :return: 建筑物分布数据的GeoDataFrame

    """

    buildings = gpd.read_file(file_path)

    return buildings



# 读取建筑物分布数据

buildings_path = 'path/to/buildings.shp'

buildings_data = read_buildings(buildings_path)



# 打印建筑物分布数据的前几行

print(buildings_data.head())

植被覆盖

植被覆盖数据可以通过遥感影像获取,通常以栅格格式保存。这些数据包括不同植被类型的分布信息。

示例:从栅格数据中读取植被覆盖数据

假设我们有一个包含植被覆盖数据的栅格文件,可以使用Python的rasterio库读取并处理这些数据。


# 示例代码:从栅格数据中读取植被覆盖数据

import rasterio

import numpy as np



def read_vegetation(file_path):

    """

    读取栅格格式的植被覆盖数据

    :param file_path: 栅格文件路径

    :return: 植被覆盖数据数组

    """

    with rasterio.open(file_path) as src:

        data = src.read(1)  # 读取第一个波段

        meta = src.meta

    return data, meta



# 读取植被覆盖数据

vegetation_path = 'path/to/vegetation.tif'

vegetation_data, meta = read_vegetation(vegetation_path)



# 打印植被覆盖数据的基本信息

print(f"Shape: {vegetation_data.shape}")

print(f"Meta: {meta}")

地形与地表特征的集成

将地形和地表特征数据集成到ADMS模型中是建模过程中非常重要的一步。这需要将数据格式转换为ADMS支持的格式,并确保数据的准确性和完整性。

地形数据的集成

示例:将地形数据集成到ADMS模型

假设我们已经准备好了一个ADMS支持的地形数据文件,可以使用ADMS的输入文件格式将这些数据集成到模型中。


# 示例代码:将地形数据集成到ADMS模型

def write_adms_input(file_path, data, xll, yll, cell_size):

    """

    将地形数据写入ADMS输入文件

    :param file_path: 输出文件路径

    :param data: 高程数据数组

    :param xll: 左下角x坐标

    :param yll: 左下角y坐标

    :param cell_size: 像元大小

    """

    with open(file_path, 'w') as file:

        file.write(f"NX = {data.shape[1]}\n")

        file.write(f"NY = {data.shape[0]}\n")

        file.write(f"DLON = {cell_size}\n")

        file.write(f"DLOF = {cell_size}\n")

        file.write(f"LON0 = {xll}\n")

        file.write(f"LOF0 = {yll}\n")

        for row in data:

            file.write(' '.join(map(str, row)) + '\n')



# 读取ASCII格式的DEM数据

ascii_dem_path = 'path/to/ascii_dem.asc'

data, xll, yll, cell_size = read_ascii_dem(ascii_dem_path)



# 写入ADMS输入文件

adms_input_path = 'path/to/adms_input.dat'

write_adms_input(adms_input_path, data, xll, yll, cell_size)

地表特征的集成

示例:将土地利用类型数据集成到ADMS模型

假设我们已经准备好了一个Shapefile格式的土地利用类型数据文件,可以使用ADMS的输入文件格式将这些数据集成到模型中。


# 示例代码:将土地利用类型数据集成到ADMS模型

import geopandas as gpd



def write_adms_land_use(file_path, land_use_data):

    """

    将土地利用类型数据写入ADMS输入文件

    :param file_path: 输出文件路径

    :param land_use_data: 土地利用类型数据的GeoDataFrame

    """

    with open(file_path, 'w') as file:

        for index, row in land_use_data.iterrows():

            geometry = row['geometry']

            land_use_type = row['land_use_type']

            for polygon in geometry:

                file.write(f"LandUseType = {land_use_type}\n")

                file.write(f"NumPoints = {len(polygon.exterior.coords)}\n")

                for coord in polygon.exterior.coords:

                    file.write(f"LonLat = {coord[0]} {coord[1]}\n")

                file.write("EndPolygon\n")



# 读取土地利用类型数据

land_use_path = 'path/to/land_use.shp'

land_use_data = read_land_use(land_use_path)



# 写入ADMS输入文件

adms_land_use_path = 'path/to/adms_land_use.dat'

write_adms_land_use(adms_land_use_path, land_use_data)

示例:将建筑物分布数据集成到ADMS模型

假设我们已经准备好了一个Shapefile格式的建筑物分布数据文件,可以使用ADMS的输入文件格式将这些数据集成到模型中。


# 示例代码:将建筑物分布数据集成到ADMS模型

import geopandas as gpd



def write_adms_buildings(file_path, buildings_data):

    """

    将建筑物分布数据写入ADMS输入文件

    :param file_path: 输出文件路径

    :param buildings_data: 建筑物分布数据的GeoDataFrame

    """

    with open(file_path, 'w') as file:

        for index, row in buildings_data.iterrows():

            geometry = row['geometry']

            building_height = row['height']

            for polygon in geometry:

                file.write(f"BuildingHeight = {building_height}\n")

                file.write(f"NumPoints = {len(polygon.exterior.coords)}\n")

                for coord in polygon.exterior.coords:

                    file.write(f"LonLat = {coord[0]} {coord[1]}\n")

                file.write("EndPolygon\n")



# 读取建筑物分布数据

buildings_path = 'path/to/buildings.shp'

buildings_data = read_buildings(buildings_path)



# 写入ADMS输入文件

adms_buildings_path = 'path/to/adms_buildings.dat'

write_adms_buildings(adms_buildings_path, buildings_data)

植被覆盖数据的集成

示例:将植被覆盖数据集成到ADMS模型

假设我们已经准备好了一个栅格格式的植被覆盖数据文件,可以使用ADMS的输入文件格式将这些数据集成到模型中。


# 示例代码:将植被覆盖数据集成到ADMS模型

import rasterio

import numpy as np



def write_adms_vegetation(file_path, vegetation_data, meta):

    """

    将植被覆盖数据写入ADMS输入文件

    :param file_path: 输出文件路径

    :param vegetation_data: 植被覆盖数据数组

    :param meta: 植被覆盖数据的元数据

    """

    with open(file_path, 'w') as file:

        file.write(f"NX = {vegetation_data.shape[1]}\n")

        file.write(f"NY = {vegetation_data.shape[0]}\n")

        file.write(f"DLON = {meta['transform'][0]}\n")

        file.write(f"DLOF = {meta['transform'][4]}\n")

        file.write(f"LON0 = {meta['transform'][2]}\n")

        file.write(f"LOF0 = {meta['transform'][5]}\n")

        for row in vegetation_data:

            file.write(' '.join(map(str, row)) + '\n')



# 读取植被覆盖数据

vegetation_path = 'path/to/vegetation.tif'

vegetation_data, meta = read_vegetation(vegetation_path)



# 写入ADMS输入文件

adms_vegetation_path = 'path/to/adms_vegetation.dat'

write_adms_vegetation(adms_vegetation_path, vegetation_data, meta)

地形与地表特征的优化

地形和地表特征数据的优化可以在提高模型精度的同时减少计算时间。优化方法包括数据降采样、数据平滑处理等。

数据降采样

数据降采样可以减少数据量,从而提高模型的计算效率。这可以通过减少栅格数据的分辨率来实现。

示例:对地形数据进行降采样

假设我们已经有一个高分辨率的地形数据文件,可以使用Python的scipy库对其进行降采样。


# 示例代码:对地形数据进行降采样

import numpy as np

from scipy.ndimage import zoom



def downsample_dem(data, factor):

    """

    对地形数据进行降采样

    :param data: 高程数据数组

    :param factor: 降采样因子

    :return: 降采样后的高程数据数组

    """

    downsampled_data = zoom(data, 1/factor, order=1)

    return downsampled_data



# 读取ASCII格式的DEM数据

ascii_dem_path = 'path/to/ascii_dem.asc'

data, xll, yll, cell_size = read_ascii_dem(ascii_dem_path)



# 对地形数据进行降采样

downsampled_data = downsample_dem(data, 2)



# 写入降采样后的ADMS输入文件

adms_input_path = 'path/to/downsampled_adms_input.dat'

write_adms_input(adms_input_path, downsampled_data, xll, yll, cell_size * 2)

数据平滑处理

数据平滑处理可以减少地形和地表特征数据中的噪声,从而提高模型的稳定性。这可以通过滤波方法实现,例如高斯滤波。

示例:对建筑物分布数据进行平滑处理

假设我们已经有一个建筑物分布数据文件,可以使用Python的scipy库对其进行平滑处理。


# 示例代码:对建筑物分布数据进行平滑处理

import numpy as np

from scipy.ndimage import gaussian_filter

import geopandas as gpd



def smooth_buildings(data, sigma):

    """

    对建筑物分布数据进行平滑处理

    :param data: 建筑物分布数据数组

    :param sigma: 高斯滤波的sigma值

    :return: 平滑处理后的建筑物分布数据数组

    """

    smoothed_data = gaussian_filter(data, sigma=sigma)

    return smoothed_data



# 读取建筑物分布数据

buildings_path = 'path/to/buildings.shp'

buildings_data = read_buildings(buildings_path)



# 将建筑物分布数据转换为栅格数据

buildings_raster = buildings_data.rasterize(out_shape=(100, 100), fill=0, dtype=np.uint8)



# 对建筑物分布数据进行平滑处理

smoothed_buildings = smooth_buildings(buildings_raster, sigma=1)



# 打印平滑处理后的建筑物分布数据

print(smoothed_buildings)



# 可视化平滑处理后的建筑物分布数据

def plot_buildings(data):

    """

    绘制建筑物分布数据

    :param data: 建筑物分布数据数组

    """

    plt.figure(figsize=(10, 8))

    plt.imshow(data, cmap='gray', aspect='auto')

    plt.colorbar(label='Building Density')

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Smoothed Building Distribution')

    plt.show()



plot_buildings(smoothed_buildings)

示例:对植被覆盖数据进行平滑处理

假设我们已经有一个植被覆盖数据文件,可以使用Python的scipy库对其进行平滑处理。


# 示例代码:对植被覆盖数据进行平滑处理

import numpy as np

from scipy.ndimage import gaussian_filter

import rasterio

import matplotlib.pyplot as plt



def smooth_vegetation(data, sigma):

    """

    对植被覆盖数据进行平滑处理

    :param data: 植被覆盖数据数组

    :param sigma: 高斯滤波的sigma值

    :return: 平滑处理后的植被覆盖数据数组

    """

    smoothed_data = gaussian_filter(data, sigma=sigma)

    return smoothed_data



# 读取植被覆盖数据

vegetation_path = 'path/to/vegetation.tif'

vegetation_data, meta = read_vegetation(vegetation_path)



# 对植被覆盖数据进行平滑处理

smoothed_vegetation = smooth_vegetation(vegetation_data, sigma=1)



# 打印平滑处理后的植被覆盖数据

print(smoothed_vegetation)



# 可视化平滑处理后的植被覆盖数据

def plot_vegetation(data):

    """

    绘制植被覆盖数据

    :param data: 植被覆盖数据数组

    """

    plt.figure(figsize=(10, 8))

    plt.imshow(data, cmap='Greens', aspect='auto')

    plt.colorbar(label='Vegetation Density')

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Smoothed Vegetation Coverage')

    plt.show()



plot_vegetation(smoothed_vegetation)

地形与地表特征的验证

地形和地表特征数据的验证是确保数据准确性和完整性的关键步骤。可以通过可视化工具来检查地形数据和地表特征数据是否正确表示了地形和地表特征。

地形数据的验证

示例:使用Matplotlib验证地形数据

使用Matplotlib库来绘制地形数据,检查其准确性和完整性。


# 示例代码:使用Matplotlib验证地形数据

import matplotlib.pyplot as plt

import numpy as np



def plot_dem(data):

    """

    绘制高程数据

    :param data: 高程数据数组

    """

    plt.figure(figsize=(10, 8))

    plt.imshow(data, cmap='terrain', aspect='auto')

    plt.colorbar(label='Elevation (m)')

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Digital Elevation Model')

    plt.show()



# 读取ASCII格式的DEM数据

ascii_dem_path = 'path/to/ascii_dem.asc'

data, xll, yll, cell_size = read_ascii_dem(ascii_dem_path)



# 绘制地形数据

plot_dem(data)

地表特征数据的验证

示例:使用Matplotlib验证土地利用类型数据

使用Matplotlib库来绘制土地利用类型数据,检查其准确性和完整性。


# 示例代码:使用Matplotlib验证土地利用类型数据

import matplotlib.pyplot as plt

import geopandas as gpd



def plot_land_use(land_use_data):

    """

    绘制土地利用类型数据

    :param land_use_data: 土地利用类型数据的GeoDataFrame

    """

    land_use_data.plot(column='land_use_type', cmap='tab20', legend=True)

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Land Use Types')

    plt.show()



# 读取土地利用类型数据

land_use_path = 'path/to/land_use.shp'

land_use_data = read_land_use(land_use_path)



# 绘制土地利用类型数据

plot_land_use(land_use_data)

示例:使用Matplotlib验证建筑物分布数据

使用Matplotlib库来绘制建筑物分布数据,检查其准确性和完整性。


# 示例代码:使用Matplotlib验证建筑物分布数据

import matplotlib.pyplot as plt

import geopandas as gpd



def plot_buildings(buildings_data):

    """

    绘制建筑物分布数据

    :param buildings_data: 建筑物分布数据的GeoDataFrame

    """

    buildings_data.plot(column='height', cmap='Greys', legend=True)

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Building Distribution')

    plt.show()



# 读取建筑物分布数据

buildings_path = 'path/to/buildings.shp'

buildings_data = read_buildings(buildings_path)



# 绘制建筑物分布数据

plot_buildings(buildings_data)

示例:使用Matplotlib验证植被覆盖数据

使用Matplotlib库来绘制植被覆盖数据,检查其准确性和完整性。


# 示例代码:使用Matplotlib验证植被覆盖数据

import matplotlib.pyplot as plt

import rasterio

import numpy as np



def plot_vegetation(data):

    """

    绘制植被覆盖数据

    :param data: 植被覆盖数据数组

    """

    plt.figure(figsize=(10, 8))

    plt.imshow(data, cmap='Greens', aspect='auto')

    plt.colorbar(label='Vegetation Density')

    plt.xlabel('Longitude')

    plt.ylabel('Latitude')

    plt.title('Vegetation Coverage')

    plt.show()



# 读取植被覆盖数据

vegetation_path = 'path/to/vegetation.tif'

vegetation_data, meta = read_vegetation(vegetation_path)



# 绘制植被覆盖数据

plot_vegetation(vegetation_data)

总结

地形与地表特征的处理是空气质量仿真模型中不可或缺的一部分。通过准确获取、处理和验证地形数据以及地表特征数据,可以显著提高模型的精度和可靠性。本文详细介绍了如何在ADMS中处理地形和地表特征数据,包括数据的准备、集成和优化步骤。通过这些方法,可以确保模型在实际应用中能够更好地模拟大气污染物的扩散和传输过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kkchenjj

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值