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

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

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

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

Например:

Человек находится по адресу: 51.26667, 3.45417

Место назначения: 51.575001, 4.83889

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

Solutions Collecting From Web of "Как перемещать маркер на 100 метров с координатами"

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

$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

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

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

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

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

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

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

  • Как добавить маркеры в полилинии Google Maps на основе расстояния по линии?

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

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

  • Перемещение точки по пути в SQL Server 2008

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

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