Страница 1 из 2

Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 10 апр 2009, 12:24
Izdolt
Столкнулся со следующей проблемой:
Нужно найти "центр тяжести" полигона и отметить его точкой. Может есть какой-нибудь скрипт на это дело?

Сразу попытаюсь объяснить что имеется в виду под центром тяжести:
Представьте, что вы вырезали любую область России из картона и теперь надо найти такую точку, воткнув иголку в которую можно добиться того, что картонка не будет "заваливаться на бок" а останется горизонтальна полу :-)
Объяснение детское - но думаю так понятнее.

Re: Центрография, конечно, лженаука, но все же...

Добавлено: 10 апр 2009, 12:47
geologic
Упрощенно можно так: грид и среднее из координат всех точек.
Для облака точек можно сразу среднее, а для полигонов, наверное, так.

Re: Центрография, конечно, лженаука, но все же...

Добавлено: 11 апр 2009, 19:17
Журавлёв
В версии 9.3 есть функция Calculate Geometry, где для полигона можно для полей таблицы вычислить X и Y координаты центроида. Для России у меня получилось Широта=61.95 и Долгота=96.58, это в Decimal Degrees. Визуально это похоже на центр масс. Соответственно, открываем таблицу атрибутов для полигонов, создаем два новых поля, в которых рассчитываем X и Y. После этого копируем содержимое этих полей и по ним строим точечный шейп.

Re: Центрография, конечно, лженаука, но все же...

Добавлено: 11 апр 2009, 20:57
Максим Дубинин
мне казалось ArcGIS геометрический центр так считает, не центр масс.

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 11 апр 2009, 22:36
Boris
Мне кажется для плоской фигуры центроид и центр масс должны совпадать, поскольку толщина по Z=0. Хотя надо посмотреть определение центроида ...

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 12 апр 2009, 10:43
Журавлёв
Цитирую с http://www.gisa.ru/13549.html
Центроид
Англ.: Centroid, Seed
1. Точка, являющаяся центром тяжести (геометрическим центром) фигуры;
2. Внутренняя точка полигона со значениями координат, полученными, например, осреднением координат всех точек, образующих полигон; служит для его идентификации (см. метка); в случае невыпуклого полигона или составного полигона, включающего внутренние полигоны -- "острова", анклавы, ее положение может не совпадать с центром тяжести полигона (Ц. в первом значении).
Я склонен доверять этому определению и интуитивно для плоских фигур отождествляю эти понятия. Цитирую справку ESRI
CENTROID for polygon: the center of gravity (centroid) of the polygon will be used.
В гидрологии центр тяжести применяется в традиционных методах расчета стока на неизученных бассейнах, что отражено в соответствующих нормативных документах (СНиПы и СП), поэтому мы его иногда применяем.

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 12 апр 2009, 19:04
Максим Дубинин
Что-то я запутался в этих определениях, мне кажется или в первом пункт 2 противоречит пункту 1 в части про невыпуклые полигоны или просто у центроида 2 определения (ArcGIS как я понимаю считает 1). Т.е., читая его буквально:
1. центроид <> внутренняя точка
2. центроид = внутренняя точка

Теперь еще соображение, возьмем объект типа круга с длинной тонкой "ручкой". Где его геометрический центр? Наверное где-то посередине этой тонкой ручки. Если мы как автор топика воткнем в него иглу и попробуем поставить на нее, что случится? Завалится, одна из частей явно тяжелее другой. Или мне кажется?

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 12 апр 2009, 21:42
Журавлёв
Я рассматривал пункт 2 как уточнение пункта 1 для сложных составных полигонов.
Проверил на дырявом полигоне, при увеличении дырки центр тяжести, рассчитанный в Arcgis, смещается.
На рисунке: 1 и 2 - дырки. Ц1 и Ц2 - координаты центров тяжести дырявых полигонов с соответствующими дырками 1 и 2.

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 13 апр 2009, 03:33
Boris
Я не могу сказать совпадает ли центроид с центром тяжести плоской фигуры, но одно я знаю точно - рассчитывается центроид очень быстро. Так что алгоритм не может быть сильно заумным.
-----
Для MapInfo:
a) фигура с дыркой и без дырки, имеет один и то же Centroid
Clipboard104.jpg
Clipboard104.jpg (10.86 КБ) 24894 просмотра
b) "сковородка" имеет Centroid, размещенный в начале "ручки"
Clipboard103.jpg
Clipboard103.jpg (11.4 КБ) 24899 просмотров
c) в такой фигуре
Clipboard105.jpg
Clipboard105.jpg (14.87 КБ) 24890 просмотров
Centroid выглядит не соответствующим любому определению :shock:

Видимо существует несколько определений (или реализаций) Centroid

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 13 апр 2009, 03:56
Максим Дубинин
Борис, Журавлев, спасибо за иллюстрации, только я сам собирался тоже самое сделать :)
А сковородка таки заваливается, согласно предсказанию.

