присвоювати та переміщувати центроїди до їх полігонів


9

Я використовую QGIS 1.8 Lisboa. Після обчислення центроїдів із форми форми багатокутника, якщо деякі з них лежать поза контурами багатокутника, я хотів би перенести їх на полігон, з якого вони походили. Критерій повинен бути однозначним, оскільки я повинен використовувати їх для отримання координат, які використовуються як ідентифікаційний код самого полігону. Отже, процедура повинна виводити одне і те саме місце кожного разу, коли він працює для одного і того ж багатокутника (не випадкове положення, подібне тому, яке задається функцією "випадкові точки", що дає новий результат щоразу, коли він виконується).


1
Звучить як два запитання. Якщо я правильно розумію, ви хочете (а) додати випадкові точки всередині багатокутника і (б) надати їм або полігону унікальний ідентифікатор, заснований на цьому. Найпростіша річ, яка спадає на думку (a), - це використовувати наявні можливості випадкової точки в QGIS, а потім просто перетинати цю точку хмари з вашим багатокутником.
lynxlynxlynx

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

використовувати інструмент fTools
Mapperz

це просто дає мені центр, але це також може лежати поза полігоном, чого я повинен уникати. Мені потрібно перемістити їх по полігону, з якого вони походять, використовуючи таку функцію, як мінімальна відстань (але відстань мене не цікавить, я хочу, щоб він перемістився). В іншому блозі хтось сказав мені використовувати ST_PointOnSurface PostGIS (але я використовую QGIS).
umbe1987

2
це дублікат gis.stackexchange.com/questions/50029/… зараз?
underdark

Відповіді:


7

Ви можете використовувати бібліотеку пітонів Shapely, яка забезпечує функцію, representative_point()яка гарантовано лежить у полігоні.

Ось сценарій Python, який можна запустити на консолі QGIS Python. Потрібно вибрати рівень багатокутника, для якого потрібно створити атрибут. Функція приймає назву атрибута, який ви хочете оновити. Атрибут вже повинен існувати у вашому шарі, він повинен бути тип рядка, і він повинен бути досить довгим (30 символів).

Ось приклад пунктів, знайдених алгоритмом:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

Я намагаюся перевірити це, здається саме те, що я шукав. Я дам вам знати, як тільки я запускаю його!
umbe1987

одне, чого я не зрозумів, це те, що ви маєте на увазі під назвою "це має бути тип рядка, і він повинен бути досить довгим (30 символів)". Чи працює ця бібліотека безпосередньо на багатокутних shpfiles? Якщо так, то я повинен створити нове поле типу рядка на вкладці Att з принаймні 30 символами, і це було б оновлення?
umbe1987

@ user9518: Так, так, як написана функція в той момент, коли ви повинні самостійно створити атрибут у таблиці, а потім лише передати ім'я поля функції. Сценарій також можна досить легко адаптувати для створення необхідного поля, якщо це потрібно.
Джейк

Я просто пропускаю одне. Здається, я зараз визначаю функцію (або клас), ввівши "def", але тоді, коли я закінчую писати сценарій, нічого не відбувається. Як я можу нарешті отримати результат у своїй таблиці?
umbe1987

1
Це спрацювало чудово !!! Я думаю, що координати записуються відповідно до системи координат шару, і що якщо я хочу мати точки, мені потрібно створити SHP з цими координатами, правда? Якби Ви були тут, я запропонував би Вам щонайменше 3 пива! Дуже дякую за Ваші зусилля !!!
umbe1987

5

Інструмент ftools centroid може розмістити центроїд поза полігоном, якщо він увігнутий.

ST_PointOnSurfaceобов'язково зробиш те, що ти хочеш. Ви можете використовувати команду зсередини QGIS, якщо ви встановили, використовуючи SPIT, щоб отримати свій файл форми у PostGIS, а потім використовувати плагін PgQuery для запуску запиту.

Крім того, якщо встановлення PostGIS трохи більше для одноразового використання, ви можете використовувати Spatialite з QGIS. Потім ви можете використовувати плагін QSpatiaLite для імпорту ваших даних до SpatiaLite та запуску запиту (відзнаки SpatialLite ST_PointOnSurface).


2

коли я правильно вас розумію, використовуйте: Вектор-> Інструменти дослідження_> Випадкові бали. Тепер виберіть у розділі "Конструкція стратифікованої вибірки (індивідуальні багатокутники)" значення з поля введення та використовуйте відповідне поле, яке дає числове значення балів, яке слід генерувати для кожного різного многокутника


що ви маєте на увазі під "відповідним полем"? Я думав скористатись центроїдом, а потім зв’язати його з найближчою частиною багатокутника, на яку він посилається, якщо він лежить поза контуром, (наприклад) обчисливши мінімальну відстань цієї точки до найближчого багатокутника. Мета полягає в тому, щоб отримати ці координати точок, щоб використовувати їх як унікальний специфічний ідентифікаційний код полігону.
umbe1987

В основному те, що я намагаюся зробити, це присвоїти кожному центроїду його відносний багатокутник і перемістити його, щоб він лежав всередині його багатокутника (або принаймні торкався його межі).
umbe1987

@ user9518: Вибачте, я неправильно зрозумів ваше запитання. Я думав, що ви хочете отримати певну кількість випадкових точок у кожному полі, наприклад, 2 бали fpr poly 1, 10 балів у полі2 тощо, тому термін "відповідне поле". звичайно, ви можете вибрати 1 для "використання цієї кількості балів", щоб створити лише один бал для кожного полі. ця точка знаходиться всередині полі або принаймні торкається його межі. але ця точка все ще зустрічається випадковим чином, тому, коли ви повторите процедуру, ви отримаєте інші бали :-(
Курт

1

плагін realcentroids, доступний для установки через плагіни> Керування та встановлення. Плагіни працювали на мене в QGIS 2.2, щоб генерувати точки, подібні до центру, вкладені всередину кожного полігону, якщо увігнуті (точка буде лежати дуже близько до краю). Я спробував інструмент «Випадкові точки», як запропонував Курт, і хоча я вказав 1 бал на багатокутник, він натомість генерує два. Додатковим недоліком є ​​те, що в більшості випадків точки не представляють центроїд, оскільки вони є випадковими.

http://www.agt.bme.hu/gis/qgis/realcentroid/

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