POI跟踪越野

时间:2016-03-05 17:09:28

标签: ios skmaps

我目前正在使用此API的POI跟踪功能和导航。我注意到API似乎只能检测到准确放置在道路上的POI。

我认为这可能是由于我已经实现的SKTrackableRule:

let rule: SKTrackablePOIRule = SKTrackablePOIRule()
    rule.aerialDistance = 100
    poiTracker = SKPOITracker()
    poiTracker.dataSource = self
    poiTracker.delegate = self
    poiTracker.setRule(rule, forPOIType: 0)
    poiTracker.setRule(rule, forPOIType: kTrackablePOITypeIncident)
    poiTracker.startPOITrackerWithRadius(kRadius, refreshMargin: kRefreshMargin, forPOITypes: [0])

我已在本文http://sdkblog.skobbler.com/detecting-tracking-pois-in-your-way/上读到规则的参数:

rule.routeDistance

有一个默认值。我想如果POI没有放在道路上,则无法实现此参数,因为API无法找到从用户位置到POI的任何道路。 我的问题是: 这是否意味着POI总是需要放在路上?如果是这种情况,是否可以取消激活此参数?

感谢任何试图解决此问题的人。

这是我的完整代码:

var map: SKMapView!

var poiTracker: SKPOITracker!
var trackablePOIs: Array<SKTrackablePOI>! = []

//Parcourt Informations Touristiques
var TableauPOIParcourues: Array<ParcourtPoi>! = []
var IndicateurPlaceTableau: Int = 0;


//utilisé pour charger le fichier GPX
var datasource: Array<AnyObject>!
var fileName: String!
var titreRoute: String!



//MARK: Lifecycle
override func viewDidLoad() {
    super.viewDidLoad()


    //Pour initialiser les variables de lecture audio

    self.configureAudioPlayer()
    NSLog("Nombre de POI en mémoire :" + String(trackablePOIs.count))
    //Pour mettre en évidence la vue direction sur la vue Map
    MapView.hidden = false
    DirectionView.hidden = true

    //paramétrage de la carte
    map = SKMapView(frame: CGRectMake(0.0, 0.0, CGRectGetWidth(DirectionView.frame), CGRectGetHeight(DirectionView.frame))) //défini la zone de la carte suivant la view Direction
    map.delegate = self
    map.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    map.settings.followUserPosition = false
    map.mapScaleView.hidden = true
    map.settings.headingMode = SKHeadingMode.RotatingHeading


    trackablePOIs = self.trackablePOIsForDemo()



    DirectionView.addSubview(self.map)
    let region: SKCoordinateRegion = SKCoordinateRegion(center: CLLocationCoordinate2DMake(49.61043, 6.13294), zoomLevel: 17)
    map.visibleRegion = region

    self.chargementNavigation()

}

//MARK: Private methods

private func chargementNavigation() {

    SKRoutingService.sharedInstance().navigationDelegate = self
    SKRoutingService.sharedInstance().routingDelegate = self
    SKRoutingService.sharedInstance().mapView = map
    NSLog("nom du fichier gpx: " + fileName)
    NSLog(NSBundle.mainBundle().pathForResource(fileName, ofType: "gpx")!)
    let path: String = NSBundle.mainBundle().pathForResource(fileName, ofType: "gpx")!
    NSLog("chemin du fichier" + path)

    do {

        let root: SKGPSFileElement = try SKGPSFilesService.sharedInstance().loadFileAtPath(path)
        let tablePointGPX: Array<AnyObject> = SKGPSFilesService.sharedInstance().locationsForElement(root)
        let routeSetting = SKRouteSettings()

        routeSetting.shouldBeRendered = true
        routeSetting.requestAdvices = true
        routeSetting.routeMode = SKRouteMode.Pedestrian
        routeSetting.routeConnectionMode = SKRouteConnectionMode.Offline

        self.startPOITracking()
        self.addAnnotations()
        SKRoutingService.sharedInstance().calculateRouteWithSettings(routeSetting, customLocations: tablePointGPX)
    } catch let error as NSError {
    }

}


override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    poiTracker.stopPOITracker()
    map.settings.displayMode = SKMapDisplayMode.Mode2D

    AudioService.sharedInstance().cancel()

    SKRoutingService.sharedInstance().clearAllRoutesFromCache()
    SKRoutingService.sharedInstance().clearCurrentRoutes()
    SKRoutingService.sharedInstance().stopNavigation()

    self.removeAnnotations()
}


