Построение прогнозируемых данных в других проектах с использованием картопий

Этот вопрос касается представления некоторых данных, которые я использую, использующих 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()

Сюжет произведен можно увидеть здесь:

Американские точки росы на орфографической карте

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

Итак, я хотел бы знать следующие вещи:

  1. Вы всегда должны transform в PlateCarree при заговоре? Почему или почему нет?
  2. Требуется ли повторный проект просто для вызова 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() вообще, когда вы делаете черчение. Но это полезно, когда вы хотите получить доступ к преобразованным координатам в некоторых ситуациях.

Другие вопросы по тегам