GeoPointInterface
GeoPointInterface represents a geographic coordinate with latitude, longitude, and optional altitude.
Interface and Implementation
GeoPointInterface Interface
The GeoPointInterface interface has the following properties. It is used for unit testing and other purposes.
interface GeoPointInterface { val latitude: Double val longitude: Double val altitude: Double?}GeoPoint
The GeoPoint class is an implementation of the GeoPointInterface interface.
data class GeoPoint( override val latitude: Double, override val longitude: Double, override val altitude: Double = 0.0) : GeoPointInterfaceCreation Methods
Factory Methods
The GeoPoint class provides the following factory methods. Developers can choose the method that is most convenient for them.
// Specify values in latitude, longitude orderGeoPoint.fromLatLong(37.7749, -122.4194)
// Specify values in longitude, latitude orderGeoPoint.fromLongLat(-122.4194, 37.7749)
// Create from an object with GeoPointInterface interfaceGeoPoint.from(existingGeoPoint)
// Create by passing values directly to constructorGeoPoint(latitude = 37.7749, longitude = -122.4194, altitude = 100)Usage Examples
// Basic marker placementval sanFrancisco = GeoPoint.fromLatLong(37.7749, -122.4194)
// Replace MapViewContainer with GoogleMapView, MapboxMapView, or other map SDK of your choiceMapViewContainer(state = mapViewState) { Marker( position = sanFrancisco, icon = ColorDefaultIcon(label = "SF") )}Coordinate System
Latitude
- Range: -90.0 to 90.0 degrees
- -90.0: South Pole
- 0.0: Equator
- 90.0: North Pole
Longitude
- Range: -180.0 to 180.0 degrees
- -180.0: International Date Line (west side)
- 0.0: Prime Meridian (Greenwich)
- 180.0: International Date Line (east side)
Validation and Normalization
Validation
The isValid() extension function checks if the coordinates of a GeoPointInterface are within valid ranges.
- Latitude: Within the range -90.0 to 90.0
- Longitude: Within the range -180.0 to 180.0
Returns true when both conditions are met.
// Usage exampleval point = GeoPoint.fromLatLong(37.7749, -122.4194)if (point.isValid()) { // Use the point}Normalization
Two methods are available to keep coordinates within valid ranges.
normalize()
The normalize() extension function clamps coordinates to valid ranges.
- Latitude: Clamped to -90.0 to 90.0
- Longitude: Normalized to -180.0 to 180.0 (modulo operation)
- Altitude: Converted to 0.0 if null
fun GeoPointInterface.normalize(): GeoPoint
// Usage exampleval invalidPoint = GeoPoint.fromLatLong(100, 200) // Invalid coordinatesval validPoint = invalidPoint.normalize() // Clamped to valid rangewrap()
The wrap() method properly wraps coordinates that cross the poles.
- When latitude exceeds 90 degrees: Wraps from -90 degrees, flips longitude by 180 degrees
- When latitude falls below -90 degrees: Wraps from 90 degrees, flips longitude by 180 degrees
- Longitude: Normalized to -180.0 to 180.0
// Example: Coordinates beyond polesval point = GeoPoint(95, 10) // Latitude exceeds 90 degreesval wrapped = point.wrap() // 緯度: -85.0, 経度: 190.0 → -170.0The difference between normalize() and wrap() is how they handle pole crossing. normalize() simply clamps values, while wrap() calculates the actual coordinates as if crossing the poles on a globe.
Comparison
equals()
The equals() method of GeoPoint performs comparison considering floating-point errors.
- Tolerance: 1e-7 (approximately 0.00000001 degrees, about 1.1cm)
- Comparison targets: Latitude, longitude, and altitude
val point1 = GeoPoint(37.7749, -122.4194, 100)val point2 = GeoPoint(37.77490001, -122.41940001, 100.00000001)val isEqual = point1 == point2 // true(within tolerance)This tolerance allows comparisons to ignore tiny differences from floating-point arithmetic.
Utility Methods
toUrlValue()
The toUrlValue() method converts latitude and longitude to a URL string.
- Format:
"latitude,longitude" - Precision: Default is 6 digits (approximately 11cm), customizable
val point = GeoPoint(37.7749, -122.4194)val urlValue = point.toUrlValue() // "37.774900,-122.419400" - Default precision (6 digits)val urlValue3 = point.toUrlValue(precision = 3) // "37.775,-122.419" - Custom precision (3 digits)Can be used for URL parameters in mapping services like Google Maps or Mapbox.