Базовая карта Python не совпадает с правильными координатами? - PullRequest
1 голос
/ 14 января 2020

У меня есть файл .dat, содержащий список координат (~ 100k) и температуру для каждой координаты. Он имеет такую ​​структуру:

  -59.083  -26.583    0.2
  -58.417  -26.250    0.6
  -58.412  -26.417    0.4
   ...

Чтобы визуально отобразить диапазоны температур, я создал массив numpy и нанес на карту наборы данных, используя модуль Basemap для Python. Код, который я написал, выглядит следующим образом:

from matplotlib import pyplot as plt 
from mpl_toolkits.basemap import Basemap
import numpy as np 

m = Basemap(projection='mill',llcrnrlat=-90,urcrnrlat=90,\
            llcrnrlon=-180,urcrnrlon=180,resolution='c')
m.drawcoastlines(linewidth=0.15)

data = np.loadtxt('gridly.dat')

xcoordlist = []
ycoordlist = []
tempvallist = []

for i in data:
    xcoord = i[0]
    ycoord = i[1]
    tempval = i[2]
    xcoord2 = xcoord*111139   #<--- Multiplying converts each coordinate's degrees to meters)
    ycoord2 = ycoord*111139
    xcoordlist.append(xcoord2)
    ycoordlist.append(ycoord2)
    tempvallist.append(tempval)

xco = np.array(xcoordlist)
yco = np.array(ycoordlist)
tval = np.array(tempvallist)

gridsize = 100
m.hexbin(yco, xco, C=tval, gridsize=gridsize)

cb = m.colorbar()
plt.show()

Когда я строю данные, я получаю почти то, что хочу, однако гексагональная тепловая карта по какой-то причине смещена, давая мне следующую диаграмму: enter image description here

Я искал в Интернете, что может быть не так, но, к сожалению, не смог найти ответы или устранить неполадки. Кто-нибудь знает, как я могу решить эту проблему?

1 Ответ

2 голосов
/ 15 января 2020

После нескольких часов копания я наконец понял это! Что было не так с моим кодом, так это то, что я пытался вручную преобразовать географические c координаты в координаты точки для отображаемой диаграммы (умножением на 111139).

Хотя логика c для этого имеет смысл, я полагаю, что этот процесс прервался, когда я начал наносить данные на различные виды диаграмм (т. Е. Ортогональные, проекции Миллера и т. Д. c.), Потому что разные проекции / диаграммы будут иметь разные координаты точек (например, как расположение пикселей на экране вашего компьютера может не совпадать с расположением пикселей на другом экране компьютера).

Вместо этого модуль базовой карты имеет встроенную в функции, которая преобразует координаты реального мира в координаты, которые могут быть нанесены на график, для вас: m(x, y).

Итак, улучшенный и правильный скрипт будет:

from matplotlib import pyplot as plt 
from mpl_toolkits.basemap import Basemap
import numpy as np 

m = Basemap(projection='mill',llcrnrlat=-90,urcrnrlat=90,\
            llcrnrlon=-180,urcrnrlon=180,resolution='c')
m.drawcoastlines(linewidth=0.15)

data = np.loadtxt('gridly.dat')

xcoordlist = []
ycoordlist = []
tempvallist = []

for i in data:
    lat = i[0]
    lon = i[1]
    tempval = i[2]
    xpt, ypt = m(lon, lat)
    xcoordlist.append(xpt)
    ycoordlist.append(ypt)
    tempvallist.append(tempval)

xco = np.array(xcoordlist)
yco = np.array(ycoordlist)
tval = np.array(tempvallist)

gridsize = 100
m.hexbin(xco, yco, C=tval, gridsize=gridsize)

cb = m.colorbar()
plt.show()

Как вы можете видеть, где указано xpt, ypt = m(lon, lat), функция преобразует долготы реального мира (lon) и широты (lat) из файла .dat в пригодные для обработки точки. Надеюсь, что это поможет кому-то еще, кто может иметь эту проблему в будущем!

...