文章目录

  • 前言
  • 一、GEE python学习的“磨刀石”
  • 二、geemap及其基本用法
    • 1.geemap介绍
    • 2. 比较常用的类
    • 3.geemap的基本操作
  • 三、地图圈取,获取经纬度
    • 1.区域圈取
    • 2.Marker获取像素坐标
  • 四、数据集预处理
    • 1.Filter
    • 2.去云
  • 五、图片,图表
    • 1.缩略图和动图
    • 2.tif图
    • 3.制作图表
  • 六、数据处理与导出方法
    • 1.数据处理
    • 2.导出图片和图片集
    • 3.导出其它数据
  • 七、App制作
    • 1.App类型
    • 2.ui制作
  • 八、Heroku及其文件系统
  • 九、Heroku下的免费文件管理方案
    • 1.邮件
    • 2.github
  • 十、以自己的电脑为主机部署App
    • 1.voila
    • 2.ngrok
    • 3.小米球

前言

注:项目距今一年了,部分代码缺失没办法

笔者之前从未接触google earth engine (GEE),网上资料也不是很多,而GEE python的内容更是少之又少。尽管如此,许多不计报酬,无私分享的同志依然给我带来很大的帮助。吃水不忘打井人,我会尽量把我在GEE python的实践经验发出来。下面我以我的项目为例,与大家交流GEE python制作App并部署的方法。

我的实践项目是:编写可以对任意圈取区域的归一化植被指数(NDVI)进行分析的App,并使用Heroku平台或者以自己的电脑为主机部署App。


注:以下内容基于鄙人粗浅的学识,错误不可避免,还请有识之士评论纠正

一、GEE python学习的“磨刀石”

磨刀不误砍柴功,我斗胆向各位推荐一些好用的工具,网址,值得学习的视频资料。
1.英文翻译工具:copytranslator
和谷歌生草机不一样,它的翻译非常自然准确,而且两种语言多次互相转译依然保持准确。学习GEE常常要看英文资料,用这个可以消除语言障碍。

2.常用的资源
链接: geemap指南.
链接: geemap作者的视频教程.
链接: 区域数值统计(均值,最大值等等).

我比较常用这些

3.geemap
geemap是吴秋生教授开发的包,专门用于python语言。(吴教授还会解答相关的问题,我厚脸皮发邮件问过,教授真的回复我了。)但是要注意,geemap适用于ipynb文件,就是jupyter notebook格式的文件,直接用py文件写应该是看不到地图的。geemap我会详细介绍。

二、geemap及其基本用法

1.geemap介绍

背景我就不说了,没什么意义。要强调的有三点:
a.GEE python相比于GEE JavaScript没有ui类,其它基本类似。所以绘制ui我们要求助于第三方库。下面是java版的API(这图不是我的,侵删):

b.GEE python没有直接部署App的功能,GEE JavaScript代码是可以用App功能直接部署到GEA上的。所以部署App我们选择Heroku平台或者也可以建立服务器。
c.geemap不能用py文件直接编写。

2. 比较常用的类

0.Map类:就是地图,但是geemap的地图基于ipyleaflet,ipywidgets所以不能直接在.py中使用
1.Image类:影像,所有卫星拍摄的影像,都是以Image类进行处理的。不同数据集有不同的属性,但是一般波段(Bands)属性。一张影像是由不同的波段构成的,比如红光(R),近红外光(NIR)。除此之外还有含云量等等。影像的属性是我们数据处理的关键。
查看方法:


2.ImageCollection类:从官方发布的文档来看,ImageCollection是由Image构成的列表或队列。但起始不能像列表,队列一样索引,删除,插入,添加等。即使有collection2list函数,返回的也只是名称的列表而已。
3.Geometry类:几何类,地图上的几何图形,可以覆盖想要的区域。点,线,多边形,圆等等。

3.geemap的基本操作

1.导入地图

import ee
import geemap
myMap = geemap.Map()
myMap

效果:

2.导入数据集

S2 = ee.ImageCollection('COPERNICUS/S2')##哨兵2号数据集

3.绘制几何图形
直接绘制:使用左侧工具栏

代码绘制:

