2009-04-28 6 views
1

У меня есть мое текущее местоположение lat long, и у меня есть список мест и там lat long.Посмотрите, если я рядом что-то

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

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

Благодаря

+0

Вы говорите о нескольких местах в небольшом географическом районе или большом количестве мест, расположенных на большом расстоянии? Решения для нескольких точек, близких друг к другу, не будут масштабироваться до больших чисел, распределенных на расстояниях, где кривизна земли вступает в игру. –

+0

Просто говорить о горстке мест действительно в моей области, а не о большом количестве мест. – Tom

ответ

7

Using Longitude and Latitude to Determine Distance

Эта проблема может быть наиболее легко решается с помощью сферических координат на земле. Вы общались с ними раньше? Вот преобразование из сферических координат в нормальные прямоугольные координаты, где а = широта и б = долгота, и г есть радиус Земли:

х = г Cos [а] Cos [Ь]
у = г Cos [а] Син [Ь]
г = г Син [а]

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

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

(...)

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

+0

Высота не важна, и не является walkability :) Спасибо за ссылку, думаю, мне нужно еще немного почитать ... – Tom

2

Нетрудно рассчитать расстояние между двумя точками, учитывая их сферические координаты (широта/долгота). Быстрый поиск «долготы широты» в 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

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

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

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

inwhich^2 означает питание от 2

так le'ts у вас есть массив объектов 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(); 

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

+0

hm, теорема о пифагоре действительно недействительна, если вы вычисляете расстояния на земля, потому что земля примерно напоминает сплющенный сфероид. подумайте о треугольнике с углом 3 90 ° - возможно, на изогнутой поверхности. вы могли игнорировать это на очень коротких расстояниях. – stefs

+0

это правильно. Я думал, что когда проблема находится на близких расстояниях, разницу между изогнутой поверхностью и поверхностью линейной пластины можно игнорировать. он несет некоторое приближение. – farzad

0

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

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