Как переместить маркер на 100 метров с координатами

У меня есть 2 координаты. Координата 1 — это «человек». Координата 2 — пункт назначения.

Как переместить координату 1 на 100 метров ближе к координате 2?

Это будет использоваться в задании cron, поэтому включены только php и mysql.

Например:

Лицо находится по адресу: 51.26667, 3.45417

Пункт назначения: 51.575001, 4.83889

Как мне рассчитать новые координаты для человека, чтобы они были на 100 метров ближе?


person Rene Pot    schedule 18.06.2010    source источник
comment
Координаты в метрах или широта/долгота? Если последнее, вам нужно выполнить проекцию координат в WGS84 или аналогичный эллипсоид, чтобы получить координаты в метрах. Затем, предполагая, что вы хотите переместиться на 100 ближе по прямой линии (без учета улиц или стен), вы можете использовать формулу евклидова расстояния   -  person Vinko Vrsalovic    schedule 19.06.2010
comment
это координаты широты, долготы. Используется гугл картами   -  person Rene Pot    schedule 19.06.2010


Ответы (3)


Используйте гаверсинус, чтобы вычислить разницу между двумя точками в метрах; затем пропорционально отрегулируйте значение координат человека.

$radius = 6378100; // radius of earth in meters
$latDist = $lat - $lat2;
$lngDist = $lng - $lng2;
$latDistRad = deg2rad($latDist);
$lngDistRad = deg2rad($lngDist);
$sinLatD = sin($latDistRad);
$sinLngD = sin($lngDistRad);
$cosLat1 = cos(deg2rad($lat));
$cosLat2 = cos(deg2rad($lat2));
$a = ($sinLatD/2)*($sinLatD/2) + $cosLat1*$cosLat2*($sinLngD/2)*($sinLngD/2);
if($a<0) $a = -1*$a;
$c = 2*atan2(sqrt($a), sqrt(1-$a));
$distance = $radius*$c;

Кормление ваших значений:

$lat = 51.26667;        //  Just South of Aardenburg in Belgium
$lng = 3.45417;
$lat2 = 51.575001;      //  To the East of Breda in Holland
$lng2 = 4.83889;

дает результат 102059,82251083 метра, 102,06 километра.

Коэффициент для корректировки равен 100/102059,82251083 = 0,0009798174985988102859004569070625.

$newLat = $lat + (($lat2 - $lat) * $ratio);
$newLng = $lng + (($lng2 - $lng) * $ratio);

Дает новую широту 51,266972108109 и долготу 3,4555267728867.

person Mark Baker    schedule 18.06.2010
comment
Следующее является хорошим дополнением: scribd.com/doc/2569355/ Гео-Расстояние-Поиск-с-MySQL - person Waleed Al-Balooshi; 19.06.2010
comment
Интересно, Хаверсайн. Что бы вы использовали в качестве R? - person Vinko Vrsalovic; 19.06.2010
comment
Я знаю, как рассчитать расстояние. Но не знаю, как правильно настроить - person Rene Pot; 19.06.2010
comment
@Vinko Зависит от того, насколько точной вы хотите получить цифру. Я знаю, что это не позволяет выполнять полярное сглаживание, но значение радиуса в моем коде должно быть таким же точным, как и в большинстве систем GPS. - person Mark Baker; 19.06.2010
comment
@Topener Haversine дает вам расстояние x между двумя точками. Вы хотите переместиться на 100 м, поэтому вы корректируете широту и долготу в соотношении 100/x. - person Mark Baker; 19.06.2010
comment
Я пытаюсь использовать вашу функцию. но я получаю довольно большое число. Каким будет результат вашей функции? - person Rene Pot; 19.06.2010

Найдите угол тета между осью x и вектором от человека к месту назначения.

theta = Atan2(dest.y-person.y, dest.x-person.x).

Теперь используйте тета и сумму, на которую вы хотите продвинуть точку, чтобы вычислить новую точку.

newPoint.x = advanceDistance * cos(theta) + person.x

newPoint.y = advanceDistance * sin(theta) + person.y

person John Wang    schedule 18.06.2010
comment
Проблема с этим решением заключается в том, что оно не рассматривает землю как сферу... Градусы широты параллельны и находятся на расстоянии примерно 111 км друг от друга, но градус долготы является самым широким на экваторе на 111 км и постепенно сходится к нулю на полюсах. . - person Daniel Vassallo; 19.06.2010
comment
Я бы все равно оставил ответ здесь, потому что он все еще актуален (по крайней мере, к названию вопроса) ... Возможно, вы просто захотите сделать примечание об этом. - person Daniel Vassallo; 19.06.2010

Если вы понимаете JavaScript, вы можете проверить метод moveTowards() в следующем посте о переполнении стека:

Этот метод возвращает точку назначения, если заданы начальная точка, конечная точка и расстояние, которое нужно пройти по этой линии. Вы можете использовать точку 1 в качестве начальной точки, точку 2 в качестве конечной точки и расстояние 100 метров. Он написан на JavaScript, но я уверен, что его можно легко портировать на PHP или MySQL.

Вы также можете ознакомиться с другим сообщением о переполнении стека, в котором реализована часть приведенной выше реализации JavaScript в виде пользовательской функции для SQL Server 2008, называемой func_MoveTowardsPoint:

В приведенном выше примере используется встроенный в SQL Server 2008 тип данных geography. Однако вы можете легко использовать два типа данных decimal для широты и долготы вместо одного типа данных geography.

И SQL Server, и примеры JavaScript были основаны на реализациях из статьи Криса Венесса Расчет расстояния , азимут и многое другое между точками широты/долготы.

person Daniel Vassallo    schedule 18.06.2010
comment
Интересные посты и ссылки - person Mark Baker; 19.06.2010