基于AIE的貴陽市冷熱島效應(yīng)分析

基于 Landsat-8 數(shù)據(jù)進(jìn)行貴陽市冷熱島分析

初始化環(huán)境

import aie

aie.Authenticate()
aie.Initialize()

Landsat-8 數(shù)據(jù)檢索

指定區(qū)域熊响、時間旨别、云量檢索 Landsat-8 ,并對數(shù)據(jù)進(jìn)行去云處理汗茄。

region = aie.FeatureCollection('China_City') \
            .filter(aie.Filter.eq('city', '貴陽市')) \
            .geometry()
dataset = aie.ImageCollection('LANDSAT_LC08_C02_T1_L2') \
             .filterBounds(region) \
             .filterDate('2021-05-01', '2021-10-1') \
             .filter(aie.Filter.lte('eo:cloud_cover', 30.0))

print(dataset.size().getInfo())

Landsat-8 數(shù)據(jù)去云

def removeLandsatCloud(image):
    cloudShadowBitMask = (1 << 4)
    cloudsBitMask = (1 << 3)
    qa = image.select('QA_PIXEL')
    mask = qa.bitwiseAnd(aie.Image(cloudShadowBitMask)).eq(aie.Image(0)).And(qa.bitwiseAnd(aie.Image(cloudsBitMask)).eq(aie.Image(0)))
    return image.updateMask(mask)
# median運(yùn)算
image = dataset.median()
# clip裁剪
image = image.clip(region)
# 去云
# 去云會造成數(shù)據(jù)缺失,所以我這里不去云了
# image = removeLandsatCloud(image)
  
map = aie.Map(
    center=image.getCenter(),
    height=800,
    zoom=7
)
rgb_params = {
    'bands': ['SR_B4', 'SR_B3', 'SR_B2'],
    'min': 8000,
    'max': 13000
}
map.addLayer(
    image,
    rgb_params,
    'raw_img',
    bounds = image.getBounds()
)
map

計算 NDVI

ndvi計算 NIR-R/NIR+R

ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename(['NDVI'])
ndvi_params = {
    'min': 0,
    'max': 1.0,
    'palette': [
        '#FFFFFF', '#CE7E45', '#DF923D', '#F1B555', '#FCD163', '#99B718', '#74A901',
        '#66A000', '#529400', '#3E8601', '#207401', '#056201', '#004C00', '#023B01',
        '#012E01', '#011D01', '#011301'
    ]
}

map.addLayer(
    ndvi,
    ndvi_params,
    'NDVI',
    bounds = image.getBounds()
)
map
貴陽市ndvi分布圖
task = aie.Export.image.toAsset(ndvi,'guiyang_ndvi',50)
task.start()

計算 Fractional Vegetation

植被覆蓋度計算 NDVI-NDVI_min / NDVI_max-NDVI_min

import numpy as np

scale = 1000

histogram = ndvi.reduceRegion(aie.Reducer.histogram(2000), None, scale)
histogram_info = histogram.getInfo()
# print(histogram_info)


bucketKey = histogram_info['NDVI_range']
bucketValue = histogram_info['NDVI_counts']

key = np.array(bucketValue)
accSum = np.cumsum(key)
# print(accSum[20])
# print(accSum[-1])
accPercent = accSum / accSum[-1]
    
p2 = np.searchsorted(accPercent, 0.2)

min_ndvi = bucketKey[p2 + 1]
print('min_ndvi:%f' % min_ndvi)

p98 = np.searchsorted(accPercent, 0.98)
max_ndvi = bucketKey[p98]
print('max_ndvi:%f' % max_ndvi)
ndvi
min = aie.Image(min_ndvi)
max = aie.Image(max_ndvi)
fv = ndvi.where(ndvi.lt(min),aie.Image(0))\
           .where(ndvi.gt(max),aie.Image(1))\
           .where(ndvi.gt(min).And(ndvi.lt(max)),\
           ndvi.subtract(min).divide(max.subtract(min)))\
           .rename(['FV'])
fv_params = {
    'min': 0,
    'max': 1
}
map.addLayer(
    fv,
    fv_params,
    'fv',
    bounds = image.getBounds()
)
map

計算比輻射率 Emissivity

