Як саме обчислюється центроїд багатокутників?


10

Мені хотілося б знати, як саме інструменти QGIS Geometry -> центроїд багатокутника обчислює координати точок. Наприклад, чи розділить бордюр багатокутника на невеликі точки, візьміть дві пари з двох точок (довжини та ширини) з максимальною відстані і приймайте перетин цих двох ліній як центроїд?

Відповіді:


13

Якщо QGIS обчислює центроїд за допомогою GEOS, який є портом JTS, алгоритм - це http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/CentroidArea.html . Про теорію існує посилання в javadoc на http://www.faqs.org/faqs/graphics/algorithms-faq/ , див. Розділ 2.02: Як можна обчислити центроїд багатокутника ?.

Центроїд (він же центр маси або центр ваги) полігона може бути обчислений як зважена сума центроїдів розбиття багатокутника на трикутники. Центроїд трикутника - це просто середнє з трьох його вершин, тобто він має координати (x1 + x2 + x3) / 3 та (y1 + y2 + y3) / 3. Це дозволяє спочатку тріангулювати багатокутник, потім сформувати суму центроїдів кожного трикутника, зважену площею кожного трикутника, всю суму, нормалізовану загальною площею багатокутника. Це дійсно працює, але є більш простий метод: триангуляція не повинна бути перегородкою, а скоріше може використовувати позитивно та негативно орієнтовані трикутники (з позитивними та негативними областями), як це використовується при обчисленні площі багатокутника. Це призводить до дуже простого алгоритму обчислення центроїда, заснованого на сумі трикутників центроїдів, зважених з їх підписаною площею. Трикутниками можна вважати такі, що утворені будь-якою нерухомою точкою, наприклад, вершиною v0 многокутника та двома кінцевими точками послідовних ребер багатокутника: (v1, v2), (v2, v3) тощо. Площа трикутника з вершинами a, b, c - половина цього виразу: (b [X] - a [X]) * (c [Y] - a [Y]) - (c [X] - a [X] ) * (b [Y] - a [Y]);

Code available at ftp://cs.smith.edu/pub/code/centroid.c (3K).
Reference: [Gems IV] pp.3-6; also includes code.

Мені здається, що метод точний. Якщо ви хочете перевірити, як використовуються значення координат, і чи можуть бути помилки округлення тощо, ви можете подивитися вихідний код JTS або GEOS.


1
Ще декілька посилань: gdal.org/python/osgeo.ogr.Geometry-class.html#Centroid зазначає, що GDAL використовує метод GEOS, описаний на geos.osgeo.org/doxygen/classgeos_1_1algorithm_1_1Centroid.html . QGIS використовує функцію GDAL у фоновому режимі.
AndreJ

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