【问题标题】:MapKit Define the desired type of search results (Country, city, region, etc)MapKit 定义所需的搜索结果类型(国家、城市、地区等)
【发布时间】:2017-06-21 01:45:18
【问题描述】:

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

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

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

这很好用,除了一件事:Apple 地图可以从任何地方返回任何东西,例如餐馆、商店等。

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

【问题讨论】:

    标签: ios maps mapkit mklocalsearch mklocalsearchrequest


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在 iOS 9.3 的 MapKit 中添加了一个名为 MKLocalSearchCompleter 的类,它有助于自动完成。您可以使用“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】:

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

        【讨论】:

          【解决方案4】:

          按照@Trevor 所说的,如果您只想要城镇,我发现拒绝标题或副标题有数字的结果会产生非常好的结果。

          Swift 4.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({ $0.title.rangeOfCharacter(from: digitsCharacterSet) == nil && $0.subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })
          

          【讨论】:

            【解决方案5】:

            我们找到的最佳解决方案是在结果标题中使用逗号过滤我们的结果。这主要只返回与城市格式匹配的结果,例如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()
            }
            

            【讨论】:

              猜你喜欢
              • 2014-09-08
              • 2011-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-28
              • 2012-03-29
              • 2021-12-31
              • 1970-01-01
              相关资源
              最近更新 更多