コンテンツにスキップ

GeoPointInterface(地理座標)

GeoPointInterface は、緯度・経度・高度(オプション)を持つ地理座標を表します。

GeoPointInterface インターフェース

Section titled “GeoPointInterface インターフェース”

GeoPointInterfaceは、以下のプロパティを持ちます。ユニットテストなどに用います。

interface GeoPointInterface {
val latitude: Double
val longitude: Double
val altitude: Double?
}

GeoPointクラスは、GeoPointInterfaceを実装したクラスです。

data class GeoPoint(
override val latitude: Double,
override val longitude: Double,
override val altitude: Double = 0.0
) : GeoPointInterface

GeoPointクラスは、下記のファクトリーメソッドを提供します。 開発者の使いやすいメソッドを選択することができます。

// 緯度,経度の順で値を指定
GeoPoint.fromLatLong(37.7749, -122.4194)
// 経度,緯度の順で値を指定
GeoPoint.fromLongLat(-122.4194, 37.7749)
// GeoPointInterfaceを持つオブジェクトから生成
GeoPoint.from(existingGeoPoint)
// コンスタントに値を直接渡して生成
GeoPoint(latitude = 37.7749, longitude = -122.4194, altitude = 100)
// 基本的なマーカー配置
val sanFrancisco = GeoPoint.fromLatLong(37.7749, -122.4194)
// MapViewContainer を GoogleMapView、MapboxMapView などの選択した地図SDKに置き換えてください
MapViewContainer(state = mapViewState) {
Marker(
position = sanFrancisco,
icon = DefaultIcon(label = "SF")
)
}
  • 範囲: -90.0 から 90.0 度
  • -90.0: 南極
  • 0.0: 赤道
  • 90.0: 北極
  • 範囲: -180.0 から 180.0 度
  • -180.0: 国際日付変更線(西側)
  • 0.0: 本初子午線(グリニッジ)
  • 180.0: 国際日付変更線(東側)

isValid() 拡張関数は、GeoPointの座標が有効な範囲内にあるかをチェックします。

  • 緯度: -90.0 〜 90.0 の範囲内
  • 経度: -180.0 〜 180.0 の範囲内

両方の条件を満たす場合に true を返します。

// 使用例
val point = GeoPoint.fromLatLong(37.7749, -122.4194)
if (point.isValid()) {
// ポイントを使用
}

座標を有効な範囲に収めるために、2つのメソッドが用意されています。

normalize() 拡張関数は、座標を有効な範囲にクランプします。

  • 緯度: -90.0 〜 90.0 にクランプ
  • 経度: -180.0 〜 180.0 に正規化(モジュロ演算)
  • 高度: null の場合は 0.0 に変換
fun GeoPointInterface.normalize(): GeoPoint
// 使用例
val invalidPoint = GeoPoint.fromLatLong(100, 200) // 無効な座標
val validPoint = invalidPoint.normalize() // 有効な範囲にクランプされる

wrap() メソッドは、極を越えた座標を適切に折り返します。

  • 緯度が90度を超えた場合: -90度から折り返し、経度を180度反転
  • 緯度が-90度を下回った場合: 90度から折り返し、経度を180度反転
  • 経度: -180.0 〜 180.0 に正規化
// 例: 極を越えた座標
val point = GeoPoint(95, 10) // 緯度が90度を超えている
val wrapped = point.wrap() // 緯度: -85.0, 経度: 190.0 → -170.0

normalize()wrap() の違いは、極を越えた場合の処理です。normalize() は単純にクランプするのに対し、wrap() は地球儀上で実際に極を越えた場合の座標を計算します。

GeoPointequals() メソッドは、浮動小数点の誤差を考慮した比較を行います。

  • 許容誤差: 1e-7(約0.00000001度、約1.1cm)
  • 比較対象: 緯度、経度、高度のすべて
val point1 = GeoPoint(37.7749, -122.4194, 100)
val point2 = GeoPoint(37.77490001, -122.41940001, 100.00000001)
val isEqual = point1 == point2 // true(許容誤差内)

この誤差許容により、浮動小数点演算による微小な差異を無視して比較できます。

toUrlValue() メソッドは、緯度と経度をURL用の文字列に変換します。

  • 形式: "緯度,経度"
  • 精度: デフォルトは6桁(約11cm)、指定可能
val point = GeoPoint(37.7749, -122.4194)
val urlValue = point.toUrlValue() // "37.774900,-122.419400" - デフォルト精度(6桁)
val urlValue3 = point.toUrlValue(precision = 3) // "37.775,-122.419" - カスタム精度(3桁)

Google Maps や Mapbox などの地図サービスのURLパラメータに使用できます。