використовуючи витончений: переклад між полігонами та мультиполігонами


12

[EDIT: рішенням цього було просто використовувати OGR для читання файлів. Дивіться приклад geographika.]

У файлі форм ESRI немає різниці між полігонами та мультиполігонами. Крім того, немає чіткого розрізнення між внутрішніми отворами та зовнішніми кільцями (окрім "ручності" даного багатокутника).

Отже, прочитавши файл форми, у мене є список послідовностей координат, що описують кільця, але без інтенсивнішої обробки я не можу розрізнити, які з цих кілець - це зовнішні кільця, внутрішні отвори чи додаткові багатокутники.

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

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

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


У цьому питанні відсутня важлива інформація щодо того, що ви використовуєте для читання Shapefile.
inc42

@ inc42 Я використовував python для читання файлу безпосередньо.
BenjaminGolder

Ага, тоді Шепельний біт вводить в оману. Вашою актуальною проблемою було з'ясування того, як визначити "вид" кільця у форматі Shapefile. :)
inc42

Відповіді:


10

Далі до відповіді relet про те, як отримати окремі багатокутники, можна потім провести перетин на всіх полігонах, щоб створити отвори. Якщо ваш набір даних містить полігони, що перекриваються, хоча вам не пощастило.

Поясніть ще раз, що не так з існуючими читачами формфайлів?

Чи не було б простіше експортувати ідентифікатори функції та значення 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 and Within для оцінки кожного багатокутника між собою та заздалегідь застосувати просторовий індекс - http://pypi.python.org/pypi/Rtree/, щоб прискорити обробку.


дякую, це не те, що я шукаю, але я побачив ще кілька роз’яснень, які я міг би зробити у своєму питанні. Щоб відповісти на ваші запитання: 1, тому що я сортую їх, щоб зробити тони перехрестя в першу чергу. 2, нічого, мені просто потрібний легкий і який я легко можу використовувати з python, і я не навчився огр. 3, ні, в цьому випадку це було б не легше.
БенджамінГолдер

1
Оце Так! Дякую географіку! Зараз я на 90% переконаний, що тут є рішення ogr. Я зіткнувся з деякими проблемами встановлення з ogr, але, схоже, над цим варто працювати. Тож ogr організовує кільця у свій wkt вихід? і чи добре це з 3D-файлами (я використовую багато 3d)?
БенджамінГолдер

Схоже, відповіді на мої запитання - так і так. І дякую, що ви познайомили мене з rtree. Здається, OGR цілком вирішує мою проблему - доки я цього разу можу правильно налаштувати інсталяцію.
BenjaminGolder

Повторне встановлення OGR - пам’ятайте, що вам знадобляться бінарні файли для Windows та відповідні вкладення Python.
geographika

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

А тепер ви можете використовувати всі функції витонченого ( витонченого )


1

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

Це може бути "більш інтенсивна обробка", якої ви хочете уникнути, але це насправді лише ітерація через координати, яка надходить безкоштовно, коли вам доведеться їх прочитати в будь-якому випадку.


Прошу вибачення - моє запитання було трохи оманливим, і я його відредагував. У мене є кільця багатокутника, і я знаю, коли у мене є список з декількох кілець багатокутника, але окрім порядку розташування точок за годинниковою або проти годинникової стрілки, я не знаю, чи це внутрішні чи зовнішні кільця. Якщо це внутрішні кільця, я не можу бути впевненим, до якого зовнішнього кільця вони належать, окрім вимірювання їх розташування.
БенджамінГолдер

Я бачу. Я також радий бачити, що ти знайшов свій шлях до огр. ;)
relet

-2

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

Багатокутник може містити кілька зовнішніх кілець. Порядок вершин або орієнтація для кільця вказує, яка сторона кільця - це внутрішня частина багатокутника.


на сторінці 10 зазначено: "Багатокутник може містити кілька зовнішніх кілець. Порядок вершин або орієнтація для кільця вказує, яка сторона кільця - це внутрішня частина багатокутника".
inc42

@ inc42 оновлено відповідно, хоча я думаю, що номер сторінки повинен бути 8 (або 12 з 34).
PolyGeo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.