YouTube | Facebook | X(Twitter) | RSS

緯度・経度・高さを三次元直交座標系に変換

2016/9/1 (木)

ArcGISでは地心直交座標系はサポートされていない。ただし、地球半径の割合から求めた3次元直交座標系を持っており、緯度・経度・高さをその直交座標系に変換できる。
ESRI Developer Summit資料 P31を参照

Developer Helpのサンプル

IGlobeViewUtil::GeographicToGeocentric 地理座標系・高さを3次元直交座標系に変換

また、「世界測地系と座標変換(飛田幹男著)で地理座標系←→地心直交座標系の変換方法が掲載されているが、これを実装してもらった。

Z値を持つ3Dフィーチャクラスを定義すれば、ArcGlobeに地球規模で3Dフィーチャを作成することができる。おそらくマルチパッチ型の図形も描けるだろう。

'IGlobeViewUtilで変換される3次元直交座標系はnormalized geocentric coordinatesといい、回転楕円体と接する地点を1(半径=1)として計算する
 
Type Coordinates
    Name As String      'Coordinates Name
    X As Double         'Geocentric Coordinates X (m)
    Y As Double         'Geocentric Coordinates Y (m)
    Z As Double         'Geocentric Coordinates Z (m)
    Lon As Double       'Longitude (Decimal Degree)
    Lat As Double       'Latitude (Decimal Degree)
    Height As Double    'Elevation Height (m)
End Type
 
 
Public Function GetCoordinates(Coords As Coordinates, Optional ToGeographic As Boolean = True)
    Dim pGlobeViewUtil As IGlobeViewUtil
    Set pGlobeViewUtil = New GlobeCamera
     
    Dim CloneCoords As Coordinates
    LSet CloneCoords = Coords
     
    Debug.Print CloneCoords.Name, "Before               ", CloneCoords.Lon, CloneCoords.Lat, CloneCoords.Height, CloneCoords.X, CloneCoords.Y, CloneCoords.Z
 
    If ToGeocentric = False Then
        'GeographicToGeocentric
        pGlobeViewUtil.GeographicToGeocentric CloneCoords.Lon, CloneCoords.Lat, CloneCoords.Height, CloneCoords.X, CloneCoords.Y, CloneCoords.Z
        Debug.Print CloneCoords.Name, "GeographicToGeocentric", CloneCoords.Lon, CloneCoords.Lat, CloneCoords.Height, CloneCoords.X, CloneCoords.Y, CloneCoords.Z
    Else
        'GeocentricToGeographic
        pGlobeViewUtil.GeocentricToGeographic CloneCoords.X, CloneCoords.Y, CloneCoords.Z, CloneCoords.Lon, CloneCoords.Lat, CloneCoords.Height
        Debug.Print CloneCoords.Name, "GeocentricToGeographic", CloneCoords.Lon, CloneCoords.Lat, CloneCoords.Height, CloneCoords.X, CloneCoords.Y, CloneCoords.Z
    End If
 
End Function
 
Public Function GetCoordinates2(ByRef X As Double, ByRef Y As Double, ByRef Z As Double, Optional ToGeographic As Boolean = True)
    Dim pGlobeViewUtil As IGlobeViewUtil
    Set pGlobeViewUtil = New GlobeCamera
     
    If ToGeographic = False Then
        'GeographicToGeocentric
        pGlobeViewUtil.GeographicToGeocentric X, Y, Z, X, Y, Z
    Else
        'GeocentricToGeographic
        pGlobeViewUtil.GeocentricToGeographic X, Y, Z, X, Y, Z
    End If
 
End Function
  • この記事を書いた人

羽田 康祐

伊達と酔狂のGISエンジニア。GIS上級技術者、Esri認定インストラクター、CompTIA CTT+ Classroom Trainer、潜水士、PADIダイブマスター、四アマ。WordPress は 2.1 からのユーザーで歴だけは長い。 代表著書『"地図リテラシー入門―地図の正しい読み方・描き方がわかる』 GIS を使った自己紹介はこちら。ESRIジャパン(株)所属、元青山学院大学非常勤講師を兼務。日本地図学会第31期常任委員。発言は個人の見解です。

-プログラミング, ArcGIS
-,