Работа с инструментами разработчика
В одном из предыдущих примеров мы уже рассмотрели образец геоинформационного анализа. В нем мы использовали инструменты для проведения визуального анализа: настройка оформления, создание буферных зон, расчет статистики. Однако для того, чтобы рассчитывать статистику, часто не нужно оформлять слои. Другим недостатком визуального анализа является ручной выбор точек при построении буферных зон. Все эти дополнительные действия замедляют работу и увеличивают количество неточностей, а также делают результат невоспроизводимым. В данном примере будет разобран вариант автоматизации геоинформационного анализа при помощи инструментов разработчика. В качестве примера мы создадим скрипт, который будет рассчитывать долю населения, проживающую в зоне десятиминутной пешеходной доступности от станций метрополитена в Казани.
Информация об используемых данных
Ссылка для загрузки данных
Набор пространственных данных можно скачать по ссылке
Описание и формат данных:
- Набор пространственных данных о численности населения Казани, распределенный по сетке H3 8 уровня в формате ESRI Shapefile
- Набор пространственных данных о расположении станций метро в формате CSV, разделитель — запятая
ESRI Shapefile (Численности населения Казани)
| h3_index (Python: int) | population (Python: float) | geometry: ESRI White Paper – July 1998 |
|---|---|---|
| 8810a81237fffff | 2997.579531452387982 | бинарное представление |
| 8810a8c48bfffff | 0.0 | бинарное представление |
| 8810a88d13fffff | 255.962693604307020 | бинарное представление |
| … | … | … |
CSV (Станции метрополитена)
| X (Python: float) | Y (Python: float) | name: (Python: string) |
|---|---|---|
| 49.2190008 | 55.7437416 | Дубравная |
| 49.0825977 | 55.8281421 | Яшьлек |
| 49.1909651 | 55.7601813 | Горки |
| … | … | … |
Создание папки и карты
Создание папки
Мы рекомендуем создать рабочую директорию в каталоге и сохранить в неё файл карты. Если Вы сделаете это, то при импорте или создании слоев путь до нужной папки будет подставляться автоматически
Создание карты
Инструменты разработчика доступны только после создания и сохранения карты. В отличие от предыдущих примеров, в этом создание карты является обязательным этапом
Для создания папки, в которой будет храниться карта, слои и данные перейдите в главное меню и выберите в нем Каталог:

Внутри каталога вы увидите все доступные для вас файлы и папки. Для создания папки в верхнем уровне Каталога перейдите на вкладку Только мои. Для этого нажмите на кнопку с надписью Все доступные со стрелкой вниз. Откроется выпадающее меню и там нажмите Только мои.

После перехода к этому разделу вы увидите все карты, слои, данные, подключения и инструменты, созданные Вами. Для создания папки, которую будете видеть только вы нажмите на кнопку Создать папку в выпадающем меню кнопки Добавить.

После нажатия у вас откроется окно создания папки. Укажите название в окне названия. Также вы можете добавить тэги и описание проекта. Обязательным является лишь название. вы можете использовать символы русского и английского алфавитов, цифры, пробелы и нижнее подчеркивание в названии папки.

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

При сохранении карты вам необходимо указать название карты. Также вы можете указать папку в каталоге, в которой будет сохранена карта, системное имя, описание и тэги. Для выбора пути нажмите на кнопку в виде папки во второй строчке окна импорта. Далее выберите и войдите в папку, в которую вы хотите сохранить свои данные. В тестовом примере сохранение производится в папку, созданную на предыдущем этапе. Системное имя задается автоматически и может содержать лишь английские буквы, цифры и нижнее подчеркивание. В данном примере мы не будем менять системное имя для карты и импортируемых данных.

Создание проекта
Предварительным условием для создания проекта является создание карты. О том, как это сделать подробно описано в начале работы. Здесь же приведем краткое описание действий. После авторизации в системе зайдите в главное меню и нажмите на кнопку сохранить. Введите название и место, в которое вы хотите сохранить свою карту.
После создания карты зайдите в главное меню и перейдите в Инструменты разработчика. Перейдите в контекстное меню карты, оно находится в списке ресурсов в левой части открывшегося окна. В контекстном меню нажмите Создать проект.

Перейдите в контекстное меню проекта и выберите Создать файл. Введите имя файла и расширение. Для скриптов Python расширением является .py.
Импорт данных
После этого нам необходимо импортировать данные для проекта. Это можно сделать прямо из инструментов разработчика. Для этого откройте контекстное меню проекта и нажмите на кнопку Загрузить. Мы будем загружать файлы в формате, указанном в соответствующем разделе. Загрузка файла, в отличие от импорта, не приведет к созданию слоя, однако она нужна для предварительной загрузки данных в каталог.

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

