Обходной путь для Google Earth Engine Python API и отсутствие поддержки ee.mapclient в Python 3

Поэтому я использовал Google Earth Engine и работал с некоторыми примерами кода в их репозитории. Я использую Python 3.6. Похоже, Google больше не будет поддерживать функцию сопоставления в Python 3 через их ee.mapclient(). Мне было интересно, нашел ли кто-нибудь подходящий обходной путь? Обрисую проблему.

Я попытался загрузить ee.mapclient для построения карты.

import ee
import ee.mapclient
ee.Initialize()

Но я получил ошибку:

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'

Проблему cStringIO достаточно легко решить следующим образом: установка пакета электронной почты python 3.4.0: ImportError: нет модуля с именем 'cStringIO'

Итак, я решил опубликовать проблему в репозитории Google Earth Engine, но обнаружил уже существующую проблему:

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

В проблеме разработчики признают проблему, но указывают, что не будут ее исправлять из-за ограничений базового пакета Tk.

Вот цитата из номера:

Мы не активно поддерживали объект mapclient, потому что он зависит от Tk, инструментария графического пользовательского интерфейса, который ведет себя по-разному на разных машинах. Не могли бы вы описать свой вариант использования, для которого требуется mapclient? Возможно, мы сможем предложить альтернативный подход.

Разработчики Google предложили представить обходной путь, но до сих пор обходной путь не опубликован.

Поэтому мне было интересно, нашел ли кто-нибудь еще подходящий обходной путь в 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')

person krishnab    schedule 26.10.2017    source источник


Ответы (1)


Не уверен, есть ли проблема с импортом ee.mapclient в Python 3, но вот обходной путь с использованием folium package, который может иметь методы, аналогичные ee.mapclient. Однако это будет отображать результат в вашем веб-браузере, а не в виде всплывающего окна (если вы не используете блокнот Jupyter, вы можете просто вызвать объект карты фолиума для визуализации).

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) 

Вы должны получить в браузере интерактивную веб-карту с результатами анализа, которая выглядит следующим образом:

person Kel Markert    schedule 30.10.2018