В данной статье мы рассмотрим как можно создать динамический GIF с помощью Python в MapInfo Pro на примере данных, которые недавно были выложены в свободный доступ Датским метеорологическим институтом.
Для создания анимации возьмем данные о молниях из сети детекторов DMI с 2002 года по настоящее время.
С помощью простого запроса отберем наблюдения за 18 июня 2002 г., день, когда по всей Дании произошло более 100 000 ударов молний. На карте ниже вы можете увидеть все зафиксированные наблюдения в течение этого дня.
![](http://download.mapinfo.ru/~estimap/download/download_new/Pictures/DynamicGIF1.png)
Для того, чтобы лучше понять, когда эти наблюдения произошли, создадим небольшой скрипт 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 |
После ввода каждой из команд можно будет увидеть процесс загрузки и установки библиотек. После устновки обеих из них командную строку можно закрыть.
![](http://download.mapinfo.ru/~estimap/download/download_new/Pictures/DynamicGIF4.png)
В консоли Python в MapInfo Pro используем комбинацию клавиш Ctrl + Enter для выполнения скрипта.
Когда скрипт начнет перебирать наблюдения за утренние часы, в западной части Дании можно будет увидеть, как начнут появляться первые молнии.
![](http://download.mapinfo.ru/~estimap/download/download_new/Pictures/DynamicGIF3.png)
Скрипт не сохраняет все отдельные изображения, а сразу удаляет их после добавления в анимацию, что означает, что конечный результат представляет собой один GIF, объединенный из 24 * 4 временных интервалов в течение дня.
Вот так будет выглядеть наш финальный результат.
![](https://s3.amazonaws.com/higherlogicdownload/PITNEYBOWES/UploadedImages/jgfvvquXSXGQ9Oe01GJJ_20020618.gif)
Надеемся, что данная статья была вам полезна, и отметим, что рассмотренный нами метод можно использовать для визуализации любых данных, которые содержат информацию о времени.
Попробуйте создать анимацию самостоятельно, скачав zip-файл, содержащий исходные данные и скрипт Python, который был использован. А последнюю версию MapInfo Pro можно найти вот тут.
Калькулятор растра в Mapinfo Pro Advanced |
Построение зон видимости в MapInfo Pro Advanced |
Использование данных LiDAR в MapInfo Pro Advanced |