Hi All
I’m playing around with at simple golf app for iPhone. The idea is to show me the distance to the hole based on my current location. This is kind of working … Since i get a value that seems correct.
But if i’m standing still (left the phone on a table), the distance to the hole jumps all over the place. I see +/- 70 meters.
I know the precision of a consumer device is not impressive, but i believe i should be able to se a result around +/- 5 meters.
Any help will be much appreciated.
I have played around with the code so many times, so there may be some (a lot) that can be removed.
I have created a view for the HoleDetails. Here a picture of the hole is shown and the current distance to the flag is provide. A MapFunction file. And file with the course and hole information
Again any help and directions is appreciated
HoleDetails:
import MapKit
import CoreLocation
import SwiftUI
struct HoleDetails: View {
@StateObject var locationManager = MapViewModel()
@Binding var klub:String
@Binding var valgtbane: String
@State var tracking:MapUserTrackingMode = .follow
@State var holeInfo:[HoleDefinition] = [HoleDefinition]()
@State var dataService = DataService()
@State var sheetVisiable = false
@State var selectedHole: String = ""
@State var searchValue = 1
var currentIndex = 0
var body: some View {
ZStack {
Color(red: 0.639, green: 0.847, blue: 0.792)
.ignoresSafeArea()
ForEach(holeInfo) { info in
if String(searchValue) == info.HoleNumber
{
VStack{
HStack{
Button {
if searchValue == 1 {}
else {searchValue -= 1}
} label:{
Image(systemName: "chevron.backward")
}
Spacer()
Image(systemName: String(info.HoleNumber) + ".circle")
Text(" Par " + String(info.par))
Spacer()
Button {
if searchValue == 18 {}
else {searchValue += 1}
} label:{
Image(systemName: "chevron.forward")
}
} .font(.largeTitle)
.fontWeight(.semibold)
.foregroundColor(Color(red: 0.506, green: 0.003, blue: 0.502))
.padding(.horizontal)
Divider()
.frame(minHeight: 5)
.overlay(Color(red: 0.506, green: 0.003, blue: 0.502))
Image(info.imagename)
.resizable()
.aspectRatio(contentMode: .fit)
.onTapGesture {
selectedHole = info.imagename
sheetVisiable = true
}
.padding()
switch locationManager.locationManager?.authorizationStatus {
case .authorizedWhenInUse, .some(.authorizedAlways):
@State var place1 = CLLocation(latitude: locationManager.currentLocation?.latitude ?? 0.00, longitude: locationManager.currentLocation?.longitude ?? 0.00)
let place2 = CLLocation(latitude: info.Lat, longitude: info.Lon)
@State var distanceInMeters:Double = place1.distance(from: place2)
Text("Afstand til midten af green:")
.padding(.bottom)
Text("\(distanceInMeters, specifier: "%.2f")")
.font(.title)
case .restricted, .denied, .none, .some(.notDetermined), .some(_):
Text("Current location data was restricted or unavailable.")
.font(.title)
Spacer()
}
}.onAppear {
locationManager.checkIfLocationServicesIsEnabled()
}
.sheet(isPresented: $sheetVisiable) {
HoleView_Enlarge(selectedHole: $selectedHole, sheetVisible: $sheetVisiable)
}
.gesture(DragGesture(minimumDistance: 0, coordinateSpace: .local)
.onEnded({ value in
if value.translation.width < 0 {
if searchValue == 18 {}
else {searchValue += 1}
}
if value.translation.width > 0 {
if searchValue == 1 {}
else {searchValue -= 1}
}
}))
}
}
}.onAppear{holeInfo = dataService.getHolesAll(klub: klub, valgtbane: valgtbane)}
}
}
struct HoleDetails_Previews: PreviewProvider {
static var previews: some View {
HoleDetails(klub: Binding.constant("Hørsholm Golf Klub"), valgtbane: Binding.constant("Vest-Nord"))
}
}
MapFunction
import SwiftUI
import CoreLocation
import CoreLocationUI
import MapKit
import Foundation
enum MapDetails {
static let startingLocation = CLLocationCoordinate2D(latitude: 55.677984489004544, longitude: 12.524586647705545)
static let defaultSpan = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
}
final class MapViewModel: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var region = MKCoordinateRegion(center: MapDetails.startingLocation, span: MapDetails.defaultSpan)
var locationManager: CLLocationManager?
private let manager = CLLocationManager()
@Published var location: CLLocationCoordinate2D?
@Published var currentLocation: CLLocationCoordinate2D?
func checkIfLocationServicesIsEnabled() {
if CLLocationManager.locationServicesEnabled() {
locationManager = CLLocationManager()
locationManager!.delegate = self
} else {
print("You need to update your settings")
}
}
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
}
DataService
import Foundation
import SwiftUI
struct DataService {
let club08_courseFront:[HoleDefinition] =
[HoleDefinition(club: 8, Course: "Front", HoleNumber: "1", imagename: "1-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 244, Lat: 55.877614, Lon: 12.533095),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "2", imagename: "2-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 123, Lat: 55.875104, Lon: 12.527999),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "3", imagename: "3-hul-2019", par: 3, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 387, Lat: 55.874358, Lon: 12.529235),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "4", imagename: "4-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 285, Lat: 55.873958, Lon: 12.535927),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "5", imagename: "5-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 165, Lat: 55.875343, Lon: 12.531754),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "6", imagename: "6-hul-2019", par: 3, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 371, Lat: 55.874374, Lon: 12.531181),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "7", imagename: "7-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 83, Lat: 55.877043, Lon: 12.531913),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "8", imagename: "8-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 269, Lat: 55.878467, Lon: 12.526468),
HoleDefinition(club: 8, Course: "Front", HoleNumber: "9", imagename: "9-hul-2019", par: 4, HCP: 00, MensBackTee: 286, MensTee: 286, WomenBackTee: 286, WomenTee: 380, Lat: 55.880314, Lon: 12.529265)]
BR
Loepp