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

时间:2017-02-03 16:12:46

标签: ios maps mapkit mklocalsearch mklocalsearchrequest

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

我想确保自己不必添加所有可用的国家/地区,并且所有进入数据库的信息都是有效的。因此,我决定这样做:

  1. 用户添加新葡萄酒并键入其来自的国家/地区的名称
  2. 在输入时,应用程序会在苹果地图数据库中搜索
  3. 此搜索的结果显示为建议,当用户点按建议时,应用会创建包含所有相关信息的Country对象。只有在存在这样的物体时才能保存酒车
  4. 这样做很好,除了一件事:Apple地图可以从任何地方返回任何东西,比如餐馆,商店等等。

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

5 个答案:

答案 0 :(得分:2)

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

iOS现在提供接收地理坐标时发送格式正确的地址,或者您可以在发送一对坐标时接收地址。或者地点名称或坐标的兴趣点。

答案 1 :(得分:2)

除了Allan的回答之外,我发现如果您按照MkLocalSearchCompletion对象的字幕属性进行过滤,则可以删除业务条目。

答案 2 :(得分:1)

在iOS 9.3中添加了一个名为MKLocalSearchCompleter的MapKit类,它有助于自动完成。您可以使用“MKSearchCompletionFilterType”过滤返回的内容,但这不是最广泛的,可能不完全有助于您的情况。它确实将城市和国家作为结果返回,但它在我使用它时也会返回业务。

一种可能的选择是在应用程序端再次过滤返回的结果,并排除其中包含数字字符的所有结果。

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
}

答案 3 :(得分:1)

关于@Trevor说的话,我发现拒绝结果,如果你只想要城镇,那么标题或副标题都有数字会产生相当好的结果。

Swift 4.1 代码:

let filteredResults = completer.results.filter({ $0.title.rangeOfCharacter(from: digitsCharacterSet) == nil && $0.subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })

或更紧凑:

{{1}}

答案 4 :(得分:0)

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

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

为获得更好的结果,您可以使用Google Places 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()
}