#多边形,还有其它类型,不一一列举
ROI = ee.Geometry.Polygon( [[[116.942508, 30.41973],[116.942508, 30.638437],[117.215907, 30.638437],[117.215907, 30.41973],[116.942508, 30.41973]]])
myMap.addLayer(ROI)#可以加入调色盘和名称,默认黑色

addLayer()可以接受影像,影像集,几何图形,矢量图等
效果:

4.引入矢量图
首先你需要有矢量图资源,具体请自行搜索,有很详细的代码,可以裁剪出城市,省份,国家等

5.裁剪(clip())

Image.clip(ROI)#裁剪出影像ROI的部分

三、地图圈取,获取经纬度

1.区域圈取

如上所示

2.Marker获取像素坐标

from ipyleaflet import WidgetControl,Marker,Popup
marker = Marker(location = (0,0),
draggable=True,)
'''
1.查看Image,ImageCollection等信息用getInfo,不用这个是看不到信息的,返回字典
2.marker初始坐标location 是元组,注意不要把横纵坐标填反
3.可拖拽'''
message1 = HTML()
marker.popup = message1#弹出信息
myMap.add_layer(marker)
popup = Popup(location=marker.location,child=message1,close_button=False,auto_close=False,close_on_escape_key=False)
#事件响应,这里是弹出marker坐标
def get_callback(marker, html,popup):def callback(*args, **kwargs):html.value = '''<b>marker location:</b><br>{}'''.format(marker.location)popup.location = marker.locationndvi_point(marker)return callback
#不同事件类型
marker.on_click(get_callback(marker, message1,popup))#添加点击事件
#marker.on_mouseover(get_callback(marker, message1,popup))


print(marker.location),你可以用任何方法使用marker所在坐标

四、数据集预处理

1.Filter

链接: Filter 使用指南.
1.按日期筛选
2.按位置筛选
3.按元数据筛选

数据集(COPERNICUS/) 日期 含云量 数据集大小
S2 - - - - 极大
S2 18/01/01~02/01 - - 降低
S2 - - <20 降低
S2 18/01/01~02/01 <20 适合处理

数据处理之前,建议先筛选出感兴趣的数据,减小运算量。

2.去云

1.QA60去云

def rmcloud(img):
#去云方法,适用哨兵2号数据。不透明云层和卷云的属性分别是QA60的第10,11号比特位0表示无,1表示有。含云量的属性是CLOUDY_PIXEL_PERCENTAGE。qa=img.select('QA60')cloud1=1<<10cloud2=1<<11mask = qa.bitwiseAnd(cloud1).eq(0).And(qa.bitwiseAnd(cloud2).eq(0))return img.updateMask(mask).divide(10000).select("B4","B8").copyProperties(img, ["system:time_start"])

2.云概率文件去云

可以参考知乎或者csdn的文章,我就不便发出了


参考: 知乎 基于sentinel的去云方案对比评估.
但是JavaScript

五、图片,图表

1.缩略图和动图

缩略图指的是:

在GEE JavaScript中缩略图可以用ui.Thumbnail()获取,但是之前提到过,python版没有ui类,python可以考虑用

geemap.ee_export_image()

imageio,制作动图很方便
动图指的是由缩略图制作的gif:

2.tif图

tif是可以在类似Arcmap的软件上进行分析的。

tif:

不能上传原图,截图将就下。

3.制作图表

1.使用matplotlib制作图表

在这里插入代码片

2.直接将图表显示在地图上

在这里插入代码片

3.geemap自带功能

六、数据处理与导出方法

1.数据处理

1.NDVI(归一化植被指数)的计算方法:

def ndvi_img(img):#加工原图像成为ndvi图像,将NDVI波段添加至图片ndvi = img.normalizedDifference(["B8","B4"]).float().rename("NDVI")ndvi_img = img.addBands(ndvi)return ndvi_img

2.使用.map()批量处理图片
你可能需要处理一整个数据集

