MapKit 定义所需的搜索结果类型(国家、城市、地区等)

MapKit Define the desired type of search results (Country, city, region, etc)

对于我正在构建的应用程序,我想实现一项功能,允许用户指定葡萄酒的地理来源(国家(例如法国)、区域(例如波尔多)、次区域(例如保拉克))。

我想确保我不必自己添加所有可用的国家,并且进入数据库的所有信息都是有效的。因此,我决定按如下方式进行:

  1. 用户添加了一种新酒并输入了它来自的国家/地区的名称
  2. 打字时,应用会在苹果地图数据库中搜索
  3. 此搜索的结果显示为建议,当用户点击建议时,应用会创建一个包含所有相关信息的 Country 对象。只有存在这样的对象时才会保存酒车

这很好用,除了一件事:Apple 地图 returns 任何地方,如餐馆、商店等。

我的问题:如何指定我要查找的内容?我只能指定我正在搜索的区域,这与我的情况无关。我希望能够告诉苹果地图只查找国家、地区、城市等。这在某种程度上可能吗?为此,我已经用尽了 google,但到目前为止还没有找到任何办法。

我使用过 MapKit,我不相信你可以对用户输入进行自动完成帮助,因为他们输入我发现的最佳解决方案是 Google Place API autocomplete

iOS现在提供发送well-formatted地址时接收geo-coordinates,或者发送一对坐标时接收地址。或地点名称或坐标的兴趣点。

iOS 9.3 中的 MapKit 添加了一个 class,名为 MKLocalSearchCompleter,它有助于自动完成。您可以使用 'MKSearchCompletionFilterType' 过滤 returned 的内容,但这不是最广泛的,可能无法完全帮助您解决问题。结果是 return 个城市和国家,但当我使用它时它也 return 的业务。

一个可能的选择是在应用端再次过滤 returned 结果并排除所有包含数字字符的结果。

func setupCompleter() {
    self.searchCompleter = MKLocalSearchCompleter()
    self.searchCompleter?.delegate = self
    self.searchCompleter?.filterType = .locationsOnly
    self.searchCompleter?.queryFragment = "Bordeaux"
}

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
    print("Results \(completer.results)")

    // Do additional filtering on results here
}

除了 Allan 的回答之外,我发现如果您按 MkLocalSearchCompletion object 的副标题 属性 进行过滤,则可以删除业务条目。

与@Trevor 所说的不同,我发现如果您只想要城市和城镇,则拒绝标题或副标题有数字的结果会产生很好的结果。

Swift4.1代码:

// Store this as a property if you're searching a lot.
let digitsCharacterSet = NSCharacterSet.decimalDigits

let filteredResults = completer.results.filter { result in    
    if result.title.rangeOfCharacter(from: digitsCharacterSet) != nil {
        return false
    }

    if result.subtitle.rangeOfCharacter(from: digitsCharacterSet) != nil {
        return false
    }

    return true
}

或更紧凑:

let filteredResults = completer.results.filter({ [=11=].title.rangeOfCharacter(from: digitsCharacterSet) == nil && [=11=].subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })

我们找到的最佳解决方案是在结果标题中使用逗号来过滤我们的结果。这主要只返回与城市格式匹配的结果,例如 Detroit, MI, United States。我们将此过滤器添加到@Ben Stahl 建议的过滤器中。 Ben 的解决方案过滤掉了逗号构成企业名称一部分的边缘情况。

这通常是 returns 三个字符以内的正确结果。要回答 OP 的问题,您可以按城市、州或国家/地区解析此字符串以获得所需的结果。

为了获得更好的结果,您可以使用 Google 地方 API。

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
    self.searchResults = completer.results.filter { result in
        if !result.title.contains(",") {
            return false
        }

        if result.title.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
            return false
        }

        if result.subtitle.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
            return false
        }

        return true
    }

    self.searchResultsCollectionView.reloadData()
}