Задать вопрос
@xaker01
Лень все лень.

Как Получить ближайшие объекты из массива с координатами?

Есть ли вообще библиотека для работы с подобными задачами ?

Имеется список объектов.
У каждого объекта есть свои координаты.
Так же имеется координата пользователя где он в данный момент.

Как найти все ближайшие объекты (Ближайшее можем задавать радиусом )
Пока в голову приходит писать все с 0. Но может уже данная задача решена и даже есть библиотека для yii2 да или просто скрипт.
  • Вопрос задан
  • 178 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@artem78
Набросал на скорую руку:
<?php

class Location {
	public $lat, $lon, $name;

	public function __construct($lat, $lon, $name='') {
		$this->lat = $lat;
		$this->lon = $lon;
		$this->name = $name;
	}
	
	public function getDistanceTo(Location &$obj) {
		$lat1 = $this->lat * M_PI / 180;
		$lon1 = $this->lon * M_PI / 180;
		$lat2 = $obj->lat * M_PI / 180;
		$lon2 = $obj->lon * M_PI / 180;
	
		$d_lon = $lon1 - $lon2;
	
		$slat1 = sin($lat1);
		$slat2 = sin($lat2);
		$clat1 = cos($lat1);
		$clat2 = cos($lat2);
		$sdelt = sin($d_lon);
		$cdelt = cos($d_lon);
	
		$y = pow($clat2 * $sdelt, 2) + pow($clat1 * $slat2 - $slat1 * $clat2 * $cdelt, 2);
		$x = $slat1 * $slat2 + $clat1 * $clat2 * $cdelt;
	
		return atan2(sqrt($y), $x) * 6372795 / 1000; // в км.
	}
};

$objects = [
	new Location(55.7518, 37.6176, 'Московский Кремль'),
	new Location(55.7702, 37.5952, 'м. Маяковская'),
	new Location(55.7621, 37.8555, 'Реутов'),
	new Location(55.6592, 37.6626, 'Коломенское'),
	new Location(55.8549, 37.4761, 'м. Речной вокзал'),
	new Location(55.9088, 37.7332, 'Мытищи'),
];

$current = new Location(55.7800, 37.6138);
$maxDistance = 12; // в километрах

foreach ($objects as $obj) {
	$dist = $obj->getDistanceTo($current);
	if ($dist < $maxDistance) {
		echo sprintf("%s (%0.2f км)<br>", $obj->name, $dist);
	}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
class Point {
    public $x, $y;

    function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    function distanceTo(Point $point) {
        $distanceX = $this->x - $point->x;
        $distanceY = $this->y - $point->y;
        $distance = sqrt($distanceX * $distanceX + $distanceY * $distanceY);
        return $distance;
    }

    function __toString() {
        return 'x: ' . $this->x . ', y: ' . $this->y;
    }
}

$a = new Point(0, 0);
$points = array(new Point(0, 2), new Point(0.5, 0.3), new Point(1, 1), new Point(-1, -2));

$curNearestPoint = $points[0];
$curNearestDistance = $a->distanceTo($curNearestPoint);
foreach ($points as $point) {
    $distance = $a->distanceTo($point);
    if ($distance < $curNearestDistance) {
        $curNearestDistance = $distance;
        $curNearestPoint = $point;
    }
}

echo 'nearest point: ' . $curNearestPoint;
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
function distanceMeters($lat1, $lon1, $lat2, $lon2) { 
  $x = deg2rad( $lon1 - $lon2 ) * cos( deg2rad( $lat1 ) );
  $y = deg2rad( $lat1 - $lat2 ); 
  $dist = 6371000.0 * sqrt( $x*$x + $y*$y );

  return $dist;
}


есть речь про "земные" координаты, а не просто x,y в какой-то вашем системе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы