【GEE python】基于geemap开发Google earth App


前言

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

笔者之前从未接触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(这图不是我的,侵删):
GEE JavaScript 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)。除此之外还有含云量等等。影像的属性是我们数据处理的关键。
查看方法:
登录GEE平台
哨兵二号数据集
波段编号

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

3.geemap的基本操作

1.导入地图

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

效果:
geemap世界地图

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.location
        ndvi_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- -- -极大
S218/01/01~02/01- -降低
S2- -<20降低
S218/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<<10
  cloud2=1<<11
  mask = 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的软件上进行分析的。
ArcMap分析tif图
tif:
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_ndvi
    except:
        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,因为时间相距太久具体的部署我已经忘记了。

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
geeGoogle Earth Engine)是由谷歌开发的一款云端平台,用于存储、处理、分析和可视化地球数据。它提供了丰富的 Python API,使得用户可以使用 Python 编程语言来访问和操作地球数据。 使用 gee Python API,可以方便地进行地理数据的获取和处理。首先,我们可以使用 gee Python API 连接到 Google Earth Engine 服务器,获取世界范围内的各种地球数据集。这些数据集包括遥感图像(如卫星图像、气候数据等)、地形数据、地表覆盖数据等等。通过 Python API,我们可以使用简洁的代码来获取这些数据,并进行进一步的处理。 在数据获取后,gee Python API 提供了丰富的数据处理和分析功能。例如,我们可以使用 Python API 对遥感图像进行影像处理,如镶嵌、裁剪、融合等。此外,Python API 还支持各种地理统计分析、空间分析和机器学习算法。这些功能使得用户能够从大规模的地球数据中提取有用的信息,并进行复杂的分析和建模工作。 除了数据处理和分析,gee Python API 还支持数据的可视化。它提供了丰富的绘图函数和库,可以生成各种静态和交互式地图,将地球数据以清晰、直观的方式展示出来。这使得使用者可以更好地理解和传达数据的结果,并进行更深入的探索和研究。 总之,gee Python API 提供了一个强大而灵活的平台,使得用户能够轻松地访问、处理和分析地球数据。它的丰富功能和易于使用的编程接口,使得科学家、学生和开发者们能够更好地利用地球数据,进行各种地理信息系统、生态环境、气候变化等方面的研究和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值