makegrid-эквивалент в cartopy, переход от базовой карты к cartopy - PullRequest
0 голосов
/ 20 декабря 2018

Итак, я годами использую Basemap в Python 2.7, я перехожу на Python3.7 и хотел бы перейти к картопии.Я работаю с большим количеством данных, где у меня есть информация о проекции, но у меня нет сетки данных.Вот как я буду обрабатывать вещи в Базовой карте.

m=Basemap(
    llcrnrlon=-118.300,
    llcrnrlat=20.600,
    urcrnrlon=-58.958,
    urcrnrlat=51.02,
    projection='lcc',
    lat_1=38.,
    lat_2=38.,
    lon_0=-95.,
    resolution ='l',
    area_thresh=1000.
)
mwidth =  1008 #for 163 5km AWIPS2 grid
mheight = 722  #for 163 5km AWIPS2 grid

Так что я настроил опорную сетку 'm' в Базовой карте ... Затем, чтобы построить данные ... Я использую это:

lons,lats=m.makegrid(mwidth,mheight)
x,y=m(lons,lats)

Затем я могу использовать contourf или pcolormesh следующим образом:

m.contourf(x,y,data)

Я в основном ищу эквивалент в cartopy, pyproj или osgeo.Я хочу передать информацию о проекции с размером сетки и получить широту / долготу, чтобы я мог строить с картопами.

Любая помощь приветствуется ...

1 Ответ

0 голосов
/ 21 декабря 2018

Документы makegrid утверждают, что он возвращает латы и долготы, которые находятся на одинаковом расстоянии в проекционной системе координат.Я полагаю, что вы в основном используете это для размещения проецируемых данных на любой карте, позволяя базовой карте указывать широту и долготу.Cartopy работает совершенно по-другому, так как вам совершенно разрешено указывать систему координат ваших координат в собственной системе координат.

Итак, если вы знаете координаты ваших данных в lcc (конформная коническая проекция Ламберта)) затем вы можете передать их в картопию, которая, при необходимости, перепроектирует ее для вас:

xs = np.linspace(llc_x0, llc_x1, n_xs),
ys = np.linspace(llc_y0, llc_y1, n_ys),
plt.contourf(xs, ys, data, transform=ccrs.LambertConformalConic())

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

В некоторых редких ситуациях вы знаете только латы / долготы, даже если данные проецируются в другом пространстве.Cartopy имеет дело с этим:

plt.contourf(lons, lats, data, transform=ccrs.PlateCarree())

Наконец, если у вас есть ограничивающий прямоугольник в проецируемом пространстве, но углы ограничивающего прямоугольника находятся в lon / lat, тогда вы можете просто преобразовать углы, а затем использовать linspace.Следующий (непроверенный) код должен справиться с задачей:

import cartopy.crs as ccrs
import numpy as np

llc = ccrs.LambertConformal()

width = 20
height = 25
llcrnrlon=-118.300
llcrnrlat=20.600
urcrnrlon=-58.958
urcrnrlat=51.02

lons = np.array([llcrnrlon, urcrnrlon])
lats = np.array([llcrnrlat, urcrnrlat])

projected_corners = llc.transform_points(
    ccrs.PlateCarree(), lons, lats)

xs = np.linspace(
    projected_corners[0, 0], projected_corners[1, 0], width)
ys = np.linspace(
    projected_corners[0, 1], projected_corners[1, 1], height)
...