SASGIS - SAS.Планета
View Issue Details
0001641SAS.Планета[All Projects] Хотелкаpublic19-10-2012 17:3423-02-2013 11:06
Fetser 
zed 
normalminorsometimes
resolvedfixed 
WindowsXPSP3
121010 
131111131111 
0001641: Считать площадь сложных полигонов хотя-бы приблизительно
Неоднократно писал данную хотелку, но к сожалению количество полигонов при подсчёте площади которых выходит NAN м2 достаточно велико. После каждого исправления методов расчёта "стало лучше, но работать пока нельзя"
И что обидно Глобал Мапер считает любые полигоны.
No tags attached.
? Чебоксары.kmz (28,044) 19-10-2012 17:34
http://www.sasgis.org/mantis/file_download.php?file_id=1110&type=bug
? Не считается.kmz (499) 23-10-2012 08:25
http://www.sasgis.org/mantis/file_download.php?file_id=1121&type=bug
? Считается.kmz (492) 23-10-2012 08:26
http://www.sasgis.org/mantis/file_download.php?file_id=1122&type=bug
Issue History
19-10-2012 17:34FetserNew Issue
19-10-2012 17:34FetserFile Added: Чебоксары.kmz
21-10-2012 17:21vdemidovNote Added: 0009648
21-10-2012 17:21vdemidovStatusnew => confirmed
21-10-2012 17:21vdemidovTarget Version => 50xxxx
22-10-2012 12:38FetserNote Added: 0009674
22-10-2012 12:43FetserNote Edited: 0009674bug_revision_view_page.php?bugnote_id=9674#r4689
22-10-2012 12:51FetserNote Edited: 0009674bug_revision_view_page.php?bugnote_id=9674#r4690
22-10-2012 14:28vdemidovNote Added: 0009677
22-10-2012 15:05TolikNote Added: 0009679
22-10-2012 15:14FetserNote Added: 0009680
22-10-2012 15:19TolikNote Edited: 0009679bug_revision_view_page.php?bugnote_id=9679#r4692
22-10-2012 15:20TolikNote Edited: 0009679bug_revision_view_page.php?bugnote_id=9679#r4693
22-10-2012 15:30FetserNote Edited: 0009680bug_revision_view_page.php?bugnote_id=9680#r4695
22-10-2012 18:15zedNote Added: 0009690
22-10-2012 18:21zedNote Added: 0009691
22-10-2012 18:26zedNote Added: 0009692
23-10-2012 08:25FetserNote Added: 0009708
23-10-2012 08:25FetserFile Added: Не считается.kmz
23-10-2012 08:26FetserFile Added: Считается.kmz
23-10-2012 08:41FetserNote Edited: 0009708bug_revision_view_page.php?bugnote_id=9708#r4716
23-10-2012 11:12FetserNote Edited: 0009708bug_revision_view_page.php?bugnote_id=9708#r4726
02-11-2012 07:16TolikNote Added: 0009810
02-11-2012 07:17TolikFile Added: SASPlanet.Debug.elf
02-11-2012 08:27vdemidovNote Added: 0009813
18-02-2013 13:01zedFile Added: SASPlanet.PolyTest.7z
18-02-2013 13:10zedNote Added: 0010583
18-02-2013 16:13zedNote Added: 0010584
18-02-2013 16:14zedFile Deleted: SASPlanet.PolyTest.7z
18-02-2013 16:40zedFile Added: SASPlanet.7z
18-02-2013 16:43zedNote Edited: 0010584bug_revision_view_page.php?bugnote_id=10584#r5144
18-02-2013 21:41vdemidovNote Added: 0010586
19-02-2013 04:51zedNote Added: 0010587
22-02-2013 13:41zedProjectSAS.Планета => SACS.Планета
22-02-2013 13:42zedStatusconfirmed => resolved
22-02-2013 13:42zedResolutionopen => fixed
22-02-2013 13:42zedAssigned To => zed
22-02-2013 13:42zedFile Deleted: SASPlanet.7z
22-02-2013 13:42zedFile Deleted: SASPlanet.Debug.elf
23-02-2013 09:28vdemidovProjectSACS.Планета => SAS.Планета
23-02-2013 11:06zedFixed in Version => 131111
23-02-2013 11:06zedTarget Version50xxxx => 131111

Notes
(0009648)
vdemidov   
21-10-2012 17:21   
Жду алгоритма, который посчитает эту площадь. А пока есть то что есть.
(0009674)
Fetser   
22-10-2012 12:38   
(edited on: 22-10-2012 12:51)
Версия SASPlanet_101206 такие полигоны считает (может конечно и неточно). А нельзя ли сделать так что если новая версия не может посчитать, то вместо выдачи NAN программа такие полигоны считала по методу что был в SASPlanet_101206?
Насчёт точности, если верить глобалмаперу то полигон 6890,4 кв.км а SASPlanet_101206 считает 5579,67 кв. км Расхождение есть но лучше чем ничего.

