西西人体www大胆高清-自拍偷拍国产-蜜臀久久久久久999-精品视频91-黑帮大佬和我的365日第二部-成人深夜网站-四虎伊人-欧美老女人xx-免费av观看网址-亚洲黄色录像片-日本h漫在线观看

星空人工智能技術(shù)網(wǎng)

PIE-Engine實(shí)踐篇|巧用map算子提高效率

999.jpg

PIE-Engine 遙感云計(jì)算平臺(tái)上集成了海量遙感數(shù)據(jù)、強(qiáng)大的算力和豐富的算子,使得大規(guī)模尺度長時(shí)間序列的遙感數(shù)據(jù)分析可以在線快速完成,其中一大利器便是map算子。本期我們來詳細(xì)介紹map算子的作用,它和傳統(tǒng)for循環(huán)的區(qū)別,以及如何巧用map算子優(yōu)化代碼,提高計(jì)算效率。

一、 map算子的作用

map算子是我們?cè)谠朴?jì)算平臺(tái)上處理影像時(shí)常用的算子,可以對(duì)集合(List、FeatureCollection、ImageCollection)中的每一個(gè)元素進(jìn)行操作,操作完成返回的結(jié)果仍是一個(gè)集合對(duì)象。以FeatureCollection調(diào)用map算子為例,其基本形式如下:

var featureCol = pie.FeatureCollection('NGCC/CHINA_PROVINCE_BOUNDARY');

var featureColNew = featureCol.map(function (feature) {

var geometry = feature.geometry();

var featureNew = pie.Feature(geometry.centroid());

return featureNew;

})

上述代碼取出featureCol 中的每一個(gè)feature,然后求取各feature的幾何中心,得到一個(gè)新的矢量集合-featureColNew。

二、map算子和for循環(huán)的區(qū)別

當(dāng)然,有些map操作用傳統(tǒng)的for/while循環(huán)也可以實(shí)現(xiàn),但二者在計(jì)算機(jī)制上有本質(zhì)區(qū)別,for循環(huán)是在前端控制變量的循環(huán),且是順序執(zhí)行代碼,效率比較慢,一般在PIE-Engine里很少用。而map則是在后臺(tái)服務(wù)器上直接作用于集合中的元素進(jìn)行循環(huán)操作,執(zhí)行效率很快,相當(dāng)于“并行執(zhí)行任務(wù)”, 但在map里一般不再用 print、Map、Export 以及Reducer等方法。下面分別對(duì)比在集合中使用map算子和for循環(huán)的不同之處。

針對(duì)List中的每個(gè)元素進(jìn)行循環(huán)計(jì)算

//對(duì)List中的每個(gè)元素加1,采用map算子

var list1 = pie.List([1,2,3,2]);

var list2 = list1.map(function (value) {

return pie.Number(value).add(1);

});

print("list2",list2);

輸出結(jié)果:


//對(duì)List中的每個(gè)元素加1,采用for循環(huán)

var list1 = pie.List([1,2,3,2]);

var list2 = [];

for(var i = 0;i

list2.push(pie.Number(list1.get(i)).add(1).getInfo());

}

print("list2",list2);

輸出結(jié)果:


List集合調(diào)用map算子后便可直接作用于其中的元素,而采用for循環(huán)則還需要增加諸多限制,才能實(shí)現(xiàn)相同的功能。

針對(duì)FeatureCollection中的每個(gè)Feature進(jìn)行循環(huán)計(jì)算

利用中國省級(jí)行政區(qū)劃矢量數(shù)據(jù)計(jì)算每個(gè)省的面積,分別采用map算子和for循環(huán)進(jìn)行計(jì)算。

(1)取FeatureCollection中的每個(gè)元素并計(jì)算其面積,采用map算子:

向上滑動(dòng)閱覽

var featureCol = pie.FeatureCollection().load('NGCC/CHINA_PROVINCE_BOUNDARY');

var featureColNew = featureCol.map(function (feature) {

var name = feature.get("name");

var geometry = feature.geometry();

var area = geometry.area().divide(1000000);

feature = feature.set("name",name);

feature = feature.set("area",area);

return feature;

})

var result = featureColNew.reduceColumns(pie.Reducer.toList(2),["name","area"]);

print("result",result);

Map.addLayer(featureCol,,"featureCol");

Map.setCenter(118,39.7,3);

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=cbe5f4f5efca4b5faa8344b0ab325c04

