百度地图位置纠偏

<span style="font-size:14px;">这里先分析一下我所要实现的功能,如果只获取当前的周边地理信息,真的需要这么麻烦的纠偏吗,其实这个答案在网络上真没有找到相关资料,不过同事瑞勤大牛却提出另一种获知当前经纬度的方法,经过测试,的确效果大不同啊,呃,上面纯属话唠,下面正式对比纠偏与非纠偏的各自实现方式,最终功能为获取当前用户的周边地理位置信息。

…………纠偏 篇…………..

1. 涉及接口:<CoreLocation/CoreLocation.h>

2. 核心代码解读:

if ([CLLocationManager locationServicesEnabled]) {

[self.locationManager setDelegate:self];

[self.locationManager setDistanceFilter:200];

[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

[self.locationManager startUpdatingLocation];

} // 开始定位

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;

//此代理方法可以实现新位置更新,即一定距离(200) 则更新一次当前位置,保持经纬度始终为最新
self.coordinate = [newLocation coordinate];

self.coordinate.longitude,self.coordinate.latitude  // 更新后的经纬度

TIPS:虽然上面方法中获取到了目前的经纬度,但是这个经纬度并不是真实的经纬度,而是火星经纬度,理所当然,下面就是考虑如何纠偏了,因为直接用这个经纬度去获取周边信息,基本不算定位,属于分身之术。

经过又一轮的查询相关资料和询问相关人士,居然小小纠偏却蕴藏很大商机,很多公司都有自己的一套纠偏方案,或者是购买第三方纠偏数据库,没有办法,只能再找,最后发现,我们的国产互联网巨头百度老大居然提供一个纠偏接口,真是感动啊,开动纠偏程序:

————————

NSString *rectificationURL=[NSString stringWithFormat:@"http://api.map.baidu.com/ag/coord/convert?from=0&to=2&x=%f&y=%f",self.coordinate.longitude,self.coordinate.latitude]; // 带上经纬度开始纠偏,对API有疑问,请自觉百度一下

纠偏结果如下:

{“error”:0,

“x”:”MTE2LjQzNTM1NDU0NjQ0″,

“y”:”MzkuOTEzNzAwOTAwNjA4″

} // 0 即为正确纠偏,后面的太不厚道了,居然用GTMBase64 加密,还好,费一番功夫下载Google 的”GTMBase64.h” 代码顺利解密,汗…
结果如下:

{

error: 0,

x: “MTE2LjQzNTM1NDU0NjQ0″,  116.43535454644

y: “MzkuOTEzNzAwOTAwNjA4″  39.913700900608

}

再次感谢百度,接下来当然是带上经度,带上纬度,开始取周边地理信息,关键代码如下:

NSString *url = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&language=%@&sensor=false", aCoordinate.latitude, aCoordinate.longitude,NSLocalizedStringFromTable(@"signLanguage", @"sign", nil)]; //获取用户当前具体地理位置

NSString *url = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/search/json?location=%f,%f&radius=%@&types=%@&sensor=true&key=%@&language=%@", aCoordinate.latitude, aCoordinate.longitude, [NSString stringWithFormat:@"%i", RADIUS], @”", kGOOGLE_API_KEY,NSLocalizedStringFromTable(@”signLanguage”, @”sign”, nil)]; //获取用户周边地理位置

Tips:若对上述API 有疑问,请自觉前往:https://developers.google.com/places/documentation/#Authentication  其中涉及的具体参数都有说明,请自动取舍,切记先申请 kGOOGLE_API_KEY.

3. 收尾工作: 关于地图的展示,关于地理详情的展示,关于JSON 的解析,关于大头针的定制,关于代码的复用,,还有一些数据的对比,由于时间问题,这里不再唠叨,下面还有两篇章,精彩继续,不要走开。
…………非纠偏 篇…………..

 

1. 涉及接口: <MapKit/MapKit.h>

2. 核心代码解读:

if (!self.signMapView) {

        self.signMapView = [[[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)] autorelease];

        _signMapView.delegate = self;

        _signMapView.showsUserLocation = YES;

  }  // 创建一个地图视图,但注意并不让该地图加载到self.view 上面,只实现它的代理和显示用户位置即可,切记,showsUserLocation一定要YES,否则将无法获取定位用户当前的经纬度。

———————————————————————————————

- (void)mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation

{

    if (userLocation.location) {

      //  userLocation.coordinate 所包含的经纬度则是真实的经纬度,不需要纠偏

   //  开始取具体的地理位置和周边的位置,具体实现代码同上

}else{

      // 提示错误信息
}

    self.signMapView = nil;

 //非常重要的一句代码,因为每一次点击签到,都要重新创建一个MKMapView,,以便能获取当前最新的经纬度,所以这里每签到一次后就要清除旧对象,重新创建对象,再重新定位。

}

-(void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error

{

    if (error.code == kCLErrorDenied){

        NSLog(@”User refused location services”);

 } else {

        NSLog(@”Did fail to locate user with error: %@”, error.description);
ips: userLocation.coordinate 是关键的值,我们的目的就是要取到它,这个经纬度就是真实的用户经纬度,不需要纠偏这么麻烦,直接利用它来取周边地理信息即可。

4. 收尾工作:可以很明显的看出,纠偏和不纠偏无论从代码量还是最终效果,利用showsUserLocation 来获取经纬度更靠谱,更有效,最终实现签到获取周边地理位置信息的功能。
    }

    self.signMapView = nil;

 } // 如果获取不到用户位置,则调用此代理方法</span>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值