FAQ
【サンプルプラグラム】大圏距離を求める (Great Circle Distance)
ナレッジ番号:5532 | 登録日:2023/07/27 | 更新日:2024/11/21
大圏距離を求める 説明
このサンプルはArcObjectsではありませんが、2点間の地理的距離を求める場合に便利です。大圏距離は回転楕円体上ではなく、球体上で計算されます。回転楕円体上での距離を計算するには、' ★関連ナレッジがみつかりませんでした★測地線関数'サンプルをご覧ください。
製品:
Engine: VB6, Java
プラットフォーム:Windows
ArcGISバージョン:9.0使用法
[VB6]
-
VBのコード ウィンドウにGCircleDistance関数を追加し、以下の例のようにして呼び出します。
Sub GetDist()
Dim dist As Double
dist = GCircleDistance(135, 35, 136, 35)Debug.Print dist
End Sub
[Java]
- Javaクラスファイルにdistance()メソッドを追加します。
-
メソッドに以下の引数を渡します。
・lat1:始点の緯度(単位:十進緯度経度)
・lon1:始点の経度(単位:十進緯度経度)
・lat2:終点の緯度(単位:十進緯度経度)
・lon2:終点の緯度 (単位:十進緯度経度) - メソッドはDouble型で返します。
[VB6]
Public Function GCircleDistance(dXO As Double, dYO As Double, _
dXD As Double, dYD As Double) _
As Double
' dXO = 始点の経度(単位:十進緯経度)
' dYO = 始点の緯度(単位:十進緯経度)
' dXD = 終点の経度(単位:十進緯経度)
' dYD = 終点の緯度(単位:十進緯経度)
'
' 関数を実行すると、2点間の距離(単位:メートル)が返ります。On Error GoTo CalcError
Dim dOrigDistance As Double
Dim dDestDistance As Double
Dim dTemp As Double
Dim dFinalDistance As Double
Dim dDistL As Double
Dim dCossa As Double
Dim dArcCos As Double
Dim dGreatCircle As DoubleConst DEG_PER_RAD = 57.29578
Const EARTH_CIRC_METERS = 40030218 '半径 = 6371007 (GRS80 Authalic Sphere)dOrigDistance = 90 - dYO
dDestDistance = 90 - dYD
dTemp = dXO - dXDdDistL = 0
If dTemp < 0 Then
dDistL = dTemp * -1
Else
dDistL = dTemp
End IfdOrigDistance = dOrigDistance / DEG_PER_RAD
dDestDistance = dDestDistance / DEG_PER_RAD
dDistL = dDistL / DEG_PER_RADdCossa = (Cos(dOrigDistance) * Cos(dDestDistance)) + _
(Sin(dOrigDistance) * Sin(dDestDistance) * Cos(dDistL))
Select Case dCossa
Case 1
dFinalDistance = 0
Case -1
dFinalDistance = EARTH_CIRC_METERS / 2
Case Else
dArcCos = 1.570796 - Atn(dCossa / Sqr(1 - (dCossa ^ 2)))
dGreatCircle = dArcCos / 6.2831853
dFinalDistance = EARTH_CIRC_METERS * dGreatCircle
End SelectGCircleDistance = dFinalDistance
Exit Function
CalcError:
GCircleDistance = -9999End Function
[Java]
/**
* Description -
*
* @param lat1 - Latitude of origin point in decimal degrees
* @param lon1 - longitude of origin point in deceimal degrees
* @param lat2 - latitude of destination point in decimal degrees
* @param lon2 - longitude of destination point in decimal degrees
*
* @return metricDistance - great circle distance in meters
*/
public static double distance(double lat1, double lon1, double lat2, double lon2){double radLat1 = Math.toRadians( lat1 );
double radLon1 = Math.toRadians( lon1 );
double radLat2 = Math.toRadians( lat2 );
double radLon2 = Math.toRadians( lon2 );
double d = Math.acos( ( Math.cos( radLat1 ) * Math.cos( radLat2 ) ) + ( Math.sin( radLat1 ) * Math.sin( radLat2 ) ) * ( Math.cos( radLon1 - radLon2 ) ) );
return ( d * EARTH_CIRC_METERS );
}private static double EARTH_CIRC_METERS = 40030218; // Radius = 6371007 (GRS80)
-
VBのコード ウィンドウにGCircleDistance関数を追加し、以下の例のようにして呼び出します。
メタデータ
機能
種類
製品