Swift ReverseGeocode CLPРазметка областей интереса почти всегда равна нулю. Должен ли я использовать что-то еще?

Я использую CLGeocoder и reverseGeocodeLocation, чтобы получить свой CLPlacemark. Почему имя в основном возвращается как адрес, а areaOfInterest возвращается как ноль? Например... области интереса отображаются для действительно важных вещей, таких как штаб-квартира Apple и аэропорты, вещи в этом роде, но магазины, такие как Walmart, Publix и прочее, равны нулю. Должен ли я искать другой путь? Я ожидаю больше информации, чем доступно с этим методом? Я имею в виду, что у Apple есть эти достопримечательности на их картах, есть ли другой способ, которым я должен попытаться получить эту информацию?

Вот несколько локаций по широте, которые я пробовал в своем районе, и которые не возвращают названия магазинов. Они пришли из Google, и когда они помещаются в карты Apple, вы оказываетесь прямо над правильным местоположением, но это также не связано ... Это заставляет меня думать, что я должен делать что-то другое, чем вернуть название магазина. Другая информация, такая как описание или категория, также была бы неплохой.

Примечание: мне нужна только информация, я не пытаюсь поместить ее на карту или что-то в этом роде.

Walmart: 35,0944° с.ш., 85,3319° з.д.

Аквариум: 35,0558° с.ш., 85,3111° з.д.

Публикс: 35,0651° с.ш., 85,3083° з.д.

Небольшой кусок моего кода. Все работы просто хотели дать вам представление о том, что я возвращаю и как.

CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
                if placemarks != nil
                {
                    if error == nil && placemarks!.count >= 1 {
                        let thePlacemarks = placemarks![0] as CLPlacemark
                        print(placemarks)
                        print(thePlacemarks.areasOfInterest?.description)
                        print(thePlacemarks.administrativeArea?.description)
                        print(thePlacemarks.areasOfInterest?.description)
                        print(thePlacemarks.country?.description)
                        print(thePlacemarks.inlandWater?.description)
                        print(thePlacemarks.isoCountryCode?.description)
                        print(thePlacemarks.locality?.description)
                        print(thePlacemarks.location?.description)
                        print(thePlacemarks.name?.description)
                        print(thePlacemarks.ocean?.description)
                        print(thePlacemarks.subAdministrativeArea?.description)
                        print()
                    }
                }
            })

Любая помощь будет здорово!

Спасибо!


person Spartakus    schedule 10.03.2018    source источник


Ответы (1)


Итак... Не обязательно идеально, но с помощью мапкита я смог выполнить MKLocalSearch, чтобы получить то, что хотел. Это работает только потому, что в моем коде есть массив конкретных местоположений, которые меня интересуют. См. мой код ниже.

Import Mapkit
let listArr = ["Walmart", "Publix","Game Stop"]

Затем где-то в вашем ViewController

func searchArr() //This function will iterate through the array and see if any of the locations are within 30 meters
{
    for element in listsArr
    {
          let request = MKLocalSearchRequest()
          request.naturalLanguageQuery = "\(element)"
          request.region = MKCoordinateRegionMakeWithDistance(currentCoordinates, 3200, 3200)
          MKLocalSearch(request: request).start { (response, error) in

              guard error == nil else {print()return}
              guard let response = response else {return}
              guard response.mapItems.count > 0 else {return}
              print(response.mapItems[0])
              let coord1 = currentCoordinates
              let coord2 = response.mapItems[0].placemark.coordinate
              let distance = self.calculateDistance(fromlat: currentCoordinates.latitude, fromlon: currentCoordinates.longitude, tolat: response.mapItems[0].placemark.coordinate.latitude, tolon: response.mapItems[0].placemark.coordinate.longitude)

          if distance > 30
          {
               print("the distance between the two points is: \(distance) meters")

          }            
      }
}

Вот небольшая функция, которую я нашел, чтобы получить расстояние между двумя координатами.

func calculateDistance(fromlat : Double, fromlon : Double, tolat : Double, tolon : Double) -> Double {

    let  DEG_TO_RAD = 0.017453292519943295769236907684886
    let  EARTH_RADIUS_IN_METERS = 6372797.560856

    let latitudeArc : Double   = (fromlat - tolat) * DEG_TO_RAD
    let longitudeArc : Double  = (fromlon - tolon) * DEG_TO_RAD
    var latitudeH : Double   = sin(latitudeArc * 0.5)
    latitudeH  *= latitudeH
    var lontitudeH : Double  = sin(longitudeArc * 0.5)
    lontitudeH *= lontitudeH
    let tmp : Double  = cos(fromlat*DEG_TO_RAD) * cos(tolat*DEG_TO_RAD)
    return EARTH_RADIUS_IN_METERS * 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH))


}
person Spartakus    schedule 10.03.2018
comment
Поправка... если расстояние › 30 должно быть ‹ 30. - person Spartakus; 23.03.2018