Координаты PHP и GPS, получая общее расстояние по путям, составленное из нескольких точек - PullRequest
2 голосов
/ 17 января 2012

Я просто не могу понять, как сделать эффективный и понятный код для этого.

У меня есть строка координат, каждая точка, естественно, состоит из долготы, широты и высоты (сейчас я вообще не беспокоюсь о высоте, и я знаю, что функция для определения отснятого материала не поддерживает высоту) :

$coordinates = "-82.36554110283872,26.15200821551467,0 -82.420692,26.097404,0 -82.52855700000001,26.186567,0 -82.41250599999999,25.996422,0 -82.50644510379755,26.05431354409091,0" 

Мне нужно выяснить расстояние в футах между каждой координатой и сложить итог. У меня есть следующая функция (которая прекрасно работает), чтобы выяснить расстояние между двумя точками:

function coordDistance($lat1, $lon1, $lat2, $lon2) {
$delta_lat = $lat2 - $lat1;
$delta_lon = $lon2 - $lon1;

$earth_radius = 20908800.00; //Distance around the earth in feet

$alpha  = $delta_lat/2;
$beta   = $delta_lon/2;
$a          = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) *    cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c      = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);

return $distance;
}

То, как я сейчас разбиваю строку с координатами и пытаюсь передать ее функции, совершенно нелепо. Любые предложения о том, как разбить координаты и разбить их, чтобы получить хороший материал для пути в хорошем виде?

Ответы [ 2 ]

1 голос
/ 17 января 2012

Если я правильно читаю вашу входную строку, сначала разбейте все координаты на массив с помощью функции explode :

$coordinatesArray = explode(" ", $coordinates);

Теперь вы можете передать каждую координату какмассив, но вам нужно обновить сигнатуру вашей функции.Например,

coordDistance($coordinatesArray[i], $coordinatesArray[i+1],); // in a loop 

Или вы можете дополнительно разбить координаты для работы с существующей сигнатурой функции.

$coordinateA = explode(",", $coordinatesArray[i]); // again, in a loop
$coordinateB = explode(",", $coordinatesArray[i+1]);

coordDistance($coordinateA[0], $coordinateB[0], $coordinateA[1], $coordinateB[1])

Подробнее здесь: http://php.net/manual/en/function.explode.php

1 голос
/ 17 января 2012

По существу переменная для накопления.Расщепление строки по пространству, чтобы получить индивидуальную точку.Цикл для н-1.Вычисление расстояния между i и i + 1.

$total = 0;

$points = explode(' ', $coordinates);
$count = count($points);

for ($i = 0; $count - 1 > $i; ++$i) {
    list($lon1, $lat1, $alt1) = explode(',', $points[$i]);
    list($lon2, $lat2, $alt2) = explode(',', $points[$i + 1]);

    $total += coordDistance($lat1, $lon1, $lat2, $lon2);
}

Я не совсем протестировал код.Мне кажется, что ваша строка координат содержит лишний пробел после знака минус.

Убедитесь, что lon и lat тоже читаются в правильном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...