Reputation: 711
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
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
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
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