采用map算子獲取中國各省的面積

(2)取FeatureCollection中的每個(gè)元素并計(jì)算其面積,采用for循環(huán):

向上滑動(dòng)閱覽

var featureCol = pie.FeatureCollection().load('NGCC/CHINA_PROVINCE_BOUNDARY');

print(featureCol)

for(i = 0; i

var name = featureCol.getAt(i).get("name");

var geometry = featureCol.getAt(i).geometry();

var area = geometry.area().divide(1000000);

print(name,area);

}

Map.addLayer(featureCol,,"featureCollection");

Map.setCenter(118,39.7,3);

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=4198d136975841269e367aec1ae47e70

運(yùn)行結(jié)果:

▲for循環(huán)輸出各省面積

上述代碼采用map算子,2秒即可出結(jié)果,而for循環(huán)則需要40秒,等待時(shí)間較長,從而體現(xiàn)map算子的優(yōu)勢(shì)。

針對(duì)ImageCollection中的每個(gè)Image進(jìn)行循環(huán)計(jì)算

(1)取ImageCollection中的每個(gè)元素計(jì)算NDVI,采用map算子:

向上滑動(dòng)閱覽

var featureCol = pie.FeatureCollection().load('NGCC/CHINA_PROVINCE_BOUNDARY');

var beijing = featureCol.filter(pie.Filter.eq("name", "北京市"));

var bjGeo = beijing.getAt(0).geometry();

var visParams = ;

Map.addLayer(beijing, visParams, "北京市");

Map.centerObject(beijing, 6);

var imageCol = pie.ImageCollection("LC08/01/T1")

.filterDate("2019-12-01", "2019-12-31")

.filterBounds(bjGeo);

print("imageCol", imageCol);

var imageColNDVI = imageCol.map(function (image) {

// NDVI計(jì)算

var img_Nir = image.select("B5");

var img_Red = image.select("B4");

var img_NDVI = img_Nir.subtract(img_Red).divide(img_Nir.add(img_Red)).rename("NDVI");

return image.addBands(img_NDVI);

});

print("imageColNDVI", imageColNDVI);

//NDVI繪制樣式

var visParamNDVI = {

min: -0.2,

max: 0.8,

palette: 'CA7A41, CE7E45, DF923D, F1B555, FCD163, 99B718, '+

'74A901, 66A000, 529400,3E8601, 207401, 056201, 004C00,'+

'023B01, 012E01, 011D01, 011301'

};

var imageNDVI = imageColNDVI.select("NDVI").mosaic().clip(bjGeo);

Map.addLayer(imageNDVI, visParamNDVI, "Layer_NDVI");

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=4ec895ce6e3b411daab877713ca81f45

輸出結(jié)果:


(2)取ImageCollection中的每個(gè)元素計(jì)算NDVI,采用for循環(huán):

向上滑動(dòng)閱覽

var featureCol = pie.FeatureCollection().load('NGCC/CHINA_PROVINCE_BOUNDARY');

var beijing = featureCol.filter(pie.Filter.eq("name", "北京市"));

var bjGeo = beijing.getAt(0).geometry();

var visParams = { color: "ff0000ff", fillColor: "00000000" };

Map.addLayer(beijing, visParams, "北京市");

Map.centerObject(beijing, 6);

var imageCol = pie.ImageCollection("LC08/01/T1")

.filterDate("2019-8-01", "2019-8-30")

.filterBounds(bjGeo);

print("imageCol", imageCol);

var newCol=[];

for (i = 0; i

var image = imageCol.getAt(i);

var img_Nir = image.select("B5");

var img_Red = image.select("B4");

var img_NDVI = img_Nir.subtract(img_Red).divide(img_Nir.add(img_Red))

.rename("NDVI");

image = image.addBands(img_NDVI);

newCol.push(image);

}

var newImageCol=pie.ImageCollection().fromImages(newCol);

print("newImageCol", newImageCol);

//NDVI繪制樣式

var visParamNDVI = {

min: -0.2,

max: 0.8,

palette: 'CA7A41, CE7E45, DF923D, F1B555, FCD163, 99B718, ' +

'74A901, 66A000, 529400,3E8601, 207401, 056201, 004C00,' +

'023B01, 012E01, 011D01, 011301'

};

var imageNDVI = newImageCol.select("NDVI").mosaic().clip(bjGeo);

