kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
move LocationUtils into utils
rodzic
425372f2cc
commit
2389c222a0
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
Ładowanie…
Reference in New Issue