View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0001116SAS.Планета[All Projects] Хотелкаpublic16-01-2012 04:5730-09-2013 21:04
ReporterTolik 
Assigned To 
PrioritylowSeverityfeatureReproducibilityN/A
StatusconfirmedResolutionopen 
PlatformOSOS Version
Product Version110418 
Target Version29xxxxFixed in Version 
Summary0001116: При измерении расстояний отображать линии в виде дуг
DescriptionСейчас расстояние между двумя точками измеряется по кратчайшему расстоянию между ними, но на карте изображается отрезок вместо дуги.

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

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

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

-  Notes
(0004998)
vdemidov (manager)
16-01-2012 06:06

Когда кто-нибудь напишет процедуры для работы с "Большим кругом" на эллипсоиде можно будет подумать. Нужна процедура разбиения отрезка на части, процедура проецирования точки по азимуту и расстоянию. Это по минимуму. А пока увы.
(0012996)
zed (manager)
30-09-2013 18:07

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

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

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

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

Теперь вопрос, как это нарисовать? Хочется рисовать именно дугу, а не несколько ломанных линий.
(0012998)
vdemidov (manager)
30-09-2013 20:37

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

Для варианта 5а нужно не забывать, что расстояние в пикселах нужно считать ближайшее через 0-й или 180-мередиан, а то получим бесконечную рекурсию.
(0013000)
zed (manager)
30-09-2013 20:41

>А зачем дугу?
А почему нет? Чем тебе не нравится вызов Canvas.Arc с четырьмя параметрами, который нарисует честную дугу без всяких аппроксимаций.
(0013001)
vdemidov (manager)
30-09-2013 20:47

Ну хотя бы тем, что их понадобиться пробрасывать через кучу уровней включая кэширование и 2 трансформации. Я не возьмусь такое реализовывать и потом поддерживать.
(0013004)
vasketsov (manager)
30-09-2013 21:01

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

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

- Users who viewed this issue
User List Anonymous (1534x), Tolik (1x), vdemidov (3x)
Total Views 1538
Last View 19-02-2020 22:49

- 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 View Revisions
16-01-2012 05:00 Tolik Description Updated View Revisions
16-01-2012 05:11 Tolik Additional Information Updated View Revisions
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 => 29xxxx
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 vdemidov Note Added: 0013005
30-09-2013 21:04 vdemidov Note Deleted: 0013005
30-09-2013 21:04 vasketsov Note Added: 0013006



Copyright © 2007 - 2020 SAS.Planet Team