em = ndvi.where(ndvi.lte(aie.Image(0.2)),aie.Image(0.995))\
           .where(ndvi.gt(aie.Image(0.2)).And(ndvi.lt(aie.Image(0.4))),\
                  aie.Image(0.9589).add((aie.Image(0.086)).multiply(fv))\
                  .subtract(aie.Image(0.0617).multiply(fv).pow(aie.Image(2))))\
           .where(ndvi.gte(aie.Image(0.4)),aie.Image(0.9625).add(aie.Image(0.0614))\
                  .multiply(fv).subtract(aie.Image(0.0461)).multiply(fv).pow(aie.Image(2)))\
           .rename(['EM'])
scale = 1000

histogram = em.reduceRegion(aie.Reducer.mean())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = em.reduceRegion(aie.Reducer.max())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = em.reduceRegion(aie.Reducer.min())
histogram_info = histogram.getInfo()
print(histogram_info)
EM

計算 Thermal

同溫黑體輻射亮度計算

th = image.select('ST_B10').multiply(aie.Image(0.00341802)).add(aie.Image(149)).rename(['TH'])
scale = 1000

histogram = th.reduceRegion(aie.Reducer.mean())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = th.reduceRegion(aie.Reducer.max())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = th.reduceRegion(aie.Reducer.min())
histogram_info = histogram.getInfo()
print(histogram_info)
Thermal范圍
th_params = {
    'min': 240,
    'max': 330,
    'palette': [
        '#0000FF', '#FFFFFF', '#008000'
    ]
}
map.addLayer(
    th,
    th_params,
    'thermal',
    bounds = image.getBounds()
)
map

計算地表溫度 ( LST )

tb = th.select(['TH'])
eb = em.select(['EM'])

lst = tb.divide(tb.multiply(aie.Image(0.00115)).divide(aie.Image(1.4388)).multiply(eb.log())\
                  .add(aie.Image(1))).subtract(aie.Image(273)).rename(['LST'])
scale = 1000

histogram = lst.reduceRegion(aie.Reducer.mean())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = lst.reduceRegion(aie.Reducer.max())
histogram_info = histogram.getInfo()
print(histogram_info)
histogram = lst.reduceRegion(aie.Reducer.min())
histogram_info = histogram.getInfo()
print(histogram_info)

histogram = lst.reduceRegion(aie.Reducer.histogram(2000), None, scale)
histogram_info = histogram.getInfo()
# print(histogram_info)
bucketKey = histogram_info['LST_range']
bucketValue = histogram_info['LST_counts']

key = np.array(bucketValue)
accSum = np.cumsum(key)
# print(accSum[20])
# print(accSum[-1])
accPercent = accSum / accSum[-1]
    
p1 = np.searchsorted(accPercent, 0.01)

min_lst = bucketKey[p1 + 1]
print('min_LST:%f' % min_lst)

p99 = np.searchsorted(accPercent, 0.99)
max_lst = bucketKey[p99]
print('max_LST:%f' % max_lst)
lst范圍

消除lst噪點

用1%和99%消除噪點

# 消除噪點,用1%和99.9%消除噪點
lst = lst.where(lst.lte(aie.Image(10)),aie.Image(10))\
           .where(lst.gt(aie.Image(10)).And(ndvi.lt(aie.Image(44))),lst)\
           .where(lst.gte(aie.Image(44)),aie.Image(44))
lst_params = {
    'min': 10,
    'max': 45,
    'palette': ['#040274', '#040281', '#0502a3', '#0502b8', '#0502ce', '#0502e6',
                '#0602ff', '#235cb1', '#307ef3', '#269db1', '#30c8e2', '#32d3ef',
                '#3be285', '#3ff38f', '#86e26f', '#3ae237', '#b5e22e', '#d6e21f',
                '#fff705', '#ffd611', '#ffb613', '#ff8b13', '#ff6e08', '#ff500d',
                '#ff0000', '#de0101', '#c21301', '#a71001', '#911003']
}

map.addLayer(
    lst,
    lst_params,
    'lst',
    bounds = image.getBounds()
)
map
貴陽市地表溫度結(jié)果
task = aie.Export.image.toAsset(lst,'lst',50)
task.start()

城市冷熱島分析

城市冷島分析


scale = 1000

histogram = lst.reduceRegion(aie.Reducer.mean())
histogram_info = histogram.getInfo()
print(histogram_info)
mean_lst =  aie.Image(histogram_info.get('LST_mean'))

# subtract運(yùn)算
uci =  lst.subtract(mean_lst)

