Модуль CoreLocation всегда не может точно определить реальное местоположение моего телефона.IOS

Программируем под IOS
Ответить
Anonymous
 Модуль CoreLocation всегда не может точно определить реальное местоположение моего телефона.

Сообщение Anonymous »

Модулю CoreLocation всегда не удается точно определить реальное местоположение моего телефона, а местоположение, показанное showUserLocation, всегда имеет небольшое отклонение.
Код LocationViewModel.swift

Код: Выделить всё

import Foundation
import CoreLocation
import Combine

class LocationViewModel: NSObject, ObservableObject, CLLocationManagerDelegate {
private let locationManager = CLLocationManager()

@Published var location: Location?
@Published var authorizationStatus: CLAuthorizationStatus?
@Published var errorMessage: String?
@Published var gpsSignalStatus: String = "Detecting GPS signal..."

override init() {
super.init()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
checkAuthorizationStatus()
}

func checkAuthorizationStatus() {
authorizationStatus = locationManager.authorizationStatus
switch authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
case .notDetermined:
locationManager.requestWhenInUseAuthorization()
case .denied, .restricted:
errorMessage = "The authorization of location is limited。Please turn it on in settings"
default:
errorMessage = "Unknown location authorization status"
}
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
checkAuthorizationStatus()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
self.location = Location(
coordinate: location.coordinate,
altitude: location.altitude,
speed: location.speed,
direction: location.course,
horizontalAccuracy: location.horizontalAccuracy,
timestamp: location.timestamp
)

if location.horizontalAccuracy < 0 {
gpsSignalStatus = "GPS is not avaliable"
} else if location.horizontalAccuracy > 100 {
gpsSignalStatus = "GPS signal is weak."
} else {
gpsSignalStatus = "GPS signal is great."
}
}

func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
if var currentLocation = self.location {
currentLocation.direction = newHeading.trueHeading
self.location = currentLocation
}
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Failed to find user's location: \(error.localizedDescription)")
}
}
Код LocationView.swift

Код: Выделить всё

...
struct MapView: View {
@ObservedObject var viewModel: LocationViewModel

@State var cameraPosition: MapCameraPosition = .automatic

var body: some View {
ZStack {
Map(position: $cameraPosition) {
if let coordinate = viewModel.location?.coordinate {
Annotation("MyLocation", coordinate: CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude)) {
Text("The position which CoreLocation got")
}

}
}
.onReceive(viewModel.location.publisher) { location in
cameraPosition = .region(MKCoordinateRegion(
center: location.coordinate,
span: MKCoordinateSpan(latitudeDelta: 0.0025, longitudeDelta: 0.0025)
))
}
}
}
}
...
Позиция, полученная с помощью CoreLocation, имеет погрешность в несколько сотен метров по сравнению с фактической позицией.
  • Любая проблема в мой код?
  • Есть ли способ получить правильное местоположение?


Подробнее здесь: https://stackoverflow.com/questions/786 ... accurately
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»