View Issue Details

IDProjectCategoryView StatusLast Update
0002276SAS.ПланетаХотелка / Feature requestpublic28-11-2013 06:15
Reporterzed Assigned Tozed  
PrioritynormalSeverityminorReproducibilityN/A
Status resolvedResolutionfixed 
Product Version131111 
Target Version140303Fixed in Version140303 
Summary0002276: Добавить альтернативный алгоритм расчёта расстояний
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 и с использованием либы проблем быть не должно.
Additional InformationТеоретическое обоснование алгоритма: Algorithms for geodesics by Karney (2012)
TagsNo tags attached.
Attached Files
geodesic.zip (14,575 bytes)

Activities

vdemidov

27-11-2013 13:13

manager   ~0013339

Может прост дождемся реализации в proj4 и просто заюзаем его, раз уж все равно пользуемся этой dll?

zed

27-11-2013 13:16

manager   ~0013340

Да вот мне загорелось и хочется попробовать прямо сейчас :) Поэтому сделаю пока отдельной либой, а как обновится proj4, можно будет перейти и на него.

Алгоритм Винсента выбрасывать по-любому не буду и он будет использоваться в случае если либа будет недоступна.

vdemidov

27-11-2013 14:08

manager   ~0013341

Ну, тогда может стоит передавать в датум уже готовые алгортимы вычисления площади и расстояния, а не создавать в конструкторе. Тогда фабрика датумов сможет управлять этим всем хозяйством.

zed

27-11-2013 20:57

manager   ~0013343

Пока что сделал в лоб.

И столкнулся с проблемой в dll: там объявляется переменная double NaN (назначение аналогично дельфийской константе NAN, которая объявлена как NAN = 0.0/0.0), которой при инициализации присваивается значение NaN = sqrt(-1.0) и на этой вот строчке либа вылетает с ошибкой floating point operation.

zed

28-11-2013 06:14

manager   ~0013346

Last edited: 28-11-2013 06:14

Сделал так:

> *(long long*)&NaN = 0x7ff8000000000000;

там внутри либы этот NaN используется только для возвращения наружу неопределённого результата (при каких-либо ошибках), так что проблем не будет.

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
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
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
08-08-2025 13:24 zed Category Хотелка => Хотелка / Feature request