Cartopy wmts KeyError проблема: TileMatrixLimits - PullRequest
0 голосов
/ 14 октября 2019

Некоторое время я использую функцию wmts cartopy, но с прошлой недели эта функция не работает, возвращая эту ошибку:

KeyError: 'TileMatrixLimits with tileMatrix "1" уже существует "

Код запуска поступает из картографической веб-документации.

под кодом:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs


def main():
    url = 'https://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi'
    layer = 'VIIRS_CityLights_2012'

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    ax.add_wmts(url, layer)
    ax.set_extent([-15, 25, 35, 60], crs=ccrs.PlateCarree())

    ax.set_title('Suomi NPP Earth at night April/October 2012')
    plt.show()


if __name__ == '__main__':
    main()

Я не понимаю, что не так.

Спасибо за помощь.

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете решить эту проблему, комментируя строки с 654 по 657 (ваш каталог Python) /Lib/site-packages/owslib/wmts.py, которые проверяют наличие индексов в статической функции from_elements из TileMatrixSetLink class

Пример:

for limits_element in link_element.findall(path):
tml = TileMatrixLimits(limits_element)
if tml.tilematrix:
    #if tml.tilematrix in tilematrixlimits:
    #    msg = ('TileMatrixLimits with tileMatrix "%s" '
    #           'already exists' % tml.tilematrix)
    #    raise KeyError(msg)
    tilematrixlimits[tml.tilematrix] = tml

links.append(TileMatrixSetLink(uri, tilematrixlimits))

Для эффектов переносимости вы можетезамените эту функцию в своем коде, прежде чем использовать ее

Например:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

### START REPLACEMENT ###

from owslib.wmts import TileMatrixSetLink, TileMatrixLimits, _TILE_MATRIX_SET_TAG, _TILE_MATRIX_SET_LIMITS_TAG, _TILE_MATRIX_LIMITS_TAG

def custom_from_elements(link_elements):
    links = []
    for link_element in link_elements:
        matrix_set_elements = link_element.findall(_TILE_MATRIX_SET_TAG)
        if len(matrix_set_elements) == 0:
            raise ValueError('Missing TileMatrixSet in %s' % link_element)
        elif len(matrix_set_elements) > 1:
            set_limits_elements = link_element.findall(
                _TILE_MATRIX_SET_LIMITS_TAG)
            if set_limits_elements:
                raise ValueError('Multiple instances of TileMatrixSet'
                                  ' plus TileMatrixSetLimits in %s' %
                                  link_element)
            for matrix_set_element in matrix_set_elements:
                uri = matrix_set_element.text.strip()
                links.append(TileMatrixSetLink(uri))
        else:
            uri = matrix_set_elements[0].text.strip()

            tilematrixlimits = {}
            path = '%s/%s' % (_TILE_MATRIX_SET_LIMITS_TAG,
                              _TILE_MATRIX_LIMITS_TAG)
            for limits_element in link_element.findall(path):
                tml = TileMatrixLimits(limits_element)
                if tml.tilematrix:
                    tilematrixlimits[tml.tilematrix] = tml

            links.append(TileMatrixSetLink(uri, tilematrixlimits))
    return links

TileMatrixSetLink.from_elements = custom_from_elements

### END REPLACEMENT ###

def main():
    url = 'https://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi'
    layer = 'VIIRS_CityLights_2012'

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    ax.add_wmts(url, layer)
    ax.set_extent([-15, 25, 35, 60], crs=ccrs.PlateCarree())

    ax.set_title('Suomi NPP Earth at night April/October 2012')
    plt.show()


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...