Как переместить маркер на 100 метров с координатами - PullRequest
4 голосов
/ 19 июня 2010

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

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

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

Например:

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

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

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

Ответы [ 3 ]

10 голосов
/ 19 июня 2010

Используйте 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

4 голосов
/ 19 июня 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

4 голосов
/ 19 июня 2010

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

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

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

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

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

...