2016-12-05 2 views
5

Я нашел один способ отправить запрос:Как геокодировать адрес по картам google iOS API?

Запрос Google Maps API геокодирования принимает следующий вид:

https://maps.googleapis.com/maps/api/geocode/outputFormat?parameters где OUTPUTFORMAT может быть одним из следующих значений:

JSON (рекомендуется) указывает вывод в JavaScript Обозначение объекта (JSON); или XML указывает на вывод в XML Для того, чтобы получить доступ к Google Maps API геокодирования через HTTP, использование:

Но это действительно неудобно, есть ли собственный способ в стрижа?

Я изучил интерфейс GMSGeocoder, и только его обратное геокодирование может быть выполнено его API.

ответ

4

Если вы просто ищете Geocoding решение, которое вы могли бы заглянуть в небольшой источник открытого проекта, который я построил. Он очень легкий и использует API-интерфейс геокодирования OpenStreetMap под названием Nominatim. Посмотрите здесь: https://github.com/caloon/NominatimSwift

Вы даже можете найти достопримечательности.

геокодирования адреса и достопримечательности:

Nominatim.getLocation(fromAddress: "The Royal Palace of Stockholm", completion: {(error, location) -> Void in 
    print("Geolocation of the Royal Palace of Stockholm:") 
    print("lat = " + (location?.latitude)! + " lon = " + (location?.longitude)!) 
}) 
0

Там нет родной путь в Google Maps API IOS SDK. Как уже упоминалось в других ответах, это было requested feature for years.

Следует помнить, что API Карт Google в основном ориентирован на создание карт: это основная цель.

Вы должны использовать API-вызовы API или какую-либо другую услугу. Например, у другой службы под названием SmartyStreets есть SDK для iOS, у которого есть встроенная поддержка передового геокодирования. Вот пример кода для Swift из their iOS SDK documentation page:

// Swift: Sending a Single Lookup to the US ZIP Code API 

package examples; 

import Foundation 
import SmartystreetsSDK 

class ZipCodeSingleLookupExample { 

    func run() -> String { 
     let mobile = SSSharedCredentials(id: "SMARTY WEBSITE KEY HERE", hostname: "HOST HERE") 
     let client = SSZipCodeClientBuilder(signer: mobile).build() 
//  Uncomment the following line to use Static Credentials 
//  let client = SSZipCodeClientBuilder(authId: "YOUR AUTH-ID HERE", authToken: "YOUR AUTH-TOKEN HERE").build() 

     let lookup = SSZipCodeLookup() 
     lookup.city = "Mountain View" 
     lookup.state = "California" 

     do { 
      try client?.send(lookup) 
     } catch let error as NSError { 
      print(String(format: "Domain: %@", error.domain)) 
      print(String(format: "Error Code: %i", error.code)) 
      print(String(format: "Description: %@", error.localizedDescription)) 
      return "Error sending request" 
     } 

     let result: SSResult = lookup.result 
     let zipCodes = result.zipCodes 
     let cities = result.cities 

     var output: String = String() 

     if (cities == nil && zipCodes == nil) { 
      output += "Error getting cities and zip codes." 
      return output 
     } 

     for city in cities! { 
      output += "\nCity: " + (city as! SSCity).city 
      output += "\nState: " + (city as! SSCity).state 
      output += "\nMailable City: " + ((city as! SSCity).mailableCity ? "YES" : "NO") + "\n" 
     } 

     for zip in zipCodes! { 
      output += "\nZIP Code: " + (zip as! SSZipCode).zipCode 
      output += "\nLatitude: " + String(format:"%f", (zip as! SSZipCode).latitude) 
      output += "\nLongitude: " + String(format:"%f", (zip as! SSZipCode).longitude) + "\n" 
     } 

     return output 
    } 
} 

Полное раскрытие: Я работал на SmartyStreets.

9

Как уже отмечалось, не существует предопределенный способ сделать поиск, но вы можете использовать запрос сети, чтобы получить доступ к Google Geocoding API себя:

func performGoogleSearch(for string: String) { 
    strings = nil 
    tableView.reloadData() 

    var components = URLComponents(string: "https://maps.googleapis.com/maps/api/geocode/json")! 
    let key = URLQueryItem(name: "key", value: "...") // use your key 
    let address = URLQueryItem(name: "address", value: string) 
    components.queryItems = [key, address] 

    let task = URLSession.shared.dataTask(with: components.url!) { data, response, error in 
     guard let data = data, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, error == nil else { 
      print(String(describing: response)) 
      print(String(describing: error)) 
      return 
     } 

     guard let json = try! JSONSerialization.jsonObject(with: data) as? [String: Any] else { 
      print("not JSON format expected") 
      print(String(data: data, encoding: .utf8) ?? "Not string?!?") 
      return 
     } 

     guard let results = json["results"] as? [[String: Any]], 
      let status = json["status"] as? String, 
      status == "OK" else { 
       print("no results") 
       print(String(describing: json)) 
       return 
     } 

     DispatchQueue.main.async { 
      // now do something with the results, e.g. grab `formatted_address`: 
      let strings = results.flatMap { $0["formatted_address"] as? String } 
      ... 
     } 
    } 

    task.resume() 
} 
1

Вы можете отправить запрос через URL сессии адрес, используя Place Search API Google Адресов, а затем проанализируйте результат json. Это может быть не идеально, но вы можете получить больше информации, кроме координат.

1

К сожалению, не существует способа сделать это как родной. Я надеюсь, что эта функция поможет.

func getAddress(address:String){ 

    let key : String = "YOUR_GOOGLE_API_KEY" 
    let postParameters:[String: Any] = [ "address": address,"key":key] 
    let url : String = "https://maps.googleapis.com/maps/api/geocode/json" 

    Alamofire.request(url, method: .get, parameters: postParameters, encoding: URLEncoding.default, headers: nil).responseJSON { response in 

     if let receivedResults = response.result.value 
     { 
      let resultParams = JSON(receivedResults) 
      print(resultParams) // RESULT JSON 
      print(resultParams["status"]) // OK, ERROR 
      print(resultParams["results"][0]["geometry"]["location"]["lat"].doubleValue) // approximately latitude 
      print(resultParams["results"][0]["geometry"]["location"]["lng"].doubleValue) // approximately longitude 
     } 
    } 
} 
Смежные вопросы