2011-08-11 10 views
3

私は、範囲を与えるために半径を使って円を計算する点の緯度と経度を持っています。地理的地域(この場合は州)の緯度と経度の境界もあります。私は、円の任意の領域が任意の領域領域と交差するかどうかを調べようとしています。重複する地理的領域を決定するためのアルゴリズム

私が探している最終的な結果は、ポイント(ジオコーディングされたアドレス)がxマイル以内にあればその状態を返すことです。

これを見つけるためのアルゴリズムがありますが、どこから探し始めるべきかわかりません。

+0

どのように状態を表しますか? – Nobody

+0

州のデータはGoogleのGeocode APIからのものです。したがって、イリノイ州の場合、データはこのURLから取得されます。 http://maps.googleapis.com/maps/api/geocode/xml?address=IL,%20United%20States&sensor=false – Josh

答えて

0

http://en.wikipedia.org/wiki/Quad_tree

これは、2次元の空間的関係ちょっとものの任意の種類のための優れた出発点です。

+0

地球は二次元ユークリッド空間ではないので、クワッドツリーはこれには適していません。 – tskuzzy

3

使用Haversine formula

a = sin²(Δlat/2) + cos(lat1)*cos(lat2)*sin²(Δlong/2) 
c = 2*atan2(√a, √(1−a)) 
d = R*c 

JavaScriptは:

var R = 6371; // km 
var dLat = (lat2-lat1)*Math.PI/180; 
var dLon = (lon2-lon1)*Math.PI/180; 
var lat1 = lat1*Math.PI/180; 
var lat2 = lat2*Math.PI/180; 

var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; 

これはあなたの任意の2点間の大圏距離を与えるだろう。残りの部分は、州の表現方法によって異なります。

+0

これはいくつかの狂気の式です。私は地球の湾曲については考えていませんでしたが、それを平坦に近似していましたが、これは間違いなく素晴らしいです。 +1してください。私はおおよその長方形の境界として取得 – Mike

+0

状態は、それが100%正確である必要はありませんが、Googleの地理コーディングAPIは、AS境界を返します。 36.9702980 -91.5130789 42.5083379 -87。0199349 与えられた半径内の任意の*ポイントが長方形の範囲内にある場合、ポイント間の距離を決定しようとしていないので、この場合、Haversineは機能しません。 – Josh

+0

@ジョシュ:矩形の各点までの距離をテストすることができます。矩形内にある場合はテストできない場合(それらの手順は入れ替えることができます)、両方が失敗した場合、あなたのポイントから所定の距離を置いて、あなたのポイントから正確に北、南、西、東に横たわり、それらが四角形の内側にあるかどうかをテストします。それらのテストのすべてが失敗した場合、状態はあなたの範囲内にありません。いずれかが失敗しなかった場合、状態は範囲内にあります。 – Nobody

-2

単一の点が円の中にあるかどうかを確認するには、Pythagorasのtheoyを使用できます。下のコードでは、サークルのcentre_x、centre_y、radius、そして評価しているポイントのx、yを渡します。あなたのポストはJavaではなくPHPでタグ付けされるかどう

def in_circle(centre_x, centre_y, radius, x, y): 
    square_dist = (centre_x - x) ** 2 + (centre_y - y) ** 2 
    return square_dist <= radius ** 2 
+1

これは地球の曲率を考慮していません。 – tskuzzy

0

、私はこの方法を車輪の再発明しようとするが、ちょうどJTS(Javaのトポロジスイート)を使用し、1つのジオメトリを作成して呼び出すことはありません

public boolean intersects(Geometry g) 

私はPHPについてよく知らないので、PHPに匹敵するライブラリがあるかどうかは分かりません。

ジオメトリはどこですか?ジオメトリがPostGISのようなデータベースに格納されている場合は、データベース呼び出しなどの基底関数を呼び出すこともできます

関連する問題