Невозможно сопоставить расстояние, вычисленное в геокодере

Согласно официальному документу геокодера:

Расстояние между Эйфелевой башней и Эмпайр Стейт Билдинг

Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655])

=> 3619.77359999382 # в настроенных единицах (миль по умолчанию)

def geodistance
   render json: Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655])
end

В моем случае я получаю следующее значение:

=> 3648.3340765758867

Конфигурации юнитов не изменились, не знаю, что может пойти не так!


person srs    schedule 03.08.2017    source источник
comment
Вы говорите, что оба результата исходят от Geocoder, или ваш результат рассчитывается по-другому?   -  person Phylogenesis    schedule 03.08.2017
comment
Первый (3619.77359999382) соответствует этому документу: github.com/alexreisner/geocoder, а 3648.3340765758867 — когда я бегу   -  person srs    schedule 03.08.2017
comment
Попробуйте поместить Geocoder::Calculations.di.... в переменную и распечатать ее. Затем передайте эту переменную в render json: <variable> и сравните разницу   -  person Abhi    schedule 03.08.2017
comment
Я считаю, что второй запрос является правильным расстоянием. Ваш первый запрос использует SQLite, то есть выполняется в среде разработки с базой данных SQLite? При использовании SQLite Geocoder автоматически использует меньше точный алгоритм поиска объектов вблизи заданной точки.   -  person BigRon    schedule 03.08.2017
comment
Ввод в переменную и печать также дают 3648.3340765758867.   -  person srs    schedule 03.08.2017
comment
@BigRon Я использую Postgres и Postgis. Первый запрос соответствует официальным иллюстрациям документа Geocoder.   -  person srs    schedule 03.08.2017
comment
@srs Postgis несовместим с Geocoder для дистанционных запросов   -  person BigRon    schedule 03.08.2017
comment
@BigRon Postgis является расширением Postgres, и я предполагаю, что это не должно быть ошибкой? как по умолчанию он должен получить доступ. Я использую метод geocoded_by и т. д. в модели и типе данных как: float и string, в отличие от типов данных postgis для rgeo: st_point и т. д. Поправьте меня, если я ошибаюсь   -  person srs    schedule 03.08.2017
comment
@srs Я знаю, что Postgis является расширением Postgres. С Postgis вы по-прежнему МОЖЕТЕ выполнять geocoded_by; однако вы не можете выполнять расчеты расстояния через Geocoder. Расчет расстояния должен выполняться другим способом, например rgeo.   -  person BigRon    schedule 03.08.2017
comment
@Big А можно поточнее? Я не храню какие-либо типы данных Postgis в своей активной записи для этой модели. Для этой модели используются следующие типы данных: lat: float, long: float и last_location:string. Если я использую Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655]), почему это будет проблемой в этом случае?   -  person srs    schedule 03.08.2017
comment
@srs ааа. Я слышу тебя. Вы вообще не пытаетесь использовать тип данных Postgis... так что это не имеет значения.   -  person BigRon    schedule 03.08.2017
comment
Правильно @Большой   -  person srs    schedule 03.08.2017


Ответы (2)


irb(main):001:0> require 'geocoder'
true
irb(main):002:0> Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655])
3648.3340765758867

Это мой образец вывода.

ИМО: Возможно, вы использовали разные версии ruby ​​или gem в каждом случае или что-то в этом роде... Было бы неплохо узнать, в каких средах выполняются оба этих примера кода.

Используйте источник, Люк!

РЕДАКТИРОВАТЬ:

Может быть что-то в этой части кода:

a = (Math.sin(dlat / 2))**2 + Math.cos(point1[0]) *
          (Math.sin(dlon / 2))**2 * Math.cos(point2[0])
c = 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1-a))
c * earth_radius(options[:units])
person Lun4i    schedule 03.08.2017
comment
Спасибо @Aitzhan. 3648.3340765758867 также то, что я получил при запуске. Другой соответствует документу, и я думаю, что он уже не актуален. - person srs; 03.08.2017
comment
Я проверил источник и метод distance_between() даже не было затронуто за 6 лет согласно GitHub. Странно, что их документация не совпадает. - person Phylogenesis; 03.08.2017
comment
Можете ли вы также проверить эти точки: Geocoder::Calculations.distance_between([12.936992, 77.627002], [12.848925, 77.651733]) Результат, который я получил: 6.3087039709946735 - person srs; 03.08.2017
comment
получил: 6.3087039709946735 - person Lun4i; 03.08.2017
comment
Именно то, что я думал, что это будет. Теперь самое приятное то, что даже если мы предположим, что обе наши настройки среды в порядке, это значение (6,3087039709946735 в милях или 10,152874887374361 в км) не соответствует функции направления Google Map, расстояние точек GMap составляет 13,9 км. так как я добавляю функцию ближайших пользователей в свой проект, где я говорю, что пользователь находится в 10 км, а на карте Google - в 13,9 км. это может привести к огромному разочарованию. Кто-нибудь, пожалуйста, поделитесь информацией о том, как сопоставить расстояние геокодера со значениями направления GMap. @Aitzhan Можете ли вы также проверить мои выводы на карте Google? - person srs; 03.08.2017
comment
Просто примечание: Geocoder использует формулу гаверсина для расчета расстояния. К сожалению, это только приближение, так как оно точно только для сферических объектов, а планета на самом деле немного толще вокруг экватора, чем от полюса к полюсу. Вполне может быть, что в формулах Google используется более точная модель Земли. - person Phylogenesis; 03.08.2017
comment
@srs Если вы хотите, чтобы расчет расстояния соответствовал направлениям GMap (расстояние зависит от дорог или другого пути движения), почему бы вам не использовать API Карт Google для расчета расстояния по направлению? Или есть варианты с открытым исходным кодом, такие как OSRM. Я обновил это, указав правильную ссылку на маршрутизацию OSRM. - person BigRon; 03.08.2017
comment
Вот ваш путь прохождения расстояния через OSRM, который точно соответствует пути путешествия через GMaps: ?overview=false" rel="nofollow noreferrer">router.project-osrm.org/route/v1/driving/. Итоговое расстояние в OSRM составляет 13,1 км. Опять же, это путь движения, а не сферическое расстояние между двумя точками на земном шаре. - person BigRon; 03.08.2017
comment
Хорошая заметка @Phylogenesis. Конечно, BigRon, я дам глубокое погружение, если кто-то еще интересно придумает какой-либо другой способ обойти проблему, пожалуйста, поделитесь. - person srs; 03.08.2017
comment
Честно говоря, я не знал, что вы сравниваете вывод геокодера с выводом механизма маршрутизации. Геокодер использует расстояние по прямой, в то время как OSRM вычисляет расстояние в соответствии с дорожная сеть. - person Phylogenesis; 03.08.2017
comment
Я думал, он использует Google Api для поиска. но это только для геокодирования. Любые предложения по передовым методам получения расстояния через дорожную сеть - person srs; 03.08.2017

Прочитайте меня значение расстояния в документе :=> 3619,77359999382 равно устарело.

person srs    schedule 03.08.2017