【问题标题】:How to Location Bias Google Places Autocomplete?如何定位偏见谷歌地方自动完成?
【发布时间】:2017-10-16 05:31:41
【问题描述】:

我正在使用 Google 的 Tutorial 将 Google Places Autocomplete 实施到带有 Swift 的 iOS 应用程序中,但我正试图将结果限制在特定位置,因为 link 说这是可能的,但对于我的一生来说,我看不到任何地方可以这样做............

这是视图控制器:

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, height: 45.0))

    subView.addSubview((searchController?.searchBar)!)
    view.addSubview(subView)
    searchController?.searchBar.sizeToFit()
    searchController?.hidesNavigationBarDuringPresentation = false

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

【问题讨论】:

    标签: ios swift google-maps autocomplete


    【解决方案1】:

    在文档中它说明了用于此的类。

    一个 GMSCoordinateBounds 对象,将结果偏置到由纬度和经度边界指定的特定区域。

    注意:您无法完全擦除这些边界之外的所有内容,如果人们搜索埃菲尔铁塔,他们仍然会看到它。但 99% 的结果可能会在这些范围内。这只是一个偏见搜索。

    给 GMSCoordinateBounds 类的角点经纬度,就是这样。

    它是这样使用的:

    let northEastBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366,
                                                longitude: 151.134002)
    let southWestBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725,
                                                longitude: 151.200349)
    let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
                                     coordinate: swBoundsCorner) 
    func placeAutocomplete() {
         let filter = GMSAutocompleteFilter()
         filter.type = .establishment
         placesClient.autocompleteQuery("Sydney Oper", bounds: bounds, filter: filter, callback: {(results, error) -> Void in
         if let error = error {
            print("Autocomplete error \(error)")
            return
         }
         if let results = results {
            for result in results {
                print("Result \(result.attributedFullText) with placeID \(result.placeID)")
            }
         }
    }) }
    

    这是他们使用它的文档中的 url: Set the GMSCoordinateBounds of autocomplete

    【讨论】:

    • 对不起,如果这是一个愚蠢的问题,但我应该把这段代码放在哪里?
    【解决方案2】:

    只是为了澄清 NebojsaNadj 对 OP 的回答 - 您可以首先使用点来表示边界框来设置偏差的边界。因此,将自动完成功能偏向内巴斯卡州奥马哈市,例如:

    let northEastBoundsCorner = //Omaha's NE corner in CLCoordinate2D
    let southWestBoundsCorner = //Omaha's SW corner in CLCoordinate2D
    let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
                                 coordinate: swBoundsCorner)
    

    因此,当您实例化 GMSController 时,您只需将其自动完成边界设置为上述边界myGMSAutoCompleteController.autocompleteBounds = bounds。在demo 引用的OP 中,应该是这样的:

    import UIKit
    import GooglePlaces
    
    class ViewController: UIViewController {
    
     // Present the Autocomplete view controller when the button is pressed.
     @IBAction func autocompleteClicked(_ sender: UIButton) {
        let autocompleteController = GMSAutocompleteViewController()
    //Here's where you add it
        let northEastBoundsCorner = //Omaha's NE corner in CLCoordinate2D
        let southWestBoundsCorner = //Omaha's SW corner in CLCoordinate2D
        let bounds = GMSCoordinateBounds(coordinate: neBoundsCorner,
                                 coordinate: swBoundsCorner)
        controller.autocompleteBounds = bounds
    //back to demo code
        autocompleteController.delegate = self
        present(autocompleteController, animated: true, completion: nil)
      }
    }
    //see the demo for the rest of the code
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2014-01-02
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多