All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jvmMain.io.data2viz.geojson.jackson.LngLatAlt.kt Maven / Gradle / Ivy

package io.data2viz.geojson.jackson

import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import io.data2viz.geojson.jackson.jackson.LngLatAltDeserializer
import io.data2viz.geojson.jackson.jackson.LngLatAltSerializer

import java.io.Serializable
import java.util.Arrays

/**
 * Construct a LngLatAlt with additional elements.
 * The specification allows for any number of additional elements in a position, after lng, lat, alt.
 * http://geojson.org/geojson-spec.html#positions
 */
@JsonDeserialize(using = LngLatAltDeserializer::class)
@JsonSerialize(using = LngLatAltSerializer::class)
class LngLatAlt
(
    var longitude: Double,
    var latitude: Double,
    private var altitude: Double = Double.NaN,
    vararg additionalElements: Double
) : Serializable {

    private var additionalElements = DoubleArray(0)

    fun hasAltitude(): Boolean  = !java.lang.Double.isNaN(altitude)

    private fun hasAdditionalElements(): Boolean = additionalElements.isNotEmpty()

    fun getAltitude(): Double = altitude

    fun setAltitude(altitude: Double) {
        this.altitude = altitude
        checkAltitudeAndAdditionalElements()
    }

    fun getAdditionalElements(): DoubleArray {
        return additionalElements
    }

    fun setAdditionalElements(vararg additionalElements: Double) {
        require(additionalElements.none { java.lang.Double.isNaN(it) }) { "No additional elements may be NaN." }
        require(additionalElements.none { java.lang.Double.isInfinite(it) }) { "No additional elements may be infinite." }
        this.additionalElements = additionalElements
        checkAltitudeAndAdditionalElements()
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is LngLatAlt) return false
        val lngLatAlt = other as LngLatAlt?
        return (java.lang.Double.compare(
            lngLatAlt!!.latitude,
            latitude
        ) == 0 && java.lang.Double.compare(lngLatAlt.longitude, longitude) == 0
                && java.lang.Double.compare(lngLatAlt.altitude, altitude) == 0 &&
                Arrays.equals(lngLatAlt.getAdditionalElements(), additionalElements))
    }

    override fun hashCode(): Int {
        var temp = java.lang.Double.doubleToLongBits(longitude)
        var result = (temp xor temp.ushr(32)).toInt()
        temp = java.lang.Double.doubleToLongBits(latitude)
        result = 31 * result + (temp xor temp.ushr(32)).toInt()
        temp = java.lang.Double.doubleToLongBits(altitude)
        result = 31 * result + (temp xor temp.ushr(32)).toInt()
        for (element in additionalElements) {
            temp = java.lang.Double.doubleToLongBits(element)
            result = 31 * result + (temp xor temp.ushr(32)).toInt()
        }
        return result
    }

    override fun toString(): String {
        var s = "LngLatAlt{longitude=$longitude, latitude=$latitude, altitude=$altitude"
        s += if (additionalElements.isNotEmpty()) additionalElements.joinToString(prefix = ", additionalElements=[",  postfix = "]}") else "}"
        return s
    }

    private fun checkAltitudeAndAdditionalElements() {
        require(hasAltitude() || !hasAdditionalElements()) { "Additional Elements are only valid if Altitude is also provided." }
    }

    init {
        setAdditionalElements(*additionalElements)
        checkAltitudeAndAdditionalElements()
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy