Страница: 1 |
Страница: 1 |
Вопрос: Рассчет расстояния между двумя городами
Добавлено: 24.06.08 22:19
Автор вопроса: Сергеичъ
Помогите мне решить непростую задачку...
Мне необходимо рассчитать расстояние между городами (используя географические координаты-широту и долготу)
ВОПРОС: Как,зная координаты города отобразить эти координаты на форме проекта VB.NET?
Кто поможет всем огромное спасибо!!!
В долгу перед помошником не останусь!
Мой e-mail: Sergey.company@li.ru
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
JacK
ICQ: 9580088
Вопросов: 13
Ответов: 1078
Web-сайт:
Профиль | | #1
Добавлено: 24.06.08 22:32
Ежели тупо, нужно вычислить расстояние по прямой, то просто, как длинну вектора определяешь) Длина вектора - квадратный корень из суммы квадратов всех его координат, вроде так, или я чего то не догнал?
Номер ответа: 2
Автор ответа:
JacK
ICQ: 9580088
Вопросов: 13
Ответов: 1078
Web-сайт:
Профиль | | #2
Добавлено: 24.06.08 22:39
Ой, корень квадратный из квадрата разности))
Кароче: SQR((X2-X1)^2+(Y2-Y1)^2) ну ты понял..
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 25.06.08 00:41
JacK, ты фигню сказал.
Для нахождения кратчайшего расстояния на сфере (дуга большого круга) можно использовать такой алгоритм:
1. Перевести широту и долготу в полярные координаты
2. Перевести полярные координаты в декартовы
3. Найти расстояние между двумя точками на сфере, заданными своими декартовыми координатами
4. Для полученного треугольника со сторонами радиус, расстояние, радиус найти угол дуги по теореме косинусов
5. По углу дуги и радиусу сферы посчитать длину дуги большого круга.
<?php
// Радиус Земли
$r = 6371.2;
// point3d sperical2decart(coords);
function sperical2decart($c){
global $r;
$d['x'] = $r * cos($c['latitude'] * cos($c['longtitude'];
$d['y'] = $r * cos($c['latitude'] * sin($c['longtitude'];
$d['z'] = $r * sin($c['latitude'];
return $d;
}
// double dist(point3d, point3d);
function dist($d1, $d2){
return sqrt(
pow($d1['x'] - $d2['x'], 2) +
pow($d1['y'] - $d2['y'], 2) +
pow($d1['z'] - $d2['z'], 2)
);
}
// double calc(coords, coords);
function calc($c1, $c2){
global $r;
// Получаем декартовы координаты городов
$d1 = sperical2decart($c1);
$d2 = sperical2decart($c2);
// Рассчитываем расстояние между ними по прямой
$d = dist($d1, $d2);
// Считаем косинус угла дуги между городами
$cosphi = 1 - $d * $d / (2 * $r * $r);
// Считаем длину дуги большого круга
$c = $r * acos($cosphi);
return $c;
}
// coords coords2double();
function coords2double($latd, $latm, $lats, $lathalf, $longd, $longm, $longs, $longhalf){
$res['latitude'] = ($latd + $latm/60 + $lats/3600) * 2 * M_PI / 360;
if($lathalf == "S" $res['latitude'] = -$res['latitude'];
$res['longtitude'] = ($longd + $longm/60 + $longs/3600) * 2 * M_PI / 360;
if($longhalf == "W" $res['longtitude'] = -$res['longtitude'];
return $res;
}
function arg_slash_parse(){
if(get_magic_quotes_gpc()){
foreach($_POST as $k => $v) $_POST[$k] = stripslashes($_POST[$k];
foreach($_GET as $k => $v) $_GET[$k] = stripslashes($_GET[$k];
}
}
arg_slash_parse();
if(isset($_GET['c1'] && isset($_GET['c2']){
preg_match('/(\d{1,2})°?(\s+(\d{1,2})\'(\s+(\d{1,2})"?)?\s+(N|S)/is', $_GET['c1'], $m1);
preg_match('/(\d{1,2})°?(\s+(\d{1,2})\'(\s+(\d{1,2})"?)?\s+(N|S)/is', $_GET['c2'], $m2);
preg_match('/(\d{1,3})°?(\s+(\d{1,2})\'(\s+(\d{1,2})"?)?\s+(W|E)/is', $_GET['c1'], $m3);
preg_match('/(\d{1,3})°?(\s+(\d{1,2})\'(\s+(\d{1,2})"?)?\s+(W|E)/is', $_GET['c2'], $m4);
echo '<div style="background: yellow; border: solid 1px gray">';
echo calc(
coords2double( $m1[1], isset($m1[3] ? $m1[3] : 0, isset($m1[5] ? $m1[5] : 0, $m1[6],
$m3[1], isset($m3[3] ? $m3[3] : 0, isset($m3[5] ? $m3[5] : 0, $m3[6],
coords2double( $m2[1], isset($m2[3] ? $m2[3] : 0, isset($m2[5] ? $m2[5] : 0, $m2[6],
$m4[1], isset($m4[3] ? $m4[3] : 0, isset($m4[5] ? $m4[5] : 0, $m4[6]
);
echo '</div>';
}
?>
<p>Вводите координаты вида:</p>
<ul>
<li>55 44' 48" N 37 36' 48" E (Москва)
<li>37 47' 09" N 122 24' 50" W (Сан-Франциско)
<li>51 31' N 0 06' W (Лондон)
<li>40 47' N 73 58' W (Нью-Йорк)
</ul>
<p>Земля предполагается сферой с радиусом 6371.2 км.</p>
<form action="" method="get">
<table>
<tr><td>Координаты 1:</td><td><input type="text" name="c1" /></td></tr>
<tr><td>Координаты 2:</td><td><input type="text" name="c2" /></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="Посчитать расстояние" /></td></tr>
</table>
</form>
Номер ответа: 4
Автор ответа:
JacK
ICQ: 9580088
Вопросов: 13
Ответов: 1078
Web-сайт:
Профиль | | #4
Добавлено: 25.06.08 01:49
Мдя))
Полезный скрипт, спасибо.
Вот, если кому лень на хост кидать:
http://jack7.ho.ua/cor.php
Номер ответа: 5
Автор ответа:
JacK
ICQ: 9580088
Вопросов: 13
Ответов: 1078
Web-сайт:
Профиль | | #5
Добавлено: 25.06.08 02:01
Хм.. странно, бочина какая.
Ищу растояние от Севастополя до Симферополя.
Правильно ли я всё делаю?
Координаты из Википедии:
Севастополь - 44 56′ 53″ N 34 06′ 15″ E
Симферополь - 44 36′ 00″ N 33 32′ 00″ E
Расстояние - 0км
Хочу выяснить причины математичской аномалии, он погрешность до секунд не считает?
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 25.06.08 08:00
Символы минуты и секунды просто апостроф и кавычка. У меня все нормально считает.