菜鸟教程小白 发表于 2022-12-13 11:04:06

ios - 如何从 CLPlaceMark 获取 map_region


                                            <p><p>我必须从 CLPlaceMark 中取出 map_region 和类型,但我找不到可以在 CLPlaceMark 类中提供 map_region 值的属性。 </p>

<pre><code> {
      placeData =   {
            component =         (
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_HOURS&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_RATING&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_FLYOVER&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_BOUNDS&#34;;
                  value =               (
                                          {
                            bounds =                         {
                              &#34;map_region&#34; =                           {
                                    eastLng = &#34;-73.832921&#34;;
                                    northLat = &#34;40.739434&#34;;
                                    southLat = &#34;40.550334&#34;;
                                    westLng = &#34;-74.056687&#34;;
                              };
                            };
                        }
                  );
                  &#34;values_available&#34; = 1;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_ROAD_ACCESS_INFO&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_PLACE_INFO&#34;;
                  value =               (
                                          {
                            &#34;place_info&#34; =                         {
                              center =                           {
                                    lat = &#34;40.692529&#34;;
                                    lng = &#34;-73.990996&#34;;
                              };
                              timezone =                           {
                                    identifier = &#34;America/New_York&#34;;
                              };
                            };
                        }
                  );
                  &#34;values_available&#34; = 1;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_ENTITY&#34;;
                  value =               (
                                          {
                            entity =                         {
                              &#34;is_disputed&#34; = 0;
                              name =                           (
                                                                  {
                                        locale = &#34;en_US&#34;;
                                        &#34;string_value&#34; = Brooklyn;
                                    }
                              );
                              type = &#34;SUB_LOCALITY&#34;;
                            };
                        }
                  );
                  &#34;values_available&#34; = 1;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_ADDRESS&#34;;
                  value =               (
                                          {
                            address =                         {
                              &#34;localized_address&#34; =                           (
                                                                  {
                                        address =                                     {
                                          formattedAddressLine =                                       (
                                                &#34;Brooklyn, NY&#34;,
                                                &#34;United States&#34;
                                          );
                                          structuredAddress =                                       {
                                                administrativeArea = &#34;New York&#34;;
                                                administrativeAreaCode = NY;
                                                areaOfInterest =                                             (
                                                    &#34;Long Island&#34;
                                                );
                                                country = &#34;United States&#34;;
                                                countryCode = US;
                                                geoId =                                             (
                                                );
                                                locality = Brooklyn;
                                                subAdministrativeArea = Kings;
                                          };
                                        };
                                        locale = &#34;en_US&#34;;
                                    }
                              );
                            };
                        }
                  );
                  &#34;values_available&#34; = 1;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_AMENITIES&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_STYLE_ATTRIBUTES&#34;;
                  &#34;values_available&#34; = 0;
                },
                            {
                  &#34;cache_control&#34; = UNCACHEABLE;
                  &#34;start_index&#34; = 0;
                  status = &#34;STATUS_SUCCESS&#34;;
                  type = &#34;COMPONENT_TYPE_BUSINESS_CLAIM&#34;;
                  &#34;values_available&#34; = 0;
                }
            );
            &#34;result_provider_id&#34; = 6489;
            status = &#34;STATUS_SUCCESS&#34;;
      };
    }
</code></pre>

<p>有没有办法从 CLPlaceMark 类中读取值?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>CLPlacemark</code> 没有任何属性来访问其底层存储数据(私有(private) <code>GEOMapItemStorage</code>)。然而,有一种方法可以访问这些数据,尽管它是一种 hacky 方式,您应该非常小心地使用它。</p>

<p>当您尝试打印 <code>CLPlacemark</code> 实例控制台日志时,还 <code>GEOMapItemStorage</code> 因此理论上您可以访问此字符串并将其转换为字典。棘手的部分是它是一个原始字符串,您必须对其进行一点处理。我正在向 <code>CLPlacemark</code> 发布一个扩展,它应该可以完成这项工作并返回 <code>?</code>。</p>

<pre><code>extension CLPlacemark {

    enum GeoMapItemStorageError: ErrorType {
      case InvalidFormat
      case DataEncoding
      case Serialization(underlaying: ErrorType)
    }

    func extractGeoMapItemStorage() throws -&gt; ? {

      let description = self.description as NSString
      let indexOfBracket = description.rangeOfString(&#34;{&#34;, options: NSStringCompareOptions.init(rawValue: 0))

      guard indexOfBracket.location != NSNotFound else {
            throw GeoMapItemStorageError.InvalidFormat
      }

      let dictString = description.substringFromIndex(indexOfBracket.location)

      guard let dictStringData = dictString.dataUsingEncoding(NSUTF8StringEncoding) else {
            throw GeoMapItemStorageError.DataEncoding
      }

      do {
            return try NSPropertyListSerialization.propertyListWithData(
                dictStringData,
                options: NSPropertyListReadOptions.Immutable,
                format: nil
                ) as?
      }
      catch (let error){
            throw GeoMapItemStorageError.Serialization(underlaying: error)
      }

    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何从 CLPlaceMark 获取 map_region,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32732971/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32732971/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何从 CLPlaceMark 获取 map_region