# lst二分類递览,將lst小于0的區(qū)域設(shè)置為1叼屠,將lst大于0的區(qū)域設(shè)置為nodata
uci_extent = lst.where(lst.lte(mean_lst),aie.Image(1))\
           .where(lst.gt(mean_lst),aie.Image(0))


uci_final = lst.where(lst.lte(mean_lst),uci)\
           .where(lst.gt(mean_lst),aie.Image(0))

task = aie.Export.image.toAsset(uci_final,'guiyang_uci_final',50)
task.start()

mask_vis  = {
    'min': 0,
    'max': 1,
    'palette': ['#ffffff', '#0000cd']    # 0:白色, 1:藍(lán)色
}

map.addLayer(uci_extent,mask_vis, 'uci_extent', bounds=region.getBounds())    # 藍(lán)色區(qū)域為冷島

冷島
histogram = uci_final.reduceRegion(aie.Reducer.min())
histogram_info = histogram.getInfo()
print(histogram_info)
冷島強(qiáng)度分布圖

城市熱島分析

tr =  lst.subtract(mean_lst).divide(mean_lst)
# lst二分類,將lst小于0的區(qū)域設(shè)置為1绞铃,將lst大于0的區(qū)域設(shè)置為nodata
uhi_extent = tr.where(tr.lt(aie.Image(0)),aie.Image(0))\
               .where(tr.gt(aie.Image(0)),aie.Image(1))
mask_vis  = {
    'min': 0,
    'max': 1,
    'palette': ['#ffffff', '#ff7070']    # 0:白色, 1:紅色
}


map.addLayer(uhi_extent,mask_vis, 'uhi_extent', bounds=region.getBounds())    # 紅色區(qū)域為熱島
熱島
uhi_final = uhi_extent.multiply(tr)
task = aie.Export.image.toAsset(tr,'guiyang_uhi_final',50)
task.start()
uhi_params  = {
    'min': 0.1,
    'max': 0.8,
    'palette': ['#fff705', '#ffd611', '#ffb613', '#ff8b13', '#ff6e08', '#ff500d',
                '#ff0000', '#de0101', '#c21301', '#a71001', '#911003']
}


map.addLayer(uhi_final,uhi_params, 'uhi_final', bounds=region.getBounds())
熱島強(qiáng)度圖

總結(jié)

總的來說环鲤,這個不難,難在精準(zhǔn)憎兽,難在精準(zhǔn)的地表溫度反演冷离,比如我遇到的異常值問題,需要去除噪點纯命。還有就是阿里云的小哥哥們很熱心西剥,也多虧他們的幫助,當(dāng)然我這個地表溫度反演做的比較簡單亿汞,也不是很準(zhǔn)確瞭空,希望大家有更加準(zhǔn)確的算法。這個實驗還是比較好的擬合了貴陽市的實際疗我,也說明AIE可以很好的使用咆畏。
本文主要引用了AIE的官方案例,《城市與區(qū)域規(guī)劃空間分析實驗教程》的實驗19吴裤,還有網(wǎng)絡(luò)上使用ENVI利用landsat8數(shù)據(jù)進(jìn)行地表溫度反演的例子旧找。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市麦牺,隨后出現(xiàn)的幾起案子钮蛛,更是在濱河造成了極大的恐慌,老刑警劉巖剖膳,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魏颓,死亡現(xiàn)場離奇詭異,居然都是意外死亡吱晒,警方通過查閱死者的電腦和手機(jī)甸饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仑濒,“玉大人叹话,你說我怎么就攤上這事□锞” “怎么了渣刷?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矗烛。 經(jīng)常有香客問我辅柴,道長箩溃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任碌嘀,我火速辦了婚禮涣旨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘股冗。我一直安慰自己霹陡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布止状。 她就那樣靜靜地躺著烹棉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怯疤。 梳的紋絲不亂的頭發(fā)上浆洗,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音集峦,去河邊找鬼伏社。 笑死,一個胖子當(dāng)著我的面吹牛塔淤,可吹牛的內(nèi)容都是我干的摘昌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼高蜂,長吁一口氣:“原來是場噩夢啊……” “哼聪黎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妨马,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挺举,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烘跺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡脂崔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年滤淳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌左。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖咐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汇歹,到底是詐尸還是另有隱情屁擅,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布产弹,位于F島的核電站派歌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胶果,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一匾嘱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧早抠,春花似錦霎烙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甘苍,卻和暖如春尝蠕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羊赵。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工趟佃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昧捷。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓闲昭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親靡挥。 傳聞我的和親對象是個殘疾皇子序矩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容