// MARK : Audio configuration

private func configureAudioPlayer() {
    let mainBundlePath: String = NSBundle.mainBundle().resourcePath! + ("/SKAdvisorResources.bundle")
    let advisorResourcesBundle: NSBundle =  NSBundle(path:mainBundlePath)!
    let soundFilesFolder: String = advisorResourcesBundle.pathForResource("Languages", ofType: "")!
    let currentLanguage: String = "en"
    let audioFilesFolderPath: String = soundFilesFolder + "/" +  currentLanguage + "/" + "sound_files"+"/"

    AudioService.sharedInstance().audioFilesFolderPath = audioFilesFolderPath
    let settings: SKAdvisorSettings = SKAdvisorSettings()
    settings.advisorVoice = currentLanguage
    SKRoutingService.sharedInstance().advisorConfigurationSettings = settings
}


// MARK : POI Tracker

private func startPOITracking() {
    let rule: SKTrackablePOIRule = SKTrackablePOIRule()
    rule.aerialDistance = 200
    poiTracker = SKPOITracker()
    poiTracker.dataSource = self
    poiTracker.delegate = self
    poiTracker.setRule(rule, forPOIType: 0)
    poiTracker.setRule(rule, forPOIType: kTrackablePOITypeIncident)
    poiTracker.startPOITrackerWithRadius(kRadius, refreshMargin: kRefreshMargin, forPOITypes: [0])
}
private func trackablePOIsForDemo() -> Array<SKTrackablePOI>! {

    //ciné caluire
    let trackablePOI1: SKTrackablePOI = SKTrackablePOI()
    trackablePOI1.poiID = 0
    trackablePOI1.type = 0
    trackablePOI1.heading = -1
    trackablePOI1.coordinate = CLLocationCoordinate2DMake(45.804819, 4.853232)

    //OKI Impression
    let trackablePOI2: SKTrackablePOI = SKTrackablePOI()
    trackablePOI2.poiID = 1
    trackablePOI2.type = 0
    trackablePOI2.heading = -1
    trackablePOI2.coordinate = CLLocationCoordinate2DMake(45.805761, 4.851612)


    //Résidence de la tour
    let trackablePOI3: SKTrackablePOI = SKTrackablePOI()
    trackablePOI3.poiID = 2
    trackablePOI3.heading = -1
    trackablePOI3.type = 0
    trackablePOI3.coordinate = CLLocationCoordinate2DMake(45.803787, 4.85173)

    //La chambre funéraire
    let trackablePOI4: SKTrackablePOI = SKTrackablePOI()
    trackablePOI4.poiID = 3
    trackablePOI4.type = 0
    trackablePOI4.coordinate = CLLocationCoordinate2DMake(45.802717, 4.851311)

    //La paroisse catholique
    let trackablePOI5: SKTrackablePOI = SKTrackablePOI()
    trackablePOI5.poiID = 4
    trackablePOI5.type = 0
    trackablePOI5.coordinate = CLLocationCoordinate2DMake(45.799935, 4.848114)

    //Cimetière de Caluire
    let trackablePOI6: SKTrackablePOI = SKTrackablePOI()
    trackablePOI6.poiID = 5
    trackablePOI6.type = 0
    trackablePOI6.coordinate = CLLocationCoordinate2DMake(45.80084,  4.851462)

    //La voie verte
    let trackablePOI7: SKTrackablePOI = SKTrackablePOI()
    trackablePOI7.poiID = 6
    trackablePOI7.type = kTrackablePOITypeIncident
    trackablePOI7.coordinate = CLLocationCoordinate2DMake(45.806771,  4.858146)

    //Beginning
    let trackablePOI8: SKTrackablePOI = SKTrackablePOI()
    trackablePOI8.poiID = 7
    trackablePOI8.heading = -1
    trackablePOI8.type = kTrackablePOITypeIncident
    trackablePOI8.coordinate = CLLocationCoordinate2DMake(49.61043,  6.13294)

    //Grand ducal palace
    let trackablePOI9: SKTrackablePOI = SKTrackablePOI()
    trackablePOI9.poiID = 8
    trackablePOI9.heading = -1
    trackablePOI9.type = kTrackablePOITypeIncident
    trackablePOI9.coordinate = CLLocationCoordinate2DMake(49.610978,  6.132507)

    //Gelle Fra
    let trackablePOI10: SKTrackablePOI = SKTrackablePOI()
    trackablePOI10.poiID = 9
    trackablePOI10.heading = -1
    trackablePOI10.type = kTrackablePOITypeIncident
    trackablePOI10.coordinate = CLLocationCoordinate2DMake(49.609273999,  6.12935630)

    //Square william 2
    let trackablePOI11: SKTrackablePOI = SKTrackablePOI()
    trackablePOI11.poiID = 10
    trackablePOI11.heading = -1
    trackablePOI11.type = kTrackablePOITypeIncident
    trackablePOI11.coordinate = CLLocationCoordinate2DMake(49.610418,  6.131728)

    //Adolph's bridge
    let trackablePOI12: SKTrackablePOI = SKTrackablePOI()
    trackablePOI12.poiID = 11
    trackablePOI12.heading = -1
    trackablePOI12.heading = -1
    trackablePOI12.type = kTrackablePOITypeIncident
    trackablePOI12.coordinate = CLLocationCoordinate2DMake(49.608271,6.126431)

    //Neumünster Abbay
    let trackablePOI13: SKTrackablePOI = SKTrackablePOI()
    trackablePOI13.poiID = 12
    trackablePOI13.heading = -1
    trackablePOI13.type = kTrackablePOITypeIncident
    trackablePOI13.coordinate = CLLocationCoordinate2DMake(0, 0)

    //Bock's Casemates
    let trackablePOI14: SKTrackablePOI = SKTrackablePOI()
    trackablePOI14.poiID = 13
    trackablePOI14.heading = -1
    trackablePOI14.type = kTrackablePOITypeIncident
    trackablePOI14.coordinate = CLLocationCoordinate2DMake(49.611595, 6.13659)
    //Casemates
    let trackablePOI15: SKTrackablePOI = SKTrackablePOI()
    trackablePOI15.poiID = 14
    trackablePOI15.heading = -1
    trackablePOI15.type = kTrackablePOITypeIncident
    trackablePOI15.coordinate = CLLocationCoordinate2DMake(49.611595, 6.13659)
    //Thüngen fort
    let trackablePOI16: SKTrackablePOI = SKTrackablePOI()
    trackablePOI16.poiID = 15
    trackablePOI16.heading = -1
    trackablePOI16.type = kTrackablePOITypeIncident
    trackablePOI16.coordinate = CLLocationCoordinate2DMake(49.616975, 6.140209)
    //Septfontaines castle
    let trackablePOI17: SKTrackablePOI = SKTrackablePOI()
    trackablePOI17.poiID = 16
    trackablePOI17.heading = -1
    trackablePOI17.type = kTrackablePOITypeIncident
    trackablePOI17.coordinate = CLLocationCoordinate2DMake(49.625711 , 6.10505)
    //Saint quirin chapel
    let trackablePOI18: SKTrackablePOI = SKTrackablePOI()
    trackablePOI18.poiID = 17
    trackablePOI18.heading = -1
    trackablePOI18.type = kTrackablePOITypeIncident
    trackablePOI18.coordinate = CLLocationCoordinate2DMake(49.60571, 6.13528)
    //Pétrusse Valley
    let trackablePOI19: SKTrackablePOI = SKTrackablePOI()
    trackablePOI19.poiID = 18
    trackablePOI19.heading = -1
    trackablePOI19.type = kTrackablePOITypeIncident
    trackablePOI19.coordinate = CLLocationCoordinate2DMake(49.607519, 6.12551)
    //jews door
    let trackablePOI20: SKTrackablePOI = SKTrackablePOI()
    trackablePOI20.poiID = 19
    trackablePOI20.heading = -1
    trackablePOI20.type = kTrackablePOITypeIncident
    trackablePOI20.coordinate = CLLocationCoordinate2DMake(49.610418, 6.131728)
    //Mudam
    let trackablePOI21: SKTrackablePOI = SKTrackablePOI()
    trackablePOI21.poiID = 20
    trackablePOI21.heading = -1
    trackablePOI21.type = kTrackablePOITypeIncident
    trackablePOI21.coordinate = CLLocationCoordinate2DMake(49.617095, 6.140337)
    //Grund
    let trackablePOI22: SKTrackablePOI = SKTrackablePOI()
    trackablePOI22.poiID = 21
    trackablePOI22.heading = -1
    trackablePOI22.type = kTrackablePOITypeIncident
    trackablePOI22.coordinate = CLLocationCoordinate2DMake(49.608189, 6.135507)
    //The Alzette river
    let trackablePOI23: SKTrackablePOI = SKTrackablePOI()
    trackablePOI23.poiID = 22
    trackablePOI23.heading = -1
    trackablePOI23.type = kTrackablePOITypeIncident
    trackablePOI23.coordinate = CLLocationCoordinate2DMake(49.610432, 6.135494)
    //The Pétrusse river
    let trackablePOI24: SKTrackablePOI = SKTrackablePOI()
    trackablePOI24.poiID = 23
    trackablePOI24.heading = -1
    trackablePOI24.type = kTrackablePOITypeIncident
    trackablePOI24.coordinate = CLLocationCoordinate2DMake(49.607519, 6.125516)
    //Spuerkess head offices
    let trackablePOI25: SKTrackablePOI = SKTrackablePOI()
    trackablePOI25.poiID = 24
    trackablePOI25.heading = -1
    trackablePOI25.type = kTrackablePOITypeIncident
    trackablePOI25.coordinate = CLLocationCoordinate2DMake(49.607054, 6.128070)
    //Arbed head offices
    let trackablePOI26: SKTrackablePOI = SKTrackablePOI()
    trackablePOI26.poiID = 25
    trackablePOI26.heading = -1
    trackablePOI26.type = kTrackablePOITypeIncident
    trackablePOI26.coordinate = CLLocationCoordinate2DMake(0,0)
    //Place d'armes
    let trackablePOI27: SKTrackablePOI = SKTrackablePOI()
    trackablePOI27.poiID = 26
    trackablePOI27.heading = -1
    trackablePOI27.type = kTrackablePOITypeIncident
    trackablePOI27.coordinate = CLLocationCoordinate2DMake(49.611306, 6.129408)
    //Philarmonie
    let trackablePOI28: SKTrackablePOI = SKTrackablePOI()
    trackablePOI28.poiID = 27
    trackablePOI28.heading = -1
    trackablePOI28.type = kTrackablePOITypeIncident
    trackablePOI28.coordinate = CLLocationCoordinate2DMake(49.618602, 6.142702)
    //European parliament
    let trackablePOI29: SKTrackablePOI = SKTrackablePOI()
    trackablePOI29.poiID = 28
    trackablePOI29.heading = -1
    trackablePOI29.type = kTrackablePOITypeIncident
    trackablePOI29.coordinate = CLLocationCoordinate2DMake(49.621613, 6.14676)
    //The European Court of Auditors
    let trackablePOI30: SKTrackablePOI = SKTrackablePOI()
    trackablePOI30.poiID = 29
    trackablePOI30.heading = -1
    trackablePOI30.type = kTrackablePOITypeIncident
    trackablePOI30.coordinate = CLLocationCoordinate2DMake(49.623004, 6.149332)
    //European Investment Fund
    let trackablePOI31: SKTrackablePOI = SKTrackablePOI()
    trackablePOI31.poiID = 30
    trackablePOI31.heading = -1
    trackablePOI31.type = kTrackablePOITypeIncident
    trackablePOI31.coordinate = CLLocationCoordinate2DMake(49.628933, 6.164587)
    //European Investment Bank
    let trackablePOI32: SKTrackablePOI = SKTrackablePOI()
    trackablePOI32.poiID = 31
    trackablePOI32.heading = -1
    trackablePOI32.type = kTrackablePOITypeIncident
    trackablePOI32.coordinate = CLLocationCoordinate2DMake(49.622144, 6.140124)

    //Court of justice
    let trackablePOI33: SKTrackablePOI = SKTrackablePOI()
    trackablePOI33.poiID = 32
    trackablePOI33.heading = -1
    trackablePOI33.type = kTrackablePOITypeIncident
    trackablePOI33.coordinate = CLLocationCoordinate2DMake(49.61919, 6.140891)




    return [trackablePOI1, trackablePOI2, trackablePOI3, trackablePOI4, trackablePOI5, trackablePOI6, trackablePOI7, trackablePOI8, trackablePOI9, trackablePOI10, trackablePOI11, trackablePOI12, trackablePOI13, trackablePOI14, trackablePOI15, trackablePOI16, trackablePOI17, trackablePOI18, trackablePOI19, trackablePOI20, trackablePOI21, trackablePOI22, trackablePOI23, trackablePOI24, trackablePOI25, trackablePOI26, trackablePOI27, trackablePOI28, trackablePOI29, trackablePOI30, trackablePOI31, trackablePOI32]

}

