March 28

Добавляем профили высот на макет карты в новой версии QGIS

В ряде версий QGIS (включая так называемую "стабильную" версию) на момент марта 2026 не устанавливается плагин DataPlotly, который, несмотря на не самый удобный интерфейс и ошибки, был незаменим в ряде задач.

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

Этап подготовки данных.


Для начала определимся, что мы хотим сделать и из каких данных.

Дано:

- слой с горнолыжными трассами

- цифровая модель рельефа

- точечный слой, который содержит в себе контрольные точки для каждой трассы (результат работы инструмента "Точки вдоль линии"). У такого слоя есть информация о высоте над уровнем моря в каждой точке

Атрибуты слоя с точками

Способ 1. Готовый скрипт для простой визуализации

Плюсы: относительно просто, если есть общее понимание того, как работает код

Вам нужно открыть консоль в QGIS и добавить туда скрипт. Далее немного модифицировать его под свои задачи и задать уникальные цвета.

Откройте дополнительное окно для скриптов:

Далее либо откройте файл готового скрипта, который можно скачать с моего гугл диска, либо вставьте код в саму консоль:

import matplotlib.pyplot as plt
from collections import defaultdict
from qgis.core import QgsProject
import os
import numpy as np

LAYER_NAME = "points_profile"
OUT_PATH = "/Users/olgagommerstadt/Documents/0_GIS/0_Cartetika/2026_03_QGIS_practive/2_lesson/all_profiles_smooth.png"

COLOR_MAP = {
    1: "#da20a5",
    2: "#cd8745",
    3: "#57dacb",
    4: "#5045c9"
}

SMOOTH_WINDOW = 5

layer = QgsProject.instance().mapLayersByName(LAYER_NAME)[0]

data = defaultdict(list)

for f in layer.getFeatures():
    num = f["number"]
    dist = f["distance"]
    elev = f["SAMPLE_1"]

    if num is not None and dist is not None and elev is not None:
        data[int(num)].append((float(dist), float(elev)))

def moving_average_safe(y, window):
    y = np.asarray(y, dtype=float)
    if len(y) < window or window < 3:
        return y

    pad = window // 2
    y_pad = np.pad(y, (pad, pad), mode="edge")
    kernel = np.ones(window) / window
    return np.convolve(y_pad, kernel, mode="valid")

plt.figure(figsize=(12, 6))

for num, values in sorted(data.items()):
    if len(values) < 2:
        continue

    values.sort(key=lambda x: x[0])

    x = np.array([v[0] for v in values], dtype=float)
    y = np.array([v[1] for v in values], dtype=float)

    color = COLOR_MAP.get(num, "#999999")

    # исходная линия
     # plt.plot(x, y, color=color, linewidth=0.8, alpha=0.35)

    # сглаженная линия
    y_smooth = moving_average_safe(y, SMOOTH_WINDOW)
    plt.plot(x, y_smooth, label=f"Трасса {num}", color=color, linewidth=2.2)

plt.title("Профили высот трасс")
plt.xlabel("Расстояние, м")
plt.ylabel("Высота над уровнем моря, м")
plt.grid(True)
plt.legend()
plt.savefig(OUT_PATH, dpi=200, bbox_inches="tight")
plt.close()

print("Сохранено:", OUT_PATH)

Теперь вам нужно модифицировать этот код под себя.

1. Изменение путей и имен файлов

LAYER_NAME = "points_profile"
OUT_PATH = "/Users/olgagommerstadt/Documents/0_GIS/0_Cartetika/2026_03_QGIS_practive/2_lesson/all_profiles_smooth.png"

Вместо points_profile вам нужно вставить название своего точечного слоя с замерами

Вместо пути в out_path вам нужно поставить свой путь, куда вы положите итоговое изображение. В этом варианте оно называется all_profiles_smooth

2. Изменение цветов

Например, у вас 4 трассы для визуализации. Для каждой вам нужен свой цвет. Поэтому эти цвета стоит указать в этом фрагменте кода:

COLOR_MAP = {
    1: "#da20a5",
    2: "#cd8745",
    3: "#57dacb",
    4: "#5045c9"
}

3. Изменение названий атрибутов