Импорт ESRI Shapefile
Информация в этом формате хранится в нескольких файлах. Для импорта в систему необходимо создать архив в формате .zip. Поместите в него файлы с расширениями .shp, .shx, .dbf. Остальные файлы являются необязательными. Импортируемые данные должны быть спроецированы в EPSG:4326
Импорт, запущенный из инструментов разработчика аналогичен импорту из главного меню. При импорте данных из ESRI Shapefile выберите атрибуты, которые будут импортированы и настройте их типы данных. Мы поменяем тип данных для атрибута population у данных о численности населения. Они добавляются в систему с типом Дробное число, хотя численность населения в ячейке должна быть представлена целым числом. Для этого мы перейдем в список типов данных и выберем тип Целое число. Далее введем название и системное имя для слоя. Название может состоять из кириллических и латинских символов, цифр, пробелов и нижних подчеркиваний.
Системное имя
Системное имя слоя используется при взаимодействии со слоем в инструментах разработчика. В связи с этим мы рекомендуем самостоятельно придумывать системное имя для слоев, которые Вы будете использовать в этом примере
В предыдущих примерах мы игнорировали системное имя, но в этом примере мы будем его использовать при написании кода, поэтому введем понятную для человека комбинацию символов. Слой будет называться Население Казани (гексагоны H3), а системное имя kazan_h3_pop.
Символы в системном имени
Системное имя может включать в себя символы английского алфавита, цифры и нижние подчеркивания. Пробелы и символы кириллицы запрещены.
Импорт CSV осуществляется также в два этапа: загрузки данных через контекстное меню карты и далее импорта через контекстное меню загруженного файла. В процессе импорта нам нужно правильно указать разделитель и в каких столбцах, и в каком формате записана геометрия.
Стандарт геометрии
Геометрия для точечных объектов может быть представлена либо в виде двух столбцов, в которых записаны координаты (X и Y или широта и долгота), либо в формате WKT. Для линейных и полигональных объектов она может быть записана только в формате WKT
В первую очередь настройте структуру файла. По умолчанию разделителем в системе является точка с запятой (;), разделителем же нашего файла является запятая. Изменим точку с запятой на запятую в поле разделитель. В файле геометрия находится в двух столбцах (X и Y), поэтому укажем в поле Долгота (X) столбец X, а в поле широта (Y) столбец Y. Система поддерживает проекцию EPSG:4326, наши данные находятся в ней. Кодировка нашего CSV файла UTF-8. Когда вы будете загружать свои данные, убедитесь, что кодировка в Вашем файла совпадает с кодировкой, которую определила система, особенно в случаях, когда вы используете символы кириллицы. По умолчанию кодировкой CSV файлов для macOS и Linux является UTF-8, для Windows — CP-1251. Не перепутайте широту и долготу, если ваши данные развернуты на 90 градусов относительно их предполагаемого расположения, импортируйте файл еще раз и поменяйте X и Y местами.
Следующим шагом настройте атрибуты, этот этап аналогичен импорту для ESRI Shapefile.
Заключительным этапом настройте название, местоположение слоя в каталоге и системное имя. Ограничения для них такие же, как и при импорте ESRI Shapefile. Слой со станциями метро будет иметь название Станции метро Казани и системное имя subway_stations_kazan.
Если вы уже загрузили данные ранее и хотите использовать слои, которые уже есть в системе, то повторно их можно не загружать. Для того, чтобы они появились в инструментах разработчика, перейдите в контекстное меню карты и нажмите на Добавить ссылку. вы увидите Каталог и далее в нем выберите нужный вам файл. Повторите это действие для последующих наборов данных.

Создание скрипта
Предустановленные библиотеки
В системе предустановлены следующие библиотеки Python:
pandas,geopandas,matplotlib,networkx,numpy,rasterio,shapely,scikit-learn,h3
При написании кода нам потребуются библиотеки для работы с пространственной информацией, а также функции API ЭверГИС. Для создания изохрон нам потребуется вспомогательный слой — в него будет записываться геометрия изохрон. Этот вспомогательный слой можно создать двумя способами: с помощью создания пустого слоя из главного меню, либо автоматизированно, при помощи скрипта. Рассмотрим оба способа.
Создание вспомогательного слоя при помощи главного меню
Создание вспомогательного слоя
Создать вспомогательный слой можно не только при помощи интерактивного интерфейса. Другим способом является создание слоя при помощи API ЭверГИС, такой способ рассмотрен в примере создания простого дашборда
Создание пустого слоя при помощи интерактивного интерфейса возможно через Пустой слой в главном меню. вам будет предложено выбрать тип слоя и название. В верхней части экрана создания слоя выберите тип геометрии Полигоны, укажите название, местоположение в каталоге и системное имя. Ограничения на типы символов такие же, как и при импорте данных.