private func addAnnotations() {
    let animationSettings: SKAnimationSettings = SKAnimationSettings()
    for poi: SKTrackablePOI in trackablePOIs {

        let coloredView = UIImageView(frame: CGRectMake(0.0, 0.0, 32.0, 32.0))
        coloredView.image = UIImage(named: "map-position-64.png")

        //create the SKAnnotationView
        let view = SKAnnotationView(view: coloredView, reuseIdentifier: "viewID")

        //create the annotation
        let viewAnnotation = SKAnnotation()
        //set the custom view
        viewAnnotation.annotationView = view
        viewAnnotation.identifier = poi.poiID
        viewAnnotation.location = poi.coordinate

        //NSLog("Ajout visuelle id " + String(poi.poiID))

        map.addAnnotation(viewAnnotation, withAnimationSettings: animationSettings)
    }
}

private func removeAnnotations() {
    map.clearAllAnnotations()
}

//MARK : SKPOITrackerDataSource

func poiTracker(poiTracker: SKPOITracker!, trackablePOIsAroundLocation location: CLLocationCoordinate2D, inRadius radius: Int32, withType poiType: Int32) -> [AnyObject]! {
    return self.trackablePOIs
}

func poiTracker(poiTracker: SKPOITracker!, didDectectPOIs detectedPOIs: [AnyObject]!, withType type: Int32) {
    //NSLog("Détection d'un POI")
    for poi in detectedPOIs as! Array<SKDetectedPOI> {
        NSLog(poi.description)
    }
}

