Проблема с проекцией робота и данными контура с помощью базовой карты - PullRequest
0 голосов
/ 03 октября 2019

Я использую библиотеку базовой карты для отображения пространственной информации из программы Copernicus. Проблема в том, что я не могу понять, как проецировать данные на проекцию робина, но я делаю это правильно с ортогональной проекцией.

Итак, в настоящее время я пробовал это:

plt.ioff()

    # adapt for location of datasources
    filePath = '../data/grib/download.grib'

    # load data
    grbs = grb.open(filePath)
    grbs.seek(0)

    data, lats, lons = (None, None, None)
    dataUnit = None
    title = None
    for g in grbs:
        data, lats, lons = g.data()

        name = g.name
        level = g.level
        pressureUnit = g.pressureUnits
        date = g.validDate

        dataUnit = g.units

        title = name + ' at ' + str(level) + ' ' + str(pressureUnit) + ' [' + str(date) + ']'
        print(title)

        break

#     mapPlot = Basemap(projection='ortho', lat_0=0, lon_0=0)
    mapPlot = Basemap(projection='robin', lat_0=0, lon_0=0, resolution='l')
    mapPlot.drawcoastlines(linewidth=0.25)

    x, y = mapPlot(lons, lats)
    mapPlot.contourf(x, y, data)
    mapPlot.colorbar(location='bottom', format='%.1f', label=dataUnit)

    plt.title(title)
    plt.show()

Ортогональная проекция работает правильно. Но для проекции Робина у меня есть ... интересная схема.

Что я делаю не так?

1 Ответ

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

Так что я понимаю, как это сделать. Я был введен в заблуждение, но первые примеры, которые я видел.

Вот мой код:


        import matplotlib
        from mpl_toolkits.basemap import Basemap, shiftgrid

        import matplotlib.pyplot as plt
        import numpy as np
        import pygrib as grb

        # Get data
        data = g['values']
        lats = g['distinctLatitudes'] # 1D vector
        lons = g['distinctLongitudes'] # 1D vector

        # Useful information for late
        name = g.name
        level = str(g.level) + g.pressureUnits
        date = g.validDate
        dataUnit = g.units

        # Parse the data
        # Shit the data to start à -180. This is important to mark the data to start at -180°
        data, lons = shiftgrid(180., data, lons, start=False)  # shiftgrid

        # Choose a representation (works with both)
#         mapPlot = Basemap(projection='ortho', lat_0=0, lon_0=0)
        mapPlot = Basemap(projection='robin', lat_0=0, lon_0=0)
        mapPlot.drawcoastlines(linewidth=0.25)

        # Convert the coordinates into the map projection
        x, y = mapPlot(*np.meshgrid(lons, lats))

        # Display data
        map = mapPlot.contourf(x, y, data, levels=boundaries, cmap=plt.get_cmap('coolwarm'))

        # Add what ever you want to your map.
        mapPlot.nightshade(date, alpha=0.1)

        # Legend
        mapPlot.colorbar(map, label=dataUnit)

        # Title
        plt.title(name + ' at ' + str(level) + ' [' + str(date) + ']')

        plt.show()

Так что он возвращает то, что я ожидаю. Result

...