1

私は現在の場所を緯度座標で取得し、場所のリストを取得しました。

私がやりたいのは、私がその場所の1つに近いかどうかを判断することです。近くには、+100mのようなものがあります。地図を表示したくありません。近くにいるかどうかを確認してください。

location / lat longを比較するために利用できるphpライブラリの種類は何ですか?それとも数学で解くことができますか?

ありがとう

4

5 に答える 5

7

経度と緯度を使用して距離を決定する

この問題は、地球上の球面座標を使用することで最も簡単に解決できます。あなたは以前にそれらに対処したことがありますか?球座標から通常の長方形座標への変換は次のとおりです。ここで、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の間の角度]

(...)

少なくとも、高さがあなたにとって重要でない場合。道路や歩きやすさに依存する高さや距離が必要な場合(これは一言でもいいですか?)、グーグルマップの方が正確だと思います。

于 2009-04-28T09:27:04.173 に答える
2

球座標(緯度/経度)を考えると、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)です。

座標を指定して2つのポイント間の距離を計算できるようになったら、すべてのランドマークをループして、現在の場所が1つに近いかどうかを確認します。

ただし、ランドマークが多数ある場合は、空間検索アルゴリズムを使用することをお勧めします(おそらく、Quadtreeまたは同様のデータ構造を使用します)。

于 2009-04-28T09:30:29.033 に答える
1

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

于 2009-04-28T09:41:36.323 に答える
1

私はこの問題のソフトウェアライブラリに精通していません。しかし、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で駆動する必要があり、その合計の平方根が結果になります。コードが修正されました。

于 2009-04-28T09:51:36.597 に答える
0

私はパッケージに精通していませんが、 GeoClassは役に立つかもしれません。

FreeGISのWebサイトで見つけました。それがあなたが探していたものではない場合は、ソフトウェアのセクションにリストされている他の多くのphpパッケージがありました。

于 2009-04-28T20:27:19.250 に答える