//MARK : RoutingService

func routingService(routingService: SKRoutingService!, didFinishRouteCalculationWithInfo routeInformation: SKRouteInformation!) {
    routingService.zoomToRouteWithInsets(UIEdgeInsetsZero, duration:1)

    let navSettings = SKNavigationSettings()
    navSettings.navigationType = SKNavigationType.Simulation
    navSettings.transportMode = SKTransportMode.Pedestrian
    navSettings.distanceFormat = SKDistanceFormat.Metric
    navSettings.showStreetNamePopUpsOnRoute = true
    SKRoutingService.sharedInstance().mainRouteId = routeInformation.routeID
    SKRoutingService.sharedInstance().mapView!.settings.displayMode = SKMapDisplayMode.Mode2D
    SKRoutingService.sharedInstance().startNavigationWithSettings(navSettings)
}

func routingService(routingService: SKRoutingService!, didChangeDistanceToDestination distance: Int32, withFormattedDistance formattedDistance: String!) {
}


func routingServiceDidReachDestination(routingService: SKRoutingService!) {

    SKRoutingService.sharedInstance().stopNavigation()
    poiTracker.stopPOITracker()
}

func routingService(routingService: SKRoutingService!, didChangeCurrentAdvice currentAdvice: SKRouteAdvice!, isLastAdvice: Bool) {
    //NSLog(currentAdvice.adviceInstruction)
}