Второй этап связан с настройкой атрибутов. Нужно создать следующие атрибуты с заданными типами данных:
- gid (Целое число)
- duration (Целое число)
- object_id (Целое число)
- route_center_x (Дробное число)
- route_center_y (Дробное число)

Созданный слой будет называться Изохроны станции метро Казань и иметь системное имя eromakh.metro_isochrones.
Работа с Python кодом
Для расчета показателя нам нужно написать четыре секции кода:
- Импорта модулей и создания объекта клиента
- Вызов функции создания изохрон и извлечение геометрии изохрон
- Извлечение данных из слоев и расчет показателя
Импорт модулей
Мы уже создали проект и .py файл перед импортом данных. На данном этапе нам нужно будет написать код. В этом примере мы напишем весь код для расчета показателя в одном файле, однако система поддерживает написание множества файлов и импорт одних .py файлов из других .py файлов. Для написания скрипта мы будем использовать встроенные функции Эвергис API.
Для работы с функциями Эвергис в первую очередь нам нужно создать объект клиента, для этого нужно импортировать соответствующую часть API:
from evergis_api import Client
Для извлечения информации из слоев нам потребуется функция eql_query_to_geodataframe:
from evergis_tools.eql import eql_query_to_geodataframe
Для создания изохрон нам потребуется функция построения изохрон build_isochrones:
from evergis_tools.tasks.network import build_isochrones
Для работы с GeoDataFrame нам потребуется библиотека GeoPandas, она предустановлена в системе:
import geopandas as gpd
Создание изохрон
Изохроны создаются при помощи функции build_isochrones. Она принимает на вход несколько параметров:
Показать Python код
build_isochrones(
client=client, # объект клиента
provider_name="sproute_isochrone_pedestrian", # тип графа (sproute_isochrone_pedestrian — пешеходные зоны, "sproute_isochrone_car_out" — автомобильные, от точки)
source_layer_eql=query, # SQL запрос к слою, от которого будут строиться зоны
source_id_attribute="gid", # id объектов в слое, по умолчанию id имеют наименование gid
source_geometry_attribute="geometry", # название атрибута геометрии исходного слоя
target_layer=target_layer_name, # системное имя слоя, в который будут записываться полигоны изохрон
duration_expression="10", # максимальное время перемещения для изохрон (минуты)
id_attribute_name="gid", # id объектов в слое изохрон, по умолчанию id имеют наименование gid
geometry_attribute_name="geometry", # название атрибута геометрии слоя с изохронами
duration_attribute_name="duration", # время отсечки для изохрон
base_object_id_attribute_name="object_id", # id объектов в слое изохрон
route_center_x_attribute_name="route_center_x", # координата X (долгота) точки, из которой строится изохрона
route_center_y_attribute_name="route_center_y" # координата Y (широта) точки, из которой строится изохрона
)
Последние четыре параметра функции являются необязательными. В случае этого примера нам нужны все точки станций метро, из которых будут строиться изохроны. В связи с этим мы source_layer_eql будет простым SELECT * FROM eromakh.subway_stations_kazan. В итоге наша функция будет иметь вид:
Показать Python код
build_isochrones(
client=client,
provider_name="sproute_isochrone_pedestrian",
source_layer_eql="SELECT * FROM eromakh.subway_stations_kazan",
source_id_attribute="gid",
source_geometry_attribute="geometry",
target_layer="eromakh.metro_isochrones",
duration_expression="10",
id_attribute_name="gid",
geometry_attribute_name="geometry",
duration_attribute_name="duration",
base_object_id_attribute_name="object_id",
route_center_x_attribute_name="route_center_x",
route_center_y_attribute_name="route_center_y"
)
Данная функция вызовет netEngine, который создаст зоны доступности в соответствии с текущими параметрами. На данный момент доступно два провайдера зон: sproute_isochrone_pedestrian для пешеходных зон доступности и sproute_isochrone_car_out для автомобильных. Время указывается в минутах.
После выполнения функции вы увидите, что в указанном слое (в данном примере eromakh.metro_isochrones) появится геометрия изохрон. Он будет выглядеть следующим образом:

