GPS zu ungenau 50 km danaben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • GPS zu ungenau 50 km danaben

    Hallo woran kann es legen das der Standort von meiner Wetter App 50 km daneben liegt obwohl ich als reichweite 100 m eingegeben habe ? Hier ist ein Teil des Codes.

    Quellcode

    1. func setupLocationmanager() {
    2. locationManager.delegate = self
    3. locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    4. locationManager.requestWhenInUseAuthorization()
    5. locationManager.startUpdatingLocation()
    6. }
    7. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    8. let location = locations[locations.count - 1]
    9. if location.horizontalAccuracy > 0 {
    10. locationManager.stopUpdatingLocation()
    11. locationManager.delegate = nil
    12. }
    13. let latitude = Int(location.coordinate.latitude)
    14. let longitude = Int(location.coordinate.longitude)
    15. let url = WETTER_URL_BY_CORDINATES + "lat=\(latitude)&lon=\(longitude)" + "&appid=\(ID)" + "&units=\(UNIT)" + "&lang=\(LANGUAGE)"
    16. getWeatherData(url: url)
    17. }
    Alles anzeigen
  • Sebi89 schrieb:

    Was genau muss ich machen ?
    Dir genau überlegen, was Dein Code macht. Letztlich brauchst Du bei der Abfrage eine Balance zwischen der Genauigkeit, die Du mit kCLLocationAccuracyHundredMeters bekommen kannst und welche für Deine Anwendung ausreichend ist. Bei einer Wetterabfrage würde ich etwas im Kilometer-Bereich angeben.

    Aber Du hat Dir mit der o. g. Abfrage ja sicher etwas gedacht ... was denn?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ne ich lerne gerade noch wie man eine wetter app macht und hab das so aus dem kurs übernommen aber wenn ich die app auf dem iPhone teste ist der standort weit daneben hatte das schon geänder auf kilometer auch mal aber geht nicht bekomme immer manfort raus. Deswegen denke ich das der eine wert > 0 vllt falsch ist
  • Sebi89 schrieb:

    Deswegen denke ich das der eine wert > 0 vllt falsch ist
    Warum sollte der falsch sein? Ich habe noch nie etwas mit CLLocationManager gemacht, aber die Aussage dieses CLLocation-Properties ist ja klar: Wie genau ist der gelieferte Standort (ungefähr). Wenn Du nur auf > 0 prüfst, sagst Du ja quasi "Ist mir egal, wie gut die Messung ist, Hauptsache ich habe überhaupt eine."... Also beendest Du die Standortbestimmung nach der ersten Meldung.

    Ich weiss nicht, welche Du Erfahrung Du in z. B. der Karten-App so machst, aber bei mir braucht es immer etwas, bis der Standort stimmt, das lässt sich ja auch gut an dem "Genauigkeits-Radius" nachvollziehen. Also würde ich hier einen Wert wie z. B. 1000 eintragen, damit die Messung erst beendet wird, wenn der Standort auf einen Kilometer stimmt. Kleiner als im Hundertmeter-Bereich darf es nicht sein, da Du gar nicht so genaue Messungen anforderst.

    Also wird die Delegate-Methode häufiger aufgerufen. Du musst dann selber entscheiden, was das für die Wetter-URL bedeutet: Ebenfalls ein mehrfacher Aufruf, oder nur bei genügend genauer Messung (was auch nie sein könnte).

    Ich rate Dir, auch bei Kursen etc. keine Zeile Code (und das meine ich wörtlich) zu verwenden, die Du nicht 100% verstanden hast. Nur so lernst Du...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • ich habs probiert mit < 1000 aber es klappt einfach nicht. er findet nicht die genauen lat und long daten. was kann ich noch tun bin echt am verzweifeln

    edit: Also meine Stadt Wetter Ruhr hat die werte latitude 51.3860225 und longitude 7.3914998 und zurück als JSON bekomme ich latitude 51.380000000000003 und longitude 7.3700000000000001

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Sebi89 ()

  • Dann erhöhe die Genauigkeit noch ein wenig (<500), du kannst ja mit der Accuracy spielen bis du einen akzeptablen Wert gefunden hast. Du musst nur bedenken, dass es dann länger Dauert die Position zu bestimmen und mehr am Akku gesaugt wird.

    Wobei ich denke, dass es in deinem Fall auch kein Problem sein sollte die höchste Genauigkeit zu nehmen und eine Accuracy von 100-500m anzustreben. Am Akku dürfte der Nutzer das kaum merken, höchsten bei der Dauer bis der Ort bestimmt wurde.

    Edit: Ich sehe gerade, dass du latitude und Longitude in Int umwandelst. Aus 58.38 wird dann 58, das dürfte zu der Abweichung führen.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • Kontrolliere nochmal mit z. B. Konsolausgaben, dass Du long und lat wirklich inkl. Kommastellen an den Webservice schickst ... und wenn ja: Kann es sein, dass dieser eben keine Daten für Deinen Standort liefert? Wo "zeigt er mir immer Enerke an"? Ich habe das Gefühl, Du jagst einem nicht bestehenden Fehler hinterher (die Integers waren definitiv einer)...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Das bekomm ich vom Server

    QuellcodeQuellcode bearbeiten


    [*]2020-07-28 19:28:07.224268+0200 Wetter App[1979:310957] This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain both “NSLocationAlwaysAndWhenInUseUsageDescription” and “NSLocationWhenInUseUsageDescription” keys with string values explaining to the user how the app uses this data
    [*]{
    [*] "visibility" : 10000,
    [*] "sys" : {
    [*] "type" : 3,
    [*] "sunset" : 1595964273,
    [*] "sunrise" : 1595908154,
    [*] "id" : 202509,
    [*] "country" : "DE"
    [*] },
    [*] "timezone" : 7200,
    [*] "wind" : {
    [*] "speed" : 4.9299999999999997,
    [*] "deg" : 268
    [*] },
    [*] "dt" : 1595957185,
    [*] "clouds" : {
    [*] "all" : 69
    [*] },
    [*] "base" : "stations",
    [*] "main" : {
    [*] "temp" : 21.82,
    [*] "temp_min" : 20.559999999999999,
    [*] "pressure" : 1013,
    [*] "feels_like" : 18.239999999999998,
    [*] "humidity" : 45,
    [*] "temp_max" : 23.329999999999998
    [*] },
    [*] "id" : 2930350,
    [*] "coord" : {
    [*] "lon" : 7.3700000000000001,
    [*] "lat" : 51.380000000000003
    [*] },
    [*] "weather" : [
    [*] {
    [*] "description" : "Überwiegend bewölkt",
    [*] "main" : "Clouds",
    [*] "id" : 803,
    [*] "icon" : "04d"
    [*] }
    [*] ],
    [*] "name" : "Enerke",
    [*] "cod" : 200
    [*]}
    [/list]
  • Wo liegt Enerke? Im Radius von 1km neben Wetter Ruhr. Passt von daher. Versuche für die Genauigkeit mal einen Wert von 50M und erhöhe die desiredAccuracy auf best oder navigation.

    Edit: Trage Vorher aber mal die fehlenden Werte Für “NSLocationAlwaysAndWhenInUseUsageDescription” und “NSLocationWhenInUseUsageDescription” in die plist ein und versuche es dann nochmal.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • ist eingetragen und hab das mal geändert immer dasselbe ergebnis. hier ist mal der ganze code vom Programm

    Quellcode

    1. import UIKit
    2. import CoreLocation
    3. import Alamofire
    4. import SwiftyJSON
    5. class WetterViewController: UIViewController, CLLocationManagerDelegate {
    6. override func viewDidLoad() {
    7. super.viewDidLoad()
    8. setupLocationmanager()
    9. setDate()
    10. setTime()
    11. timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.setTime), userInfo: nil, repeats: true)
    12. }
    13. // MARK: - Outlets
    14. @IBOutlet weak var cityLabel: UILabel!
    15. @IBOutlet weak var temperaturLabel: UILabel!
    16. @IBOutlet weak var statusLabel: UILabel!
    17. @IBOutlet weak var datumLabel: UILabel!
    18. @IBOutlet weak var wetterBild: UIImageView!
    19. @IBOutlet weak var uhrzeitLabel: UILabel!
    20. // MARK: - Variabeln
    21. var locationManager = CLLocationManager()
    22. var weatherDataModel = WeatherDataModel()
    23. var timer = Timer()
    24. let UNIT = "metric"
    25. let LANGUAGE = "de"
    26. let ID = ""
    27. let WETTER_URL_BY_CORDINATES = "http://api.openweathermap.org/data/2.5/weather?"
    28. let WETTER_URL_BY_CITYNAME = "http://api.openweathermap.org/data/2.5/weather?q="
    29. // MARK: - GPS Data
    30. func setupLocationmanager() {
    31. locationManager.delegate = self
    32. locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    33. locationManager.requestAlwaysAuthorization()
    34. locationManager.requestWhenInUseAuthorization()
    35. locationManager.startUpdatingLocation()
    36. }
    37. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    38. let location = locations[locations.count - 1]
    39. if location.horizontalAccuracy < 50 {
    40. locationManager.stopUpdatingLocation()
    41. locationManager.delegate = nil
    42. }
    43. let latitude = Double(location.coordinate.latitude)
    44. let longitude = Double(location.coordinate.longitude)
    45. let url = WETTER_URL_BY_CORDINATES + "lat=\(latitude)&lon=\(longitude)" + "&appid=\(ID)" + "&units=\(UNIT)" + "&lang=\(LANGUAGE)"
    46. getWeatherData(url: url)
    47. }
    48. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    49. erstelleAnzeige(message: error.localizedDescription)
    50. }
    51. // MARK: - getWetterdata
    52. func getWeatherData(url: String) {
    53. AF.request(url, method: .get).responseJSON { (repsone) in
    54. switch repsone.result {
    55. case .success:
    56. let weatherJSON : JSON = JSON(repsone.value!)
    57. self.getWeatherDataFromJSON(json: weatherJSON)
    58. print("\(weatherJSON)")
    59. case .failure:
    60. self.erstelleAnzeige(message: "\(repsone.error!)")
    61. }
    62. }
    63. }
    64. // MARK: - JSON Daten
    65. func getWeatherDataFromJSON(json: JSON) {
    66. if json["main"]["temp"].double != nil {
    67. weatherDataModel.temp = json["main"]["temp"].intValue
    68. weatherDataModel.city = json["name"].stringValue
    69. weatherDataModel.country = json["sys"]["country"].stringValue
    70. weatherDataModel.description = json["weather"][0]["description"].stringValue
    71. weatherDataModel.iconName = json["weather"][0]["icon"].stringValue
    72. UpdateUI()
    73. }
    74. }
    75. // MARK: - UpdateUI
    76. func UpdateUI() {
    77. cityLabel.text = weatherDataModel.city + ", \(weatherDataModel.country)"
    78. temperaturLabel.text = "\(weatherDataModel.temp)" + "°"
    79. statusLabel.text = weatherDataModel.description
    80. let imageUrl = "http://openweathermap.org/img/wn/\(weatherDataModel.iconName).png"
    81. weatherDataModel.loadImageFromUrl(imageUrl: imageUrl, imageView: wetterBild)
    82. }
    83. // MARK: - Set Time and Date
    84. func setDate() {
    85. let formatter = DateFormatter()
    86. formatter.dateFormat = "MMM d, yyyy"
    87. formatter.locale = Locale(identifier: "de_DE")
    88. datumLabel.text = formatter.string(from: Date())
    89. }
    90. @objc func setTime() {
    91. let formatter = DateFormatter()
    92. formatter.dateFormat = "HH:mm:ss"
    93. uhrzeitLabel.text = formatter.string(from: Date())
    94. }
    95. func erstelleAnzeige(message: String) {
    96. let alert = UIAlertController(title: "Fehler", message: message, preferredStyle: .alert)
    97. let action1 = UIAlertAction(title: "OK", style: .default) { (action) in}
    98. alert.addAction(action1)
    99. self.present(alert, animated: true, completion: nil)
    100. }
    101. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sebi89 ()

  • Wird die Delegate-Methode mehrfach aufgerufen? Dann setzt Du ja auch x URL-Requests ab. Sicher, dass die Ausgabe, die Du Dir anschaust, nicht zum ersten Standort gehört? Ich würde den Request erst absetzen, wenn die Standort-Daten die notwendige Genauigkeit haben.

    Aber das schrieb ich ja schon vor 9h ... es wird mir zu mühselig, sorry.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Quellcode

    1. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    2. let location = locations[locations.count - 1]
    3. if location.horizontalAccuracy < 50 {
    4. locationManager.stopUpdatingLocation()
    5. locationManager.delegate = nil
    6. }
    7. let latitude = Double(location.coordinate.latitude)
    8. let longitude = Double(location.coordinate.longitude)
    9. let url = WETTER_URL_BY_CORDINATES + "lat=\(latitude)&lon=\(longitude)" + "&appid=\(ID)" + "&units=\(UNIT)" + "&lang=\(LANGUAGE)"
    10. getWeatherData(url: url)
    11. }
    Alles anzeigen
    Jedesmal wenn eine neue Location reinkommt.
    Meine Tipps:
    1. Packe mal alles in den if-Teil.
    2. Editiere mal deinen Beitrag 17 und entferne die ID. Das sieht mir nach einem API Key aus und hat damit nichts in einem Forum oder anderen öffentlichen Orten zu suchen.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.