func routingService(routingService: SKRoutingService!, didChangeCurrentSpeed speed: Double) {

}

func routingService(routingService: SKRoutingService!, didChangeCurrentVisualAdviceDistance distance: Int32, withFormattedDistance formattedDistance: String!) {
}


func routingService(routingService: SKRoutingService!, didChangeNextStreetName nextStreetName: String!, streetType: SKStreetType, countryCode: String!) {
}

func routingService(routingService: SKRoutingService!, didChangeCurrentAdviceImage adviceImage: UIImage!, withLastAdvice isLastAdvice: Bool) {

}


func routingService(routingService: SKRoutingService!, didUpdateFilteredAudioAdvices audioAdvices: [AnyObject]!) {
}

//MARK : CoreData

}

1 个答案:

答案 0 :(得分:1)

这就是你的SKTrackablePOIRule的样子:

let rule: SKTrackablePOIRule = SKTrackablePOIRule() rule.aerialDistance = 100
rule.routeDistance = 1500 rule.numberOfTurns = 2

rule.maxGPSAccuracy = 100

rule.minSpeedIgnoreDistanceAfterTurn = 80

rule.maxDistanceAfterTurn = 300 rule.eliminateIfUTurn = YES

rule.playAudioWarning= NO

查看文档(SKTrackablePOIRule)并考虑所有规则都应该完成。

[编辑:28-03-2016]:在演示应用中,我们添加了example with some POIs并且没有放在路上(另请查看更新的POITrackerViewController class)和所有内容按预期工作。