Shapely.intersection: примеры (PYTHON)
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 в некоторых случаях. Это улучшает совместимость с другими операциями.
Расширенные примеры
Пересечение мультиполигонов
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)))
Последовательное пересечение нескольких объектов
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))
Пересечение с буферной зоной
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)
Работа с геометрическими коллекциями
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
- питон shapely.intersection - аргументы и возвращаемое значение
- Функция python shapely.intersection - описание
- shapely.intersection - примеры
- shapely.intersection - похожие методы на python
- shapely.intersection на php, c#, sql, java
- shapely.intersection изменения python
- Примеры shapely.intersection на питон