User Guide#

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

Введение#

Данный документ содержит описание основных методов работы с проектами ГИС Integro с помощью языка Python.

Перед началом работы необходимо сообщить системе, где находятся библиотеки ГИС Integro и связанные с ними модули Python. Это можно выполнить одним из двух способов. Ниже, замените <integropath> на фактический путь к месту установки ГИС Integro.

Вариант 1:
Настройте переменную окружения PYTHONPATH, указав в ней путь <integropath>\python. После этого может потребоваться перезапустить Python.
Вариант 2:
Добавьте путь <integropath>\python в sys.path напрямую из кода, как показано в примере.
import sys
sys.path.append(r'<integropath>\python')
#import sys
#sys.path.append(r'<integropath>\python')

Теперь можно импортировать модуль integro.

import integro as ig

Проект#

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

В данном примере используется демонстрационный проект, который можно скачать с сайта ГИС Integro. Укажите папку где расположен проект в переменной project_folder.

project_folder = r'<projectpath>'
project_path = os.path.join(project_folder, 'Демонстрационный проект._ip')
project = ig.load_project(project_path)

У проекта можно получить его название и путь к файлу проекта.

project.caption
'Демонстрационный проект'
project.source
'd:\data\maps\demo\Демонстрационный проект._ip'

Сохранить проект можно вызвав метод save. Чтобы сохранить проект в другом месте на диске используйте метод save_as, передав ему путь.

Внимание! Выполнение следующей ячейки приведет к записи проекта на диск.

project_save_path = os.path.join(project_folder, 'Демонстрационный проект (копия)._ip')
project.save_as(project_save_path)
True

В проекте содержатся наборы двумерных и трехмерных сцен, а так же макеты. Для доступа к ним используются соответсвенно свойства scenes2d, scenes3d и layouts.

Дальнейшие примеры работы с двумерными сценами и слоями аналогичны для трехмерных сцен и макетов.

scenes2d = project.scenes2d
scenes3d = project.scenes3d
layouts = project.layouts

Названия всех сцен возвращает свойство captions, а их количество свойство size.

scenes2d.captions
['Центральный федеральный округ. Топокарта',
 'Липецкая область. Лицензии на добычу',
 'Федеральные округа РФ',
 'Геологическая карта ЦФО 2.5 млн',
 'Геологический разрез по линии А1-А2-А3']
scenes2d.size
5

Отдельную сцену можно получить по названию или по индексу.

scene_cfo = scenes2d['Центральный федеральный округ. Топокарта']
scene_subj = scenes2d[2]

Также можно обойти все сцены используя цикл for.

for scene in scenes2d:
    print(scene.caption)
Центральный федеральный округ. Топокарта
Липецкая область. Лицензии на добычу
Федеральные округа РФ
Геологическая карта ЦФО 2.5 млн
Геологический разрез по линии А1-А2-А3

Добавить новую двумерную сцену в проект можно используя метод add_scene2d, передав ему название сцены. Для добавления трехмерной сцены используйте метод add_scene3d, а для добавления макета add_layout.

scene_relief = project.add_scene2d('Рельеф')
scene_lic3d = project.add_scene3d('Лицензии')

Удалить сцену можно вызвав метод remove, передав ему название или индекс сцены.

project.scenes3d.remove('Лицензии')

Cцена#

У сцены можно получить название, экстент, систему координат и цвет фона.

scene_cfo.caption
'Центральный федеральный округ. Топокарта'
scene_cfo.extent
[-456173.23368579696, 5493404.910533255, 540255.9596409685, 6644533.876938898]
scene_cfo.crs
'+proj=eqdc +lon_0=38 +lat_0=0 +x_0=0 +y_0=0 +lat_1=46.4 +lat_2=71.8 +towgs84=0.013,-0.092,-0.03,-0.0017,0.0036,-0.0043,0.0074 +ellps=GSK2011 +units=m +lon_wrap=45 +no_defs'
scene_cfo.background
Red: 255 Green: 255 Blue: 255

Слои содержащиеся в сцене можно получить через свойство layers.

