Создание карты для Google Earth при помощи Python
Задача: отобразить наши данные на Google Earth
?нструменты: Python, PyNGL, convert
Я почему-то всегда думал что создание карт для Google Earth это занятие для избранных. С такой помпой очередной институт всегда анонсировал что его данные теперь и на Google Eatrh, что мне казалось группа программистов денно и ношно трудилась над этой непростой задачей год и вот теперь, наконец, долгожданный .kml файл увидел свет.
При ближайшем рассмотрении всё оказалось просто до тривиальности.
Собственно создание карты будет проводиться при помощи PyNGL, питоновского модуля позволяющего отображать двумерные данные на карте. Основы работы с этим модулем описаны в данном блоге и могут быть найдены по тегу PyNGL.
После мы обрежем карту при помощи convert и создадим простейший .kml файл, который и «натянет» наше изображение на Google Earth.
Поехали.
Для начала скачаем файл с которым будем работать, это температура поверхности моря за один день 2009 года. Скачиваем его и распаковываем.
Теперь полностью скрипт который нарисует нам нашу карту
import Ngl
import Nio
import numpy
import sys, os, time
try:
file_name = sys.argv[1]
except:
print "Usage:",sys.argv[0], "input_file "
sys.exit(1)
file = Nio.open_file(file_name)
sst_nio = file.variables["sst"]
lon = file.variables["lon"]
lat = file.variables["lat"]
sst_scaled = sst_nio[0,0,:,:]
lon = lon[:]
lat = lat[:]
latt = numpy.zeros((720,1440))
lonn = numpy.zeros((720,1440))
for i in range(1440):
latt[:,i] = lat[:]
for i in range(720):
lonn[i,:] = lon[:]
rlist = Ngl.Resources()
rlist.wkColorMap = 'posneg_2'
wks_type = "ps"
wks = Ngl.open_wks(wks_type,"sst_earth",rlist)
ws_id = Ngl.get_workspace_id()
rlist = Ngl.Resources()
rlist.wsMaximumSize = 33554432
Ngl.set_values(ws_id,rlist)
resources = Ngl.Resources()
#Ngl.free_color(wks, 12)
if hasattr(sst_nio,"_FillValue"):
resources.sfMissingValueV = float(sst_nio._FillValue[0]*sst_nio.scale_factor[0] )
sst = sst_scaled[:]*sst_nio.scale_factor[0]
resources.sfXArray = Ngl.add_cyclic(lonn[:])
resources.sfYArray = Ngl.add_cyclic(latt[:])
resources.mpFillColors = [0,-1,-1,-1]
resources.mpGridAndLimbOn = False
resources.cnFillOn = True
resources.cnFillDrawOrder = "Predraw"
resources.nglSpreadColorStart = 5
resources.nglSpreadColorEnd = -2
resources.cnLineDrawOrder = "Predraw"
resources.cnLevelSelectionMode = "ExplicitLevels" # Define own levels.
resources.cnLevels = numpy.arange(0.,32.,2)
resources.mpProjection = "CylindricalEquidistant"
resources.mpDataBaseVersion = "LowRes"
resources.mpLimitMode = "LatLon"
resources.mpMinLonF = 0
resources.mpMaxLonF = 360
resources.mpMinLatF = -80
resources.mpMaxLatF = 85
resources.pmLabelBarDisplayMode = "Never"
resources.mpOutlineBoundarySets = "NoBoundaries"
resources.cnLineLabelsOn = False
resources.cnLinesOn = False
map = Ngl.contour_map(wks,Ngl.add_cyclic(sst[:,:]),resources)
?спользование его такое
Я не буду разбирать скрипт и интересующихся снова отправляют к постам о PyNGL в этом блоге. Единственно обращу внимание на несколько важных мест.
Здесь мы устанавливаем цвет на «прозрачный» для океана, суши и внутренней воды (озёр, рек).
resources.mpOutlineBoundarySets = "NoBoundaries"
Запрещаем рисовать легенду при любых обстоятельствах и запрещаем выделять границу суши и воды (рисовать береговую линию).
Всё остальное стандартная отрисовка карт в PyNGL. Вы конечно можете рисовать карту любой удобной вам программой, от GrADS до Matlab 🙂
Получаем файл sst_earth.ps который выглядит как то так
Это наша заготовочка. Для того чтобы сделать из неё пригодную для Google Earth карту, нужно применить утилиту convert
- -density 300 — конвертируем файл с разрешением 300 точек на дюйм
- -rotate 270 — поворачиваем картинку на 270 градусов
- -transparent «rgb(255,255,255)» — назначаем цвет который будет прозрачным, в нашем случае белый
- -crop 2706×1239+385+583\! — обрезаем изображение, убирая всё лишнее
Для подробного описания этих опций смотрите документацию по imagemagick и в частности по утилите convert
В итоге получается картинка с прозрачными областями, которая будучи открыта в редакторе изображений будет выглядеть так
Вместо шашечек потом будет суша.
Теперь создадим .kml файл, который поместит нашу картинку на Google Earth.
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Example from koldunov.net </name>
<description>Ocean parameters</description>
<Folder>
<name>Sea Surface Temperature</name>
<description>NOAA Optimum Interpolation 1/4 Degree Daily Sea Surface Temperature Analysis (Version 2). Source http://www.ncdc.noaa.gov/oa/climate/research/sst/oi-daily.php </description>
<GroundOverlay>
<name>SST</name>
<visibility>1</visibility>
<Icon>
<href>sst_earth.png</href>
</Icon>
<LatLonBox>
<north>85</north>
<south>-80</south>
<east>180</east>
<west>-180</west>
</LatLonBox>
</GroundOverlay>
</Folder>
</Document>
</kml>
Тут всё прозрачно.
Открываем документ, даём ему название, даём описание.
Открываем папку, называем папку, описываем папку.
С тега GroundOverlay собственно начинается вся магия. Мы даём название слою, говорим что он должен сразу отобразиться.
В тег Icon заключаем путь к рисунку. В данном случае он в локальной папке, в той же что и .kml файл, но вполне может быть на удалённом сервере.
В LatLonBox вы указываете границы вашего рисунка они должны быть такими же как те что вы указали при создании вашей картинки. Правда у нас было
resources.mpMaxLonF = 360
resources.mpMinLatF = -80
resources.mpMaxLatF = 85
Google Earth же понимает только долготы в форме -180:180, так что циферки придётся немного поменять.
Загружайте файл в Google Earth и наслаждайтесь своей картинкой, растянутой на всю Землю.
Просто, не правда ли? ) У полюсов конечно всё это выглядит не так прекрасно, но в принципе терпимо.
Желающих посмотреть какие ещё картинки можно рисовать в PyNGL под Google Earth отправляю в раздел на OceanographersRU где мы создаём свой .kml файл с ежедневно обновляющимися параметрами океана.
Если кто ни будь воспользуется данными советами, очень интересно было бы посмотреть на результат, оставляйте ссылки в комментах )
В качестве бонуса пара дополнительных строчек к скрипту отрисовки карты, которые обрежут картинку, и создадут маленькое изображение даты, которое можно тоже пришпилить на Google Earth.
os.system("convert -size 125x25 xc:white -gravity \"West\" -font Courier-10-Pitch-Regular -pointsize 20 -draw \"text 2,0 '"+file_name[14:18]+" "+file_name[18:20]+" "+file_name[20:22]+"'\" sst_time.png")
Хорошая статья, жаль, что Python — RIP
Дык гугль только питон и юзает.
Ну, вместо перла, предположу, теперь питон выбирают. А что и вместо питона уже чем-то другим пользуются?
С чего это Pyton — RIP? Нормально развивающийся язык.
Да тролль это, не обращайте внимания =)
Combivent Inhaler Order On Line No Rx Cialis Cialis Strips canadian cialis Rhine Inc India Complaints
Achat Viagra Petite Quantite Cialis Euro Med Cialis 247drugsshop
Swww Healthy Man Viagra Cialis Propecia Cutaneo cialis 5 mg best price usa Zithromax Tripak
Cialis Erbe Naturale Cialis Kitten Amoxicillin Dosage Cialis Le Kamagra Est Il Autorise En France