简体   繁体   English

使用 iOS 中的 Geocoder 类获取基于地址的纬度和经度

[英]Get latitude and longitude based on Address using Geocoder class in iOS

I got the current location based on the Longitude and Latitude values and then I also got multiple places on google map using Annotation.我根据经度和纬度值获得了当前位置,然后我还使用注释在谷歌地图上获得了多个位置。 Now I want to get the longitude and latitude values based on the Address( ie street,city and county).Need some guidance on how this can be achieved.现在我想根据地址(即街道、城市和县)获取经度和纬度值。需要一些关于如何实现的指导。

Till now, this is what I have tried:-到目前为止,这就是我尝试过的:-

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize streetField = _streetField, cityField = _cityField, countryField = _countryField, fetchCoordinatesButton = _fetchCoordinatesButton, nameLabel = _nameLabel, coordinatesLabel = _coordinatesLabel;
@synthesize geocoder = _geocoder;


- (void)viewDidLoad
{

    [super viewDidLoad];
    _streetField.delegate=self;
    _cityField.delegate=self;
    _countryField.delegate=self;

    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)fetchCoordinates:(id)sender {
    NSLog(@"Fetch Coordinates");
    if (!self.geocoder) {
          NSLog(@"Geocdoing");
        self.geocoder = [[CLGeocoder alloc] init];
    }

    NSString *address = [NSString stringWithFormat:@"%@ %@ %@", self.streetField.text, self.cityField.text, self.countryField.text];
    NSLog(@"GET Addres%@",address);

    self.fetchCoordinatesButton.enabled = NO;

    [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
          NSLog(@"Fetch Gecodingaddress");
        if ([placemarks count] > 0) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];

             NSLog(@"GET placemark%@",placemark);

            CLLocation *location = placemark.location;

            NSLog(@"GET location%@",location);

            CLLocationCoordinate2D coordinate = location.coordinate;


            self.coordinatesLabel.text = [NSString stringWithFormat:@"%f, %f", coordinate.latitude, coordinate.longitude];

            NSLog(@"CoordinatesLabel%@",self.coordinatesLabel.text);


            if ([placemark.areasOfInterest count] > 0) {
                NSString *areaOfInterest = [placemark.areasOfInterest objectAtIndex:0];
                self.nameLabel.text = areaOfInterest;
                NSLog(@"NameLabe%@",self.nameLabel.text);
            }
        }

        self.fetchCoordinatesButton.enabled = YES;
    }];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
@end

Above code is not working to give me the latitude and longitude.Need some help on what am I doing wrong here or if I am missing on something.上面的代码不能给我纬度和经度。需要一些帮助来解决我在这里做错了什么或者我遗漏了什么。

Thanks in Advance.提前致谢。

This was very old answer, Kindly check with new Updates这是一个很旧的答案,请检查新的更新

EDIT :编辑

Before using this check with iOS8 updation在 iOS8 更新中使用此检查之前

NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription

This is for getting lat and long based user area like street name,state name,country.这是用于获取基于纬度和经度的用户区域,例如街道名称、州名、国家/地区。

-(CLLocationCoordinate2D) getLocationFromAddressString: (NSString*) addressStr {
    double latitude = 0, longitude = 0;
    NSString *esc_addr =  [addressStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr];
    NSString *result = [NSString stringWithContentsOfURL:[NSURL URLWithString:req] encoding:NSUTF8StringEncoding error:NULL];
    if (result) {
        NSScanner *scanner = [NSScanner scannerWithString:result];
        if ([scanner scanUpToString:@"\"lat\" :" intoString:nil] && [scanner scanString:@"\"lat\" :" intoString:nil]) {
            [scanner scanDouble:&latitude];
            if ([scanner scanUpToString:@"\"lng\" :" intoString:nil] && [scanner scanString:@"\"lng\" :" intoString:nil]) {
                [scanner scanDouble:&longitude];
            }
        }
    }
    CLLocationCoordinate2D center;
    center.latitude=latitude;
    center.longitude = longitude;
    NSLog(@"View Controller get Location Logitute : %f",center.latitude);
    NSLog(@"View Controller get Location Latitute : %f",center.longitude);
    return center;
    
}

call the method like this in viewdidload method or somewhere according to your project根据您的项目在 viewdidload 方法或某处调用这样的方法

[self getLocationFromAddressString:@"chennai"];

just pass this in your browser http://maps.google.com/maps/api/geocode/json?sensor=false&address=chennai只需在您的浏览器中传递这个http://maps.google.com/maps/api/geocode/json?sensor=false&address=chennai

