Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать расстояние между координатами на карте 
V
    Опции темы
Cache
Дата 12.3.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Здравствуйте!
Делаю проект на PHP и api яндекс карт
Можно ли в PHP вычислить расстояние (например в метрах) между двумя точками на карте
точки для примера:
37.63 55.75 и 37.61 55.75
между ними чуть больше 1 км.
PM MAIL   Вверх
ksnk
Дата 12.3.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



А какие проблемы? Немного тригонометрии, гугла и магии ;) Радиус земли можно поискать в Гугле, остальное - в учебнике тригонометрии, магия - для демонстрации результата...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 12.3.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Cache, а в АПИ нет никакого метода?
можно и посчитать, но для эллипсоида это сложнее, чем для шара. кроме того, что Земля - не идеальный эллипсоид.
PM MAIL   Вверх
solenko
Дата 12.3.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(ksnk @  12.3.2010,  16:06 Найти цитируемый пост)
Немного тригонометрии

Ну не тригонометрии, а сферический геометрии...
Но гугл, естественно, поможет


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Cache
Дата 12.3.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



skyboy, в API есть функция только для JS
расстояния, между которыми нужно будет искать длину пути, у меня совсем небольшие - около 100км., что по земным меркам не особо внушительно) поэтому и сфера должна подойти
сейчас попробую написать скрипт, после - выложу исходник
PM MAIL   Вверх
Cache
Дата 12.3.2010, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



мм, вот например:

S = 111,2×arccos(sin φ1 × sin φ2 + cos φ1 × cos φ2 × cos (L2-L1)),
где S - расстояние, км;
φ1 и L1 - широта и долгота точки 1 (для северной широты и восточной долготы со знаком плюс, для южной широты и западной долготы со знаком минус), градусы;
φ2 и L2 - широта и долгота точки 2, градусы;
константа 111,2 - средняя длина дуги в один градус на поверхности Земли, км.

отсюда

тогда все просто:
Код

function echoDistance($s1,$d1,$s2,$d2){
    return 111.2 * acos(sin($s1)*sin($s2) + cos($s1) * cos($s2) * cos($d2-$d1));
}
echo round(echoDistance(55.771033,37.64309,55.78245,37.669182),2)."km";

выдает - 2.44km
но яндекс по тем же координатам выдает - 2.09 км.
из-за чего такая погрешность? действительно из-за формы планеты?

*UPDATE*
попробовал еще 2 раза с другими координатами - погрешность стала гораздо ниже - на 25км - 200м
в принципе меня такая ситуация устраивает, но если возможно что-то точнее - буду рад если поделитесь)

всем спасибо!

Это сообщение отредактировал(а) Cache - 12.3.2010, 19:04
PM MAIL   Вверх
wOOx
Дата 12.3.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 20.12.2009

Репутация: нет
Всего: нет



ну я бы вообще считал для плоскости
мне кажется, холмистость местности может повлиять на точность результата сильнее, чем форма планеты smile
PM MAIL   Вверх
solenko
Дата 12.3.2010, 19:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Погрешность вызвана тем, что в одном градусе очень разное количество километров в зависимости от широты.
Сравните, сколько километов между меридианами на экваторе и на полюсе )

Добавлено через 3 минуты и 40 секунд
Цитата(wOOx @  12.3.2010,  18:07 Найти цитируемый пост)
ну я бы вообще считал для плоскости

ну, приведенный код и считает для плоскости


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 13.3.2010, 12:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Cache @  12.3.2010,  18:56 Найти цитируемый пост)
 acos(sin($s1)*sin($s2) + cos($s1) * cos($s2) * cos($d2-$d1));...
echoDistance(55.771033,...

Мой экспириенс в тригонометрии невысок, однако меня смушает в этой формуле отсутствие магического числа Pi и тот факт, что синус - периодическая функция с периодом 2*Pi...

Если вообразить себе гео-сферическую систему координат, вообразить себе , что земля нифига не геоид, а идеальная сфера, считать, что точки, между которыми нужно мерить расстояние расположены близко друг к другу, помянуть незлым тихим словом Евклида и наплевать на сферическую геометрию, порисовать все это добро на бумажке, немного бумажку почирикать, то вполне вероятно, получится что-то такое:
длина минуты (1 градус) широты = 2*Pi*R/360, где Pi и в Африке Pi, а R - радиус Земли. Длина же минуты долготы будет примерно такой = 2*Pi*R*cos(M_PI*$s1/180)/360, где $s1 - одна из "широт" (они расположены близко!).
Итого, формула вычисления расстояния по координатам, после не очень сложных сокращений, будет примерно такой.
Код

function echoDistance($s1,$d1,$s2,$d2){
    return 111.2 *sqrt(pow(($s1-$s2),2)+pow(($d1-$d2)*cos(M_PI*$s1/180),2));
};
echo round(echoDistance(55.771033,37.64309,55.78245,37.669182),2)."km";

Что дает нам 2.07км для заявленных координат. Примерно похоже на то, что дает нам гугл в неисповедимой мудрости его...



Это сообщение отредактировал(а) ksnk - 13.3.2010, 12:02


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ReDComraD
Дата 7.6.2010, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.6.2010

Репутация: нет
Всего: нет



ksnk - Спасибо Тебе большое, действительно формула Твоя дает очень точный результат и не надо API гугла загружать для высчита расстояния.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.