Shapely.intersection: примеры (PYTHON)

Использование функции intersection в Shapely на практике
Раздел: Геометрия, Операции
shapely.intersection(a: geometry, b: geometry): geometry

Описание функции intersection

Функция intersection из библиотеки Shapely предназначена для вычисления геометрического пересечения двух объектов. Операция выполняется в соответствии с моделью DE-9IM и возвращает общую часть пространства, которую разделяют оба объекта. Использование функции актуально при выполнении пространственного анализа, определении областей наложения объектов и обработке геоданных.

Функция принимает два основных аргумента:

  • a, b: геометрические объекты из библиотеки Shapely (например, Point, LineString, Polygon, MultiPolygon).
  • grid_size (необязательный): числовое значение, задающее размер сетки для обработки координат. Применяется для уменьшения ошибок округления и повышения точности вычислений.

Возвращаемым значением является новый геометрический объект Shapely, представляющий пересечение. Если пересечение отсутствует, функция возвращает пустую геометрию типа GeometryCollection или None в зависимости от версии библиотеки.

Краткие примеры применения

Пересечение двух полигонов

from shapely.geometry import Polygon

poly1 = Polygon([(0, 0), (2, 0), (2, 2), (0, 2)])
poly2 = Polygon([(1, 1), (3, 1), (3, 3), (1, 3)])
result = poly1.intersection(poly2)
print(result)
POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))

Пересечение линии и полигона

from shapely.geometry import LineString, Polygon

line = LineString([(0, 1), (3, 1)])
poly = Polygon([(1, 0), (2, 0), (2, 2), (1, 2)])
result = line.intersection(poly)
print(result)
LINESTRING (1 1, 2 1)

Использование параметра grid_size

from shapely.geometry import Polygon

poly1 = Polygon([(0.1, 0.1), (2.1, 0.1), (2.1, 2.1), (0.1, 2.1)])
poly2 = Polygon([(1, 1), (3, 1), (3, 3), (1, 3)])
result = poly1.intersection(poly2, grid_size=0.5)
print(result)
POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))

Отсутствие пересечения

from shapely.geometry import Point, Polygon

point = Point(5, 5)
poly = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
result = point.intersection(poly)
print(result)
GEOMETRYCOLLECTION EMPTY

Похожие функции в Python

union

Функция union объединяет геометрические объекты, возвращая их общую площадь. Применяется для слияния пространственных данных.

difference

Функция difference вычисляет разность между двумя объектами, возвращая часть первого объекта, которая не пересекается со вторым. Используется для вычитания областей.

symmetric_difference

Функция symmetric_difference возвращает части объектов, которые не являются общими. Подходит для поиска уникальных участков.

Выбор функции зависит от задачи: intersection применяется для поиска общих областей, union – для объединения, difference – для исключения одной геометрии из другой.

Аналоги функции в других языках

JavaScript (Turf.js)

const turf = require('@turf/turf');
const poly1 = turf.polygon([[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]]);
const poly2 = turf.polygon([[[1, 1], [3, 1], [3, 3], [1, 3], [1, 1]]]);
const intersection = turf.intersect(poly1, poly2);
console.log(JSON.stringify(intersection));
{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[2,2],[2,1],[1,1],[1,2],[2,2]]]}}

SQL (PostGIS)

SELECT ST_AsText(ST_Intersection(
    ST_GeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))'),
    ST_GeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))')
));
POLYGON((2 2,2 1,1 1,1 2,2 2))

Java (JTS Topology Suite)

import org.locationtech.jts.geom.*;
import org.locationtech.jts.io.WKTReader;

GeometryFactory factory = new GeometryFactory();
WKTReader reader = new WKTReader(factory);
Geometry poly1 = reader.read("POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))");
Geometry poly2 = reader.read("POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))");
Geometry result = poly1.intersection(poly2);
System.out.println(result);
POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))

Функции в других языках часто имеют схожую логику, но отличаются синтаксисом и особенностями библиотек.

Распространенные ошибки

Несовместимые типы геометрий

from shapely.geometry import Point, LineString

point = Point(0, 0)
line = LineString([(1, 1), (2, 2)])
result = point.intersection(line)
print(result)
GEOMETRYCOLLECTION EMPTY

Ошибки не возникает, но результат пустой из-за отсутствия пересечения. Проблемы могут появиться при последующей обработке, если не проверять тип результата.

Некорректные координаты

from shapely.geometry import Polygon

poly1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
poly2 = Polygon([(2, 2), (3, 2), (3, 3)])  # Неправильный полигон (менее 4 точек)
# Вызовет ошибку при создании poly2, а не при intersection
print(poly2.is_valid)
False

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

Изменения в последних версиях

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

Также в версии 2.0 изменилось поведение при отсутствии пересечения: теперь возвращается пустая геометрия типа GeometryCollection вместо None в некоторых случаях. Это улучшает совместимость с другими операциями.

Расширенные примеры

Пересечение мультиполигонов

Пример python
from shapely.geometry import MultiPolygon, Polygon

mpoly1 = MultiPolygon([
    Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]),
    Polygon([(2, 2), (3, 2), (3, 3), (2, 3)])
])
mpoly2 = MultiPolygon([
    Polygon([(0.5, 0.5), (1.5, 0.5), (1.5, 1.5), (0.5, 1.5)]),
    Polygon([(2.5, 2.5), (3.5, 2.5), (3.5, 3.5), (2.5, 3.5)])
])
result = mpoly1.intersection(mpoly2)
print(result)
MULTIPOLYGON (((1 1, 0.5 1, 0.5 0.5, 1 0.5, 1 1)), ((3 3, 2.5 3, 2.5 2.5, 3 2.5, 3 3)))

Последовательное пересечение нескольких объектов

Пример python
from shapely.geometry import Polygon
from functools import reduce

polys = [
    Polygon([(0, 0), (i, 0), (i, i), (0, i)]) for i in range(1, 5)
]
result = reduce(lambda a, b: a.intersection(b), polys)
print(result)
POLYGON ((1 1, 1 0, 0 0, 0 1, 1 1))

Пересечение с буферной зоной

Пример python
from shapely.geometry import Point, LineString

point = Point(0, 0)
line = LineString([(1, -1), (1, 1)])
buffer_zone = point.buffer(1.5)
result = buffer_zone.intersection(line)
print(result)
LINESTRING (1 -0.5, 1 0.5)

Работа с геометрическими коллекциями

Пример python
from shapely.geometry import GeometryCollection, Polygon, LineString

geom1 = GeometryCollection([
    Polygon([(0, 0), (2, 0), (2, 2), (0, 2)]),
    LineString([(1, 1), (3, 3)])
])
geom2 = Polygon([(1, 1), (3, 1), (3, 3), (1, 3)])
result = geom1.intersection(geom2)
print(result)
GEOMETRYCOLLECTION (POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2)), LINESTRING (1 1, 2 2))

питон shapely.intersection function comments

En
Shapely.intersection Return the intersection of geometries