Google Earth Engine Python API的解决方法,并且不支持Python 3中的"ee.mapclient"

kri*_*nab 7 python gis python-3.x google-earth-engine

所以我正在使用Google Earth Engine并在他们的回购中处理一些示例代码.我使用的是Python 3.6.看起来谷歌不再支持Python 3中的映射功能ee.mapclient()了.我想知道是否有人找到了合适的解决方法?让我概述一下这个问题.

我试图加载ee.mapclient绘制地图.

import ee
import ee.mapclient
ee.Initialize()
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误:

ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-13-6d4860410653> in <module>()
      1 import ee
----> 2 import ee.mapclient
      3 ee.Initialize()

/media/krishnab/lakshmi/anaconda3/envs/pMining/lib/python3.6/site-packages/ee/mapclient.py in <module>()
     29 
     30 import collections
---> 31 import cStringIO
     32 import functools
     33 import math

ModuleNotFoundError: No module named 'cStringIO'
Run Code Online (Sandbox Code Playgroud)

cStringIO问题是很容易解决按: 蟒蛇3.4.0电子邮件软件包安装:导入错误:没有模块名为"cStringIO"

所以我在Google Earth Engine Repo上发布了一个问题,但发现了一个先前存在的问题:

https://github.com/google/earthengine-api/issues/16

在该问题中,开发人员承认该问题,但表示由于底层Tk包的限制,他们不会修复它.

以下是该问题的引用:

我们没有积极维护mapclient对象,因为它依赖于Tk,一个图形用户界面工具包,它在不同的机器上表现不同.你能描述一下需要mapclient的用例吗?我们或许可以提出另一种方法.

谷歌开发者提出了提交解决方法,但到目前为止还没有发布任何解决方法.

因此,我想知道是否有其他人在Python3.6中找到了适合此问题的解决方法?

通过一个真实的代码示例,我可以从Google示例回购中提供以下代码:

import datetime
import ee
import ee.mapclient

ee.Initialize()
ee.mapclient.centerMap(-95.738, 18.453, 9)

# Filter the LE7 collection to a single date.
collection = (ee.ImageCollection('LE7_L1T')
              .filterDate(datetime.datetime(2002, 11, 8),
                          datetime.datetime(2002, 11, 9)))
image = collection.mosaic().select('B3', 'B2', 'B1')

# Display the image normally.
ee.mapclient.addToMap(image, {'gain': '1.6, 1.4, 1.1'}, 'Land')

# Add and stretch the water.  Once where the elevation is masked,
# and again where the elevation is zero.
elev = ee.Image('srtm90_v4')
mask1 = elev.mask().eq(0).And(image.mask())
mask2 = elev.eq(0).And(image.mask())
ee.mapclient.addToMap(
    image.mask(mask1), {'gain': 6.0, 'bias': -200}, 'Water: Masked')
ee.mapclient.addToMap(
    image.mask(mask2), {'gain': 6.0, 'bias': -200}, 'Water: Elev 0')
Run Code Online (Sandbox Code Playgroud)

小智 2

不确定 Python 3 中的 import ee.mapclient 是否仍然存在问题,但这里有一个使用folium 包的解决方法,它可以具有与 ee.mapclient 类似的方法。但是,这将在您的 Web 浏览器中渲染结果,而不是作为弹出窗口(除非使用 Jupyter 笔记本,那么您只需调用 folium 地图对象即可渲染)。

import ee
import folium
import datetime
import webbrowser

ee.Initialize()

class eeMapHack(object):
    def __init__(self,center=[0, 0],zoom=3):
        self._map = folium.Map(location=center,zoom_start=zoom)
        return

    def addToMap(self,img,vizParams,name):
         map_id = ee.Image(img.visualize(**vizParams)).getMapId()
         tile_url_template = "https://earthengine.googleapis.com/map/{mapid}/{{z}}/{{x}}/{{y}}?token={token}"
         mapurl = tile_url_template.format(**map_id)
         folium.WmsTileLayer(mapurl,name=name).add_to(self._map)

         return

    def addLayerControl(self):
         self._map.add_child(folium.map.LayerControl())
         return


# initialize map object
eeMap = eeMapHack(center=[18.453,-95.738],zoom=9)

# Filter the LE7 collection to a single date.
collection = (ee.ImageCollection('LE7_L1T')
          .filterDate(datetime.datetime(2002, 11, 8),
                      datetime.datetime(2002, 11, 9)))
image = collection.mosaic().select('B3', 'B2', 'B1')
eeMap.addToMap(image, {'gain': '1.6, 1.4, 1.1'}, 'Land')

# Add and stretch the water.  Once where the elevation is masked,
# and again where the elevation is zero.
elev = ee.Image('srtm90_v4')
mask1 = elev.mask().eq(0).And(image.mask())
mask2 = elev.eq(0).And(image.mask())

eeMap.addToMap(image.mask(mask1), {'gain': 6.0, 'bias': -200}, 'Water: Masked')
eeMap.addToMap(image.mask(mask2), {'gain': 6.0, 'bias': -200}, 'Water: Elev 0')

# add layer control to map
eeMap.addLayerControl()

outHtml = 'map.html' # temporary file path, change if needed
eeMap._map.save(outHtml)

webbrowser.open('file://'+outHtml) 
Run Code Online (Sandbox Code Playgroud)

您应该在浏览器中获得一个交互式网络地图,其中包含如下所示的分析结果: