我的当前位置拉长了,我有一个地方列表,并且那里很长。
我想做的是弄清楚我是否在附近的一个地方,附近会是+ 100米。我不想显示地图,只知道我是否靠近它。
什么样的php库可用于比较location / lat long?或者我可以用数学来解决它吗?
由于
答案 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
其中a
和b
是你的分数,r
是地球的平均半径(6371 km)。
一旦你能够计算给定坐标的两点之间的距离,你就会想要遍历所有的地标,看看你当前的位置是否接近一个。
但是,如果您有许多地标,则可能需要使用空间搜索算法(可能使用Quadtree或类似的数据结构)。
答案 2 :(得分:1)
http://blog.wekeroad.com/2007/08/30/linq-and-geocoding C#和TSQL示例http://www.codeproject.com/KB/cs/distancebetweenlocations.aspx
答案 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)