2016-08-11 3 views
11

Все мои геозонности запускаются, когда GPS входит в определенную область, сначала я думал, что это из-за радиуса, однако даже после его уменьшения вдвое у меня такая же проблема.didEnterRegion стрельба по всем моим геообъектам

import UIKit 
import CoreLocation 


class itemDesc { 
    var title: String 
    var coordinate: CLLocationCoordinate2D 
    var regionRadius: CLLocationDistance 
    var location: String 
    var type: String 

    init(title: String, coordinate: CLLocationCoordinate2D, regionRadius: CLLocationDistance, location: String, type: String) { 
     self.title = title 
     self.coordinate = coordinate 
     self.regionRadius = regionRadius 
     self.location = location 
     self.type = type 
    } 

} 

class ViewController: UIViewController, CLLocationManagerDelegate { 

    let locationManager = CLLocationManager() 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     locationManager.delegate = self 
     locationManager.requestAlwaysAuthorization() 
     locationManager.startUpdatingLocation() 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 

     setupData() 
    } 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 

    } 

    func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) { 
     print("Monitoring failed for region with identifier: \(region!.identifier)") 
    } 

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
     print("Location Manager failed with the following error: \(error)") 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     let locValue:CLLocationCoordinate2D = manager.location!.coordinate 
     print("locations = \(locValue.latitude) \(locValue.longitude)") 
    } 

    func handleRegionEvent(region: CLRegion!) { 
     print("Geofence triggered \(region.identifier)") 
    } 

    func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) { 
     if region is CLCircularRegion { 
      handleRegionEvent(region) 
     } 
    } 

    func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) { 
     if region is CLCircularRegion { 

     } 
    } 

    func setupData(){ 
     if CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion.self) { 

      let itemRegion = [ 
       itemDesc(title: "DOOR", coordinate: CLLocationCoordinate2DMake(00.497699, 00.575095), regionRadius: 0.5, location: "DOOR", type: "exterior"), 
       itemDesc(title: "BARN FRONT", coordinate: CLLocationCoordinate2DMake(00.49751, 00.575149), regionRadius: 0.5, location:"BARN FRONT", type: "exterior"), 
       itemDesc(title: "GRASS", coordinate: CLLocationCoordinate2DMake(00.497337, 00.575069), regionRadius: 0.5, location: "GRASS ", type: "nature")] 

      for item in itemRegion { 

       let coordinate = item.coordinate 
       let regionRadius = item.regionRadius 
       let title = item.title 
       let region = CLCircularRegion(center: coordinate, radius: regionRadius, identifier: title) 

       locationManager.startMonitoringForRegion(region) 

      } 
     } else{ 
      print("system can't track regions") 
     } 

    } 

} 

Используя (0,497337, 0,575069) Я бы только ожидать, что GRASS забор срабатывать, этого не происходит.

Выходы:

regionRadius = 1,0

locations = 37.33233141 -122.0312186 
locations = 37.33233141 -122.0312186 
locations = 0.497337 0.575069 
Geofence triggered BARN FRONT 
Geofence triggered DOOR 
Geofence triggered GRASS 

regionRadius = 0,5

locations = 37.33233141 -122.0312186 
locations = 37.33233141 -122.0312186 
locations = 0.497337 0.575069 
Geofence triggered BARN FRONT 
Geofence triggered DOOR 
Geofence triggered GRASS 

Хотя даже на расстоянии 1 м, это не должно быть проблемой:

четвертого знака после запятой стоит до 11 м

Пятый знак после запятой стоит до 1,1 м

Шестое после запятой стоит до 0,11 м

ответ

4

Наилучшая точность остроумие h чип GPS и kCLLocationAccuracyBestForNavigation часто составляет всего 10 метров.

Apple, говорит (в местопребывании & Maps PG), что минимальное расстояние для регионов следует считать 200м

как указал этот ответ - это поможет, но не порадовать вас

https://stackoverflow.com/a/23931552/2027018

1

Если кто-то помогает, кто спотыкается об этом, я больше не получал CLRegion.

Вместо этого я пошел с классом CLLocation и использовал .distanceFromLocation и разработал расстояние для каждого из моих регионов/мест.

 Смежные вопросы

  • Нет связанных вопросов^_^