View Issue Details

IDProjectCategoryView StatusLast Update
0001116SAS.ПланетаХотелка / Feature requestpublic30-09-2013 21:04
ReporterTolik Assigned To 
PrioritylowSeverityfeatureReproducibilityN/A
Status confirmedResolutionopen 
Product Version110418 
Target Version44xxxx 
Summary0001116: При измерении расстояний отображать линии в виде дуг
DescriptionСейчас расстояние между двумя точками измеряется по кратчайшему расстоянию между ними, но на карте изображается отрезок вместо дуги.

Во-первых, это сбивает с толку: непонятно, что мы измерили. Например, если поставить 2 точки на 60-й параллели от меридиана 50 до 130, получится 4189 км (это кратчайший путь). А если на том же самом отрезке поставить несколько промежуточных точек, получится 4476 км (это - грубо - расстояние вдоль параллели). Но визуально разницы нет.

Во-вторых, просто очень хочется видеть, какой именно путь самый короткий.
Additional InformationGE даёт примерно тот же результат, но рисует дуги.
Tagsлинейка

Relationships

parent of 0001188 resolvedzed Алгоритм проецирования точки на эллипсоиде 
parent of 0002088 resolvedzed Добавить в IDatum функцию построения N промежуточных точек отрезка 
related to 0001021 resolvedzed Измерение растояния 

Activities

vdemidov

16-01-2012 06:06

manager   ~0004998

Когда кто-нибудь напишет процедуры для работы с "Большим кругом" на эллипсоиде можно будет подумать. Нужна процедура разбиения отрезка на части, процедура проецирования точки по азимуту и расстоянию. Это по минимуму. А пока увы.

zed

30-09-2013 18:07

manager   ~0012996

Сейчас вроде есть всё необходимое, чтобы рисовать дугу?

Алгоритм мне видится такой:
1. Берём 2 точки, между которыми нужно нарисовать дугу и измеряем расстояние между ними (TDatum.CalcDist). При этом, мы получаем начальный азимут.
2. Делим расстояние на 2 и используя начальный азимут из предыдущего шага, находим координаты промежуточной точки.
3. Собственно, можем рисовать дугу.

У меня только возник вопрос, где у нас происходит отрисовка этой линии/дуги? В TCalcLineLayer только рендерится текст, но в параметрах присутствует IPathOnMapEdit. Кто его рисует? Мы там можем определить, что рисуем именно линейку, а не путь, чтобы рисовать дугу (TBitmap32.Canvas.Arc). Или можно рисовать дуги и для путей?

zed

30-09-2013 19:25

manager   ~0012997

Доработал 0002088 - теперь у IDatum можно сразу попросить эту промежуточную точку, без лишних телодвижений.

Теперь вопрос, как это нарисовать? Хочется рисовать именно дугу, а не несколько ломанных линий.

vdemidov

30-09-2013 20:37

manager   ~0012998

А зачем дугу? ИМХО гораздо проще таки ломаную линию, просто нужно правильно подбирать количество промежуточных точек. Делать это нужно на этапе построения спроецированной линии. Я представляю себе это как-то так:
1. Есть 2 точки в LonLat.
2. Получаем их спроецированные координаты.
3. Смотрим расстояние в пикселях.
4. Сравниваем расстояние, если меньше какого-то определенного числа, то вообще оставляем как есть.
5. Если больше то разбиваем на количество точек пропорциональное расстоянию в пикселах, но не больше максимального.
5а. Как вариант (только сейчас придумал), разбивать отрезок напополам и смотреть насколько промежуточная точка отличается простой середины отрезка и если она больше порогового значения в 2-10 пикселей, то повторять процедуру для каждого из полученных отрезков.

vdemidov

30-09-2013 20:41

manager   ~0012999

Для варианта 5а нужно не забывать, что расстояние в пикселах нужно считать ближайшее через 0-й или 180-мередиан, а то получим бесконечную рекурсию.

zed

30-09-2013 20:41

manager   ~0013000

>А зачем дугу?
А почему нет? Чем тебе не нравится вызов Canvas.Arc с четырьмя параметрами, который нарисует честную дугу без всяких аппроксимаций.

vdemidov

30-09-2013 20:47

manager   ~0013001

Ну хотя бы тем, что их понадобиться пробрасывать через кучу уровней включая кэширование и 2 трансформации. Я не возьмусь такое реализовывать и потом поддерживать.

vasketsov

30-09-2013 21:01

manager   ~0013004

>пробрасывать через кучу уровней включая кэширование и 2 трансформации
Почему не сделать как отдельный тип геопримитива?
Те же метки в виде окружности можно сделать честными, а не 64-угольниками.
И дуги можно (окружность будет как частный случай дуги).

vasketsov

30-09-2013 21:04

manager   ~0013006

Проблема конечно будет с операциями над полигонами и окружностями, типа вычитания или объединения, но их пока нет.

Issue History

Date Modified Username Field Change
16-01-2012 04:57 Tolik New Issue
16-01-2012 04:58 Tolik Status new => acknowledged
16-01-2012 04:58 Tolik Description Updated
16-01-2012 05:00 Tolik Description Updated
16-01-2012 05:11 Tolik Additional Information Updated
16-01-2012 06:06 vdemidov Note Added: 0004998
16-01-2012 09:49 gpsMax Tag Attached: линейка
27-01-2012 21:29 vdemidov Status acknowledged => confirmed
27-01-2012 21:29 vdemidov Product Version .Nightly => 110418
27-01-2012 21:29 vdemidov Target Version => 44xxxx
27-02-2012 08:56 vdemidov Relationship added parent of 0001188
08-10-2012 14:19 vdemidov Relationship added related to 0001021
13-08-2013 12:47 vdemidov Relationship added parent of 0002088
30-09-2013 18:07 zed Note Added: 0012996
30-09-2013 19:25 zed Note Added: 0012997
30-09-2013 20:37 vdemidov Note Added: 0012998
30-09-2013 20:41 vdemidov Note Added: 0012999
30-09-2013 20:41 zed Note Added: 0013000
30-09-2013 20:47 vdemidov Note Added: 0013001
30-09-2013 21:01 vasketsov Note Added: 0013004
30-09-2013 21:04 vasketsov Note Added: 0013006
08-08-2025 13:24 zed Category Хотелка => Хотелка / Feature request