Выясни, если я что-то рядом - PullRequest
1 голос
/ 28 апреля 2009

У меня есть текущее местоположение в долготе, и у меня есть список мест и там в длинном.

Что я хотел бы сделать, так это выяснить, если я рядом с одним из мест, рядом будет что-то вроде + 100 м Я не хочу показывать карту, просто знайте, рядом ли я.

Какие библиотеки php доступны для сравнения location / lat long? Или я могу решить это с математикой?

Спасибо

Ответы [ 5 ]

7 голосов
/ 28 апреля 2009

Использование долготы и широты для определения расстояния

Эту проблему легче всего решить, используя сферические координаты на земной шар. Вы имели дело с этим раньше? Вот преобразование из сферические координаты к нормальным прямоугольным координатам, где a = широта а b = долгота, а r это радиус Земли:

x = r Cos [a] Cos [b]
y = r Cos [a] Sin [b]
z = r грех [a]

Тогда мы будем использовать следующее свойство точечного произведения (обозначено [p, q]):

[p, q] = длина [p] * длина [q] * Cos [угол между p & q]

(...)

по крайней мере, если рост не важен для тебя. если вам нужно, чтобы высота и / или расстояние зависели от дорог или пешеходной дорожки (это даже слово?), я думаю, карты Google были бы более точными.

2 голосов
/ 28 апреля 2009

Нетрудно рассчитать расстояние между двумя точками, учитывая их сферические координаты (широта / долгота). Быстрый поиск по «широте и долготе» в Google показывает уравнение.

Видимо, это что-то вроде этого:

acos(cos(a.lat) * cos(a.lon) * cos(b.lat) * cos(b.lon) +
     cos(a.lat) * sin(a.lon) * cos(b.lat) * sin(b.lon) +
     sin(a.lat) * sin(b.lat)) * r

, где a и b - ваши точки, а r - средний радиус Земли (6371 км).

Как только вы сможете рассчитать расстояние между двумя точками по их координатам, вам нужно будет пройти по всем ориентирам и посмотреть, находится ли ваше текущее местоположение рядом с ним.

Однако, если у вас много ориентиров, вы можете использовать алгоритм пространственного поиска (возможно, используя Quadtree или аналогичную структуру данных).

1 голос
/ 28 апреля 2009

Я не знаком с программными библиотеками для этой проблемы. но если вы говорите в двумерном пространстве, то тут мне в голову приходит математика:

Вы можете найти расстояние между любыми двумя точками в 2D-пространстве, используя этот расчет:

расстояние = sqrt ((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2)

в котором ^ 2 означает питание от 2.

так скажем, у вас есть массив объектов Point (здесь я определяю простой класс для Point), таким образом вы можете узнать, какие точки соседствуют:

class Point {
    protected $_x = 0;
    protected $_y = 0;

    public function __construct($x,$y) {
         $this->_x = $x;
         $this->_y = $y;
    }
    public function getX() {
         return $this->_x;
    }

    public function getY() {
    return $this->_y;
    }    

    public function getDistanceFrom($x,$y) {
        $distance = sqrt( pow($x - $this->_x , 2) + pow($y - $this->_y , 2) );
        return $distance;
    }

    public function isCloseTo($point=null,$threshold=10) {
        $distance = $this->getDistanceFrom($point->getX(), $point->getY() );
        if ( abs($distance) <= $threshold ) return true;
        return false;
    }

    public function addNeighbor($point) {
        array_push($this->_neighbors,$point);
        return count($this->_neighbors);
    }

    public function getNeighbors() {
        return $this->_neighors;
    }
}

$threshold = 100; // the threshold that if 2 points are closer than it, they are called "close" in our application
$pointList = array();
/*
 * here you populate your point objects into the $pointList array.
*/
// you have your coordinates, right?
$myPoint = new Point($myXCoordinate, $myYCoordinate);

foreach ($pointList as $point) {
   if ($myPoint->isCloseTo($point,$threshold) {
       $myPoint->addNeighbor($point);
   }
}

$nearbyPointsList = $myPoint->getNeighbors();

edit: Извините, я забыл формулу линейного расстояния. оба значения расстояний по осям X и Y должны быть снабжены энергией 2, и тогда результатом будет сумма их суммы. код теперь исправлен.

1 голос
/ 28 апреля 2009
0 голосов
/ 29 апреля 2009

Я не знаком с пакетом, но GeoClass может быть полезным.

Я нашел его на сайте FreeGIS . Если это не совсем то, что вы искали, в разделе программного обеспечения есть много других пакетов php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...