def get_ndvi_collection(start_time,end_time):try:no_cloud_S2 = S2.filterDate(start_time,end_time).filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20)).map(rmcloud)#选择年份,数据集去云处理ndvi_list = no_cloud_S2.map(ndvi_img)#转化为ndvi图vis_params = {'min': -0.2,'max': 0.8,'palette': 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +'3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'}ROI_ndvi = ndvi_list.select("NDVI").map(clip)#ndvi图片裁剪出合肥地区return ROI_ndviexcept:return None

3.Reducer

4.geemap中区域统计数值方法
视频参考: GEE教程第12期: Computing zonal statistics with Earth Engine.

5.geemap自带功能

2.导出图片和图片集

视频参考: GEE教程第11期:Exporting Earth Engine Image and ImageCollection.

3.导出其它数据

七、App制作

1.App类型

2.ui制作

视频参考: GEE教程第40期:如何添加交互式控件到地图上.
对于控件较多的App,我推荐Tab控件,可以更好管理界面

tab_contents = ['第1页', '第2页','地图']tool1 = widgets.VBox()
tool2 = widgets.VBox()
children = [tool1,tool2,myMap]tab = widgets.Tab()
tab.children = children
for index,i in enumerate(tab_contents):tab.set_title(index,i)  # 需要索引与值两个参数
tab

八、Heroku及其文件系统

翻译自:https://help.heroku.com/K1PPS2WM/why-are-my-file-uploads-missing-deleted-from-the-application

Heroku文件系统是短暂的——这意味着在dyno运行时对文件系统的任何更改只会持续到dyno关闭或重新启动。每个dyno都会使用最近部署的文件系统的干净副本启动。这与许多基于容器的系统(如Docker)的运行方式类似。
此外,在正常运行情况下,dynos每天都会重新启动一个称为“循环”的过程。
这两个事实意味着Heroku上的文件系统不适合持久存储数据。在需要存储数据的情况下,我们建议使用数据库插件,如Postgres(用于数据)或专用文件存储服务,如AWS S3(用于静态文件)。如果你不想在AWS上建立一个账户来创建一个S3 bucket,我们这里也有处理静态资产存储和处理的插件https://elements.heroku.com/addons

也就是说,想要长期存储文件——得加钱

九、Heroku下的免费文件管理方案

1.邮件

你可以使用邮件发送heroku的数据到指定邮箱,写代码可以考虑stmp(如果我没记错的话)

2.github

十、以自己的电脑为主机部署App

1.voila

voila(又称Voilà)是构筑web app的捷径。voila会将 Jupyter 笔记本变成独立的 Web 应用程序,这样jupyter代码直接在主机上运行就可以形成app,Voilà 使用 strip_source 选项运行,该选项可以隐藏原始代码。
要注意的是, Voilà 默认不提供作为经典笔记本扩展 (nbextension) 安装的 Jupyter Widget。如果自定义小部件尚未发布到 npm,或者当 Voilà 在没有 Internet 连接的环境中运行时,这可能会导致错误 (404)。所以使用ipywidgets绘制ui时,为了防止界面加载不出来,需要使用命令“voila --enable_nbextensions=True”,支持扩展。

2.ngrok

如果你不想用heroku,转而使用自己的笔记本电脑作为主机。那用volia之后,还需要把app发布出来。nigrok可以解决此问题。但是ngrok使用成本高,只是想做个小项目或者糊弄毕设完全不需要。你就可以使用小米球作为替代,一杯可乐钱就ok。
为了与voila功能配合,先使用voila – port = <port number>,将Web App运行到端口。再使用ngrok的内网穿透,就可以完成App的本地服务器部署

3.小米球

具体的部署方法可以参考上面链接中的up,因为时间相距太久具体的部署我已经忘记了。

