弄清楚我是否附近的东西

时间:2009-04-28 09:21:34

标签: php geolocation gps gis location

我的当前位置拉长了,我有一个地方列表,并且那里很长。

我想做的是弄清楚我是否在附近的一个地方,附近会是+ 100米。我不想显示地图,只知道我是否靠近它。

什么样的php库可用于比较location / lat long?或者我可以用数学来解决它吗?

由于

5 个答案:

答案 0 :(得分:7)

Using Longitude and Latitude to Determine Distance

  

通过使用球面坐标可以最容易地解决这个问题   地球。你以前处理过那些吗?这是转型   球面坐标到法线直角坐标,其中a =纬度   和b =经度,r是地球的半径:

     

x = r Cos [a] Cos [b]
    y = r Cos [a] Sin [b]
    z = r Sin [a]

     

然后我们将使用点积的以下属性(标注为[p,q]):

     

[p,q] =长度[p] *长度[q] * Cos [p&之间的角度Q]

     

(...)

至少,如果身高对你不重要的话。 如果您需要高度和/或距离取决于道路或步行(这甚至是一个单词?),我认为谷歌地图会更精确。

答案 1 :(得分: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

其中ab是你的分数,r是地球的平均半径(6371 km)。

一旦你能够计算给定坐标的两点之间的距离,你就会想要遍历所有的地标,看看你当前的位置是否接近一个。

但是,如果您有许多地标,则可能需要使用空间搜索算法(可能使用Quadtree或类似的数据结构)。

答案 2 :(得分:1)

答案 3 :(得分:1)

我不熟悉这个问题的软件库。但如果你在2D空间谈话,那么我想到的是一些数学:

您可以使用此计算找到2D空间中任意2个点的距离:

距离= sqrt((X2 - X1)^ 2 +(Y2 - Y1)^ 2)

inwhich ^ 2表示由2提供动力。

所以说你有一个Point对象数组(这里我为Points定义了一个简单的类),这样你就可以找到相邻的点:

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提供,然后它们的和的sqrt是结果。现在纠正了代码。

答案 4 :(得分:0)

我不熟悉这个包,但是 GeoClass可能有用。

我在FreeGIS网站上找到了它。如果这不是你想要的,那么软件部分中列出了许多其他的php包。