Overlay: пересечение слоёв и буферы

Урок про overlay — наложение слоёв друг на друга — и буферный анализ, два метода, которыми решают большинство прикладных пространственных задач.

Overlay-анализ объединяет геометрию и атрибуты двух слоёв, образуя новый слой: пересечение, объединение или разность исходных.

Вспомните метафору слоёв-плёнок из первого раздела. Overlay — это формальная операция «наложить и совместить»: взять слой зданий и слой зоны затопления и получить третий слой — затопленные здания, причём с их атрибутами. Вместе с буферами overlay покрывает огромную долю реальных ГИС-задач.

Три вида overlay

  • Intersection — оставить только общую часть слоёв. «Какие участки леса попали в новую особо охраняемую зону?»
  • Union — слить оба слоя, сохранив все области. «Объединить кадастровые участки в один план.»
  • Difference — вычесть один слой из другого. «Застраиваемая земля = участок минус водоохранные зоны.»

Буферный анализ

Буфер превращает точку, линию или полигон в зону вокруг него. Это мощно в связке с overlay. Сценарий: «найти жилые дома в зоне шума 200 м вдоль железной дороги». Решение — буфер 200 м вокруг линии дороги, затем пересечение этого буфера со слоем домов.

  Шаг 1: линия ж/д        ============
  Шаг 2: буфер 200 м    [============]
  Шаг 3: дома + overlay  попавшие дома помечены

Площадь пересечения буфера и круга мы умеем считать даже элементарно — для двух кругов это геометрия. Покажем, как наложение порогов работает на простом числовом примере: подсчитаем суммарную «затронутую» длину дорог, попавших в буфер реки, по табличным данным:

# Дороги: (имя, длина_км, расстояние_до_реки_м)
roads = [
    ("Набережная", 3.2, 50),
    ("Центральная", 5.0, 800),
    ("Мостовая", 1.1, 120),
    ("Парковая", 2.4, 300),
]
buffer_m = 200  # водоохранная зона

affected = [(name, km) for name, km, dist in roads if dist <= buffer_m]
total = sum(km for _, km in affected)
print("В водоохранной зоне 200 м:")
for name, km in affected:
    print(f"  {name}: {km} км")
print(f"Итого затронуто: {total:.1f} км")

Вывод:

В водоохранной зоне 200 м:
  Набережная: 3.2 км
  Мостовая: 1.1 км
Итого затронуто: 4.3 км

Как работает под капотом

Под честным overlay лежит вычислительная геометрия полигонов: алгоритмы вроде Вейлера-Азертона или Грайнера-Хорманна находят точки пересечения рёбер двух полигонов и собирают из дуг новый контур. Это нетривиально (особенно с дырками и самокасаниями), поэтому overlay никогда не пишут руками — берут из shapely/GEOS:

from shapely.geometry import LineString, Polygon

railway = LineString([(0, 0), (10, 0)])
noise_zone = railway.buffer(2)        # буфер 2 единицы

houses = Polygon([(3, -1), (6, -1), (6, 1), (3, 1)])
affected = noise_zone.intersection(houses)
print(affected.area)                  # площадь затронутых домов

Буфер строится приближением: окружность вокруг точки заменяется многоугольником из $N$ сегментов (по умолчанию десятки), поэтому площадь буфера чуть меньше идеального круга — параметр resolution управляет точностью.

Частые ошибки

  • Overlay слоёв в разных проекциях. Геометрии должны быть в одной системе координат, иначе пересечение бессмысленно.
  • Буфер в градусах. Буфер строят в метровой проекции; в градусах «200» — это сотни километров.
  • Невалидная геометрия. Самопересекающийся полигон ломает overlay; его сначала «чинят» (make_valid).

Overlay как язык пространственных вопросов

Сила overlay в том, что им формулируются почти любые вопросы вида «что и где совпадает». Градостроитель спрашивает: «какие участки под застройку попадают в водоохранную зону?» — это разность участков и охранной зоны. Эколог: «сколько леса оказалось внутри новой особо охраняемой территории?» — пересечение лесного слоя с границей ООПТ и подсчёт площади результата. Страховщик: «какие дома в зоне затопления при подъёме реки на 3 метра?» — пересечение слоя зданий с полигоном затопления, полученным из DEM. Во всех случаях ответ — это новый слой, у объектов которого есть и геометрия пересечения, и атрибуты обоих исходных слоёв, так что дальше его можно фильтровать и суммировать обычными табличными средствами.

Буфер расширяет этот язык до вопросов про близость. «В зоне доступности 15 минут пешком от метро» — это буфер вокруг станций (радиус пересчитан из времени и скорости пешехода). «Где нельзя строить ближе 100 метров от газопровода» — буфер вокруг линии трубы. Комбинируя буфер и overlay, решают многошаговые задачи: построить буфер вокруг школ, вычесть из него промзоны, пересечь с жилыми кварталами — и получить пригодные под детскую площадку участки. Именно эта композиция простых операций, а не какая-то одна магическая функция, и составляет ремесло пространственного аналитика.

Итог

  • Overlay накладывает слои: intersection, union, difference.
  • Буфер строит зону вокруг объекта; в связке с overlay решает много задач.
  • Слои должны быть в одной проекции, буфер — в метрах.
  • Честный overlay полигонов берут из shapely/GEOS, а не пишут вручную.
Проверьте себя
1. Что делает операция intersection в overlay-анализе?
AСливает слои воедино
BОставляет только общую часть двух слоёв
CВычитает один слой из другого
DУдаляет геометрию
2. Как решить задачу «дома в зоне шума 200 м от дороги»?
AПосчитать центроид дороги
BПостроить буфер 200 м вокруг дороги и пересечь его со слоем домов
CПеревести дома в растр
DСложить площади домов
3. Почему перед overlay важно привести слои к одной проекции?
AДля красоты
BИначе геометрии в разных системах координат не совпадут и пересечение будет бессмысленным
CПроекция не влияет
DЧтобы уменьшить файл