Fixed an old issue regarding satellite footprint rendering #36

This commit is contained in:
Arty Bishop committed 2022-02-23 19:17:41 +00:00
1 parent 74cbad5127
commit 03323172ea
9 files changed
+44 -25

No files matched your search

+2 -1
View File
@@ -2,8 +2,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rtbishop.look4sat"> package="com.rtbishop.look4sat">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
@@ -32,6 +32,7 @@ import androidx.navigation.fragment.navArgs
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentMapBinding import com.rtbishop.look4sat.databinding.FragmentMapBinding
import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.predict.SatPos
import com.rtbishop.look4sat.domain.predict.Satellite import com.rtbishop.look4sat.domain.predict.Satellite
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.osmdroid.config.Configuration import org.osmdroid.config.Configuration
@@ -41,7 +42,6 @@ import org.osmdroid.views.CustomZoomButtonsController
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.FolderOverlay import org.osmdroid.views.overlay.FolderOverlay
import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Marker
import org.osmdroid.views.overlay.Polygon
import org.osmdroid.views.overlay.Polyline import org.osmdroid.views.overlay.Polyline
@AndroidEntryPoint @AndroidEntryPoint
@@ -59,8 +59,9 @@ class MapFragment : Fragment(R.layout.fragment_map) {
strokeJoin = Paint.Join.ROUND strokeJoin = Paint.Join.ROUND
} }
private val footprintPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { private val footprintPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
strokeWidth = 2f
style = Paint.Style.FILL_AND_STROKE style = Paint.Style.FILL_AND_STROKE
color = Color.parseColor("#26FFE082") color = Color.parseColor("#FFE082")
} }
private lateinit var binding: FragmentMapBinding private lateinit var binding: FragmentMapBinding
@@ -124,7 +125,7 @@ class MapFragment : Fragment(R.layout.fragment_map) {
posMap.entries.forEach { posMap.entries.forEach {
Marker(mapView).apply { Marker(mapView).apply {
setInfoWindow(null) setInfoWindow(null)
textLabelFontSize = 24 textLabelFontSize = 28
textLabelBackgroundColor = Color.TRANSPARENT textLabelBackgroundColor = Color.TRANSPARENT
textLabelForegroundColor = textLabelForegroundColor =
ContextCompat.getColor(requireContext(), R.color.accent) ContextCompat.getColor(requireContext(), R.color.accent)
@@ -164,13 +165,17 @@ class MapFragment : Fragment(R.layout.fragment_map) {
binding.mapView.overlays[1] = trackOverlay binding.mapView.overlays[1] = trackOverlay
} }
private fun handleFootprint(satFootprint: List<GeoPos>) { private fun handleFootprint(satPos: SatPos) {
val footprintPoints = satFootprint.map { GeoPoint(it.latitude, it.longitude) } val center = GeoPoint(Math.toDegrees(satPos.latitude), Math.toDegrees(satPos.longitude))
val footprintOverlay = Polygon().apply { val radiusM = satPos.getRangeCircleRadiusKm() * 1000
fillPaint.set(footprintPaint) val footprintPoints = mutableListOf<GeoPoint>()
for (i in 0..720) {
footprintPoints.add(center.destinationPoint(radiusM, i.toDouble()))
}
val footprintOverlay = Polyline().apply {
outlinePaint.set(footprintPaint) outlinePaint.set(footprintPaint)
try { try {
this.points = footprintPoints setPoints(footprintPoints)
} catch (exception: IllegalArgumentException) { } catch (exception: IllegalArgumentException) {
println(exception.stackTraceToString()) println(exception.stackTraceToString())
} }
@@ -180,8 +185,8 @@ class MapFragment : Fragment(R.layout.fragment_map) {
private fun handleMapData(mapData: MapData) { private fun handleMapData(mapData: MapData) {
binding.apply { binding.apply {
mapDataName.text = mapTitle.text = mapData.name
String.format(getString(R.string.pat_osm_idName), mapData.catNum, mapData.name) mapDataId.text = String.format(getString(R.string.map_sat_id), mapData.catNum)
mapDataQth.text = String.format(getString(R.string.map_qth), mapData.qthLoc) mapDataQth.text = String.format(getString(R.string.map_qth), mapData.qthLoc)
mapDataAlt.text = String.format(getString(R.string.pat_altitude), mapData.altitude) mapDataAlt.text = String.format(getString(R.string.pat_altitude), mapData.altitude)
mapDataDst.text = String.format(getString(R.string.pat_distance), mapData.range) mapDataDst.text = String.format(getString(R.string.pat_distance), mapData.range)
@@ -23,6 +23,7 @@ import com.rtbishop.look4sat.domain.ISettings
import com.rtbishop.look4sat.domain.QthConverter import com.rtbishop.look4sat.domain.QthConverter
import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.predict.Predictor import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.domain.predict.SatPos
import com.rtbishop.look4sat.domain.predict.Satellite import com.rtbishop.look4sat.domain.predict.Satellite
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.* import kotlinx.coroutines.*
@@ -53,8 +54,8 @@ class MapViewModel @Inject constructor(
private val _track = MutableLiveData<List<List<GeoPos>>>() private val _track = MutableLiveData<List<List<GeoPos>>>()
val track: LiveData<List<List<GeoPos>>> = _track val track: LiveData<List<List<GeoPos>>> = _track
private val _footprint = MutableLiveData<List<GeoPos>>() private val _footprint = MutableLiveData<SatPos>()
val footprint: LiveData<List<GeoPos>> = _footprint val footprint: LiveData<SatPos> = _footprint
private val _mapData = MutableLiveData<MapData>() private val _mapData = MutableLiveData<MapData>()
val mapData: LiveData<MapData> = this._mapData val mapData: LiveData<MapData> = this._mapData
@@ -151,12 +152,7 @@ class MapViewModel @Inject constructor(
private suspend fun getSatFootprint(satellite: Satellite, pos: GeoPos, date: Date) { private suspend fun getSatFootprint(satellite: Satellite, pos: GeoPos, date: Date) {
val satPos = predictor.getSatPos(satellite, pos, date.time) val satPos = predictor.getSatPos(satellite, pos, date.time)
val satFootprint = satPos.getRangeCircle().map { rangePos -> _footprint.postValue(satPos)
val osmLat = clipLat(rangePos.latitude)
val osmLon = clipLon(rangePos.longitude)
GeoPos(osmLat, osmLon)
}
_footprint.postValue(satFootprint)
} }
private suspend fun getSatData(satellite: Satellite, pos: GeoPos, date: Date) { private suspend fun getSatData(satellite: Satellite, pos: GeoPos, date: Date) {
+3 -1
View File
@@ -18,11 +18,13 @@
<EditText <EditText
android:id="@+id/entries_search" android:id="@+id/entries_search"
style="@style/ToolbarTitle" style="@style/ToolbarTitle"
android:inputType="text" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="52dp" android:layout_marginStart="52dp"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginEnd="52dp" android:layout_marginEnd="52dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:inputType="text"
android:hint="@string/entries_search_hint" android:hint="@string/entries_search_hint"
android:importantForAutofill="no" /> android:importantForAutofill="no" />
+10 -4
View File
@@ -22,6 +22,12 @@
<TextView <TextView
android:id="@+id/map_title" android:id="@+id/map_title"
style="@style/ToolbarTitle" style="@style/ToolbarTitle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="52dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="52dp"
android:layout_marginBottom="4dp"
android:text="@string/map_title" /> android:text="@string/map_title" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
@@ -86,7 +92,7 @@
style="@style/WorldMapText" style="@style/WorldMapText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="10dp"
android:layout_marginTop="6dp" android:layout_marginTop="6dp"
android:text="@string/pat_osm_lat" android:text="@string/pat_osm_lat"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -119,7 +125,7 @@
style="@style/WorldMapText" style="@style/WorldMapText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="10dp"
android:text="@string/pat_altitude" android:text="@string/pat_altitude"
app:layout_constraintBaseline_toBaselineOf="@+id/map_data_lat" app:layout_constraintBaseline_toBaselineOf="@+id/map_data_lat"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />
@@ -172,7 +178,7 @@
app:layout_constraintTop_toTopOf="@+id/map_coordinator" /> app:layout_constraintTop_toTopOf="@+id/map_coordinator" />
<TextView <TextView
android:id="@+id/map_data_name" android:id="@+id/map_data_id"
style="@style/WorldMapText" style="@style/WorldMapText"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -181,7 +187,7 @@
android:ellipsize="end" android:ellipsize="end"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:maxLines="1" android:maxLines="1"
android:text="@string/pat_osm_idName" android:text="@string/map_sat_id"
app:layout_constraintBaseline_toBaselineOf="@+id/map_prev_btn" app:layout_constraintBaseline_toBaselineOf="@+id/map_prev_btn"
app:layout_constraintEnd_toStartOf="@+id/map_next_btn" app:layout_constraintEnd_toStartOf="@+id/map_next_btn"
app:layout_constraintStart_toEndOf="@+id/map_prev_btn" /> app:layout_constraintStart_toEndOf="@+id/map_prev_btn" />
+2
View File
@@ -63,6 +63,8 @@
<string name="map_title">Карта Мира</string> <string name="map_title">Карта Мира</string>
<string name="map_qth">QTH Локатор: %s</string> <string name="map_qth">QTH Локатор: %s</string>
<string name="map_coverage">Покрытие: %.0fкм</string> <string name="map_coverage">Покрытие: %.0fкм</string>
<string name="map_sat_id">Id: %d</string>
<string name="map_sat_name">%s</string>
<string name="radar_az_text">Азим.</string> <string name="radar_az_text">Азим.</string>
<string name="radar_az_value">%.1f°</string> <string name="radar_az_value">%.1f°</string>
+2
View File
@@ -74,6 +74,8 @@
<string name="map_title">World Map</string> <string name="map_title">World Map</string>
<string name="map_qth">QTH Locator: %s</string> <string name="map_qth">QTH Locator: %s</string>
<string name="map_coverage">Coverage: %.0f km</string> <string name="map_coverage">Coverage: %.0f km</string>
<string name="map_sat_id">Id: %d</string>
<string name="map_sat_name">%s</string>
<string name="map_copyright" translatable="false">Wikimedia maps | Map data © OpenStreetMap contributors</string> <string name="map_copyright" translatable="false">Wikimedia maps | Map data © OpenStreetMap contributors</string>
<string name="radar_az_text">Azimuth</string> <string name="radar_az_text">Azimuth</string>
+2
View File
@@ -57,6 +57,8 @@
<item name="android:layout_gravity">center</item> <item name="android:layout_gravity">center</item>
<item name="android:background">@color/transparent</item> <item name="android:background">@color/transparent</item>
<item name="android:gravity">center</item> <item name="android:gravity">center</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
<item name="android:includeFontPadding">false</item> <item name="android:includeFontPadding">false</item>
<item name="android:textColor">@color/accent</item> <item name="android:textColor">@color/accent</item>
<item name="android:textColorHint">@color/accent</item> <item name="android:textColorHint">@color/accent</item>
@@ -51,7 +51,6 @@ data class SatPos(
fun getRangeCircle(): List<GeoPos> { fun getRangeCircle(): List<GeoPos> {
val positions = mutableListOf<GeoPos>() val positions = mutableListOf<GeoPos>()
val beta = acos(earthRadiusKm / (earthRadiusKm + altitude)) val beta = acos(earthRadiusKm / (earthRadiusKm + altitude))
// val radiusKm = earthRadiusKm * acos(earthRadiusKm / (earthRadiusKm + altitude))
var tempAzimuth = 0 var tempAzimuth = 0
while (tempAzimuth < 360) { while (tempAzimuth < 360) {
val azimuth = tempAzimuth / 360.0 * 2.0 * Math.PI val azimuth = tempAzimuth / 360.0 * 2.0 * Math.PI
@@ -80,4 +79,8 @@ data class SatPos(
} }
return positions return positions
} }
fun getRangeCircleRadiusKm(): Double {
return earthRadiusKm * acos(earthRadiusKm / (earthRadiusKm + altitude))
}
} }