user2893370
user2893370

Reputation: 711

Latitude & Longitude for Autocomplete place search google API in ios

I implemented the Autocomplete Place Search API from Google. It works fine.

But in the response, the google is not returning the "Latitude & Longitude" of the place.

my code is as follow

NSString *strUrl =
[[[NSString stringWithFormat:@"%@%@%@?sensor=false&key=%@&input=%@",
   PLACES_API_BASE,
   TYPE_AUTOCOMPLETE,
   OUT_JSON,API_KEY,
   txt_search.text]
  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
 stringByReplacingOccurrencesOfString:@" " withString:@"%20"];


NSLog(@"--- address ---  %@",strUrl);

NSData *responseData = [NSData dataWithContentsOfURL:[NSURL URLWithString:strUrl] options:NSDataReadingUncached error:nil];


NSDictionary  *dictResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:Nil];
NSLog(@"%@",dictResponse);

Response

{
  "status": "OK",
  "predictions": [ {
    "description": "Paris, France",
    "id" : "691b237b0322f28988f3ce03e321ff72a12167fd",
    "reference": "CiQYAAAA0Q_JA...kT3ufVLDDvTQsOwZ_tc",
    "terms": [ {
      "value": "Paris",
      "offset": 0
    }, {
      "value": "France",
      "offset": 7
    } ],
    "types": [ "geocode" ],
    "matched_substrings": [ {
      "offset": 0,
      "length": 5
    } ]
  }

Upvotes: 3

Views: 2820

Answers (3)

Abhinav Jha
Abhinav Jha

Reputation: 345

Try the below Swift Code :-

import UIKit
import GooglePlaces

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {



@IBOutlet weak var txtField: UITextField!
@IBOutlet weak var tableView: UITableView!

var tableData = [GMSAutocompletePrediction]()

var fetcher: GMSAutocompleteFetcher?

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.white
    self.edgesForExtendedLayout = []

    let nsBoundsCorner = CLLocationCoordinate2D(latitude: 20.5937, longitude: 78.9629)

    let bounds = GMSCoordinateBounds(coordinate: nsBoundsCorner, coordinate: nsBoundsCorner)

    let filter = GMSAutocompleteFilter()
    filter.type = .establishment

    fetcher  = GMSAutocompleteFetcher(bounds: bounds, filter: filter)
    fetcher?.delegate = self

    txtField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),for: .editingChanged)

    tableView.delegate = self
    tableView.dataSource = self

    self.tableView.reloadData()


    // Do any additional setup after loading the view.
}

@objc func textFieldDidChange(textField: UITextField) {
        fetcher?.sourceTextHasChanged(txtField.text!)
    }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return tableData.count
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var section = indexPath.section
    var row = indexPath.row

    let cell1 : UITableViewCell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell1")

    cell1.selectionStyle = UITableViewCellSelectionStyle.none
    cell1.backgroundColor = UIColor.clear
    cell1.contentView.backgroundColor = UIColor.clear
    cell1.textLabel?.textAlignment = NSTextAlignment.left
    cell1.textLabel?.textColor = UIColor.black
    cell1.textLabel?.font = UIFont.systemFont(ofSize: 14.0)

    cell1.textLabel?.text = tableData[indexPath.row].attributedFullText.string
    return cell1
}

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    txtField.text = tableData[indexPath.row].attributedFullText.string
    getLatLongFromAutocompletePrediction(prediction:tableData[indexPath.row])
}

 func getLatLongFromAutocompletePrediction(prediction:GMSAutocompletePrediction){

    let placeClient = GMSPlacesClient()

    placeClient.lookUpPlaceID(prediction.placeID!) { (place, error) -> Void in
        if let error = error {
            //show error
            return
        }

        if let place = place {
            place.coordinate.longitude //longitude 
            place.coordinate.latitude //latitude
        } else {
        //show error
        }
    }
}
}

extension TableViewController: GMSAutocompleteFetcherDelegate {


func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {

    tableData.removeAll()

    for prediction in predictions{

        tableData.append(prediction)

    }
    tableView.reloadData()
}

func didFailAutocompleteWithError(_ error: Error) {
    print(error.localizedDescription)
   }
}

Upvotes: 0

Chandru
Chandru

Reputation: 247

Try this

NSString * urlString =[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=Your address &sensor=true"];
NSURL * url=[NSURL URLWithString:urlString];
NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url];
NSURLResponse * response;
NSError * error;
NSData * responseData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString * outputData=[[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@" output is %@",outputData);

In this change the "your address" to the location u want

Upvotes: 1

vokilam
vokilam

Reputation: 10323

According to Place Autocomplete documentation objects of predictions array don't have location info. You can use reference property to retrieve place details.

The returned predictions are designed to be presented to the user to aid them in selecting the desired place. You can send a Place Details request for more information about any of the places which are returned.

Upvotes: 2

Related Questions