Простой пример:
>>> from shapely.geometry import MultiPoint, Point
>>> points = MultiPoint([Point(0, 0), Point(1, 0), Point(1, 1), Point(0, 1)])
>>> points.wkt
'MULTIPOINT (0 0, 1 0, 1 1, 0 1)'
>>> bad_point = Point(1, 0)
>>> points.difference(bad_point).wkt
'MULTIPOINT (0 0, 0 1, 1 1)'
Как видите, удаление Point
из MultiPoint
с помощью difference
нарушает первоначальный порядок. Ожидаемый результат:
'MULTIPOINT (0 0, 1 1, 0 1)'
Это ошибка или так задумано? Документы ничего не говорят об этом поведении.
Версия Shapely: 1.6.4.post1, установлена из conda.
Это поведение унаследовано от GEOS, библиотеки, над которой работает Shapely.
Я не думаю, что это ошибка как таковая . Это просто не то, как работает алгоритм, вычисляющий разницу. Два выхода геометрически эквивалентны. Я не думаю, что простая модель признаков придает какое-либо значение порядку частей в коллекции.
Кое-что, объясняющее это, может быть добавлено в документацию. Я не уверен, где лучше всего было бы добавить его, поскольку это не что-то конкретное для метода разницы.
См. OGC 06-103r4 для простого доступа к функциям , §6.1.5 для MultiPoint:
Точки не связаны и не упорядочены каким-либо семантически важным образом (см. обсуждение в GeometryCollection).
Таким образом, это указывает на то, что поведение предусмотрено дизайном. Это также то же самое поведение в JTS .
Похожий объект, который сохраняет порядок, — это [Multi]LineString
, но этот пример нужно будет обрабатывать по-другому.
Да я вижу. Я думаю, в конце раздела _Коллекции_ можно было бы добавить предупреждение о том, что не следует полагаться на сохранение порядка.
Самый полезный комментарий
См. OGC 06-103r4 для простого доступа к функциям , §6.1.5 для MultiPoint:
Таким образом, это указывает на то, что поведение предусмотрено дизайном. Это также то же самое поведение в JTS .
Похожий объект, который сохраняет порядок, — это
[Multi]LineString
, но этот пример нужно будет обрабатывать по-другому.