2012-04-16 22 views
3

ビン・マップと2つのポイントがある: Point1、Point2と私はこれら2つのポイント間の距離を計算したいですか?それは可能ですか? と私はポイント1とポイント2とポイント2の間のパスの2/3に円を配置したい場合...どのように私はそれを作ることができますか?ビン地図の2つのポイント間の距離を計算する

答えて

10

Haversine、さらにはVincentyの式を参照してください。

次のコードは、距離を取得するためにhaversinesの方法を使用しています。

public double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2) 
    { 
     double distance = 0; 

     double dLat = (lat2 - lat1)/180* Math.PI; 
     double dLong = (long2 - long1)/180 * Math.PI; 

     double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) 
        + Math.Cos(lat1/180* Math.PI) * Math.Cos(lat2/180* Math.PI) 
        * Math.Sin(dLong/2) * Math.Sin(dLong/2); 
     double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); 

     //Calculate radius of earth 
     // For this you can assume any of the two points. 
     double radiusE = 6378135; // Equatorial radius, in metres 
     double radiusP = 6356750; // Polar Radius 

     //Numerator part of function 
     double nr = Math.Pow(radiusE * radiusP * Math.Cos(lat1/180 * Math.PI), 2); 
     //Denominator part of the function 
     double dr = Math.Pow(radiusE * Math.Cos(lat1/180 * Math.PI), 2) 
         + Math.Pow(radiusP * Math.Sin(lat1/180 * Math.PI), 2); 
     double radius = Math.Sqrt(nr/dr); 

     //Calculate distance in meters. 
     distance = radius * c; 
     return distance; // distance in meters 
    } 

あなたはに関する情報hereで良いサイトを見つけることができます。

+4

+1。 Haversineは最も一般的であり、任意の2点間のおおよその距離を決定するのに完全に適しています。 Vincentyは、地球の形状が完全球ではなく回転楕円体であると仮定しているため、より良い近似を提供します。最後のオプションは、Microsoft.SqlServer.Types.dllライブラリをインポートし、SqlGeographyデータ型のSTDistance()メソッドを使用することです。これは、楕円体モデル(WGS84など)を使用する際に最も正確な結果をもたらします。これは、SQL Serverが地理データ型の場合とまったく同じです。 –

+0

遠方のパーツにはうまくいきますが、point1とpoint2の間の距離の2/3にどのように円を表示できますか? – AboKevo

+0

結果はメートル、KM ....ですか? – toroveneno

2

より正確な結果が必要な場合、または数学演算を実行する場合(たとえば、円をスペリオ/投影に変換する場合)、地理図書館を(再)投影および計算操作に使用できます。 DotSpatialまたはSharpMapとサンプル/ユニットテスト/ソースを見てください...これはあなたの問題を解決するのに役立ちます。

とにかくgeodesic distancebearingがわかっている場合は、結果のターゲット位置(円の中心)がどこにあるかを計算することもできます。 Vincenty'sアルゴリズムの「直接問題」を参照してください。また、useful algorithm implementations/silver

GIS Stackexchangeに質問を投稿することも考えられます。彼らはあなたのようなGISに関連する問題について議論します。 calculating lat long x-miles from pointの質問をご覧ください(既に距離を知っているので)distance calculationsについてのディスカッションをご覧ください。この質問は問題how to draw a point on a line in a given distanceに関連しており、ほぼ同じです(中心と半径が必要なため)。

もう1つの方法は、ArcGIS API for Silverlightを使用してBing Mapsを表示することです。オープンソースであり、そこに必要なことを学ぶことができます。サンプル内のユーティリティのサンプルタブを参照してください。

0

すでに言及したように:this pageをご覧になり、問題に関する詳細情報を入手してください。ここで、数式、JavaScriptコード、および目的地点を特定の距離だけ計算し、出発地からの方位を計算するためのExcelサンプルを検索します(見出しを参照)。

コードをC#-worldに「変換」するのは難しいことではありません。

12

Microsoftには、Haversine式を使用するGeoCoordinate.GetDistanceTo Methodがあります。

他の実装では、小さすぎる距離のNaNを返します。私はまだ組み込み関数に関する問題に遭遇していません。

+0

ああ、前に気付かなかった。 Thanx – Beachwalker

+0

APIがちょうど大きくなっています!それも私には分かりませんでした。私は自分のプロジェクトで取り組むために自分の共通のlibにHaversine実装を追加しました。私はそれを知っている、甘い削除することができますね! – Depechie

+1

Windows Storeアプリケーションでサポートされていないようです... – LowDev1

関連する問題