现有一套城市建筑物高度数据集其分瓦片存储数据格式为tif格式全国范围的数据划分为310个瓦片每个瓦片的大小为2°×2°其命名规则为CNBH10m_X中心经度_Y中心纬度tif以CNBH10m_X101_Y21tif这个文件名为例表示该瓦片覆盖的范围是东经100°——102°北纬20°——22°。现在还有一个全国的分市shp要求遍历所有市获取覆盖市的建筑物数据瓦片并将其进行拼接然后用shp裁剪拼接完
实现这个任务需要使用一些工具和库来进行地理空间数据处理。可以使用Python编程语言,并使用GDAL(Geospatial Data Abstraction Library)和geopandas库来处理矢量和栅格数据。以下是一个大致的步骤:
- 导入所需的库:
import os
import glob
import geopandas as gpd
from osgeo import gdal
from shapely.geometry import box
- 读取分市的shp文件:
shp_path = 'path_to_shapefile.shp'
cities = gpd.read_file(shp_path)
- 遍历每个市的边界,获取对应的建筑物数据瓦片:
tile_folder = 'path_to_tile_folder'
output_folder = 'path_to_output_folder'
for index, city in cities.iterrows():
city_name = city['city_name'] # 假设shp中有一个名为'city_name'的列来存储市的名称
# 获取市的边界框
bbox = city.geometry.bounds
xmin, ymin, xmax, ymax = bbox
# 根据边界框计算对应的瓦片
start_x = int(xmin // 2) * 2
start_y = int(ymin // 2) * 2
end_x = int(xmax // 2) * 2 + 2
end_y = int(ymax // 2) * 2 + 2
# 遍历瓦片并拼接
tiles = []
for x in range(start_x, end_x, 2):
for y in range(start_y, end_y, 2):
tile_name = f'CNBH10m_X{x}_Y{y}.tif'
tile_path = os.path.join(tile_folder, tile_name)
tiles.append(tile_path)
# 使用GDAL库来进行瓦片拼接
mosaic_path = os.path.join(output_folder, f'{city_name}_mosaic.tif')
gdal.BuildVRT(mosaic_path, tiles)
gdal.Translate(mosaic_path, mosaic_path, format='GTiff')
- 使用shp裁剪拼接完的tif:
for index, city in cities.iterrows():
city_name = city['city_name']
mosaic_path = os.path.join(output_folder, f'{city_name}_mosaic.tif')
output_path = os.path.join(output_folder, f'{city_name}_height.tif')
# 使用GDAL库进行裁剪
gdal.Warp(output_path, mosaic_path, cutlineDSName=shp_path, cropToCutline=True)
这样,就可以遍历所有市,获取覆盖市的建筑物数据瓦片,并将其进行拼接,然后用shp裁剪拼接完的tif,得到分市的建筑物高度栅格数据。请注意,代码中的路径需要根据实际情况进行修改。
原文地址: https://www.cveoy.top/t/topic/i5vx 著作权归作者所有。请勿转载和采集!