SASGIS - SAS.Планета
View Issue Details
0002276SAS.Планета[All Projects] Хотелкаpublic27-11-2013 13:0628-11-2013 06:15
zed 
zed 
normalminorN/A
resolvedfixed 
131111 
140303140303 
0002276: Добавить альтернативный алгоритм расчёта расстояний
Алгоритм Винсента (обратный), который сейчас используется в 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 и с использованием либы проблем быть не должно.
Теоретическое обоснование алгоритма: Algorithms for geodesics by Karney (2012)
No tags attached.
zip geodesic.zip (14,575) 28-11-2013 06:11
http://www.sasgis.org/mantis/file_download.php?file_id=1609&type=bug
Issue History
27-11-2013 13:06zedNew Issue
27-11-2013 13:06zedStatusnew => assigned
27-11-2013 13:06zedAssigned To => zed
27-11-2013 13:07zedDescription Updatedbug_revision_view_page.php?rev_id=5858#r5858
27-11-2013 13:13vdemidovNote Added: 0013339
27-11-2013 13:16zedNote Added: 0013340
27-11-2013 14:08vdemidovNote Added: 0013341
27-11-2013 20:57zedNote Added: 0013343
28-11-2013 06:11zedFile Added: geodesic.zip
28-11-2013 06:14zedNote Added: 0013346
28-11-2013 06:14zedNote Edited: 0013346bug_revision_view_page.php?bugnote_id=13346#r5860
28-11-2013 06:15zedStatusassigned => resolved
28-11-2013 06:15zedFixed in Version => 140303
28-11-2013 06:15zedResolutionopen => fixed

Notes
(0013339)
vdemidov   
27-11-2013 13:13   
Может прост дождемся реализации в proj4 и просто заюзаем его, раз уж все равно пользуемся этой dll?
(0013340)
zed   
27-11-2013 13:16   
Да вот мне загорелось и хочется попробовать прямо сейчас :) Поэтому сделаю пока отдельной либой, а как обновится proj4, можно будет перейти и на него.

Алгоритм Винсента выбрасывать по-любому не буду и он будет использоваться в случае если либа будет недоступна.
(0013341)
vdemidov   
27-11-2013 14:08   
Ну, тогда может стоит передавать в датум уже готовые алгортимы вычисления площади и расстояния, а не создавать в конструкторе. Тогда фабрика датумов сможет управлять этим всем хозяйством.
(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 используется только для возвращения наружу неопределённого результата (при каких-либо ошибках), так что проблем не будет.