and you will have json format with lat and lon并且您将拥有带有纬度和经度的 json 格式

http://maps.google.com/maps/api/geocode/json?sensor=false&address=@"your city name here"




 NSString *address = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@ %@ %@", self.streetField.text, self.cityField.text, self.countryField.text];

the usage of this method....这种方法的使用......

CLLocationCoordinate2D center;
        center=[self getLocationFromAddressString:@"uthangarai"];
      double  latFrom=&center.latitude;
      double  lonFrom=&center.longitude;

  NSLog(@"View Controller get Location Logitute : %f",latFrom);
        NSLog(@"View Controller get Location Latitute : %f",lonFrom);

Someone looking for Swift 2.0 solution can use below :寻找 Swift 2.0 解决方案的人可以在下面使用:

let address = "1 Infinite Loop, CA, USA"
        let geocoder = CLGeocoder()

        geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
            if((error) != nil){
                print("Error", error)
            }
            if let placemark = placemarks?.first {
                let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
                coordinates.latitude
                coordinates.longitude
                print("lat", coordinates.latitude)
                print("long", coordinates.longitude)


            }
        })

Swift迅速

public func getLocationFromAddress(address : String) -> CLLocationCoordinate2D {
        var lat : Double = 0.0
        var lon : Double = 0.0

        do {

            let url = String(format: "https://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", (address.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!))
            let result = try Data(contentsOf: URL(string: url)!)
            let json = JSON(data: result)

            lat = json["results"][0]["geometry"]["location"]["lat"].doubleValue
            lon = json["results"][0]["geometry"]["location"]["lng"].doubleValue

        }
        catch let error{
            print(error)
        }

        return CLLocationCoordinate2D(latitude: lat, longitude: lon)
    }

I used SwiftyJSON but you can parse the JSON response however you want我使用了SwiftyJSON,但您可以根据需要解析 JSON 响应

Try this,尝试这个,

NSString *address = [NSString stringWithFormat:@"%@,%@,%@", self.streetField.text, self.cityField.text,self.countryField.text];    

[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error)
 {
     if(!error)
     {
         CLPlacemark *placemark = [placemarks objectAtIndex:0];
         NSLog(@"%f",placemark.location.coordinate.latitude);
         NSLog(@"%f",placemark.location.coordinate.longitude);
         NSLog(@"%@",[NSString stringWithFormat:@"%@",[placemark description]]);
     }
     else
     {
         NSLog(@"There was a forward geocoding error\n%@",[error localizedDescription]);
     }
 }
 ];
- (IBAction)forwardButton:(id)sender
{
    if([self.address.text length])
    {
        NSString *place = self.address.text;
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        __unsafe_unretained RTGeoCoderViewController *weakSelf = self;
        [geocoder geocodeAddressString:place completionHandler:^(NSArray* placemarks, NSError* error)
         {
             NSLog(@"completed");
             if ( error )
             {
                 NSLog(@"error = %@", error );
                 dispatch_async(dispatch_get_main_queue(),
                                ^{
                                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[self errorMessage:error.code] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
                                    [alert show];
                                });
             }
             else
             {
                NSLog(@"%@",placemarks);
             }
         }];
    }
}

Try this尝试这个

 - (void)getAddressFromAdrress:(NSString *)address withCompletationHandle:(void (^)(NSDictionary *))completationHandler {   


                CLGeocoder *geoCoder = [[CLGeocoder alloc] init];  
            //Get the address through geoCoder  
            [geoCoder geocodeAddressString:address   completionHandler:^(NSArray *placemarks, NSError *error) {  


                if ([placemarks count] > 0 && !error) {

                    //get the address from placemark
                    CLPlacemark *placemark = [placemarks objectAtIndex:0];
                    NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                    CLLocation *location = placemark.location;
                    CLLocationCoordinate2D coordinate = location.coordinate;
                    _latitudeUserLocation  = coordinate.latitude;
                    _longitudeUserLocation = coordinate.longitude;
                    NSString *postalCode   =  placemark.addressDictionary[(NSString*)kABPersonAddressZIPKey];
                    if (postalCode == nil) postalCode = @"";
                    if (locatedAt == nil)  locatedAt  = @"";
                    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                                postalCode               ,kPostalCode,
                                                locatedAt                ,kFullAddress,
                                                nil];
                    completationHandler(dictionary);

                } else {

                    completationHandler(nil);
                }
            }];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM