i try to catch the longitude and latitude values and to display them in the console (NSLog) for the moment, i have puted the correspondant code in the viewWillAppear method, any way, it's not a big deal, my problem is when i show the view the first time, my console show me that:
latitude: 0.000000
longitude:0.000000
and the second time it shows me that :
latitude : 134217731.444448
longitude : 0.700000
the third time :
latitude : 134217731.444448
longitude : 0.700000
the n time :
latitude : 134217731.444448
longitude : 0.700000
this my code in the viewWillAppear (i'm sure it's logic is pretty right and i'm waiting for your clarification):
-(void)viewWillAppear:(BOOL)animated
{
// locationManager update as location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:#"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:#"%f", coordinate.longitude];
NSLog(#"Latitude : %#", latitude);
NSLog(#"Longitude : %#",longitude);
}
note that i work on the iPhone simulator, thx for help :)))
You shouldn't check coordinate here.
Implement locationManager:didUpdateToLocation:fromLocation: method in the same class and check the location inside this method:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
CLLocationCoordinate2D coordinate = [newLocation coordinate];
NSString *latitude = [NSString stringWithFormat:#"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:#"%f", coordinate.longitude];
NSLog(#"Latitude : %#", latitude);
NSLog(#"Longitude : %#",longitude);
}
Your current class should implement CLLocationManagerDelegate protocol, i.e. it should be a delegate of location manager.
Related
I am using a method to get my location:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
CLLocation *currentLocation = newLocation;
NSLog(#"%#", currentLocation);}
//new method to find the distance
-(void) zoomToNearestSpot: (NSArray *) spot location: (CLLocation *)myLocation
{
myLocation = currentLocation;
spot = chSpot;
for (int i=0; i< spot.count; i++)
{
ChargingSpots *mySpot = [spot objectAtIndex:i];
CLLocation *thePoint = [[CLLocation alloc]initWithLatitude:[mySpot.LocationLat doubleValue] longitude:[mySpot.LocationLong doubleValue]];
CLLocationDistance dist = [myLocation distanceFromLocation:thePoint];
NSLog(#"%f", dist);
you get here **distance** in meter so in assumption **20 miles = 32187 meter**
put condition such like
if(distance <= 32187)
{
// under 20 miles you can add the zoom level
}
else
{
// out of 20 miles
}
}
}
First, I need to show all of the spots on the map by zooming out according to their number then find the nearest spots and zoom in the camera on them in.
you have more the two coordinate
1) current (user Location)
2) another coordinate ..
Here distanceFromLocation: method is use for get distance between two location.
CLLocationDistance distance = [currentLOcation distanceFromLocation:anotherLocation];
for example where you need add the following lines
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
CLLocation *currentLocation = newLocation;
for (int i=0; i<chSpot.count; i++)
{
ChargingSpots *spot = [chSpot objectAtIndex:i];
NSString *locLat = spot.LocationLat;
NSString *locLong = spot.LocationLong;
CLLocation *LocationAtual = [[CLLocation alloc] initWithLatitude: locLat longitude: locLong];
CLLocationDistance distanceBetween = [currentLocation
distanceFromLocation: LocationAtual];
NSString *tripString = [[NSString alloc]
initWithFormat:#"%f",
distanceBetween];
NSLog(#"DIST: %f", tripString);
}
}
you can use this code
1.) CLLocation *loc=[[CLLocation alloc]initWithLatitude:spot.LocationLat longitude:spot.LocationLong];
2.) CLLocationDistance distanceInMeters=[currentLocation distanceFromLocation:loc];
This will help.ThankYou
I am using GMSPolyline on google map to show shortest path between two points. This map does not show user's current location properly.
Here is my code. Let me know about the correction that I can make in my code. Thanks in advance.
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
/////// If it's a relatively recent event, turn off updates to save power.
CLLocation* location = [locations lastObject];
NSDate* eventDate = location.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 0.5)
{
/////// Update your marker on your map using location.coordinate.latitude
//and location.coordinate.longitude);
NSLog(#"event time=%#",eventDate);
#pragma mark start Point of Polyline Drow
///////////////Logitude 23.03 apvathe darek point tyathe start thay etle polyline Drow thay/////
if (location.coordinate.longitude==23.03)
{
[locationManager stopUpdatingLocation];
}
[mypath addObject:[NSString stringWithFormat:#"%f,%f",location.coordinate.latitude,location.coordinate.longitude]];
GMSMutablePath *path1 = [GMSMutablePath path];
for (int i=0; i<mypath.count; i++)
{
//NSString *str1=mypath[i];
NSArray* foo = [mypath[i] componentsSeparatedByString: #","];
NSString* lat = [foo objectAtIndex: 0];
NSString* longi = [foo objectAtIndex: 1];
[path1 addCoordinate:CLLocationCoordinate2DMake([lat floatValue], [longi floatValue])];
}
GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path1];
rectangle.map = mapView_;
marker.position = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude);
marker.title = #"Gurukul Road,Ahmedabad";
marker.snippet = #"Gujarat";
marker.map = mapView_;
}
}
you have to be more accurate in case of latitude and longitude you are using there %f and that is not accurate as per values of latitude and longitude use this code...
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(#"didUpdateToLocation: %#", newLocation);
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
strForCurrentLongitude= [NSString stringWithFormat:#"%.8f", currentLocation.coordinate.longitude];
strForCurrentLatitude = [NSString stringWithFormat:#"%.8f", currentLocation.coordinate.latitude];
}
}
Take Double value instead of float in this line.
[path1 addCoordinate:CLLocationCoordinate2DMake([lat floatValue], [longi floatValue])];
I have a function that utilizes LocationManager for iOS development. The function fulfills the very common purpose of pulling latitude and longitude from the LocationManager object and populating some method variables to build a set of directions.
Currently the method works fine on the iOS simulator when there are some specifically placed breakpoints. I will step into each step until I see that the lat and long have been populated and then continue program execution. The view is correctly altered to bring up a set of directions.
If the breakpoints are removed however, the variables are never populated and the view defaults to 0.000 for lat and longitudes.
I also see an error in one of the threads (I'm completely unfamiliar with thread based programming. This is not my app I am debugging): Thread 1: EXC_BAD_ACCESS (CODE =1, address= {some address}
Below is the function code (asdf is just the instance name for LocationManager):
(void)webViewDidFinishLoad:(UIWebView *)webView
{
asdf = [[CLLocationManager alloc] init];
asdf.delegate = self;
asdf.distanceFilter = kCLDistanceFilterNone;
asdf.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[asdf startUpdatingLocation];
CLLocation *location = [asdf location];
float longitude=location.coordinate.longitude;
float latitude=location.coordinate.latitude;
NSLog(#"dLongitude : %f", longitude);
NSLog(#"dLatitude : %f", latitude);
double userLatitude = latitude;
double userLongitude = longitude;
[locationManager stopUpdatingLocation];
NSString *userLat = [NSString stringWithFormat:#"%f", userLatitude];
NSString *userLng = [NSString stringWithFormat:#"%f", userLongitude];
NSString *destinationLatitude = site.siteGPSN;
NSString *destinationLongitude = site.siteGPSW;
NSString *javascriptString = [NSString stringWithFormat:#"buildMap('%#','%#','%#','%#')",destinationLatitude, destinationLongitude, userLat, userLng];
[webView stringByEvaluatingJavaScriptFromString:javascriptString];
}
You're not using CLLocationManager correctly. You need to implement the CLLocationManagerDelegate. Otherwise there is no guarantee there will be a location object cached by the manager when you try to use it.
The implementation would look something like this:
- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
// handle error
}
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
// use location here
}
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if (status == kCLAuthorizationStatusAuthorized)
{
[manager startUpdatingLocation];
}
}
Remember to call stopUpdatingLocation at the appropriate time as well (whenever you are done).
I would recommend looking at Apple's "LocateMe" sample project which provides some great starting code on how to use this protocol correctly.
https://developer.apple.com/library/ios/samplecode/LocateMe/Listings/Classes_GetLocationViewController_m.html#//apple_ref/doc/uid/DTS40007801-Classes_GetLocationViewController_m-DontLinkElementID_8
Location manager never gets an update as soon as you start it using startUpdatingLocation this is when the delegate methods come into action. Delegate methods are invoked only when a location update is available or the process failed for some reason.
I found that you have set:
asdf.delegate = self;
That means you are registering the current class as a handler for location updates. So you should declare the CLLocationManagerDelegate protocol in the header (.h file) of your class, like following:
#interface <# Your Class Name #> : NSObject<CLLocationManagerDelegate> // your class might have inherited from anything other than NSObject
////......
#end
Now in your implementation file (.m) implement the following methods:
-(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations {
if (!locations || [locations count] == 0) {
return;
}
CLLocation* location = locations[[locations count] - 1];
if (location.horizontalAccuracy < 0) {
return;
}
float longitude=location.coordinate.longitude;
float latitude=location.coordinate.latitude;
NSLog(#"dLongitude : %f", longitude);
NSLog(#"dLatitude : %f", latitude);
double userLatitude = latitude;
double userLongitude = longitude;
//[locationManager stopUpdatingLocation]; -- dont stop it here
NSString *userLat = [NSString stringWithFormat:#"%f", userLatitude];
NSString *userLng = [NSString stringWithFormat:#"%f", userLongitude];
NSString *destinationLatitude = site.siteGPSN;
NSString *destinationLongitude = site.siteGPSW;
NSString *javascriptString = [NSString stringWithFormat:#"buildMap('%#','%#','%#','%#')",destinationLatitude, destinationLongitude, userLat, userLng];
[webView stringByEvaluatingJavaScriptFromString:javascriptString];
}
-(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation { //for backward compatibility
if (newLocation.horizontalAccuracy < 0) {
return;
}
float longitude=newLocation.coordinate.longitude;
float latitude=newLocation.coordinate.latitude;
NSLog(#"dLongitude : %f", longitude);
NSLog(#"dLatitude : %f", latitude);
double userLatitude = latitude;
double userLongitude = longitude;
//[locationManager stopUpdatingLocation]; -- dont stop it here
NSString *userLat = [NSString stringWithFormat:#"%f", userLatitude];
NSString *userLng = [NSString stringWithFormat:#"%f", userLongitude];
NSString *destinationLatitude = site.siteGPSN;
NSString *destinationLongitude = site.siteGPSW;
NSString *javascriptString = [NSString stringWithFormat:#"buildMap('%#','%#','%#','%#')",destinationLatitude, destinationLongitude, userLat, userLng];
[webView stringByEvaluatingJavaScriptFromString:javascriptString];
}
-(void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error {
NSLog(#"core location error: %#",[error localizedDescription]);
if ([error code] != kCLErrorLocationUnknown) { //when location update is not available for that time don't continue receiving updates
NSLog(#"location service will terminate now");
[manager stopUpdatingLocation];
}
}
After all these set up, your location manager would invoke the appropriate delegate method when an update is available (or failed) and you can stop your location service when you don't actually need it anymore, may be in your viewWillDisappear or dealloc methods.
What is the propery way to obtain CLLocationCoordinate2D?
In .h:
#property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
In .m
//Called when the location can be obtained
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
//Get the latitude and longitude location
CLLocation *lastLocation = [locations lastObject];
_latitude = [[NSString alloc] initWithFormat:#"%f", lastLocation.coordinate.latitude];
_longitude = [[NSString alloc] initWithFormat:#"%f", lastLocation.coordinate.longitude];
}
Is it this:
_coordinate = lastLocation.coordinate;
or this:
_coordinate = manager.location.coordinate;
First read the documentation as already stated in the comments, because this is a must know for location programming.
Second pay attention that is not the first data you get from delegate, because it could be a cached data (you need to check the timestamp) or an invalid data (with horizontal accuracy less that zero).
You could use that code:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation * newLocation = [locations lastObject];
if (newLocation.horizontalAccuracy < 0) {
return;
}
NSTimeInterval interval = [newLocation.timestamp timeIntervalSinceNow];
if (abs(interval)>5) {
return;
}
//YOUR CODE HERE
}
Hope this helps, Andrea
i use core location to get the longitude and latitude value of my current position and i have displayed it into a label, so for my case it's always 0.000000 for both longitude and latitude, is it because i work on the simulator ??
//longitude and latitude
// locationManager update as location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:#"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:#"%f", coordinate.longitude];
Just initialization the location manager doesn't fetch you values.
you have to write this
[self.locationManager startUpdatingLocation];
then you have to override a callback method
- (void) locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *) newLocation
fromLocation: (CLLocation *) oldLocation {
[self.locationManager stopUpdatingLocation];
NSString *latitude = [NSString stringWithFormat:#"%f", newLocation.latitude];
NSString *longitude = [NSString stringWithFormat:#"%f", newLocation.longitude];
[self.locationManager release];
}
Hope that helps!
Shuanak
No. CoreLocation on the iPhone simulator is fixed at 37.3317 North, 122.0307 West (Apple HQ).
Try moving your locationManager code away from your code with the label. Put the location manager code in the viewDidLoad or something and then put this code
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:#"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:#"%f", coordinate.longitude];
in a function that you call from a button. CoreLocation needs time to get itself going. This is true on the device for sure, but perhaps it is also true on the simulator.