Данные о погоде на картах - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь нанести на карту некоторые данные о погоде, используя Базовую карту (я тоже открыт для картографирования) на Python. Сейчас мои погодные данные выглядят как это . Мой источник данных - это в основном массив, каждая позиция которого соответствует квадрату сетки, а каждое значение указывает цвет, которым должен быть квадрат. Код, используемый для создания этого изображения, выглядит следующим образом, где каждый квадрат сетки равен 1000 м:

grid_0 = np.asarray(dec.split())
grid_1=np.reshape(grid_0,(n_cols,n_rows))
grid_2 = grid_1.astype(float)

# Make plot
plt.figure(figsize=(30,30))
fig, ax = plt.subplots()

plt.axis('off')
cax = ax.imshow(grid_2, interpolation='nearest', cmap=cmap)

У меня есть информация о том, где географически расположен нижний угол сетки. Я считаю, что лучший способ нанести это на карту - это использовать функцию contourf (), но я совсем новичок в Basemap и не могу найти способ преобразовать это в то, что может понять contourf (). Для отображения карты я использую Базовую карту, где lon_air и lat_air - координаты определенного аэропорта:

fig=figure(1, figsize=(19, 15))

m = Basemap(projection='cyl', llcrnrlon=lon_air-25, llcrnrlat=lat_air-15,
            urcrnrlon=lon_air+25, urcrnrlat=lat_air+15, resolution='h', area_thresh=10000)

m.drawstates(linewidth=0.5, color='black', zorder=4)
m.drawcountries(linewidth=2.0, color='white', zorder=3)
m.drawmapboundary(fill_color='#e5f5ff')
m.fillcontinents(color='#DFDFDF', zorder=1)
m.scatter(lon_air, lat_air,marker='o',color='k', zorder=10)

x0, y0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371)) 
x1, y1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371)) 

im = plt.imshow(plt.imread('./pngs/9905.png'), extent=(x0, x1, y0, y1), zorder=2)
plt.show()

Я отредактирую сообщение, если кто-то посчитает, что нужно больше подробностей. Спасибо всем заранее!

1 Ответ

0 голосов
/ 06 сентября 2018

Создание графика Basemap.contourf - довольно стандартная процедура. Ваша команда plt.imread должна вернуть вам массив 2D numpy (при условии, что это серая шкала), поэтому сделайте что-то подобное, чтобы получить фактические данные и их размеры:

data = plt.imread('./pngs/9905.png')
lx, ly = data.shape

Далее вам необходимо указать координаты для каждой точки ваших данных. Для contourf это делается путем предоставления двух дополнительных 2D полей, одно с координатами x, а другое с координатами y. Вы можете получить правильную форму с np.linspace и np.meshgrid:

lon0, lat0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371))
lon1, lat1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371))
lons = np.linspace(lon0, lon1, lx)  #1D
lats = np.linspace(lat0, lat1, ly)  #1D
lon, lat = np.meshgrid(lons,lats)   #1D --> 2D

Теперь вам все еще нужно преобразовать координаты карты в координаты проекции, а затем построить все это:

x,y = m(lon, lat)
m.contourf(x,y,data)
plt.show()

Могут все еще быть некоторые проблемы с расположением данных (иногда это немного сбивает с толку), поэтому вам, возможно, придется транспонировать их (data.T) или инвертировать измерение (путем индексации [::-1]). Если у вас возникнут проблемы такого рода, пожалуйста, спросите (или предоставьте пример изображения), тогда я могу соответствующим образом скорректировать ответ. О, и не забудьте добавить

import numpy as np

где-то в начале вашего скрипта.

...