Построение прогнозируемых данных в других проектах с использованием картопий
Этот вопрос касается представления некоторых данных, которые я использую, использующих CRS Ламберта. Хотя эти вопросы конкретно относятся к построению данных LCC в нескольких проекциях, они также применимы к использованию картопий в целом, поскольку я хотел бы лучше понять логику / процесс построения карт с использованием картопий.
Ниже приведены примеры кода того, что я пытаюсь сделать. Первый пример - это просто построение некоторых данных LCC. Данные, которые я использовал, доступны по ссылке здесь.
import cartopy.crs as ccrs
import cartopy.feature as cf
import matplotlib.pyplot as plt
import numpy as np
proj = ccrs.LambertConformal(central_latitude = 25,
central_longitude = 265,
standard_parallels = (25, 25))
# Data and coordinates (from download link above)
with np.load('nam_218_20120414_1200_006.npz') as nam:
dat = nam['dpc']
lat = nam['lat']
lon = nam['lon']
ax = plt.axes(projection = proj)
ax.pcolormesh(lon, lat, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
plt.show()
Сюжет произведен можно увидеть здесь:
Точки росы США на карте LCC
Мое первое замешательство при использовании картопий было, почему я всегда должен преобразовываться в PlateCarree
при заговоре? Моя первоначальная мысль была transform
Ключевое слово pcolormesh
вызову нужна информация о проекции LCC, а не PlateCarree
,
Далее, если я хочу отобразить свои данные LCC в другой проекции, например, Орфографической, я бы поступил так, как показано ниже?
# First, transform from LCC to Orthographic
transform = proj.transform_points(ccrs.Orthographic(265,25), lon, lat)
x = transform[..., 0]
y = transform[..., 1]
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(x, y, dat, transform = ccrs.PlateCarree())
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
Сюжет произведен можно увидеть здесь:
Американские точки росы на орфографической карте
Я думаю, что Орфографическая карта выглядит правильно, но я хотел бы быть уверенным, что я правильно понимаю процесс перепроецирования с картопией.
Итак, я хотел бы знать следующие вещи:
- Вы всегда должны
transform
вPlateCarree
при заговоре? Почему или почему нет? - Требуется ли повторный проект просто для вызова
transform_points
метод или есть другие шаги?
Обновление 1
Судя по ответу swatchai, кажется, что ответ на мой вопрос 2 swatchai: transform_points
не требуется. Можно просто использовать transform
Ключевое слово аргумент во многих методах построения Matplotlib. Это то, что я думал изначально. Однако, пропуская transform_points
не работал для меня. Смотрите пример ниже:
ax = plt.axes(projection = ccrs.Orthographic(265,25))
ax.pcolormesh(lon, lat, dat, transform = proj)
ax.add_feature(cf.NaturalEarthFeature(
category='cultural',
name='admin_1_states_provinces_lines',
scale='50m',
facecolor='none'))
ax.coastlines('50m')
ax.add_feature(cf.BORDERS)
ax.set_global()
Который производит этот сюжет:
Орфографический график без transform_points Шаг
Похоже, проблема заключается в том, что входные данные широты и долготы не преобразуются в координаты сетки, поэтому они отображаются только в очень маленькой области графика. Итак, чтобы расширить вопрос 2, если вы должны пропустить transform_points
есть ли ошибка в методах построения карт, основанных на моем примере выше? Или я все еще пропускаю шаг?
2 ответа
Необходимо провести важное различие между географическими и прогнозируемыми (или координатными) координатами. Более подробное описание их можно найти здесь. Важным моментом, который помогает ответить на вопрос 1, является то, что широта и долгота являются географическими координатами, тогда как точки с единицами измерения в метрах являются проекционными координатами.
Численная модель погоды, из которой получены данные примера, использует в своих вычислениях конформную проекцию Ламберта (подробнее здесь). Тем не менее, координаты, которые получают выходные данные, широта и долгота. Если у вас нет опыта работы с пространственными данными, вы можете подумать, что пары широта / долгота - это проекционные координаты LCC, когда они на самом деле являются географическими координатами; материал LCC используется во время интеграции модели.
Чтобы ответить на вопрос 1, нет, вы не всегда должны использовать PlateCarree
как источник CRS. Вы, однако, всегда используете PlateCarree
для данных широты и долготы (что имело место здесь). Таким образом, cartopy будет правильно преобразовывать ваши значения широты / долготы в проекционные координаты (в метрах) и сможет легко transform
ваши данные для других проекций во время построения. Эта проблема, в конечном счете, является причиной, по-видимому, пустого графика в обновлении 1. Говорят, что исходные данные имеют проекционные координаты LCC в transform
, cartopy взял лат / лон вход и интерпретировал их как имеющие единицы метров. Данные наносились на график, но экстент был настолько мал, что их было невозможно увидеть, не изменив экстент графика так, чтобы он совпадал с данными.
Что касается Вопроса 2, то нет, используя transform_points
не является обязательным требованием Картография была создана таким образом, чтобы сделать ее легко построить в нескольких проекциях с минимальными промежуточными шагами. Как уже упоминалось @swatchai, иногда вы можете использовать фактические прогнозируемые координаты и использовать transform_points
метод позволит вам сделать это. когда transform_points
был использован для создания второго графика в исходном посте, по сути, он делал вручную то, что было бы автоматически сделано, если бы входные координаты были правильно обработаны с помощью PlateCarree
в transform
,
Наконец, @ajdawson дал важное разъяснение относительно того, как использовать projection
а также transform
при построении. Как только вы поймете, что у вас есть для исходных координат, эта информация также будет полезна. Комментарий цитируется ниже:
В общем,
projection
говорит картопу, как должна выглядеть нарисованная карта, иtransform
говорит картопы, в какой системе координат представлены ваши данные. Вы можете установитьprojection
в любой понравившейся вам проекции, ноtransform
должен соответствовать любой системе координат, которую используют ваши данные.
В Cartopy ccrs.PlateCarree() - это самая базовая проекция карты, которую иногда называют непроецированной проекцией, то есть географическая позиция (широта, долгота) в градусах -> становится значениями сетки y=lat; x=long на карте PlateCarree.
Этот фрагмент кода:
import cartopy.crs as ccrs
axm = plt.axes( projection = ccrs.xxxx() )
создает ось axm
для построения карты в xxxx
проекция. Когда вы выводите данные на оси, координатами по умолчанию являются сетки (x,y) этой проекции (обычно в метрах). Вот почему вам нужно transform=ccrs.PlateCarree()
объявить, что ваши входные данные (x,y) действительно в (long, lat) градусах или, другими словами, в (x,y) координат сетки PlateCarree.
Если ваша целевая проекция Орфографическая, а данные LambertConformal,
ax = plt.axes(projection = ccrs.Orthographic(265,25))
lccproj = ccrs.LambertConformal(central_latitude = 25,
central_longitude = 265,
standard_parallels = (25, 25))
Вы можете построить данные с
ax.pcolormesh(x, y, dat, transform = lccproj)
Нет необходимости использовать transform_points() вообще, когда вы делаете черчение. Но это полезно, когда вы хотите получить доступ к преобразованным координатам в некоторых ситуациях.