а вот сравнение простого полигона:
GlobalMapper 26854 кв. км
SASPlanet_121010 27072 кв. км
SASPlanet_101206 29313 кв. км

(0009677)
vdemidov   
22-10-2012 14:28   
Это не полигон. Это фрактал какой-то. Я пас.
(0009679)
Tolik   
22-10-2012 15:05   
(edited on: 22-10-2012 15:20)
Заинтересовался, что за фрактал, тоже открыл :)
Да ладно, ничё особенного.

Я не знаю, как это по науке считать, но придумал, как оцениить прямо сейчас.
Кликаем на полигон пр.кн., выбираем операции с выдел. областью, скачать.
САС показывает 16123 тайла на зуме 16 (больше зум - дольше думать будет, зато точнее), осталось умножить на площадь тайла где-то в центре этой области. Нарисовал полигон в 1 тайл z16, площадь его показывает 460434 м2. Итого 7423 км2 - грубо, конечно, и больше чем на самом деле (т.к. тайлы за края залазят).

Короче, это можно автоматизировать и сделать точнее, поделив площадь краевых тайлов пополам.

P.S. z18: 244684 тайла x 28630.31 m2 = 7005 км2

(0009680)
Fetser   
22-10-2012 15:14   
(edited on: 22-10-2012 15:30)
>Я не знаю, как это по науке считать
А наука их именно так и создаёт. Рассчитывается по определённой формуле каждый пиксель растрового изображения на предмет того входит в зону или не входит. И полученное растровое изображение переводится в вектор. Так что по сути данный расчёт площади для таких типов полигонов самый верный. Радиомобайл вообще суммирует закрашенные пиксели растрового изображения и перемножает на среднюю площадь одного пиксела. И точность расчёта будет очень высокая потому что, не смотря на сложный внешний вид, это изуродованный рельефом круг.

(0009690)
zed   
22-10-2012 18:15   
Я так понимаю, что проблема из-за того, что полигон самопересекающийся?
Просто, на ура гуглятся алгоритмы расчёта площади многоугольника методом "отсечения ушей", где полигон разбивается на кучу треугольников, сумма площадей которых и даёт результат. Но про самопересечения там ни слова.
(0009691)
zed   
22-10-2012 18:21   
О, нашёл:

Changeset: 3111 (22c4a6ae68cf) сделал вычисление площади триангуляцией, теперь все точно.
User: azya
Date: 2011-03-24 17:24:38 +0300 (19 months)

...и потом было ещё несколько доработок этого метода.

Можно попробовать отрефакторить этот момент, но только надо поднять все старые баги с подсчётом площади, чтобы было на чём тестировать. Может помочь, если проблема не в алгоритме, а в реализации.
(0009692)
zed   
22-10-2012 18:26   
Либо, если тут действительно самопересечения портят всю малину, то надо искать алгоритм, который бы разбил самопересекающийся полигон на несколько нормальных, без самопересечения и считать уже по ним.

Fetser
А можете сделать маленький полигон, для которого выводит NAN?
(0009708)
Fetser   
23-10-2012 08:25   
(edited on: 23-10-2012 11:12)
Самопересечение тут не причём. Получил два совершенно одинаковых на внешний вид полигона один из них считается другой нет. Зависит от того какой по счёту является точка с совпадающими координатами. В полигоне какой не хочет считаться она вторая, а если полигон рисовать начиная с другой точки то он считается.

(0009810)
Tolik   
02-11-2012 07:16   
В версии 121102.6637 при попытке вывести информацию о метке Чебоксары вылетает floating point чё-то там. ELF прилагается.
(0009813)
vdemidov   
02-11-2012 08:27   
Ну эта авешка не совсем в тему этого бага, но уже пофиксил.
(0010583)
zed   
18-02-2013 13:10   
Удалось немного улучшить ситуацию - прикреплённые к тикету полигоны считаются.

Применил способ разбиения исходного полигона на относительно мелкие кусочки, и расчёт площади проходит уже для каждого отдельного куска. Площадь по-прежнему считает старый алгоритм и иногда он выдаёт NAN и, соответственно, площадь таких кусков игнорируется. Но в рамках этого тикета - считать хотя бы приблизительно, задачу можно считать решённой (если тестирование на прикреплённом exe будет удачным).
(0010584)
zed   
18-02-2013 16:13   
(edited on: 18-02-2013 16:43)
Нашёл ещё более удачный вариант - полигон сразу разбивается на треугольники, так что про старый алгоритм можно забыть как страшный сон.

Прикрепил exe. Изменения залил в vsasas

(0010586)
vdemidov   
18-02-2013 21:41   
А разве там не на плоские треугольники расчитано? Я пока не очень вникал, правда.
(0010587)
zed   
19-02-2013 04:51   
Там всё верно.