Проблема с пересечением строки даты изображения в imshow & cartopy

Я пытаюсь построить квадратную сетку данных с одинаковым интервалом (в широте и долготе), используя cartopy, matplotlib и imshow. Данные пересекают линию дат, и у меня возникли проблемы с правильной работой карты.

Вот пример моей проблемы:

import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt 


lat = np.arange(6000)*0.02 + (-59.99)
lon = np.arange(6000)*0.02 + (85.01)

dat = np.reshape(np.arange(6000*6000),[6000,6000])

tran = ccrs.PlateCarree()
proj = tran

plt.figure(figsize=(8,8))

ax = plt.axes(projection=proj)
print([lon[0],lon[-1],lat[0],lat[-1]])
ax.imshow(dat, extent=[lon[0],lon[-1],lat[0],lat[-1]],transform=tran,interpolation='nearest')
ax.coastlines(resolution='50m', color='black', linewidth=2)
ax.gridlines(crs=proj,draw_labels=True)
plt.show()

tran = ccrs.PlateCarree(central_longitude=180)
proj = tran

plt.figure(figsize=(8,8))

ax = plt.axes(projection=proj)
print([lon[0]-180,lon[-1]-180,lat[0],lat[-1]])
ax.imshow(dat, extent=[lon[0]-180,lon[-1]-180,lat[0],lat[-1]],transform=tran,interpolation='nearest')
ax.coastlines(resolution='50m', color='black', linewidth=2)
ax.gridlines(crs=tran,draw_labels=True)
plt.show()

Первый график дает это изображение с обрывом на 180E:  нарезанный на 180

Второй способ устраняет проблему с картой, но теперь отметки сетки неверны:  180 теперь ноль

Думаю, я пробовал перепроецировать (где tran! = Proj), но, похоже, он либо зависал, либо занимал слишком много времени.

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


person Will Mc.    schedule 16.11.2017    source источник
comment
Нет картографии, но разве вы не можете просто поменять ярлыки на все, что захотите, с помощью ax.set_xticklabels?   -  person Andrey Sobolev    schedule 16.11.2017
comment
Любые комментарии / вопросы по моему ответу?   -  person swatchai    schedule 22.11.2017


Ответы (1)


С Cartopy рисовать карту, пересекающую линию дат, всегда сложно. Вот код, который строит нужную вам карту.

import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt 

# demo raster data
n1 = 300
m1 = 0.4
lat = np.arange(n1)*m1 + (-59.99)
lon = np.arange(n1)*m1 + (85.01)
dat = np.reshape(np.arange(n1*n1), [n1,n1])

cm_lon=180  # for central meridian

tran = ccrs.PlateCarree(central_longitude = cm_lon)
proj = tran

plt.figure(figsize=(8,8))
ax = plt.axes(projection=proj)

ext = [lon[0]-cm_lon, lon[-1]-cm_lon, lat[0], lat[-1]]
#print(ext)

ax.imshow(dat, extent=ext, \
              transform=tran, interpolation='nearest')

ax.coastlines(resolution='110m', color='black', linewidth=0.5, zorder=10)

# this draws grid lines only, must go beyond E/W extents
ax.gridlines(draw_labels=False, xlocs=[80,100,120,140,160,180,-180,-160,-140])

# this draw lables only, exclude those outside E/W extents
ax.gridlines(draw_labels=True, xlocs=[100,120,140,160,180,-160])

plt.show()

Полученная карта:

output

person swatchai    schedule 16.11.2017