CoreLocation 地理定位
1.创建定位管理者
CLLocationManager *mgr = [[CLLocationManager alloc]init];
2.设置代理
mgr = self;
3.开始定位
[mgr startUpdatingLocation];
4.计算两个地理位置之间的距离
CLLocation *location1 = [[CLLocation alloc]initWithLatitude:20.20 longitude:111.230];
CLLocation *location2 = [[CLLocation alloc]initWithLatitude:66.20 longitude:222.230];
CLLocationDistance distance = [location1 distanceFormLocation:location2];
NSLog(@"两个地理位置之间的距离%f",distance);
定位的代理方法
-(void)locationmanager:(CLLocationmanager*)manager didupdateLocations:(NSArray *)locations{
NSLog(@"定位到用户的位置,如果不停止会一直定位");
//获取用户位置的对象
CLLocation *location = [locations lastObject];
CLLocationCoordinate2D coordinate = location.coordinate;
NSLog(@"纬度:%f 经度:%f",coordinate.latitude,coordinate.longitude);
[manager stopUpdatingLocation];
}
// 1.取出用户输入的地址
NSString *address = self.addressFIeld.text;
if (address.length == 0) {
NSLog(@"输入地址不能为空");
return;
}
地理编码geocode
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
// 1.如果解析有错误,或者解析出的数组个数为0.直接返回
if (placemarks.count == 0 || error) return;
// 2.便利所有的地标对象(如果是实际开发,可以给用户以列表的形式展示)
for (CLPlacemark *pm in placemarks) {
// 2.1.取出用户的位置信息
CLLocation *location = pm.location;
// 2.2.取出用户的经纬度
CLLocationCoordinate2D coordinate = location.coordinate;
// 2.3.将信息设置到界面上
self.latitudeLabel.text = [NSString stringWithFormat:@"%.2f", coordinate.latitude];
self.longitudeLabel.text = [NSString stringWithFormat:@"%.2f",coordinate.longitude];
self.resultLabel.text = pm.name;
}
}];
反地理编码rervsecode
// 1.取出输入的经纬度
NSString *latitude = self.latitudeField.text;
NSString *longitude = self.longitudeField.text;
if (latitude.length == 0 || longitude.length == 0) {
return;
}
// 2.反地理编码
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude.floatValue longitude:longitude.floatValue];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
// 如果有错误,或者解析出来的地址数量为0
if (placemarks.count == 0 || error) return ;
// 取出地标,就可以取出地址信息,以及CLLocation对象
CLPlacemark *pm = [placemarks firstObject];
#warning 注意:如果是取出城市的话,需要判断locality属性是否有值(直辖市时,该属性为空)
if (pm.locality) {
self.resultLabel.text = pm.locality;
} else {
self.resultLabel.text = pm.administrativeArea;
}
}];
网友评论