2017-02-14 17 views
1

Этот вопрос относится к построению некоторых данных, которые используются с использованием CRMS Lambert Conformal (LCC). Хотя эти вопросы конкретно относятся к построению данных LCC в нескольких проекциях, это также относится к использованию картографии в целом, поскольку я хотел бы лучше понять логику/процесс построения графика с использованием картографии.Построение прогнозируемых данных в других проекторах с использованием картографии

Ниже приведены некоторые примеры того, что я пытаюсь сделать. Первый пример - просто построение некоторых данных LCC. Данные, которые я использовал, доступны по ссылке here.

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 Карта

Моя первая путаница при использовании cartopy почему я всегда трансформироваться в 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() 

Участок производства можно увидеть здесь:

США на Ортографическую точка росы Карта

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

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

  1. Вы всегда должны transform к PlateCarree при печати? Почему или почему нет?
  2. Требуется ли повторное проецирование только для вызова метода transform_points или существуют другие шаги?

Update 1

На основании ответа от @swatchai, кажется, что ответ на мой вопрос 2 является то, что 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() 

который производит этот сюжет:

Orthographic Участок Без transform_points Шаг

Проблема, кажется, что широта и долгота вход не получить преобразуются в координаты сетки, поэтому они отображаются только в чрезвычайно малой области графика. Итак, чтобы расширить вопрос 2, если вы должны пропустить transform_points, есть ли ошибка в методах построения картографии, основанных на моем примере выше? Или я все еще пропущу шаг?

+0

Пожалуйста, разместите несколько своих данных. Я подозреваю, что у вас есть (lat, long) данные только. Кроме того, некоторые значения long не находятся в диапазоне (-180, 180) градусов. – swatchai

+0

Я добавил ссылку на данные в вопросе. Что касается диапазона долгот, изменение значения (-180, 180) не меняет результат построения графика при попытке конвертировать LCC в Orthographic. Кажется, что, когда я использую преобразование «PlateCarree» с координатами х, у или необработанным латом, на графике. Это просто сбивает с толку, потому что во втором случае я не делаю ничего, чтобы преобразовать координаты, как в первом случае. – nawendt

+1

Пример вашего обновления 1 является правильным только в том случае, если ваши данные имеют кордины в ортографической системе координат (а какие они не являются). В общем, 'projection' сообщает cartopy, как должна выглядеть нарисованная карта, а' transform' сообщает cartopy, в какой системе координат представлены ваши данные. Вы можете настроить 'projection' на любой прогноз, который вам нравится, но' transform' должен соответствовать какая система координат использует ваши данные. – ajdawson

ответ

1

Необходимо провести важное различие между географическими и прогнозируемыми (или сетками) координатами. Более подробное описание их можно найти here. Важная вещь и то, что помогает ответить на вопрос 1, заключается в том, что широта и долгота: географические координаты, тогда как точки, которые имеют единицы измерения в метрах, составляют , прогнозируемые координаты.

Численная модель погоды, в которой получены данные примера, использует расчеты Ламберта Conformal в своих расчетах (подробнее here). Тем не менее, координаты, которые получают выходные данные, - это широта и долгота. Если вы неопытные с пространственными данными, вы можете в конечном итоге подумать, что пары lat/lon являются LCC прогнозируемыми координатами, когда они на самом деле geogrphic координаты; материал LCC используется во время интеграции модели.

Чтобы ответить на вопрос 1, нет, вы не всегда должны использовать PlateCarree в качестве источника CRS. Однако вы всегда используете PlateCarree для данных широты и долготы (что было здесь). Таким образом, картография корректно преобразует ваши значения lat/lon в , проецирует координаты (в метрах) и сможет легко записать ваши данные в другие прогнозы во время построения графика. Эта проблема в конечном итоге является причиной кажущегося пустого заговора в обновлении 1.Говоря, что исходные данные имеют прогнозируемые координаты LCC в transform, cartopy взял вход lat/lon и интерпретировал их как единицы единиц измерения. Данные действительно были построены, но размер был настолько мал, что их было невозможно увидеть, не изменяя размер участка, чтобы быть таким же, как данные.

Что касается Вопроса 2, то нет, использование transform_points не является обязательным требованием. cartopy был создан таким образом, чтобы сделать его легко построить в нескольких проекциях с минимальными промежуточными шагами. Как упоминал @swatchai, иногда вы можете использовать фактические проецируемые координаты, и использование метода transform_points позволит вам это сделать. Когда transform_points был использован для создания второго графика в исходном столбце, он, по существу, вручную делал то, что было бы автоматически сделано, если бы правильные входные координаты обрабатывались должным образом с PlateCarree в transform.

Наконец, важное разъяснение было сделано @ajdawson относительно того, как использовать projection и transform при построении графика. Как только вы поймете, что у вас есть для координат источника, эта информация также полезна. Комментарий цитируется ниже:

В общем, projection говорит cartopy, что нарисованная карта должна выглядеть, и transform говорит cartopy, что система ваши данные представлены в координате Вы можете установить projection в любой проекции вам нравится, но. transform должен соответствовать любой системе координат, которую используют ваши данные.

3

В Cartopy ccrs.PlateCarree() является самой основной проекцией карты, иногда называемой невыпроектированной проекцией, т. Е. Геопозицией (lat, long) в градусах -> становится значение сетки y = lat; x = long на карте PlateCarree.

Этот фрагмент кода:

import cartopy.crs as ccrs 
axm = plt.axes(projection = ccrs.xxxx()) 

создает ось axm для построения карты в xxxx проекции. Когда вы производите данные на axm, координатами по умолчанию являются сетка (x, y) этой проекции (обычно в метрах). Вот почему вам нужно transform=ccrs.PlateCarree() заявить, что ваш вход (x, y) действительно находится в (длинном, лат) градусах или, другими словами, в координатах сетки PlateCarree (x, y).

Если ваша целевая проекция Orthographic в то время как данные 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() вообще, когда вы делаете заговоры. Но это полезно, когда вы хотите получить доступ к преобразованным координатам в некоторой ситуации.

+0

Замечания 'PlateCarree' были полезны. Используя ваш пример и пропуская «transform_points», я думал, что картография должна работать. Однако, следуя вашему примеру и используя 'x = lon' и' y = lat', данные не отображаются. Кажется, что долгота и широта не преобразуются в координаты сетки. Данные построены, но координатное несоответствие приводит к очень малой общей сумме данных. Это карточная ошибка? Не уверен. Я обновлю свой вопрос на примере, так как это приводит к моему первоначальному путанице с тем, как работает картография. – nawendt

 Смежные вопросы

  • Нет связанных вопросов^_^