Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Рассчет расстояния между двумя городами Добавлено: 24.06.08 22:19  

Автор вопроса:  Сергеичъ
ЗДРАВТВУЙТЕ!

Помогите мне решить непростую задачку...
 Мне необходимо рассчитать расстояние между городами (используя географические координаты-широту и долготу)
ВОПРОС: Как,зная координаты города отобразить эти координаты на форме проекта VB.NET?

  Кто поможет всем огромное спасибо!!!
В долгу перед помошником не останусь!
Мой e-mail: Sergey.company@li.ru

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 JacK



ICQ: 9580088 

Вопросов: 13
Ответов: 1078
 Web-сайт: idiot.ru
 Профиль | | #1
Добавлено: 24.06.08 22:32
Ежели тупо, нужно вычислить расстояние по прямой, то просто, как длинну вектора определяешь) Длина вектора - квадратный корень из суммы квадратов всех его координат, вроде так, или я чего то не догнал?

Ответить

Номер ответа: 2
Автор ответа:
 JacK



ICQ: 9580088 

Вопросов: 13
Ответов: 1078
 Web-сайт: idiot.ru
 Профиль | | #2
Добавлено: 24.06.08 22:39
Ой, корень квадратный из квадрата разности))
Кароче: SQR((X2-X1)^2+(Y2-Y1)^2) ну ты понял..

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 25.06.08 00:41
JacK, ты фигню сказал.

Для нахождения кратчайшего расстояния на сфере (дуга большого круга) можно использовать такой алгоритм:
1. Перевести широту и долготу в полярные координаты
2. Перевести полярные координаты в декартовы
3. Найти расстояние между двумя точками на сфере, заданными своими декартовыми координатами
4. Для полученного треугольника со сторонами радиус, расстояние, радиус найти угол дуги по теореме косинусов
5. По углу дуги и радиусу сферы посчитать длину дуги большого круга.

<meta http-equiv="Content-type" content="text/html; charset=windows-1251" />

<?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-сайт: idiot.ru
 Профиль | | #4
Добавлено: 25.06.08 01:49
Мдя))
Полезный скрипт, спасибо.
Вот, если кому лень на хост кидать:
http://jack7.ho.ua/cor.php

Ответить

Номер ответа: 5
Автор ответа:
 JacK



ICQ: 9580088 

Вопросов: 13
Ответов: 1078
 Web-сайт: idiot.ru
 Профиль | | #5
Добавлено: 25.06.08 02:01
Хм.. странно, бочина какая.
Ищу растояние от Севастополя до Симферополя.
Правильно ли я всё делаю?
Координаты из Википедии:
Севастополь - 44 56&#8242; 53&#8243; N 34 06&#8242; 15&#8243; E
Симферополь - 44 36&#8242; 00&#8243; N 33 32&#8242; 00&#8243; E
Расстояние - 0км
Хочу выяснить причины математичской аномалии, он погрешность до секунд не считает?

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 25.06.08 08:00
Символы минуты и секунды просто апостроф и кавычка. У меня все нормально считает.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам