[РЕДАКТИРОВАТЬ: решение этой проблемы было просто использовать OGR для чтения шейп-файлов. Смотрите пример географии.]
В шейп-файле ESRI нет различия между полигонами и мультиполигонами. Кроме того, нет явного различия между внутренними отверстиями и внешними кольцами (кроме «управляемости» данного многоугольника).
Поэтому после прочтения шейп-файла у меня есть список последовательностей координат, описывающих кольца, но без некоторой более интенсивной обработки я не могу различить, какие из этих колец являются внешними кольцами, внутренними отверстиями или дополнительными многоугольниками.
Оказывается , что для стройной «s Polygon и MultiPolygon конструкторов, должно быть четкое различие между внешним и внутренними кольцами, так как я должен перейти от неясного списка колец упорядоченного множества разделенных полигонов, с четко обозначенными внутренним и внешними кольцами ?
Подводя итог: если у меня есть список многоугольных колец, но я не знаю, какие кольца являются отверстиями во внутренней части или являются отдельными многоугольниками, как мне лучше отсортировать их в отдельные многоугольники с обозначенными внутренними отверстиями?
Я ищу простое алгоритмическое решение, которое я могу реализовать на python, можно использовать для обработки сотен полигонов за минуту или меньше, и я делаю это для того, чтобы выполнить большое количество пересечений.
Ответы:
В дополнение к ответу Релета о том, как получить отдельные полигоны, вы можете запустить пересечение всех полигонов, чтобы создать дыры. Если ваш набор данных содержит перекрывающиеся полигоны, хотя вам не повезло.
Объясните еще раз, что не так с существующими читателями шейп-файлов?
Не будет ли проще экспортировать идентификаторы объектов и значения M из шейп-файла, а затем присоединить их обратно к полигонам после использования существующей программы чтения шейп-файлов?
Для мультипатчей вы можете использовать ту же технику, присваивая идентификаторы полигонов «идентификатору патча», а затем добавляя этот атрибут обратно к объектам.
Изменить: Хотя вы говорите, что вы не хотите использовать OGR, на всякий случай, если вы передумаете ..
Геометрия должна быть выведена следующим образом:
Первая скобка содержит координаты внешнего кольца, последующие скобки - координаты внутренних колец. Если у вас есть Z значений, точки должны быть в формате 79285 57742 10 (где последняя координата - высота).
В противном случае вы можете использовать функции Shapely Contains и Within для оценки каждого многоугольника друг с другом и предварительно применить пространственный индекс - http://pypi.python.org/pypi/Rtree/ для ускорения обработки.
источник
Сначала используйте ogr для открытия шейп-файла:
преобразовать геометрию шейп-файла в геометрические фигуры
Для многоугольников в многоугольнике:
И теперь вы можете использовать все функции shapely ( shapely )
источник
Я не слишком знаком с тем, как многоугольники на самом деле хранятся в файлах форм, но не должно ли кольцо многоугольников быть замкнутым циклом тогда и только тогда, когда начальная координата повторяется? Поэтому, если вы сравните каждую последующую координату с начальной координатой, вы найдете первую точку, где полигон замкнут. Если это последняя координата многоугольника, то это простой многоугольник, если нет, то он является многоугольником и требует обработки других циклов.
Это может быть «более интенсивная обработка», которую вы хотите избежать, но на самом деле это просто итерация по координатам, которая предоставляется бесплатно, когда вам все равно нужно их прочитать.
источник
Как указано @ inc42 , на стр. 8 Технического описания шейп- файла ESRI: В Белой книге ESRI - июль 1998 г. (стр. 12 из 34 в PDF) обсуждается содержание записей полигонов, которое может соответствовать тому, что вам нужно:
источник