layers_cfo = scene_cfo.layers

Названия всех слоев возвращает свойство captions, а их количество свойство size.

layers_cfo.captions
['Растительность',
 'Города',
 'Озера, водохранилища, крупные реки',
 'Реки',
 'Автомобильные дороги',
 'Железные дороги',
 'Станции, остановочные пункты',
 'Границы районов',
 'Границы субъектов',
 'Субъекты РФ',
 'Населенные пункты']
layers_cfo.size
11

Отдельный слой можно получить по названию или по индексу.

lr_cities = layers_cfo['Города']
lr_rivers = layers_cfo[3]

Также можно обойти все слои используя цикл for.

for lr in scene_cfo.layers:
    print(lr.caption)
Растительность
Города
Озера, водохранилища, крупные реки
Реки
Автомобильные дороги
Железные дороги
Станции, остановочные пункты
Границы районов
Границы субъектов
Субъекты РФ
Населенные пункты

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

layer_path = os.path.join(project_folder, r'DATA/3D/Stratigraphic/stratigraphic_surfaces.pgrid')
lr_relief = scene_relief.add_layer(ig.Layer2DType.TOS_GRID, 'Рельеф', layer_path)

Удалить слой из сцены можно вызвав метод remove, передав ему название или индекс слоя.

layers_cfo.captions.remove('Растительность')

Слой#

У слоя можно получить его тип, название, эксент, систему координат и путь к источнику данных.

lr_cities.mtype
'shp_pgn_lr2d'
lr_cities.caption
'Города'
lr_cities.extent
[-436034.5656462434, 5501571.583288855, 491984.85385911405, 6584026.962992895]
lr_cities.crs
'+proj=eqdc +lon_0=38 +lat_0=0 +x_0=0 +y_0=0 +lat_1=46.4 +lat_2=71.8 +towgs84=0.013,-0.092,-0.03,-0.0017,0.0036,-0.0043,0.0074 +ellps=GSK2011 +units=m +lon_wrap=45 +no_defs'
lr_cities.source
'd:\data\maps\demo\DATA\2D\1mln\ppa.shp'

Управлять видимостью слоя можно через ствойство visible.

lr_cities.visible
True

Аттрибуты#

Аттрибуты слоя можно загрузить в pd.DataFrame используя метод load_data. По умолчанию будут загружены все поля аттрибутивной таблицы и поле с геометрией (если устанволена библиотека geopandas).

