Swift Geocode googlemap からappleの関数へ変更
このソースが動かなくなった
/// 住所ボタン=住所の位置を登録して、登録した位置を中央に表示してピンを落とす。 @IBAction func centerLocationFromAddress(_ sender: Any) { //住所のnilチェック guard let addr = uiJusho.text, !addr.isEmpty else { return } //Google geolocation関数呼び出し、ここが2018.2よりGoogleの仕様変更で利用できない //軽度緯度をAPIで取得しているだけ 下記に示す guard let location = GmsUtils.getLocationOf(addr) else { MsAlert.confirmOk(self,"MsgMapGmsGeocodeNoResponse") return } //返却された、経度、緯度をMAPの中心に表示する関数を呼び出し msMapAgent?.center(point:location, animated:true) registarPersonLocation(location) //キーボードを閉じる textUiPlaceAdjuster.endEditing() }
getLocationOf(addr)
/// 住所の位置を検索し返す static func getLocationOf(_ address: String) -> CLLocationCoordinate2D? { // address は query部分に当たるので所定のエンコードを行う guard let encAddr = address.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed), !encAddr.isEmpty else { return nil } // goole geocode サービス要求:dataが返されない事もありうる。 let strUrl = "https://maps.google.com/maps/api/geocode/json?address=\(encAddr)&sensor=false" guard let url = URL(string: strUrl), let data = try? Data(contentsOf: url) else { return nil } //JSONSerializationにて解析 // 結果を解析 guard let json = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! NSDictionary, (json["status"] as? String) == "OK" else { return nil } guard let result = json["results"] as? NSArray, result.count > 0, let geometry = (result[0] as! NSDictionary)["geometry"] as? NSDictionary, let location = geometry["location"] as? NSDictionary, let lat = location["lat"] as? Double, let lng = location["lng"] as? Double else { //print("\n\(lat), \(lng)") return nil } // ここで返却している CLLocationDegrees型で //init(latitude: CLLocationDegrees, longitude: CLLocationDegrees) return CLLocationCoordinate2D(latitude: lat, longitude: lng) }
Appleの関数のみでの実装
/// 検査ボタン押下 func searchBarSearchButtonClicked(_ searchBar: UISearchBar){ // キーボードを納め、探す場所が入力されていれば、それを探す self.view.endEditing(true) guard let adress = uiSearchLocation.text, !adress.isEmpty else { return } // 検索は非同期で、時間がかかることもあるのでキャンセルボタンを表示し // 結果が返されるまでの間でキャンセル可能とする searchBar.showsCancelButton = true CLGeocoder().geocodeAddressString( adress, completionHandler:geocodeComplete) }
func geocodeComplete(places:[CLPlacemark]?, error:Error?) { self.uiSearchLocation.showsCancelButton = false if error != nil { // localizedDescription には次のような文字列が入っていた // The operation couldn’t be completed. (kCLErrorDomain error 8.) // そのまま出すとオペレータの混乱を招くので MagMsgGmsGeocodeNoResponse // を使う MsAlert.confirmOk(self,"MagMsgGmsGeocodeNoResponse") return } if let _places = places, !_places.isEmpty { if let ll = _places[0].location?.coordinate { self.msMapAgent.center(point:ll, animated:true) } } }