私は現在の場所を緯度座標で取得し、場所のリストを取得しました。
私がやりたいのは、私がその場所の1つに近いかどうかを判断することです。近くには、+100mのようなものがあります。地図を表示したくありません。近くにいるかどうかを確認してください。
location / lat longを比較するために利用できるphpライブラリの種類は何ですか?それとも数学で解くことができますか?
ありがとう
私は現在の場所を緯度座標で取得し、場所のリストを取得しました。
私がやりたいのは、私がその場所の1つに近いかどうかを判断することです。近くには、+100mのようなものがあります。地図を表示したくありません。近くにいるかどうかを確認してください。
location / lat longを比較するために利用できるphpライブラリの種類は何ですか?それとも数学で解くことができますか?
ありがとう
この問題は、地球上の球面座標を使用することで最も簡単に解決できます。あなたは以前にそれらに対処したことがありますか?球座標から通常の長方形座標への変換は次のとおりです。ここで、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の間の角度]
(...)
少なくとも、高さがあなたにとって重要でない場合。道路や歩きやすさに依存する高さや距離が必要な場合(これは一言でもいいですか?)、グーグルマップの方が正確だと思います。
球座標(緯度/経度)を考えると、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)です。
座標を指定して2つのポイント間の距離を計算できるようになったら、すべてのランドマークをループして、現在の場所が1つに近いかどうかを確認します。
ただし、ランドマークが多数ある場合は、空間検索アルゴリズムを使用することをお勧めします(おそらく、Quadtreeまたは同様のデータ構造を使用します)。
http://blog.wekeroad.com/2007/08/30/linq-and-geocoding for LINQ Example http://www.codeproject.com/KB/cs/distancebetweenlocations.aspx for C#and TSQL Example
私はこの問題のソフトウェアライブラリに精通していません。しかし、2D空間で話している場合、ここに私の頭に浮かぶ数学があります。
この計算を使用して、2D空間内の任意の2点の距離を見つけることができます。
距離=sqrt((X2-X1)^ 2 +(Y2-Y1)^ 2)
ここで、^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で駆動する必要があり、その合計の平方根が結果になります。コードが修正されました。