Теперь у нас есть как геометрия зон доступности, так и геометрия ячеек H3 с привязанной к ним численности населения. Это позволяет нам совершить векторный оверлей слоев и извлечь численность населения.
Извлечение данных из слоев
Извлечение данных из слоев производится при помощи функции eql_query_to_geodataframe. У нее есть два параметра: query и client. Параметр query принимает в себя SQL-запрос, который включает в себя выборку определенных полей по какому-либо условию. Назад данная функция возвращает geopandas.GeoDataFrame, даже если в запросе не указано возвращение геометрии объектов.
В системе установлено дополнение PostGIS, которое позволяет производить манипуляции с геометрией на уровне базы данных. В связи с этим нам потребуется два запроса: один для оценки всего населения города, а второй для подсчета численности населения, попадающего в изохроны. Первый запрос будет выглядеть следующим образом: SELECT SUM(population) AS population FROM eromakh.kazan_h3_pop. Он вернет geopandas.GeoDataFrame в котором будет единственный столбец population. Для того, чтобы получить итоговую сумму нам нужно извлечь это значение.
Второй запрос будет выглядеть несколько сложнее, так как включает в себя выборку при помощи геометрии изохрон:
Показать SQL запрос
WITH clip AS ( SELECT ST_Union(geometry) AS geometry FROM eromakh.metro_isochrones )
SELECT SUM(population)FROM eromakh.kazan_h3_pop AS hexagons CROSS JOIN clip WHERE ST_Intersects(hexagons.geometry, clip.geometry)
После второго запроса нам также потребуется извлечь данные о суммарной численности населения при помощи функций geopandas. В итоге данная часть кода будет выглядеть так:
Показать Python код
gdf_total_pop = eql_query_to_geodataframe(query="SELECT SUM(population) AS population FROM eromakh.kazan_h3_pop", client=client) gdf_subway_pop = eql_query_to_geodataframe(query=f""" WITH clip AS ( \ SELECT ST_Union(geometry) AS geometry \ FROM eromakh.metro_isochrones \ ) \ SELECT SUM(population)FROM eromakh.kazan_h3_pop AS hexagons CROSS JOIN clip \ WHERE ST_Intersects(hexagons.geometry, clip.geometry)""", client=client)
total_population = gdf_total_pop[“population”].sum() subway_population = gdf_subway_pop[“population”].sum()
Весь код будет выглядеть следующим образом:
Показать Python код
# Импорт необходимых библиотек from evergis_api import Client from evergis_tools.eql import eql_query_to_geodataframe from evergis_tools.tasks.network import build_isochrones import geopandas as gpdclient = Client() # Создание объекта клиента
Создание изохрон
build_isochrones( client=client, provider_name=“sproute_isochrone_pedestrian”, source_layer_eql=“SELECT * FROM eromakh.subway_stations_kazan”, source_id_attribute=“gid”, source_geometry_attribute=“geometry”, target_layer=“eromakh.metro_isochrones”, duration_expression=“10”, id_attribute_name=“gid”, geometry_attribute_name=“geometry”, duration_attribute_name=“duration”, base_object_id_attribute_name=“object_id”, route_center_x_attribute_name=“route_center_x”, route_center_y_attribute_name=“route_center_y” )
gdf_total_pop = eql_query_to_geodataframe(query=“SELECT SUM(population) AS population FROM eromakh.kazan_h3_pop”, client=client) gdf_subway_pop = eql_query_to_geodataframe(query=f""" WITH clip AS (
SELECT ST_Union(geometry) AS geometry
FROM eromakh.metro_isochrones
)
SELECT SUM(population)FROM eromakh.kazan_h3_pop AS hexagons CROSS JOIN clip
WHERE ST_Intersects(hexagons.geometry, clip.geometry)""", client=client)total_population = gdf_total_pop[“population”].sum() subway_population = gdf_subway_pop[“population”].sum()
print(f”Доля населения, проживающая в 10-минутной доступности вокруг станций метро {subway_population / total_population * 100} %”)
Результат выполнения кода при помощи инструментов разработчика:

В данном примере была упрощена работа с геометрией: для расчета использовалось все население ячеек, пересекавшихся с ячейками H3. Для более точного расчета можно использовать более сложные функции векторного оверлея SQL-подобных запросов или обработки данных при помощи Python в инструментах разработчика. Подобные особенности решения мы оставим на усмотрение человека, который проводит геоинформационный анализ. Задача данного примера — познакомить пользователя с инструментами разработчика.