for f in layer.getFeatures():
    num = f["number"]
    dist = f["distance"]
    elev = f["SAMPLE_1"]

Здесь вместо "number" нужно поставить свое название поля для номера трассы, вместо "distance" - свое название поля для дистанции от начала трассы (если вы создавали точечный слой с помощью точек вдоль линии, это поле будет называться так), вместо "SAMPLE_1" поставить название поля с высотой над уровнем моря.

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

Способ 2 С помощью инструмента высотного профиля и умного наложения.

Плюсы: применимо на разных версиях QGIS, не требует программирования

Минусы: много шагов

В новых версиях QGIS существует инструмент создания высотных профилей. Он не самый очевидный для использования, но работать с ним можно.

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

1. Открываем профиль высот

В выпадающем списке "Вид" - "Профиль высот" ("View" - "Elevation profile")

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

2. Настройка визуализации профиля

- Слева в списке слоев у профиля активируйте слой с точками промеров.

- Зайдите в настройки этого слоя в инструменте высотного профиля (правой кнопкой мыши - свойства/properties).

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

(мое поле высоты над уровнем моря называвется SAMPLE_1)

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

Меню настроек можно закрыть.

- В меню профиля высот нужно выбрать инструмент выбора контура из объекта и с помощью него на карте в основном окне QGIS выбрать первую трассу, профиль которой хотите построить.

Если все правильно, должен появиться профиль высот для этой трассы.

3. Получение данных и определение параметров экспорта

"Прокликайте" так свои трассы, чтобы определить для них самые важные параметры, которые пригодятся для экспорта - минимальная высота профиля, максимальная высота профиля, максимальная ширина профиля.

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

- Выберите правильный цвет, соответствующий вашей трассе на карте (скопируйте его в свойствах слоя в основном окне QGIS) и далее вставьте его в настройках слоя в инструменте профиля высот.

4. Экспорт графиков

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

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

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

- Далее аналогичным образом вам нужно кликнуть на трассу 2, далее выбрать ей соответствующий цвет в настройках и экспортировать с указанием тех же настроек. Далее с остальными трассами/линиями аналогично.

5. Добавление профилей на макет одним изображением

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

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

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

Путь к первому профилю

Далее вам нужно скопировать этот элемент и вставить его несколько раз. Одна копия - одна линия профиля. Расскажу, что делать, на примере первой копии:

  • поставить элемент прямо на уже размещенный профиль
  • в настройках элемента указать, что вам нужен не файл "1.png", а, например, "2.png".
  • в настройках отрисовки (rendering) нужно поставить способ визуализации "Только темное" ("Only dark"). Благодаря этому способу перекрытия вы оставите только полосу профиля + подписи. Если изображения ровно лежат друг на друге и параметры везде одинаковые, то подписи не будут превращаться в кашу.

3 Способ. Использовать старый добрый DataPlotly.

Если у вас устанавливается DataPlotly, то самый простой способ - использовать его для создания графика высот.

Краткое описание, что нужно делать:

В макете выберите инструмент ADD PLOT ITEM, далее в настройках нужно перейти в меню элементов графиков (scatter plot по умолчанию). В нем вам нужно зайти в настройки, сменить тип графика на профиль (XY graph), сказать, что в качестве исходных данных вы выбираете точечный слой с высотами. В качестве OY нужно выбрать поле высоты, в качестве данных для OX - поле distance (расстояние от начала профиля).

Чтобы профиль строился только на одну трассу, нужно сделать ограничение в feature subset, задать там простое условие в доп настройках, чтобы отображаемые данные ограничивались только, например, первым профилем (number=1).

Далее нужно выбрать настройки визуализации, указать нужные параметры цветов, и пр.

Как только первый график будет настроен, в настройках модуля в разделе plots вы сможете добавить еще данные на ваш график с помощью кнопки "+" или с помощью копирования уже существующего набора данных, который вы настроили до этого. Для каждой линии нужно будет задать свой цвет.

4 способ. Генератор геометрии

Это довольно нетипичный способ создания профиля высот, но он имеет место быть.

Логика: вы создаете точечный слой, где каждая точка будет иметь "выпуклость" наверх в соответствии с высотой над уровнем моря.

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