Python中rasterio庫(kù)的實(shí)現(xiàn)
前言
遙感數(shù)據(jù)是通過(guò)衛(wèi)星、無(wú)人機(jī)等設(shè)備獲取的地球表面信息,廣泛應(yīng)用于農(nóng)業(yè)、環(huán)境監(jiān)測(cè)、城市規(guī)劃等領(lǐng)域。處理這些數(shù)據(jù)常常需要對(duì)柵格圖像進(jìn)行分析,而Python的rasterio庫(kù)正是解決這一需求的利器。本篇文章將帶你深入了解rasterio庫(kù),幫助你掌握遙感數(shù)據(jù)處理的技巧與最佳實(shí)踐。
rasterio官方文檔:https://rasterio.readthedocs.io/en/latest/index.html

一、rasterio庫(kù)簡(jiǎn)介
rasterio是基于GDAL的Python接口封裝,相比直接使用GDAL,rasterio具有以下優(yōu)勢(shì):
? 更簡(jiǎn)潔的API設(shè)計(jì)
? 原生支持NumPy數(shù)組操作
? 完美集成Python科學(xué)計(jì)算生態(tài)
? 支持多線程讀寫(xiě)加速
典型應(yīng)用場(chǎng)景:
- 衛(wèi)星影像讀寫(xiě)與格式轉(zhuǎn)換
- 遙感指數(shù)計(jì)算(如NDVI等)
- 影像裁剪與鑲嵌
- 地理坐標(biāo)系統(tǒng)轉(zhuǎn)換
二、環(huán)境安裝
你可以通過(guò)以下命令安裝rasterio庫(kù):
pip install rasterio
對(duì)于地理空間數(shù)據(jù)處理,推薦使用conda環(huán)境來(lái)管理依賴(lài)包:
conda install -c conda-forge rasterio
注意事項(xiàng):
- Windows用戶(hù):建議先安裝預(yù)編譯的GDAL庫(kù),避免出現(xiàn)安裝錯(cuò)誤??梢詮膆ttps://www.lfd.uci.edu/~gohlke/pythonlibs/下載對(duì)應(yīng)版本的whl文件。
- Linux/MacOS用戶(hù):通常直接通過(guò)
pip或conda安裝即可,但請(qǐng)確保GDAL等依賴(lài)項(xiàng)已正確配置。
三、核心功能詳解
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"坐標(biāo)系:{src.crs}")
print(f"影像尺寸:{src.width}x{src.height}")
print(f"空間分辨率:{src.res}")
print(f"地理范圍:{src.bounds}")
2. 數(shù)據(jù)寫(xiě)入與格式轉(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. 坐標(biāo)轉(zhuǎn)換
# 地理坐標(biāo) ? 像素坐標(biāo) row, col = src.index(116.3974, 39.9093) # 天安門(mén)坐標(biāo)轉(zhuǎn)像素位置 lon, lat = src.xy(500, 500) # 中心點(diǎn)坐標(biāo) # 坐標(biāo)系統(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)
# 計(jì)算NDVI
red = src.read(3).astype(float)
nir = src.read(4).astype(float)
ndvi = (nir - red) / (nir + red + 1e-8)
四、可視化實(shí)踐
# 可視化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')

五、實(shí)際應(yīng)用案例
任務(wù):批量處理Landsat8數(shù)據(jù)提取水體信息
# 示例:批量處理Landsat8數(shù)據(jù)提取水體信息
# 1. 讀取熱紅外波段
with rasterio.open('landsat8_b10.tif') as src:
thermal_band = src.read(1)
# 2. 計(jì)算地表溫度(簡(jiǎn)單的示例,實(shí)際需要進(jìn)行輻射校正)
temperature = (thermal_band - 273.15) # 假設(shè)熱紅外波段已經(jīng)是開(kāi)爾文溫度
# 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)計(jì)報(bào)告
import numpy as np
water_area = np.sum(water_mask) * src.res[0] * src.res[1] # 計(jì)算水體面積
print(f'水體面積: {water_area} 平方米')
六、高級(jí)功能
- 多線程處理:通過(guò)
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í)數(shù)據(jù) - 數(shù)據(jù)集拼接:利用
rasterio.merge.merge()實(shí)現(xiàn)影像鑲嵌 - 分塊處理:支持大數(shù)據(jù)分塊讀?。╟hunked reading)
結(jié)語(yǔ)
rasterio憑借其簡(jiǎn)潔的API和強(qiáng)大的功能,已成為遙感數(shù)據(jù)處理的必備工具。
到此這篇關(guān)于Python中rasterio庫(kù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python rasterio庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python自動(dòng)化運(yùn)維之Telnetlib的具體使用
本文將結(jié)合實(shí)例代碼,介紹python自動(dòng)化運(yùn)維之Telnetlib的具體使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
Python實(shí)現(xiàn)抓取HTML網(wǎng)頁(yè)并以PDF文件形式保存的方法
這篇文章主要介紹了Python實(shí)現(xiàn)抓取HTML網(wǎng)頁(yè)并以PDF文件形式保存的方法,結(jié)合實(shí)例形式分析了PyPDF2模塊的安裝及Python抓取HTML頁(yè)面并基于PyPDF2模塊生成pdf文件的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
python輕松辦公將100個(gè)Excel中符合條件的數(shù)據(jù)匯總到1個(gè)Excel里
這篇文章主要為大家介紹了python輕松辦公將100個(gè)Excel中符合條件的數(shù)據(jù)匯總到1個(gè)Excel里示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python實(shí)現(xiàn)Excel拆分和合并的優(yōu)化版本
這篇文章主要為大家詳細(xì)介紹了一個(gè)基于Python的Excel文件拆分與合并工具,采用模塊化設(shè)計(jì)實(shí)現(xiàn)高效處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-02-02
windows環(huán)境下python程序庫(kù)導(dǎo)出requirements并使用詳解
這篇文章主要介紹了windows環(huán)境下python程序庫(kù)導(dǎo)出requirements并使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
Python爬蟲(chóng)實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題
這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

