У меня есть 2 координаты. Координата 1 – это «человек». Координата 2 – это пункт назначения.
Как переместить координату на 100 метров ближе к координате 2?
Это будет использоваться в задании cron, поэтому включены только php и mysql.
Например:
Человек находится по адресу: 51.26667, 3.45417
Место назначения: 51.575001, 4.83889
Как бы я вычислил новые координаты для Человека на 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()
в следующей статье «Переполнение стека»:
Этот метод возвращает точку назначения, если задана начальная точка, конечная точка и расстояние для перемещения по этой линии. Вы можете использовать точку 1 как отправную точку, точку 2 в качестве конечной точки и расстояние 100 метров. Он написан на JavaScript, но я уверен, что его можно легко портировать на PHP или MySQL.
Вы также можете проверить этот другой пост переполнения стека, который реализует часть вышеупомянутой реализации JavaScript, как пользовательскую функцию для SQL Server 2008, называемую func_MoveTowardsPoint
:
Вышеупомянутый тип данных встроенной geography
SQL Server 2008. Однако вы можете легко использовать два decimal
типа данных для широты и долготы вместо одного типа данных geography
.
И SQL Server, и примеры JavaScript были основаны на реализациях статьи Криса Винесса « Рассчитайте расстояние, принимая и больше между точками широты / долготы» .