move LocationUtils into utils

pull/434/head
andrekir 2022-05-20 11:20:13 -03:00
rodzic 425372f2cc
commit 2389c222a0
3 zmienionych plików z 28 dodań i 33 usunięć

Wyświetl plik

@ -1,8 +1,8 @@
package com.geeksville.mesh package com.geeksville.mesh
import android.os.Parcelable import android.os.Parcelable
import com.geeksville.mesh.ui.bearing import com.geeksville.mesh.util.bearing
import com.geeksville.mesh.ui.latLongToMeter import com.geeksville.mesh.util.latLongToMeter
import com.geeksville.util.anonymize import com.geeksville.util.anonymize
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

Wyświetl plik

@ -16,7 +16,7 @@ import com.geeksville.mesh.*
import com.geeksville.mesh.database.PacketRepository import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.database.entity.Packet import com.geeksville.mesh.database.entity.Packet
import com.geeksville.mesh.service.MeshService import com.geeksville.mesh.service.MeshService
import com.geeksville.mesh.ui.positionToMeter import com.geeksville.mesh.util.positionToMeter
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

Wyświetl plik

@ -1,6 +1,9 @@
package com.geeksville.mesh.ui package com.geeksville.mesh.util
import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshProtos
import kotlin.math.abs
import kotlin.math.acos
import kotlin.math.atan2
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
@ -28,15 +31,15 @@ fun degreesToDMS(
val isPos = degIn >= 0 val isPos = degIn >= 0
val dirLetter = val dirLetter =
if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W' if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W'
degIn = Math.abs(degIn) degIn = abs(degIn)
val degOut = degIn.toInt() val degOut = degIn.toInt()
val minutes = 60 * (degIn - degOut) val minutes = 60 * (degIn - degOut)
val minwhole = minutes.toInt() val minwhole = minutes.toInt()
val seconds = (minutes - minwhole) * 60 val seconds = (minutes - minwhole) * 60
return arrayOf( return arrayOf(
Integer.toString(degOut), Integer.toString(minwhole), degOut.toString(), minwhole.toString(),
java.lang.Double.toString(seconds), seconds.toString(),
Character.toString(dirLetter) dirLetter.toString()
) )
} }
@ -45,14 +48,14 @@ fun degreesToDM(_degIn: Double, isLatitude: Boolean): Array<String> {
val isPos = degIn >= 0 val isPos = degIn >= 0
val dirLetter = val dirLetter =
if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W' if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W'
degIn = Math.abs(degIn) degIn = abs(degIn)
val degOut = degIn.toInt() val degOut = degIn.toInt()
val minutes = 60 * (degIn - degOut) val minutes = 60 * (degIn - degOut)
val seconds = 0 val seconds = 0
return arrayOf( return arrayOf(
Integer.toString(degOut), java.lang.Double.toString(minutes), degOut.toString(), minutes.toString(),
Integer.toString(seconds), seconds.toString(),
Character.toString(dirLetter) dirLetter.toString()
) )
} }
@ -61,14 +64,14 @@ fun degreesToD(_degIn: Double, isLatitude: Boolean): Array<String> {
val isPos = degIn >= 0 val isPos = degIn >= 0
val dirLetter = val dirLetter =
if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W' if (isLatitude) if (isPos) 'N' else 'S' else if (isPos) 'E' else 'W'
degIn = Math.abs(degIn) degIn = abs(degIn)
val degOut = degIn val degOut = degIn
val minutes = 0 val minutes = 0
val seconds = 0 val seconds = 0
return arrayOf( return arrayOf(
java.lang.Double.toString(degOut), Integer.toString(minutes), degOut.toString(), minutes.toString(),
Integer.toString(seconds), seconds.toString(),
Character.toString(dirLetter) dirLetter.toString()
) )
} }
@ -89,10 +92,10 @@ fun addDistance(
distMeters: Double, distMeters: Double,
theta: Double theta: Double
): DoubleArray { ): DoubleArray {
val dx = distMeters * Math.sin(theta) // theta measured clockwise val dx = distMeters * sin(theta) // theta measured clockwise
// from due north // from due north
val dy = distMeters * Math.cos(theta) // dx, dy same units as R val dy = distMeters * cos(theta) // dx, dy same units as R
val dLong = dx / (111320 * Math.cos(lat)) // dx, dy in meters val dLong = dx / (111320 * cos(lat)) // dx, dy in meters
val dLat = dy / 110540 // result in degrees long/lat val dLat = dy / 110540 // result in degrees long/lat
return doubleArrayOf(lat + dLat, longitude + dLong) return doubleArrayOf(lat + dLat, longitude + dLong)
} }
@ -111,16 +114,10 @@ fun latLongToMeter(
val a2 = lng_a / pk val a2 = lng_a / pk
val b1 = lat_b / pk val b1 = lat_b / pk
val b2 = lng_b / pk val b2 = lng_b / pk
val t1 = val t1 = cos(a1) * cos(a2) * cos(b1) * cos(b2)
Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos( val t2 = cos(a1) * sin(a2) * cos(b1) * sin(b2)
b2 val t3 = sin(a1) * sin(b1)
) var tt = acos(t1 + t2 + t3)
val t2 =
Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(
b2
)
val t3 = Math.sin(a1) * Math.sin(b1)
var tt = Math.acos(t1 + t2 + t3)
if (java.lang.Double.isNaN(tt)) tt = 0.0 // Must have been the same point? if (java.lang.Double.isNaN(tt)) tt = 0.0 // Must have been the same point?
return 6366000 * tt return 6366000 * tt
} }
@ -186,10 +183,8 @@ fun bearing(
val lat2Rad = Math.toRadians(lat2) val lat2Rad = Math.toRadians(lat2)
val deltaLonRad = Math.toRadians(lon2 - lon1) val deltaLonRad = Math.toRadians(lon2 - lon1)
val y = sin(deltaLonRad) * cos(lat2Rad) val y = sin(deltaLonRad) * cos(lat2Rad)
val x = val x = cos(lat1Rad) * sin(lat2Rad) - (sin(lat1Rad) * cos(lat2Rad) * cos(deltaLonRad))
cos(lat1Rad) * sin(lat2Rad) - (sin(lat1Rad) * cos(lat2Rad) return radToBearing(atan2(y, x))
* Math.cos(deltaLonRad))
return radToBearing(Math.atan2(y, x))
} }
/** /**