Map.addLayer(imageNDVI, visParamNDVI, "Layer_NDVI");

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=ef81bdf97c8d45809c3101f5f8dee4c4

上述代碼采用map算子和for循環(huán)的計(jì)算時(shí)間基本相同, 但在使用for循環(huán)時(shí)要重新構(gòu)造一個(gè)存放新的image集合的數(shù)組,并在循環(huán)結(jié)束后重新構(gòu)造一個(gè)由這些image組成的ImageCollection,在步驟上較為復(fù)雜。

因此,在遙感云計(jì)算平臺(tái)中,涉及到對(duì)集合中的每個(gè)元素進(jìn)行操作時(shí),推薦使用map算子,快速且便利。但前述提到,在map算子中不宜再用 print、Map、Export 以及Reducer等方法,如果需要對(duì)集合中的每個(gè)元素進(jìn)行統(tǒng)計(jì)操作,則可用for循環(huán)代替,以下代碼展示了使用for循環(huán)統(tǒng)計(jì)北京各城區(qū)提取的建筑區(qū)面積:

向上滑動(dòng)閱覽

var chn = pie.FeatureCollection('NGCC/CHINA_PROVINCE_BOUNDARY');

var beijing = chn.filter(pie.Filter.eq("name", "北京市"));

var bjGeo = beijing.getAt(0).geometry();

var chn2 = pie.FeatureCollection('NGCC/CHINA_COUNTY_BOUNDARY');

var beijing2 = chn2.filter(pie.Filter.eq("cname", "北京市"));

var bjGeo2 = beijing2.getAt(0).geometry();

Map.centerObject(beijing, 7)

var visParams = { color: "ff0000ff", fillColor: "00000000" };

Map.addLayer(beijing, visParams, "北京市邊界");

Map.addLayer(beijing2, visParams, "北京市各區(qū)");

function rmCloud(image) {

var qa = image.select("BQA");

var cloudMask = qa.bitwiseAnd(1

return image.updateMask(cloudMask);

}

var l8 = pie.ImageCollection("LC08/01/T1")

.filterDate("2020-7-1", "2020-8-30")

.filterBounds(bjGeo)

.select(["B2", "B3", "B4", "B5", "B6", "BQA"])

.map(rmCloud);

//計(jì)算用到的指數(shù)

function imgCalculate(image) {

var green = image.select("B3");

var red = image.select("B4");

var nir = image.select("B5");

var swir1 = image.select("B6");

var ndvi = (nir.subtract(red)).divide(nir.add(red)).rename("NDVI");

var mndwi = green.subtract(swir1)

.divide(green.add(swir1))

.rename("MNDWI");

return image.addBands(ndvi).addBands(mndwi);

}

var imgCol = l8.map(imgCalculate)

.mean()

.clip(bjGeo);

Map.addLayer(imgCol, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "imgCol");

var ndvi = imgCol.select("NDVI");

var nonVeg = imgCol.updateMask(ndvi.lte(0.6));

Map.addLayer(nonVeg, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "nonVeg");

var mndwi = imgCol.select("MNDWI");

var nonVegWater = nonVeg.updateMask(mndwi.lte(0.3));

Map.addLayer(nonVegWater, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "nonVegWater");

var nonVegWater2 = nonVegWater.select("B2").gt(0);

Map.addLayer(nonVegWater2, { min: 0, max: 1, palette: "ff0000" }, "nonVegWater2");

var areaImage = nonVegWater2.pixelArea().multiply(nonVegWater2.gt(0));

var area = areaImage.reduceRegion(pie.Reducer.sum(), bjGeo, 30);

print("北京市建筑用地面積(單位:平方千米): ", pie.Number(area.get("constant")).divide(1000000));

var newFeatures = [];

for (var i = 0; i

var temp = nonVegWater2.clip(beijing2.getAt(i).geometry());

var areaImg = temp.pixelArea().multiply(temp.gt(0));

var area = areaImg.reduceRegion(pie.Reducer.sum(), beijing2.getAt(i).geometry(), 30);

newFeatures.push(beijing2.getAt(i).set("area", area.get("constant")));

}

beijing2 = pie.FeatureCollection(newFeatures);

print("beijing2",beijing2);

var result = beijing2.reduceColumns(pie.Reducer.toList(2), ["name", "area"]);

print("result", result);

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=bf885222bf584f33aaa96c2a0093c03d

輸出結(jié)果:


三、巧用map算子,提高計(jì)算效率

map算子帶來便利的同時(shí),也將大量的計(jì)算轉(zhuǎn)移給了后臺(tái)計(jì)算服務(wù)。通常我們?cè)谟跋裉幚頃r(shí)會(huì)計(jì)算多個(gè)指數(shù),單個(gè)指數(shù)的計(jì)算公式通常會(huì)寫成函數(shù)的形式方便調(diào)用。多個(gè)map算子共同使用時(shí),相當(dāng)于多次循環(huán),所涉及到的運(yùn)算量也很大,怎樣使用map算子才能優(yōu)化計(jì)算邏輯,提高計(jì)算效率呢?

