SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0002276 | SAS.Планета | [All Projects] Хотелка | public | 27-11-2013 13:06 | 28-11-2013 06:15 |
|
Reporter | zed | |
Assigned To | zed | |
Priority | normal | Severity | minor | Reproducibility | N/A |
Status | resolved | Resolution | fixed | |
Platform | | OS | | OS Version | |
Product Version | 131111 | |
Target Version | 140303 | Fixed in Version | 140303 | |
|
Summary | 0002276: Добавить альтернативный алгоритм расчёта расстояний |
Description | Алгоритм Винсента (обратный), который сейчас используется в SAS, не всегда может рассчитать расстояние между двумя точками. И вот тому яркий пример: http://sasgis.org/forum/viewtopic.php?f=2&t=2211&start=10#p33545
Оказывается (внезапно), что есть ещё один популярный алгоритм, лишённый таких недостатков, да к тому же ещё и более быстрый (по заверениям). Этот алгоритм настолько втёрся в доверие, что его даже решили включить в состав proj4 в следующем релизе (4.9.xx).
Алгоритм уже реализован на нескольких популярных языках (к сожалению, Delphi среди них нету), в том числе и на Си: http://geographiclib.sourceforge.net/html/C/ но на счастье, там довольно простое API и с использованием либы проблем быть не должно. |
Steps To Reproduce | |
Additional Information | Теоретическое обоснование алгоритма: Algorithms for geodesics by Karney (2012) |
Tags | No tags attached. |
Relationships | |
Attached Files | geodesic.zip (14,575) 28-11-2013 06:11 http://www.sasgis.org/mantis/file_download.php?file_id=1609&type=bug |
|
Issue History |
Date Modified | Username | Field | Change |
27-11-2013 13:06 | zed | New Issue | |
27-11-2013 13:06 | zed | Status | new => assigned |
27-11-2013 13:06 | zed | Assigned To | => zed |
27-11-2013 13:07 | zed | Description Updated | bug_revision_view_page.php?rev_id=5858#r5858 |
27-11-2013 13:13 | vdemidov | Note Added: 0013339 | |
27-11-2013 13:16 | zed | Note Added: 0013340 | |
27-11-2013 14:08 | vdemidov | Note Added: 0013341 | |
27-11-2013 20:57 | zed | Note Added: 0013343 | |
28-11-2013 06:11 | zed | File Added: geodesic.zip | |
28-11-2013 06:14 | zed | Note Added: 0013346 | |
28-11-2013 06:14 | zed | Note Edited: 0013346 | bug_revision_view_page.php?bugnote_id=13346#r5860 |
28-11-2013 06:15 | zed | Status | assigned => resolved |
28-11-2013 06:15 | zed | Fixed in Version | => 140303 |
28-11-2013 06:15 | zed | Resolution | open => fixed |
Notes |
|
|
Может прост дождемся реализации в proj4 и просто заюзаем его, раз уж все равно пользуемся этой dll? |
|
|
(0013340)
|
zed
|
27-11-2013 13:16
|
|
Да вот мне загорелось и хочется попробовать прямо сейчас :) Поэтому сделаю пока отдельной либой, а как обновится proj4, можно будет перейти и на него.
Алгоритм Винсента выбрасывать по-любому не буду и он будет использоваться в случае если либа будет недоступна. |
|
|
|
Ну, тогда может стоит передавать в датум уже готовые алгортимы вычисления площади и расстояния, а не создавать в конструкторе. Тогда фабрика датумов сможет управлять этим всем хозяйством. |
|
|
(0013343)
|
zed
|
27-11-2013 20:57
|
|
Пока что сделал в лоб.
И столкнулся с проблемой в dll: там объявляется переменная double NaN (назначение аналогично дельфийской константе NAN, которая объявлена как NAN = 0.0/0.0), которой при инициализации присваивается значение NaN = sqrt(-1.0) и на этой вот строчке либа вылетает с ошибкой floating point operation. |
|
|
(0013346)
|
zed
|
28-11-2013 06:14
|
|
Сделал так:
> *(long long*)&NaN = 0x7ff8000000000000;
там внутри либы этот NaN используется только для возвращения наружу неопределённого результата (при каких-либо ошибках), так что проблем не будет.
|
|