Python中rasterio庫的實現(xiàn)
前言
遙感數(shù)據(jù)是通過衛(wèi)星、無人機等設(shè)備獲取的地球表面信息,廣泛應(yīng)用于農(nóng)業(yè)、環(huán)境監(jiān)測、城市規(guī)劃等領(lǐng)域。處理這些數(shù)據(jù)常常需要對柵格圖像進行分析,而Python的rasterio庫正是解決這一需求的利器。本篇文章將帶你深入了解rasterio庫,幫助你掌握遙感數(shù)據(jù)處理的技巧與最佳實踐。
rasterio官方文檔:https://rasterio.readthedocs.io/en/latest/index.html
一、rasterio庫簡介
rasterio是基于GDAL的Python接口封裝,相比直接使用GDAL,rasterio具有以下優(yōu)勢:
? 更簡潔的API設(shè)計
? 原生支持NumPy數(shù)組操作
? 完美集成Python科學計算生態(tài)
? 支持多線程讀寫加速
典型應(yīng)用場景:
- 衛(wèi)星影像讀寫與格式轉(zhuǎn)換
- 遙感指數(shù)計算(如NDVI等)
- 影像裁剪與鑲嵌
- 地理坐標系統(tǒng)轉(zhuǎn)換
二、環(huán)境安裝
你可以通過以下命令安裝rasterio庫:
pip install rasterio
對于地理空間數(shù)據(jù)處理,推薦使用conda
環(huán)境來管理依賴包:
conda install -c conda-forge rasterio
注意事項:
- Windows用戶:建議先安裝預(yù)編譯的GDAL庫,避免出現(xiàn)安裝錯誤??梢詮膆ttps://www.lfd.uci.edu/~gohlke/pythonlibs/下載對應(yīng)版本的whl文件。
- Linux/MacOS用戶:通常直接通過
pip
或conda
安裝即可,但請確保GDAL等依賴項已正確配置。
三、核心功能詳解
1. 數(shù)據(jù)讀取與元數(shù)據(jù)解析
import rasterio with rasterio.open('sentinel2.tif') as src: # 獲取數(shù)據(jù)矩陣(NumPy數(shù)組) data = src.read() # 查看元數(shù)據(jù) print(f"數(shù)據(jù)集信息:\n{src.meta}") print(f"坐標系:{src.crs}") print(f"影像尺寸:{src.width}x{src.height}") print(f"空間分辨率:{src.res}") print(f"地理范圍:{src.bounds}")
2. 數(shù)據(jù)寫入與格式轉(zhuǎn)換
# 創(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. 數(shù)據(jù)操作技巧
? 影像裁剪
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. 坐標轉(zhuǎn)換
# 地理坐標 ? 像素坐標 row, col = src.index(116.3974, 39.9093) # 天安門坐標轉(zhuǎn)像素位置 lon, lat = src.xy(500, 500) # 中心點坐標 # 坐標系統(tǒng)轉(zhuǎn)換 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('植被指數(shù)分布', fontsize=16) plt.axis('off') plt.savefig('ndvi_map.png', dpi=300, bbox_inches='tight')
五、實際應(yīng)用案例
任務(wù):批量處理Landsat8數(shù)據(jù)提取水體信息
# 示例:批量處理Landsat8數(shù)據(jù)提取水體信息 # 1. 讀取熱紅外波段 with rasterio.open('landsat8_b10.tif') as src: thermal_band = src.read(1) # 2. 計算地表溫度(簡單的示例,實際需要進行輻射校正) temperature = (thermal_band - 273.15) # 假設(shè)熱紅外波段已經(jīng)是開爾文溫度 # 3. 應(yīng)用閾值分割提取水體(基于溫度或植被指數(shù)) water_mask = temperature < 20 # 假設(shè)溫度低于20°C為水體 # 4. 輸出二值化結(jié)果 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線程數(shù)
from rasterio import Env with Env(GDAL_NUM_THREADS=4): with rasterio.open('large_image.tif') as src: data = src.read()
- 內(nèi)存文件操作:使用
MemoryFile
處理臨時數(shù)據(jù) - 數(shù)據(jù)集拼接:利用
rasterio.merge.merge()
實現(xiàn)影像鑲嵌 - 分塊處理:支持大數(shù)據(jù)分塊讀?。╟hunked reading)
結(jié)語
rasterio憑借其簡潔的API和強大的功能,已成為遙感數(shù)據(jù)處理的必備工具。
到此這篇關(guān)于Python中rasterio庫的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python rasterio庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用代理ip實現(xiàn)自動化爬蟲任務(wù)管理
本文主要介紹了Python利用代理ip實現(xiàn)自動化爬蟲任務(wù)管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解
今天小編就為大家分享一篇關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python2和Python3中print的用法示例總結(jié)
在Python 3中接觸的第一個很大的差異就是縮進是作為語法的一部分,這和C++等其他語言確實很不一樣,所以要小心,其中python3和python2中print的用法有很多不同,這篇文章主要給大家介紹了關(guān)于Python2和Python3中print用法的相關(guān)資料,需要的朋友可以參考下。2017-10-10Python使用read_csv讀數(shù)據(jù)遇到分隔符問題的2種解決方式
read.csv()可以從帶分隔符的文本文件中導(dǎo)入數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python使用read_csv讀數(shù)據(jù)遇到分隔符問題的2種解決方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細介紹了python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11