cities = lr_cities.load_data()
cities.head()
geometry stat pop adm text_adm code_text text_cntr text codf
0 MULTIPOLYGON (((-16771.887 6195981.367, -16199... 5.0 1000.0 1.0 Столица РФ Крупный город (более 50 тыс.чел.) или крупный ... Россия Москва 41100000.0
1 MULTIPOLYGON (((50857.674 6433449.893, 49120.0... 5.0 100.0 9.0 Административные центры районов Крупный город (более 50 тыс.чел.) или крупный ... Россия Рыбинск 41100000.0
2 MULTIPOLYGON (((-225935.718 6417365.935, -2265... 5.0 10.0 9.0 Административные центры районов Крупный город (более 50 тыс.чел.) или крупный ... Россия Бологое 41100000.0
3 MULTIPOLYGON (((175464.794 6405200.715, 173212... 5.0 100.0 5.0 Административные центры субъектов РФ Крупный город (более 50 тыс.чел.) или крупный ... Россия Кострома 41100000.0
4 MULTIPOLYGON (((109367.755 6384841.605, 107962... 5.0 500.0 5.0 Административные центры субъектов РФ Крупный город (более 50 тыс.чел.) или крупный ... Россия Ярославль 41100000.0

Можно ограничить список загружаемых полей передав их имена аргументу fields. Аргументу geom можно передать имя колонки с геометрий или None, чтобы не загржать её.

cities_pop = lr_cities.load_data(fields=['pop', 'text'], geom='geom')
cities_pop.head()
geom pop text
0 MULTIPOLYGON (((-16771.887 6195981.367, -16199... 1000.0 Москва
1 MULTIPOLYGON (((50857.674 6433449.893, 49120.0... 100.0 Рыбинск
2 MULTIPOLYGON (((-225935.718 6417365.935, -2265... 10.0 Бологое
3 MULTIPOLYGON (((175464.794 6405200.715, 173212... 100.0 Кострома
4 MULTIPOLYGON (((109367.755 6384841.605, 107962... 500.0 Ярославль

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

lr_cities.fields
['stat', 'pop', 'adm', 'text_adm', 'code_text', 'text_cntr', 'text', 'codf']

Двумерные сети#

Свойство двумерный сети можно загрузить в np.ndarray используя метод load_grid. По умолчанию будет использовано поле из настроек стилевого оформления слоя.

grid = lr_relief.load_grid()

Можно явно указать загружаемое поле, передав его имя аргументу field.

grid_k = lr_relief.load_grid(field='K')

Список полей доступных для загрузки можно получить используя свойство fields, а поле стилевого оформления через свойство style_field.

lr_relief.fields
['relief', 'K', 'J', 'C', 'D3', 'D2', 'V', 'RF', 'Fund', 'K_log', 'K_edges']

Посмотрим на размерность сети и нарисуем ее средствами библиотеки matplotlib.

grid_k.shape
(2228, 1248)
plt.figure(figsize=(5,5))
plt.imshow(grid_k)
plt.show()
_images/PyIntegro_74_0.png

В сеть можно добавить новое поле используя метод add_grid, передав ему массив данных и имя. Аргумент overwrite позволяет перезаписать поле если оно уже существует.

Вычислим логарфим от загруженного поля и запишем его под именем K_log.

Внимание! Выполнение следующей ячейки приведет к записи данных на диск.

grid_log_k = np.log(grid_k)
lr_relief.add_grid(grid_log_k, 'K_log', overwrite=True)
True

Визуализация#

Метод plot позволяет отобразить всю сцену или ее фрагмент средствами библотеки matplotlib. По умолчанию будет нарисована вся сцена.

Дополнительно можно указать размер изображения (в сантиметрах, милимметрах или пикселях), центральную точку отображаемой области сцены, масштаб или степень приблежения относительно полного экстента сцены.

scene_cfo.plot(size=10)
plt.show()
_images/PyIntegro_79_0.png

Нарисуем фрагмент сцены около города Москва в масштабе 1:500 000, задав размер изображения в 15 см.

scene_cfo.plot(size=15, pos=(-24283.4505, 6180335.1258), scale=500_000)
plt.show()
_images/PyIntegro_81_0.png

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

viewer_cfo = scene_cfo.viewer
viewer_cfo.zoom_scene()

Метод imshow позволяет отобразить сцену при текущих настройках масштаба и видимой области.

plt.figure(figsize=(7, 7))
viewer_cfo.imshow()
plt.show()
<Figure size 700x700 with 0 Axes>
_images/PyIntegro_85_1.png

Используя метод pan можно изменить координаты центра, а методы zoom_in, zoom_out и zoom позволяют изменять текущий масштаб. Масштаб можно задать как отдельно по горизонтали и вертикали, так и один для обоих направлений.

plt.figure(figsize=(7, 7))
viewer_cfo.pan(-24283.4505, 6180335.1258)
viewer_cfo.zoom_in(6)
viewer_cfo.imshow()
plt.show()
<Figure size 700x700 with 0 Axes>
_images/PyIntegro_87_1.png

Венуться к исходному масштабу можно вызвав метод zoom_scene.

plt.figure(figsize=(7, 7))
viewer_cfo.zoom_scene()
viewer_cfo.imshow()
plt.show()
<Figure size 700x700 with 0 Axes>
_images/PyIntegro_89_1.png

Свойство scale позволяет настроить текущий масштаб.

viewer_cfo.scale
(12430639.00730504, 12430639.00730504)

А свойство center позволяет настроить координаты центра видимой области.

viewer_cfo.center
(42041.362977585755, 6068969.393736077)