【GEE python】基于geemap开发Google earth App相关推荐

  1. Python基于vs2013开发配置环境出错unsupported python version 3.7解决方案

    Python基于vs2013开发配置环境出错 unsupported python version 3.7解决方案 前提:vs2013+vs2013插件+python 可能网友们在安装完成之后,打开v ...

  2. 基于AS开发的手机App源码 可以配合单片机wifi通信接收单片机数据

    基于AS开发的手机App源码 可以配合单片机wifi通信接收单片机数据 注:只有文字描述的功能,其它功能无法实现,也不会制作 ID:6939642638150328Uun丶

  3. 基于Android开发的天气预报app(源码下载)

    基于AndroidStudio环境开发的天气app 由于需要源码的人特别多,我特地花时间新增了对最新IDE版本Android Studio Chipmunk | 2021.2.1 Patch 1的支持 ...

  4. 基于android开发的日历,基于android开发的日历APP设计.doc

    PAGE I 摘 要 Android系统凭借其良好的用户体验,低廉的成本及高开放性产生了巨大的应用量和广阔的应用面.如今,基于android系统的应用极为丰富,从输入法到影音播放器,从系统工具到网页浏 ...

  5. html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结

    悦心,一款音乐播放器应用.由"女立方"团队开发.眼下.较为流行的音乐播放器有QQ音乐.网易云音乐.多米音乐等. "悦心"音乐播放器的主要功能,提供音乐数据库,点 ...

  6. GEE学习笔记:在Google Earth Engine(GEE)中导出shp文件

    目前想到的需要导出shp文件的应用场景有如下: 1.在线处理矢量数据,将结果导出.         2.在GEE上选取样本点,导出到本地处理.         3.将得到的栅格结果转成矢量,再导出到本 ...

  7. 【收藏】基于QGIS的Google Earth Engine插件已发布

    https://zhuanlan.zhihu.com/p/98060635?utm_source=qq

  8. GEE学习笔记:在Google Earth Engine(GEE)中批量下载Sentinel-2影像

    目标:批量下载研究区域满足一定条件的所有Sentinel-2影像. Sentienl-2A携带了一枚多光谱成像仪(MSI),具有三种不同的空间分辨率 ,10m空间分辨率下有四个波段( B2.B3.B4 ...

  9. GEE学习笔记:在Google Earth Engine(GEE)中计算坡度、坡向、山体阴影

    本次实验使用的 SRTM 数字高程数据是 30 米分辨率数据,对某地区的坡度.坡向和山体阴影信息进行提取. 目录 1.获取SRTMGL1_003 数据 2.计算地形特征 3.分别提取各地形因子 4.完 ...

最新文章

  1. 低压抽屉柜常见故障处理方法_电磁流量计的常见故障及处理方法
  2. sys.stdout sys.stderr的用法
  3. delphi中採用bpl共享模塊的幾點釋疑
  4. openid saml2_单一登录云:SAML和OpenId
  5. python csdn博客_GitHub - 1783955902/CSDNBlogBackup: Python实现CSDN博客的完整备份
  6. 解决mysql ERROR 1045(28000)问题【忘记密码,修改配置文件,无密码登录mysql修改密码】
  7. 【clickhouse】创建物化视图数据来源是两张表该怎么写创建语句呢?
  8. (转)jquery基础教程八 load方法及小技巧
  9. 机器学习基础(十三)—— regularization validation
  10. thinkjs查询mysql_Thinkjs关系数据库学习——查询数据
  11. 软件集成测试工作流程指南
  12. 用 Python 写个消消乐小游戏
  13. 华为novia3i鸿蒙,华为nova3i一马当先:值得年轻人购买的智能手机推荐
  14. OBS视频采集流程分析
  15. 身份认证协议攻击怎么解决
  16. 完美的Python代码制作“恐龙跳一跳“小游戏【附带源码 】
  17. 服务器电脑上保存的文件找不到了,保存在电脑上的word文件突然找不到怎么办?该如何找回来...
  18. 第一周 周报
  19. Dockerflie概述
  20. 用 Appium 自动收取蚂蚁森林能量

热门文章

  1. 【人工智能】不确定性推理(QDU)
  2. 〖Python WEB 自动化测试实战篇⑮〗 实战 - 自动化测试的持续集成
  3. python安装失败的解决办法
  4. php怎么写取消关注,网页PHP颤音取消批量关注JS代码
  5. 关于windows的粘滞键后门漏洞
  6. idea 查看并设置快捷键
  7. Java中Debug手段——JUnit单元测试
  8. PHP之十六个魔术方法详解 转自:青叶
  9. 王者荣耀:必须要学会的七个技巧,不然活该你连输100场!
  10. 钉钉直播视频下载方法分享地瓜网络技术