GeoPointInterface(地理座標)
GeoPointInterface は、緯度・経度・高度(オプション)を持つ地理座標を表します。
インターフェースと実装
Section titled “インターフェースと実装”GeoPointInterface インターフェース
Section titled “GeoPointInterface インターフェース”GeoPointInterfaceは、以下のプロパティを持ちます。ユニットテストなどに用います。
interface GeoPointInterface { val latitude: Double val longitude: Double val altitude: Double?}GeoPoint
Section titled “GeoPoint”GeoPointクラスは、GeoPointInterfaceを実装したクラスです。
data class GeoPoint( override val latitude: Double, override val longitude: Double, override val altitude: Double = 0.0) : GeoPointInterface生成メソッド
Section titled “生成メソッド”ファクトリーメソッド
Section titled “ファクトリーメソッド”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") )}緯度(Latitude)
Section titled “緯度(Latitude)”- 範囲: -90.0 から 90.0 度
- -90.0: 南極
- 0.0: 赤道
- 90.0: 北極
経度(Longitude)
Section titled “経度(Longitude)”- 範囲: -180.0 から 180.0 度
- -180.0: 国際日付変更線(西側)
- 0.0: 本初子午線(グリニッジ)
- 180.0: 国際日付変更線(東側)
検証と正規化
Section titled “検証と正規化”isValid() 拡張関数は、GeoPointの座標が有効な範囲内にあるかをチェックします。
- 緯度: -90.0 〜 90.0 の範囲内
- 経度: -180.0 〜 180.0 の範囲内
両方の条件を満たす場合に true を返します。
// 使用例val point = GeoPoint.fromLatLong(37.7749, -122.4194)if (point.isValid()) { // ポイントを使用}座標を有効な範囲に収めるために、2つのメソッドが用意されています。
normalize()
Section titled “normalize()”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()
Section titled “wrap()”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.0normalize() と wrap() の違いは、極を越えた場合の処理です。normalize() は単純にクランプするのに対し、wrap() は地球儀上で実際に極を越えた場合の座標を計算します。
equals()
Section titled “equals()”GeoPoint の equals() メソッドは、浮動小数点の誤差を考慮した比較を行います。
- 許容誤差: 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(許容誤差内)この誤差許容により、浮動小数点演算による微小な差異を無視して比較できます。
ユーティリティメソッド
Section titled “ユーティリティメソッド”toUrlValue()
Section titled “toUrlValue()”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パラメータに使用できます。