используя shapely: перевод между полигонами и мультиполигонами

12

[РЕДАКТИРОВАТЬ: решение этой проблемы было просто использовать OGR для чтения шейп-файлов. Смотрите пример географии.]

В шейп-файле ESRI нет различия между полигонами и мультиполигонами. Кроме того, нет явного различия между внутренними отверстиями и внешними кольцами (кроме «управляемости» данного многоугольника).

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

Оказывается , что для стройной «s Polygon и MultiPolygon конструкторов, должно быть четкое различие между внешним и внутренними кольцами, так как я должен перейти от неясного списка колец упорядоченного множества разделенных полигонов, с четко обозначенными внутренним и внешними кольцами ?

Подводя итог: если у меня есть список многоугольных колец, но я не знаю, какие кольца являются отверстиями во внутренней части или являются отдельными многоугольниками, как мне лучше отсортировать их в отдельные многоугольники с обозначенными внутренними отверстиями?

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

BenjaminGolder
источник
В этом вопросе отсутствует важная информация о том, что вы используете для чтения шейп-файла.
inc42
@ inc42 Я использовал Python для непосредственного чтения файла.
BenjaminGolder
Ах, тогда немного Shapely вводит в заблуждение. Ваша настоящая проблема заключалась в том, чтобы выяснить, как определить «вид» кольца в формате Shapefile. :)
inc42

Ответы:

10

В дополнение к ответу Релета о том, как получить отдельные полигоны, вы можете запустить пересечение всех полигонов, чтобы создать дыры. Если ваш набор данных содержит перекрывающиеся полигоны, хотя вам не повезло.

Объясните еще раз, что не так с существующими читателями шейп-файлов?

Не будет ли проще экспортировать идентификаторы объектов и значения M из шейп-файла, а затем присоединить их обратно к полигонам после использования существующей программы чтения шейп-файлов?

Для мультипатчей вы можете использовать ту же технику, присваивая идентификаторы полигонов «идентификатору патча», а затем добавляя этот атрибут обратно к объектам.

Изменить: Хотя вы говорите, что вы не хотите использовать OGR, на всякий случай, если вы передумаете ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

Геометрия должна быть выведена следующим образом:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

Первая скобка содержит координаты внешнего кольца, последующие скобки - координаты внутренних колец. Если у вас есть Z значений, точки должны быть в формате 79285 57742 10 (где последняя координата - высота).

В противном случае вы можете использовать функции Shapely Contains и Within для оценки каждого многоугольника друг с другом и предварительно применить пространственный индекс - http://pypi.python.org/pypi/Rtree/ для ускорения обработки.

geographika
источник
спасибо, это не то, что я ищу, но я увидел еще несколько уточнений, которые мог бы дать по моему вопросу. Чтобы ответить на ваши вопросы: 1, потому что я сортирую их, чтобы сделать тонны пересечений в первую очередь. 2, ничего, мне просто нужен легкий, который я могу легко использовать из python, и я не изучил ogr. 3, нет, в этом случае было бы легче.
BenjaminGolder
1
Вау! Спасибо география! Теперь я на 90% убежден, что решение здесь - ogr. Я столкнулся с некоторыми проблемами при установке с ogr, но, похоже, их стоит решить. Итак, ogr организует кольца в своем выводе wkt? и это нормально с 3d шейп-файлами (я использую много 3d)?
BenjaminGolder
Похоже, ответы на мои вопросы да и да. И спасибо, что познакомили меня с rtree. OGR, кажется, полностью решает мою проблему - пока я могу правильно настроить установку на этот раз.
BenjaminGolder
Повторная установка OGR - помните, что вам понадобятся двоичные файлы для Windows и соответствующие привязки Python.
география
9

Сначала используйте ogr для открытия шейп-файла:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

преобразовать геометрию шейп-файла в геометрические фигуры

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Для многоугольников в многоугольнике:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

И теперь вы можете использовать все функции shapely ( shapely )

Constantinius
источник
1

Я не слишком знаком с тем, как многоугольники на самом деле хранятся в файлах форм, но не должно ли кольцо многоугольников быть замкнутым циклом тогда и только тогда, когда начальная координата повторяется? Поэтому, если вы сравните каждую последующую координату с начальной координатой, вы найдете первую точку, где полигон замкнут. Если это последняя координата многоугольника, то это простой многоугольник, если нет, то он является многоугольником и требует обработки других циклов.

Это может быть «более интенсивная обработка», которую вы хотите избежать, но на самом деле это просто итерация по координатам, которая предоставляется бесплатно, когда вам все равно нужно их прочитать.

пересдавать
источник
Я прошу прощения - мой вопрос немного вводил в заблуждение, и я его отредактировал. У меня есть многоугольные кольца, и я знаю, когда у меня есть список из более чем одного многоугольного кольца, но кроме порядка точек по часовой стрелке или против часовой стрелки, я не знаю, являются ли они внутренними или внешними кольцами. Если они являются внутренними кольцами, я не могу точно определить, к какому внешнему кольцу они относятся, кроме измерения их местоположения.
BenjaminGolder
Понимаю. Я также рад видеть, что вы нашли свой путь к огру. ;)
ретлет
-2

Как указано @ inc42 , на стр. 8 Технического описания шейп- файла ESRI: В Белой книге ESRI - июль 1998 г. (стр. 12 из 34 в PDF) обсуждается содержание записей полигонов, которое может соответствовать тому, что вам нужно:

Многоугольник может содержать несколько внешних колец. Порядок вершин или ориентации для кольца указывает, какая сторона кольца является внутренней частью многоугольника.

PolyGeo
источник
у п.10 есть это «Многоугольник может содержать несколько внешних колец. Порядок вершин или ориентация для кольца указывает, какая сторона кольца является внутренней частью многоугольника».
inc42
@ inc42 обновляется соответствующим образом, хотя я думаю, что номер страницы должен быть 8 (или 12 из 34).
PolyGeo