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.
PYTHONPATH, указав в ней путь
<integropath>\python. После этого может потребоваться
перезапустить Python.<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()
В сеть можно добавить новое поле используя метод 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()
Нарисуем фрагмент сцены около города Москва в масштабе 1:500 000, задав размер изображения в 15 см.
scene_cfo.plot(size=15, pos=(-24283.4505, 6180335.1258), scale=500_000)
plt.show()
Кроме того управлять всеми настройками отображения сцены можно через
свойство 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>
Используя метод 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>
Венуться к исходному масштабу можно вызвав метод zoom_scene.
plt.figure(figsize=(7, 7))
viewer_cfo.zoom_scene()
viewer_cfo.imshow()
plt.show()
<Figure size 700x700 with 0 Axes>
Свойство scale позволяет настроить текущий масштаб.
viewer_cfo.scale
(12430639.00730504, 12430639.00730504)
А свойство center позволяет настроить координаты центра видимой
области.
viewer_cfo.center
(42041.362977585755, 6068969.393736077)