Python中rasterio庫的實現
前言
遙感數據是通過衛(wèi)星、無人機等設備獲取的地球表面信息,廣泛應用于農業(yè)、環(huán)境監(jiān)測、城市規(guī)劃等領域。處理這些數據常常需要對柵格圖像進行分析,而Python的rasterio庫正是解決這一需求的利器。本篇文章將帶你深入了解rasterio庫,幫助你掌握遙感數據處理的技巧與最佳實踐。
rasterio官方文檔:https://rasterio.readthedocs.io/en/latest/index.html
一、rasterio庫簡介
rasterio是基于GDAL的Python接口封裝,相比直接使用GDAL,rasterio具有以下優(yōu)勢:
? 更簡潔的API設計
? 原生支持NumPy數組操作
? 完美集成Python科學計算生態(tài)
? 支持多線程讀寫加速
典型應用場景:
- 衛(wèi)星影像讀寫與格式轉換
- 遙感指數計算(如NDVI等)
- 影像裁剪與鑲嵌
- 地理坐標系統(tǒng)轉換
二、環(huán)境安裝
你可以通過以下命令安裝rasterio庫:
pip install rasterio
對于地理空間數據處理,推薦使用conda
環(huán)境來管理依賴包:
conda install -c conda-forge rasterio
注意事項:
- Windows用戶:建議先安裝預編譯的GDAL庫,避免出現安裝錯誤。可以從https://www.lfd.uci.edu/~gohlke/pythonlibs/下載對應版本的whl文件。
- Linux/MacOS用戶:通常直接通過
pip
或conda
安裝即可,但請確保GDAL等依賴項已正確配置。
三、核心功能詳解
1. 數據讀取與元數據解析
import rasterio with rasterio.open('sentinel2.tif') as src: # 獲取數據矩陣(NumPy數組) data = src.read() # 查看元數據 print(f"數據集信息:\n{src.meta}") print(f"坐標系:{src.crs}") print(f"影像尺寸:{src.width}x{src.height}") print(f"空間分辨率:{src.res}") print(f"地理范圍:{src.bounds}")
2. 數據寫入與格式轉換
# 創(chuàng)建新柵格文件 profile = src.profile profile.update( dtype=rasterio.float32, count=3, compress='lzw' ) with rasterio.open('output.tif', 'w', **profile) as dst: dst.write(data.astype(rasterio.float32))
支持格式:GeoTIFF、JPEG2000、ENVI、HDF等30+種格式
3. 數據操作技巧
? 影像裁剪
from rasterio.mask import mask import geojson # 按像素范圍裁剪 window = Window(100, 200, 800, 600) clip_data = src.read(window=window) # 按地理范圍裁剪,GeoJSON格式 geometry = { "type": "Polygon", "coordinates": [ [ [116.0, 39.5], [116.5, 39.5], [116.5, 40.0], [116.0, 40.0], [116.0, 39.5] ] ] } clip_data, clip_transform = rasterio.mask.mask(src, [geometry], crop=True)
? 重采樣
from rasterio.enums import Resampling # 選擇重采樣方法:最近鄰、雙線性、立方卷積等 resampled_data = src.read( out_shape=(src.height//2, src.width//2), resampling=Resampling.bilinear # 雙線性插值法 )
4. 坐標轉換
# 地理坐標 ? 像素坐標 row, col = src.index(116.3974, 39.9093) # 天安門坐標轉像素位置 lon, lat = src.xy(500, 500) # 中心點坐標 # 坐標系統(tǒng)轉換 from rasterio.warp import transform dst_crs = 'EPSG:3857' # Web墨卡托 transformed = transform(src.crs, dst_crs, [lon], [lat])
5. 多波段處理
# 波段合并 with rasterio.open('RGB.tif', 'w', **profile) as dst: for i in range(3): dst.write(data[i], i+1) # 計算NDVI red = src.read(3).astype(float) nir = src.read(4).astype(float) ndvi = (nir - red) / (nir + red + 1e-8)
四、可視化實踐
# 可視化NDVI import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) plt.imshow(ndvi, cmap='RdYlGn', vmin=-1, vmax=1) plt.colorbar(label='NDVI') plt.title('植被指數分布', fontsize=16) plt.axis('off') plt.savefig('ndvi_map.png', dpi=300, bbox_inches='tight')
五、實際應用案例
任務:批量處理Landsat8數據提取水體信息
# 示例:批量處理Landsat8數據提取水體信息 # 1. 讀取熱紅外波段 with rasterio.open('landsat8_b10.tif') as src: thermal_band = src.read(1) # 2. 計算地表溫度(簡單的示例,實際需要進行輻射校正) temperature = (thermal_band - 273.15) # 假設熱紅外波段已經是開爾文溫度 # 3. 應用閾值分割提取水體(基于溫度或植被指數) water_mask = temperature < 20 # 假設溫度低于20°C為水體 # 4. 輸出二值化結果 with rasterio.open('water_mask.tif', 'w', **src.profile) as dst: dst.write(water_mask.astype(rasterio.uint8), 1) # 5. 生成統(tǒng)計報告 import numpy as np water_area = np.sum(water_mask) * src.res[0] * src.res[1] # 計算水體面積 print(f'水體面積: {water_area} 平方米')
六、高級功能
- 多線程處理:通過
rasterio.Env()
配置GDAL線程數
from rasterio import Env with Env(GDAL_NUM_THREADS=4): with rasterio.open('large_image.tif') as src: data = src.read()
- 內存文件操作:使用
MemoryFile
處理臨時數據 - 數據集拼接:利用
rasterio.merge.merge()
實現影像鑲嵌 - 分塊處理:支持大數據分塊讀?。╟hunked reading)
結語
rasterio憑借其簡潔的API和強大的功能,已成為遙感數據處理的必備工具。
到此這篇關于Python中rasterio庫的實現的文章就介紹到這了,更多相關Python rasterio庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用read_csv讀數據遇到分隔符問題的2種解決方式
read.csv()可以從帶分隔符的文本文件中導入數據,下面這篇文章主要給大家介紹了關于Python使用read_csv讀數據遇到分隔符問題的2種解決方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07python pygame實現滾動橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細介紹了python pygame實現滾動橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11