2016-02-06 5 views
1

Итак, Ive внедрил searchBar для моего приложения карт и дал мне некоторые странные результаты. Например, если я ищу «Осло», это указывает на очень специфическое, но странное место к северу от города и приближается к дальнему. Должно быть, что-то я сделал неправильно в коде здесь. Любой, кто может определить проблему?MKLocalSearchRequest дает мне странные результаты

// When user submits search query 
func searchBarSearchButtonClicked(searchBar: UISearchBar){ 
    // resign first responder and dismiss the searchbar. 
    searchBar.resignFirstResponder() 
    dismissViewControllerAnimated(true, completion: nil) 

    // Create and start search request 
    localSearchRequest = MKLocalSearchRequest() 
    localSearchRequest.naturalLanguageQuery = searchBar.text 
    localSearch = MKLocalSearch(request: localSearchRequest) 

    localSearch.startWithCompletionHandler { (localSearchResponse, error) -> Void in 

     if localSearchResponse == nil{ 
      let alertController = UIAlertController(title: nil, message: "Place Not Found", preferredStyle: UIAlertControllerStyle.Alert) 
      alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alertController, animated: true, completion: nil) 
      return 
     } 

     let center = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, longitude: localSearchResponse!.boundingRegion.center.longitude) 
     self.updateCurrentMapRegion(center, distance: 5000) 
     NSNotificationCenter.defaultCenter().postNotificationName("LocationUpdate", object: nil, userInfo: ["latitude": center.latitude, "longitude": center.longitude]) 
    } 
} 

Кроме того, одна проблема заключается в том, что я удалил расстояние до 5000 метров при обновлении области карты после получения результата поиска. Как я могу справиться с этим более динамично?

Что альтернатива использованию MKLocalSearchRequest(), который, на мой взгляд звучит как то, что вы должны использовать при поиске вещей поблизости и не более крупные объекты, такие как города и т.д.

ответ

3

Первое первый: MKLocalSearch является правильным API для вас, чтобы использовать, хотя это может показаться немного странным для того, что вы делаете!

MKLocalSearch получает список местоположений, а затем возвращает ограничивающий прямоугольник вокруг местоположений, чтобы он наилучшим образом соответствовал тем, что, по его мнению, вы ищете. Я попытался запустить свой код и нашел это в Осло:

Oslo place mark in bounding box

Проблема вы столкнулись в том, что вы используете в центре ограничительной рамки в качестве пин месте, а не в метках Осло.

Так вместо того, чтобы ваша строка кода здесь:

let center = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, 
    longitude: localSearchResponse!.boundingRegion.center.longitude) 

Вы могли бы использовать:.

(Это необязательно, но вы можете выбрать, как справиться с этим я покажу вы предпочитаете мой вариант.)

Кроме того, это решает вашу проблему о том, как далеко увеличить. Простой, вы можете использовать ограничивающий прямоугольник области в качестве уровня масштабирования. Я не уверен, как работает ваш метод updateCurrentMapRegion:distance, но у MKMapView есть удобный метод setRegion:animated, который вы можете использовать (если у вас есть доступ).

mapView.setRegion(localSearchResponse!.boundingRegion, animated: true) 

Суммируя все это, если у вас есть ссылка на MapView, вы должны быть в состоянии заменить блок завершения с этим и она работает:

guard let localSearchResponse = localSearchResponse, mapItem = localSearchResponse.mapItems.first else { 
    let alertController = UIAlertController(title: nil, message: "Place Not Found", preferredStyle: UIAlertControllerStyle.Alert) 
    alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil)) 
    self.presentViewController(alertController, animated: true, completion: nil) 
    return 
} 

let center = mapItem.placemark.coordinate 
self.mapView.setRegion(localSearchResponse.boundingRegion, animated: true) 
NSNotificationCenter.defaultCenter().postNotificationName("LocationUpdate", object: nil, userInfo: ["latitude": center.latitude, "longitude": center.longitude]) 

В этом блоке я также заменил ваш оператор if с guard, чтобы установить оба значения, поэтому нам больше не нужно принудительно разворачивать опции. Если у вас нет доступа к mapView в этом методе, вы можете, вероятно, переключить updateCurrentMapRegion:center так, чтобы он соответствовал лучшему, или сделать некоторую математику, чтобы сделать ограничительную область подходящей в пределах этих значений.

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