Создание анимированного GIF в MapInfo Pro

 

В данной статье мы рассмотрим как можно создать динамический GIF с помощью Python в MapInfo Pro на примере данных, которые недавно были выложены в свободный доступ Датским метеорологическим институтом

 

Для создания анимации возьмем данные о молниях из сети детекторов DMI с 2002 года по настоящее время.

С помощью простого запроса отберем наблюдения за 18 июня 2002 г., день, когда по всей Дании произошло более 100 000 ударов молний. На карте ниже вы можете увидеть все зафиксированные наблюдения в течение этого дня.

 

 

Для того, чтобы лучше понять, когда эти наблюдения произошли, создадим небольшой скрипт Python.

 

 

Скрипт будет извлекать из таблицы наблюдения за каждые прошедшие 15 минут, отображая их на карте и экспортируя как одно изображение.

Далее скрипт объединит все эти отдельные изображения в динамический GIF, который наглядно покажет, как гроза перемещалась по Дании в выбранный нами день. Кроме того, в верхнем левом углу скрипт добавит отметку времени, обновляемого каждый час измерений, поэтому его можно будет увидеть и в финальном GIF-файле.

 

Вот этот скрипт:

 

import time
import os
from System import Enum
from MapInfo.Types import *
from MapInfo.Types.Data import *
import imageio

#Get the map window
map = pro.Maps[0]
#Get the table to use
table = pro.Catalog.Tables['Lightnings_20020618']
path = os.path.dirname(table.FullPath)
path = os.path.join(path, '20020618.gif')
#print('gif path: ' + path)

#loop through the day
with imageio.get_writer(path, mode='I') as writer:
    #loop through the hours
    for nHour in range(24):  #should be 24
        #Loop the 15 minute intervals of each hour
        for nMinute in [0,15,30,45]:
            tFrom = (2002, 6, 18, nHour, nMinute, 0, 0, 0, 0)
            sFrom = time.asctime(tFrom)[11:16]
            if nMinute == 45:
                if nHour == 23:
                    nHour = 0
                else:
                    nHour = nHour + 1
                nMinute = 00
            else:
                nHour = nHour
                nMinute = nMinute + 15
                
            tTo = (2002, 6, 18, nHour, nMinute, 0, 0, 0, 0)
            sTo = time.asctime(tTo)[11:16]
            print("{}: {}-{}".format(pro.EvalMapBasicCommand('Time(24)'), sFrom, sTo))
            
            #Build SQL string
            sSQL = 'Select * From {} As "t" Where t.OBSERVED_TIME >= "{}"'.format(table.Alias, sFrom)
            if sTo != "00:00":
                sSQL = sSQL + 'And t.OBSERVED_TIME < "{}"'.format(sTo) 
                
            sSQL = sSQL + ' Into _temp noselect'
            #print(sSQL)
            pro.RunMapBasicCommandEx(sSQL)
            map.Layers.AddLayer('_temp', 1)
            
            #Update the timestamp
            if sFrom[3:5] == "00":
                sUpdate = 'Update Time_Title Set TimeStamp = "{}"'.format(sFrom)
                pro.RunMapBasicCommandEx(sUpdate)
                pro.RunMapBasicCommandEx("Commit Table Time_Title")
            
            #Export the map window to an image file
            fileName = pro.EvalMapBasicCommandEx('TempFileName$("")')
            sCmd = 'Save Window {} As "{}" Type "PNG" Width 19.0235 Units "cm" Height 14.7637 Units "cm" Resolution 120'.format(map.WindowInfo.WindowId, fileName)
            pro.RunMapBasicCommandEx(sCmd)

            #Add the map image to the dynamic GIF
            image = imageio.imread(fileName)
            writer.append_data(image)
            pro.RunMapBasicCommandEx('Kill "{}"'.format(fileName))

 

Для написания и выполнения скрипта используем консоль Python в MapInfo Pro v2019.3.

 

 

Стоит отметить, что несмотря на то, что MapInfo поставляется с предустановленным Python, включая ряд часто используемых библиотек, для выполнения данного скрипта все же необходимо установить несколько дополнительных модулей.

 

Для этого выполним следующие шаги:

 

1. Откроем командную строку Windows

2. Введем: CD C: \ Program Files \ MapInfo \ Professional \ Python37, где C: \ Program Files \ MapInfo \ Professional - это установочная папка MapInfo Pro. Затем нажмем Enter.

3. Далее установим две новых необходимых для скрипта библиотеки. Это делается путем ввода двух команд (по отдельности) :

 

python -m pip install imageio
python -m pip install Pillow

 

После ввода каждой из команд можно будет увидеть процесс загрузки и установки библиотек. После устновки обеих из них командную строку можно закрыть.

 

 

В консоли Python в MapInfo Pro используем комбинацию клавиш Ctrl + Enter для выполнения скрипта.

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

 

 

Скрипт не сохраняет все отдельные изображения, а сразу удаляет их после добавления в анимацию, что означает, что конечный результат представляет собой один GIF, объединенный из 24 * 4 временных интервалов в течение дня.

 

Вот так будет выглядеть наш финальный результат.

 


Надеемся, что данная статья была вам полезна, и отметим, что рассмотренный нами метод можно использовать для визуализации любых данных, которые содержат информацию о времени.

Попробуйте создать анимацию самостоятельно, скачав zip-файл, содержащий исходные данные и скрипт Python, который был использован. А последнюю версию MapInfo Pro можно найти вот тут.

 

 

 

Другие полезные статьи:

 

Калькулятор растра в Mapinfo Pro Advanced
Построение зон видимости в MapInfo Pro Advanced
Использование данных LiDAR в MapInfo Pro Advanced