SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0001116 | SAS.Планета | [All Projects] Хотелка | public | 16-01-2012 04:57 | 30-09-2013 21:04 |
|
Reporter | Tolik | |
Assigned To | | |
Priority | low | Severity | feature | Reproducibility | N/A |
Status | confirmed | Resolution | open | |
Platform | | OS | | OS Version | |
Product Version | 110418 | |
Target Version | 29xxxx | Fixed in Version | | |
|
Summary | 0001116: При измерении расстояний отображать линии в виде дуг |
Description | Сейчас расстояние между двумя точками измеряется по кратчайшему расстоянию между ними, но на карте изображается отрезок вместо дуги.
Во-первых, это сбивает с толку: непонятно, что мы измерили. Например, если поставить 2 точки на 60-й параллели от меридиана 50 до 130, получится 4189 км (это кратчайший путь). А если на том же самом отрезке поставить несколько промежуточных точек, получится 4476 км (это - грубо - расстояние вдоль параллели). Но визуально разницы нет.
Во-вторых, просто очень хочется видеть, какой именно путь самый короткий. |
Steps To Reproduce | |
Additional Information | GE даёт примерно тот же результат, но рисует дуги. |
Tags | линейка |
Relationships | parent of | 0001188 | resolved | zed | Алгоритм проецирования точки на эллипсоиде | parent of | 0002088 | resolved | zed | Добавить в IDatum функцию построения N промежуточных точек отрезка | related to | 0001021 | resolved | zed | Измерение растояния |
|
Attached Files | |
|
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 | bug_revision_view_page.php?rev_id=2487#r2487 |
16-01-2012 05:00 | Tolik | Description Updated | bug_revision_view_page.php?rev_id=2488#r2488 |
16-01-2012 05:11 | Tolik | Additional Information Updated | bug_revision_view_page.php?rev_id=2492#r2492 |
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 | |
Notes |
|
|
Когда кто-нибудь напишет процедуры для работы с "Большим кругом" на эллипсоиде можно будет подумать. Нужна процедура разбиения отрезка на части, процедура проецирования точки по азимуту и расстоянию. Это по минимуму. А пока увы. |
|
|
(0012996)
|
zed
|
30-09-2013 18:07
|
|
Сейчас вроде есть всё необходимое, чтобы рисовать дугу?
Алгоритм мне видится такой:
1. Берём 2 точки, между которыми нужно нарисовать дугу и измеряем расстояние между ними (TDatum.CalcDist). При этом, мы получаем начальный азимут.
2. Делим расстояние на 2 и используя начальный азимут из предыдущего шага, находим координаты промежуточной точки.
3. Собственно, можем рисовать дугу.
У меня только возник вопрос, где у нас происходит отрисовка этой линии/дуги? В TCalcLineLayer только рендерится текст, но в параметрах присутствует IPathOnMapEdit. Кто его рисует? Мы там можем определить, что рисуем именно линейку, а не путь, чтобы рисовать дугу (TBitmap32.Canvas.Arc). Или можно рисовать дуги и для путей? |
|
|
(0012997)
|
zed
|
30-09-2013 19:25
|
|
Доработал 0002088 - теперь у IDatum можно сразу попросить эту промежуточную точку, без лишних телодвижений.
Теперь вопрос, как это нарисовать? Хочется рисовать именно дугу, а не несколько ломанных линий. |
|
|
|
А зачем дугу? ИМХО гораздо проще таки ломаную линию, просто нужно правильно подбирать количество промежуточных точек. Делать это нужно на этапе построения спроецированной линии. Я представляю себе это как-то так:
1. Есть 2 точки в LonLat.
2. Получаем их спроецированные координаты.
3. Смотрим расстояние в пикселях.
4. Сравниваем расстояние, если меньше какого-то определенного числа, то вообще оставляем как есть.
5. Если больше то разбиваем на количество точек пропорциональное расстоянию в пикселах, но не больше максимального.
5а. Как вариант (только сейчас придумал), разбивать отрезок напополам и смотреть насколько промежуточная точка отличается простой середины отрезка и если она больше порогового значения в 2-10 пикселей, то повторять процедуру для каждого из полученных отрезков. |
|
|
|
Для варианта 5а нужно не забывать, что расстояние в пикселах нужно считать ближайшее через 0-й или 180-мередиан, а то получим бесконечную рекурсию. |
|
|
(0013000)
|
zed
|
30-09-2013 20:41
|
|
>А зачем дугу?
А почему нет? Чем тебе не нравится вызов Canvas.Arc с четырьмя параметрами, который нарисует честную дугу без всяких аппроксимаций. |
|
|
|
Ну хотя бы тем, что их понадобиться пробрасывать через кучу уровней включая кэширование и 2 трансформации. Я не возьмусь такое реализовывать и потом поддерживать. |
|
|
|
>пробрасывать через кучу уровней включая кэширование и 2 трансформации
Почему не сделать как отдельный тип геопримитива?
Те же метки в виде окружности можно сделать честными, а не 64-угольниками.
И дуги можно (окружность будет как частный случай дуги). |
|
|
|
Проблема конечно будет с операциями над полигонами и окружностями, типа вычитания или объединения, но их пока нет. |
|