Вот мои произведения, Arcview GIS, Polygon.ReturnCenter + прямоугольник охвата вокруг них. Заодно прилагаю сам шейп на случай если вдруг кто-то захочет сравнить что получается для тех же фигур в другом ПО. Было бы интересно.
skovorodka.gif
И все-таки центр масс здесь непричем
skovorodka.gif (2.28 КБ) 24890 просмотров
serp.gif
serp.gif (2.54 КБ) 24890 просмотров
hole1.gif
hole1.gif (3.02 КБ) 24892 просмотра
hole2.gif
hole2.gif (3.09 КБ) 24895 просмотров
cross.gif
Крест
cross.gif (2.11 КБ) 24893 просмотра
1.7z
(1.58 КБ) 812 скачиваний

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 13 апр 2009, 08:46
Журавлёв
в ArcGIS 9.3 - Data Management Tools-Feature-Feature To Point
Очевидно, что крест и серп на иголке не подвесишь, поэтому центроиды получились внутри дырок. Кстати, существует еще опция Inside, с использованием которой результаты получились аналогичными результатам sim.

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 13 апр 2009, 11:00
geologic
Когда-то давно разбирали этот вопрос. По-моему, в ArcINFO даже было описание на эту тему... Центроид мол считается как центр тяжести, а потом сдвигается перпендикулярно оси пока не попадет внутрь фигуры.
Поскольку считается простым способом, без особого анализа формы, то может не совпадать с истинным ЦТ. IMHO векторно ЦТ непросто вычислить, вряд ли есть готовый алгоритм. Обычно применяют разбиение на треугольники и тп. Или подобно грид в результате по регулярной сетке, только с неявной дискретностью - как правило, совпадающей с точностью координат. Т.е. долгая процедура.

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 17 апр 2009, 02:31
BlackRead
Boris писал(а): Я не могу сказать совпадает ли центроид с центром тяжести плоской фигуры...
Центроид не имеет к центру тяжести никакого отношения. Обычно это фиктивный объект, который находится внутри (с точки зрения топологии) площадного объекта. Пространственно, он может иметь любое расположение, удовлетворяя главному и единственному условию. Его задача раньше сводилась к тому, чтобы иметь ассоциативную связь с непространственными атрибутами объекта. В последнее время все развитые продукты для ГИС имеют встроенные топологические анализаторы и непосредственное оперирование пользователями центроидами редко, когда нужно. А, вот, грамотное расположение центроида - задача ещё та! Автомат их лепит куда ни попадя, а часто центроиды подписывают (подписывали). Поэтому приходилось для цивильной карты после авторасстановки центроидов, ручками пробегать по ней и переносить их в наиболее свободные места(из ручки сковородки в саму тарелку, e.g.), где и кликать удобнее, и подписи помещаются.
Извините за возможный оффтопик! Тему не читал, только сообщение от Boris.
--
Маша

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 17 апр 2009, 02:46
BlackRead
geologic писал(а):IMHO векторно ЦТ непросто вычислить, вряд ли есть готовый алгоритм.
Естественно, есть!!! Вы полагаете, что этот вопрос впервые заинтересовал именно вас? (без обид ;) А как тогда сделали все графические векторные редакторы, а системы черчения (типа AutoCAD, MicroStation...), а системы проектирования (типа SolidEdge, I/EMS), а ракеты как запустили...?!!
Ищем книги с названиями подобными самосфантазированнаму - "Алгоритмы компьютерной графики". Издания, эдак, годов 70-х - 80-х. Скорее всего, перевод. В библиотеках, типа ГПНТБ в Москве, по меж.библ.абонементу, в Инете или где-то воруем...
Уже давно всё описано (по крайней мере, математика для геоинформатики). Не изабритайте виласипеды! Читайте сначала книги, потом берите в руки манипуляторы типа "мышь" и киборды.
Короче, "Учите матчасть!" - говорил (по рассказам) прапор моего недавнего бойфренда.
--
Маша

Re: Найти "центр тяжести" полигона и отметить его точкой

Добавлено: 17 апр 2009, 07:00
Izdolt
BlackRead писал(а):
geologic писал(а):IMHO векторно ЦТ непросто вычислить, вряд ли есть готовый алгоритм.
Естественно, есть!!! Вы полагаете, что этот вопрос впервые заинтересовал именно вас? (без обид ;)
Уже давно всё описано (по крайней мере, математика для геоинформатики). Не изабритайте виласипеды! Читайте сначала книги, потом берите в руки манипуляторы типа "мышь" и киборды.
Короче, "Учите матчасть!" - говорил (по рассказам) прапор моего недавнего бойфренда.
--
Вы меня тоже извините, но я не очень понял - зачем Вы вообще написали свое сообщение? Ответить: "Учите матчасть" - можно на 99,9% вопросов, задаваемых на этом форуме. То, что уже "все давно придумано" - никто не сомневался и я, задавая этот вопрос, конечно это учитывал и именно поэтому спрашивал - не знает ли кто ответ? И в данном случае послать в московские библиотеки - примерно равносильно тому, что просто послать...

2All: Спасибо за предложенные варианты. Мне как раз был нужен "центр тяжести" для Иркутской области - а она по форме отдаленно напоминает "сковородку"... хотя честно сказать я так до конца и не уверен, что полученная точка - это именно то, что мне нужно - хоть и в самом деле вырезай из картона и накалывай на иголку :-)