Вычислить все координаты до x десятичных знаков между двумя координатами широты и долготы.

Как я могу рассчитать каждые координаты широты и долготы между двумя координатами широты и долготы в PHP?

Допустим, у меня есть координаты A:

(39.126331, -84.113288) 

и координаты B:

(39.526331, -84.213288)

Как мне вычислить все возможные координаты между этими двумя координатами широты и долготы (в прямой линии) до пяти десятичных знаков (например, 39.12633, -84.11328) и получить список координат между ними?

Кроме того, у меня есть еще один набор координат (координаты C), которые немного отклоняются и не совпадают с координатами между A и B.

Как я могу рассчитать расстояние между координатами C и ближайшими координатами между A и B?


person Jacob R    schedule 03.08.2013    source источник
comment
Что вы имеете в виду под списком координат. Вы хотите, чтобы между ними были все возможные координаты с 6 значащими цифрами? Или вы хотите уравнение линии между двумя точками? Или вы хотите чего-то совсем другого?   -  person Madison May    schedule 04.08.2013
comment
Да, всех возможных координат между ними с 5 значащими цифрами будет достаточно. Уточню свой вопрос. Спасибо.   -  person Jacob R    schedule 04.08.2013
comment
Пользователям SO было бы полезно, если бы вы указали свое конечное использование и то, что вы уже пробовали. Ваш расчет даст ужасно большой список перестановок. Почему вы хотите перечислить их все, если алгоритм работал бы лучше?   -  person nickhar    schedule 04.08.2013
comment
Я пытаюсь написать функцию или серию функций на PHP, которые будут принимать новый набор координат GPS пользователя, их старый набор координат и третий набор координат, не связанный с пользователем. Функция в основном должна проверять, близки ли третий набор или координаты к первому или второму набору или каким-либо координатам между ними.   -  person Jacob R    schedule 04.08.2013
comment
Создание списка всех возможных координат между ними - невероятно плохой подход. Вы когда-нибудь изучали векторы?   -  person Beta    schedule 04.08.2013
comment
посмотрите на расстояние между трассами на этой странице, в примере используется js, но математику легко перевести на PHP.   -  person Wrikken    schedule 12.08.2013


Ответы (2)


Вы можете вычислить диаграмму Вороного для всех пар широт и затем искать соседнюю ячейку. Также обратите внимание, что широта и долгота - это углы, а не мировые координаты или декартовы координаты. Вы можете скачать мою диаграмму Вороного класса PHP @ phpclasses.org.

person Gigamegs    schedule 28.09.2013

Вот что для меня решило:

function point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY)
{

        $r_numerator = ($pointX - $startX) * ($endX - $startX) + ($pointY - $startY) * ($endY - $startY);
        $r_denominator = ($endX - $startX) * ($endX - $startX) + ($endY - $startY) * ($endY - $startY);
        $r = $r_numerator / $r_denominator;

        $px = $startX + $r * ($endX - $startX);
        $py = $startY + $r * ($endY - $startY);

        $closest_point_on_segment_X = $px;
        $closest_point_on_segment_Y = $py;

        $distance = user_bomb_distance_calc($closest_point_on_segment_X, $closest_point_on_segment_Y, $pointX, $pointY);

        return array($distance, $closest_point_on_segment_X, $closest_point_on_segment_Y);
}

function user_bomb_distance_calc($uLat , $uLong , $bLat , $bLong)
{
    $earthRadius = 6371; #km
    $dLat = deg2rad((double)$bLat - (double) $uLat);
    $dlong = deg2rad((double)$bLong - (double) $uLong);

    $a = sin($dLat / 2 ) * sin($dLat / 2 ) + cos(deg2rad((double)$uLat)) * cos(deg2rad((double)$bLat)) * sin($dlong / 2) * sin($dlong / 2);


    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $distance = $earthRadius * $c;

    $meter = 1000; //convert to meter 1KM = 1000M

    return  intval( $distance * $meter ) ;
}
person Jacob R    schedule 04.10.2013