这一篇介绍发布GEE地图,偏摸索向
给几个官方发布的引用GEE的demo例子
官方demo—https://developers.google.com/earth-engine/app_engine_examples
打开可以看见代码,本科毕设时做过这个,那个时候只是简单套用模板,现在多多少少有一点框架的知识,看起来稍微容易一点。
先从灯光例子开始学(因为这个比较炫)
它这里用的是Jinja2框架,我之前用过django框架,反正两者差不多,我就用django来做了。从github下载下来html文件和static里的所有文件放到我的django框架对应的路径里去。
接着修改:
在script.js里面,这里的key要写上自己从谷歌地图申请下来的key,不然会无法加载谷歌地图。
在index.html末尾处,这里要写上eeMapId和eeToken,本demo的两个值要打开示例网页,通过控制台查看,我直接贴出来,复制粘贴替换上述代码就好了。
最后就能完美的在本地运行了~
关于eeMapId和eeToken的获取
本来我以为这个值是图像的ID,在GEE可以直接获取,后来发现不是,原来是在server.py生成并传入js的两组代码,现在我把相关功能源代码贴出来:
注意:token好像是随机生成的。而且是有时间限制的,所以官方例子中token是动态生成的
import ee
def GetTrendyMapId():
collection = ee.ImageCollection(IMAGE_COLLECTION_ID)
def CreateTimeBand(img):
year = ee.Date(img.get('system:time_start')).get('year').subtract(1991)
return ee.Image(year).byte().addBands(img)
collection = collection.select('stable_lights').map(CreateTimeBand)
fit = collection.reduce(ee.Reducer.linearFit())
return fit.getMapId({
'min': '0',
'max': '0.18,20,-0.18',
'bands': 'scale,offset,scale',
})
ee.Initialize()
IMAGE_COLLECTION_ID = 'NOAA/DMSP-OLS/NIGHTTIME_LIGHTS'
mapid = GetTrendyMapId()
print(mapid)
这里的代码是对历年灯光数据变化做一个线性拟合,得到offset和scale两个参数波段,并将这两个参数波段通过某种拉伸做可视化,并最后封装成代码。
下面将用上述方法来实现人口密度数据的发布:
修改参数为:
def GetTrendyMapId():
collection = ee.ImageCollection('CIESIN/GPWv4/population-density')
collection = collection.select('population-density')
fit = collection
return fit.getMapId({
'min': '-40.585220364507',
'max': '3423.0576525324904',
'bands': 'population-density',
'palette': 'eef3e4,ffa2d1,ff1b64'
})
得到id和token后去替换,再次运行得到网页:
了解了大致的原理后,就可以通过openlayers发布瓦片地图服务了(不过只是暂时的)~
<!DOCTYPE html>
<html>
<head>
<title>Simple Map</title>
<link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
<script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script>
</head>
<body>
<div id="map" class="map"></div>
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'https://earthengine.googleapis.com/map/69f116ad42579461da2c45099d659e33/{z}/{x}/{y}?token=839c83429c13908ba804ce4d3824a823',
})
}),
],
target: 'map',
view: new ol.View({
center: ol.proj.transform(
[-122.416667, 37.783333], 'EPSG:4326', 'EPSG:3857'),
zoom: 12
})
});
</script>
</body>
</html>
注意: 2019.12.10补充部分
新的earthengine-api包里修改了ee.Initialize()里的默认参数,
当默认为true时,输出的mapid将包括mapid和token,原有的token属性变成空,新的改变怎么去加载地图我并没有研究,,但是如果想实现原有的方法加载地图,只需要修改下面_init_.py里的Initialize()里的use_cloud_api参数即可,这里的参数代表是是否启用谷歌云~