下面以去云后計(jì)算裸土指數(shù)BSI、改進(jìn)的歸一化差異水體指數(shù)MNDWI、增強(qiáng)型的裸土指數(shù)EBSI、建筑用地指數(shù)NDBI等4個(gè)指數(shù)的計(jì)算為例,來說明如何在代碼級(jí)別進(jìn)行優(yōu)化來減少計(jì)算量從而提高計(jì)算效率。

方法1,將每個(gè)指數(shù)的計(jì)算單獨(dú)寫成函數(shù),在篩選完影像后依次用map算子調(diào)用:


向上滑動(dòng)閱覽

var chn = pie.FeatureCollection('NGCC/CHINA_PROVINCE_BOUNDARY');

var beijing = chn.filter(pie.Filter.eq("name", "北京市"));

var bjGeo = beijing.getAt(0).geometry();

Map.centerObject(beijing, 7)

var visParams = { color: "ff0000ff", fillColor: "00000000" };

Map.addLayer(beijing, visParams, "北京市邊界");

//去云

function rmCloud(image) {

var qa = image.select("BQA");

var cloudMask = qa.bitwiseAnd(1

return image.updateMask(cloudMask);

}

//裸土指數(shù)BSI: [(B06 + B04)-(B05 + B02)]/[(B06 + B04)+(B05 + B02)]

function BSI(image) {

var nir = image.select("B5");

var swir1 = image.select("B6");

var red = image.select("B4");

var blue = image.select("B2");

var bsi = (swir1.add(red).subtract(nir.add(blue)))

.divide(swir1.add(red).add(nir.add(blue)));

return image.addBands(bsi.rename("BSI"));

}

//改進(jìn)的歸一化差異水體指數(shù)MNDWI: (B03 - B06)/(B03 + B06)

function MNDWI(image) {

var mndwi = image.select("B3").subtract(image.select("B6"))

.divide(image.select("B3").add(image.select("B6")))

return image.addBands(mndwi.rename("MNDWI"));

}

//增強(qiáng)型的裸土指數(shù)EBSI:(BSI - MNDWI)/(BSI + MNDWI)

function EBSI(image) {

var mndwi = image.select("MNDWI");

var bsi = image.select("BSI");

var ebsi = (bsi.subtract(mndwi)).divide(bsi.add(mndwi));

return image.addBands(ebsi.rename("EBSI"));

}

//建筑用地指數(shù)NDBI: (B06 - B05)/(B06 + B05)

function NDBI(image) {

var ndbi = image.select("B6").subtract(image.select("B5"))

.divide(image.select("B6").add(image.select("B5")))

return image.addBands(ndbi.rename("NDBI"));

}

//加載Landsat 8影像數(shù)據(jù)集合

var imgColl8 = pie.ImageCollection("LC08/01/T1")

.filterDate("2020-4-1", "2020-4-30")

.filterBounds(bjGeo)

.select(["B2", "B3", "B4", "B5", "B6", "B7", "BQA"])

.map(rmCloud)

.map(BSI)

.map(MNDWI)

.map(EBSI)

.map(NDBI)

.mean()

.clip(bjGeo);

print("imgColl8",imgColl8);

Map.addLayer(imgColl8, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "imgCol1");

Map.addLayer(imgColl8.select("BSI"), { min: -0.2, max: 0.2 }, "BSI");

Map.addLayer(imgColl8.select("NDBI"), { min: -0.2, max: 0.2 }, "NDBI");

Map.addLayer(imgColl8.select("MNDWI"), , "MNDWI");

Map.addLayer(imgColl8.select("EBSI"), { min: 0, max: 1 }, "EBSI");

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=402cadc45985400c8650620b9d93bad9

上述代碼共調(diào)用了5次map算子,相當(dāng)于對(duì)篩選后的影像進(jìn)行了5次遍歷,除去云操作外,每一次都是對(duì)每景影像進(jìn)行波段運(yùn)算完后添加計(jì)算后的指數(shù),將大量的算力消耗在了重復(fù)讀取和寫入上,輸出計(jì)算結(jié)果用時(shí)85秒,完整顯示用時(shí)135秒。

依次調(diào)用多個(gè)map計(jì)算每個(gè)指數(shù)

方法2,將去云及指數(shù)運(yùn)算封裝成一個(gè)函數(shù),在篩選完影像后僅用map算子調(diào)用一次:


向上滑動(dòng)閱覽

var chn = pie.FeatureCollection('NGCC/CHINA_PROVINCE_BOUNDARY');

var beijing = chn.filter(pie.Filter.eq("name", "北京市"));

var bjGeo = beijing.getAt(0).geometry();

Map.centerObject(beijing, 7)

var visParams = { color: "ff0000ff", fillColor: "00000000" };

Map.addLayer(beijing, visParams, "北京市邊界");

var imgColl8 = pie.ImageCollection("LC08/01/T1")

.filterDate("2020-4-1", "2020-4-30")

.filterBounds(bjGeo)

.select(["B2", "B3", "B4", "B5", "B6", "B7", "BQA"]);

//影像處理函數(shù)

function imgCalculate(image) {

var qa = image.select("BQA");

var cloudMask = qa.bitwiseAnd(1

image = image.updateMask(cloudMask);

var blue = image.select("B2");

var green = image.select("B3");

var red = image.select("B4");

var nir = image.select("B5");

var swir1 = image.select("B6");

var bsi = (swir1.add(red).subtract(nir.add(blue)))

.divide(swir1.add(red).add(nir.add(blue)))

.rename("BSI");

var mndwi = green.subtract(swir1)

.divide(green.add(swir1))

.rename("MNDWI");

var ebsi = (bsi.subtract(mndwi)).divide(bsi.add(mndwi))

.rename("EBSI");

var ndbi = swir1.subtract(nir)

.divide(swir1.add(nir))

.rename("NDBI");

return image.addBands(mndwi).addBands(bsi).addBands(ebsi)

.addBands(ndbi);

}

imgColl8 = imgColl8.map(imgCalculate).mean().clip(bjGeo);

print("imgColl8", imgColl8);

Map.addLayer(imgColl8, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "imgCol1");

Map.addLayer(imgColl8.select("BSI"), { min: -0.2, max: 0.2 }, "BSI");

Map.addLayer(imgColl8.select("NDBI"), { min: -0.2, max: 0.2 }, "NDBI");

Map.addLayer(imgColl8.select("MNDWI"), , "MNDWI");

Map.addLayer(imgColl8.select("EBSI"), { min: 0, max: 1 }, "EBSI");

代碼鏈接:

https://engine.piesat.cn/engine-share/shareCode.html?id=ce08fdb1cca147acb6ae6da7629fb49f

將指數(shù)計(jì)算封裝到一個(gè)函數(shù)中調(diào)用

上述代碼僅調(diào)用了1次map算子,對(duì)篩選后的影像進(jìn)行了去云操作以及4個(gè)指數(shù)波段的添加,僅需對(duì)每景影像讀取寫入一次,大大節(jié)省了算力,只用8秒即可輸出結(jié)果并完整顯示,相比于方法1,計(jì)算速度提升近10倍。

學(xué)會(huì)了這種思路后,平常我們?cè)诰帉懘a時(shí),注意將計(jì)算過程優(yōu)化,就可以提高計(jì)算效率,減少等待時(shí)間。

 

星空人工智能技術(shù)網(wǎng) 倡導(dǎo)尊重與保護(hù)知識(shí)產(chǎn)權(quán)。如發(fā)現(xiàn)本站文章存在版權(quán)等問題,煩請(qǐng)30天內(nèi)提供版權(quán)疑問、身份證明、版權(quán)證明、聯(lián)系方式等發(fā)郵件至1851688011@qq.com我們將及時(shí)溝通與處理。!:首頁 > 新聞 » PIE-Engine實(shí)踐篇|巧用map算子提高效率

感覺不錯(cuò),很贊哦! ()
分享到:

相關(guān)推薦

留言與評(píng)論(共有 0 條評(píng)論)
   
驗(yàn)證碼: