IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法

IOS_开发技巧_定位反地理编码的一些坑 在反地理编码中,我们直接拿到了CLPlacemark来获取地理信息,但是大家有没有发现有一个坑,在定位到北京的时候,这个信息却没有按照我们所想的方式去走了,原因如下,不说了,代码 // 反地理编码 [self.coder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray 阅读详情

IOS7 WGS-84转GCJ-02(火星坐标)


CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位:

 //创建CLLocationManager对象
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    
    //设置委托对象为自己
    [locationManager setDelegate:self];
    
    //要求CLLocationManager对象返回全部结果
    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    
    //要求CLLocationManager对象的返回结果尽可能的精准
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    
    //要求CLLocationManager对象开始工作,定位设备位置
    [locationManager startUpdatingLocation];

通过下面的CLLocationManager的委托方法可以得到或者更新locationManager的经纬度,并且显示到MapView上

//CLLocationManager委托方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //得到newLocation
    CLLocation *loc = [locations objectAtIndex:0];
}

但是对于国内地图而言,使用LocationManager定位所获得经纬度,是有一段较大距离的 偏移的。

这是为什么呢??这几天一直在查这方面的资料,各种google、baidu论坛里给出的答案也各有不同:
wifi 热点 基站 gps等等所导致的都有,最后查找还是找到了问题所在,原来国内地图使用的坐标系统是 GCJ-02而ios sdk中所用到的是国际标准的坐标系统 WGS-84。

因为国内使用的是加密后的坐标系GCJ-02就是网络上叫的火星坐标。

locationManager就是因为得到的是火星坐标偏移后的经纬度,所以导致在MapView上有很大的偏差,而在MKMapView上通过定位自己位置所获得的经纬度有是准确,因为apple已经对国内地图做了偏移优化。


1、那么临时的解决方法:想要获得自己准确的经纬度可以直接通过MKMapView中对自身定位来获得:

    //定义一个MKMapView 并且调用setShowUserLocation:YES来获得自身的位置
    [self.mapView setShowsUserLocation:YES];
    
    //如果不想要显示这个MKMapView就将其隐藏
    [self.mapView setHidden:YES];

然后通过MKMapView的委托方法来获取准确的经纬度:

    -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    CLLocationCoordinate2D coord = [userLocation coordinate];
    NSLog(@"经度:%f,纬度:%f",coord.latitude,coord.longitude);
    }

这个方法虽然简单,也可以实时的获取自己的位置而且基本上都是准确的位置,但是也就无法使用locationManager中的一些功能了。

那么有没有更好的解方法可以让我们在火星坐标上使用locationManager来获得准确的位置呢? 看了几篇博客给出的答案是相似的,就是调用apple的私有模块类中得方法来对经纬度做一个偏移修正:

http://blog.youkuaiyun.com/zhibudefeng/article/details/8495837

http://yach.me/blog/2011/11/09/huo-xing-zuo-biao-xi-wen-ti-zai-iosxia-de-xiu/

上面两篇文章中都提到了使用apple的私有模块MKLocationManager来修正偏移,不过遗憾的是如果使用了私有模块会导致AppStore审核失败,但是幸运的是这种方式只能在IOS5以前的系统中使用。。。。。。至少今天我们不用担心该不该使用这个方式。

接下来就是正题了:最后我找到了一份android的火星坐标转换的算法,然后自己改写成了以下将 WGS-84坐标系统转为GCJ-02的Objective-C代码,这样就能方便的使用CLLocationManager这个类了。

2、将WGS-84转为GCJ-02(火星坐标):

新建一个类“WGS84TOGCJ02”,在.h头文件中定义:

//  Copyright (c) 2013年 swinglife. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface WGS84TOGCJ02 : NSObject
//判断是否已经超出中国范围
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location;
//转GCJ-02
+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc;
@end
在WGS84TOGCJ02.m文件中:

//  Copyright (c) 2013年 swinglife. All rights reserved.
//

#import "WGS84TOGCJ02.h"

const double a = 6378245.0;
const double ee = 0.00669342162296594323;
const double pi = 3.14159265358979324;

@implementation WGS84TOGCJ02

+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc
{
    CLLocationCoordinate2D adjustLoc;
    if([self isLocationOutOfChina:wgsLoc]){
        adjustLoc = wgsLoc;
    }else{
        double adjustLat = [self transformLatWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double adjustLon = [self transformLonWithX:wgsLoc.longitude - 105.0 withY:wgsLoc.latitude - 35.0];
        double radLat = wgsLoc.latitude / 180.0 * pi;
        double magic = sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = sqrt(magic);
        adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
        adjustLoc.latitude = wgsLoc.latitude + adjustLat;
        adjustLoc.longitude = wgsLoc.longitude + adjustLon;
    }
    return adjustLoc;
}

//判断是不是在中国
+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location
{
    if (location.longitude < 72.004 || location.longitude > 137.8347 || location.latitude < 0.8293 || location.latitude > 55.8271)
        return YES;
    return NO;
}

+(double)transformLatWithX:(double)x withY:(double)y
{
    double lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));
    lat += (20.0 * sin(6.0 * x * pi) + 20.0 *sin(2.0 * x * pi)) * 2.0 / 3.0;
    lat += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
    lat += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
    return lat;
}

+(double)transformLonWithX:(double)x withY:(double)y
{
    double lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
    lon += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
    lon += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
    lon += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
    return lon;
}

@end

最后我们通过判断isLocationOutOfChina 然后调用transformLatWithX方法就能获取转换后的 CLLocationCoordinate2D结构类型

//CLLocationManager委托方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //得到newLocation
    CLLocation *loc = [locations objectAtIndex:0];
    //判断是不是属于国内范围
    if (![WGS84TOGCJ02 isLocationOutOfChina:[loc coordinate]]) {
        //转换后的coord
        CLLocationCoordinate2D coord = [WGS84TOGCJ02 transformFromWGSToGCJ:[loc coordinate]];
    }






ios百度地图定位反地理编码 效果展示图中红色框中的地址是根据手机的位置定位出来的,定位使用的是百度地图SDK的第三方。 引入头文件等 在要用到定位的控制器的.h文件中设置相关协议以及属性 @interface WFCityChooseController : UIViewController< BMKGeneralDelegate, BMKMapViewDelegate, BMKLocationServiceDelegate, 阅读详情

相关推荐

避开定位踩坑指南:Android三种坐标系转换实战(WGS84/GCJ02/BD09)

本文深入解析Android定位开发中WGS84、GCJ02、BD09三种坐标系差异导致的定位偏差问题,并提供实战解决方案。通过详解坐标系转换算法、LocationManager使用及Haversine距离计算,帮助开发者构建精准的定位打卡功能,有效避免因坐标不统一引发的业务逻辑错误。

wdx01234567的博客 589

GIS小知识-由对GCJ-02的疑问引出的坐标系相关概念

在介绍GCJ-02之前,我们先了解一下常见关于坐标系的术语。

孙霸天的专栏 6098

GPS定位坐标纠偏

做过地图相关开发的同学肯定会遇到这样一个问题:同样的经纬度坐标,在不同的地图上位置不一样。那是因为大家用的不是同一个坐标系。 不同的坐标系之间可能有几十到几百米的偏移,所以在开发基于地图的产品,或者做地理数据可视化时,我们需要修正不同坐标系之间的偏差。 WGS-84 世界大地测量系统 WGS-84(World Geodetic System, WGS)是使用最广泛的坐标系,也是世界通用的坐标系,绝...

6005

Hbuilder uni.getLocation gcj02获取失败问题

Hbuilder uni.getLocation默认情况下如果获得wgs84坐标体系,只要配置maps选项就可以。本文讨论如何获取gcj02坐标体系坐标。

yarlungsoft_ed的博客 4665

transformer优化(一)-UNeXt 学习笔记

​它在早期阶段使用卷积,在潜在空间阶段使用 MLP。通过一个标记化的 MLP 块来标记和投影卷积特征,并使用 MLP 对表示进行建模。 ​

PLANTTHESON的博客 2033

软件工程大作业——图书管理系统/图书个性化推荐与实现系统

软件工程期末大作业,图书管理系统,包含ER图、程序流程图、属性图、结构图

2401_82857325的博客 3646

iOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法:接口转换法,代码转换法

IOS7 WGS-84转GCJ-02(火星坐标) CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位: [objc] view plaincopyprint? //创建CLLocationManager对象      CLLocationManager *locat

Welcome to tikeyc's column 1536

2023-ICCV-隐式神经网络实现低光照图像增强(NeRCo)论文解读+代码解析

NeRCo()提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。

weixin_45595504的博客 3184

定位坐标偏差

关于地图相当重要的一篇文章:http://www.cnblogs.com/kenshincui/p/4125570.html 原文地址:http://blog.youkuaiyun.com/swingpyzf/article/details/16972351 CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位:  

qq_25601465的博客 1325

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 326

QPrintPreviewDialog 打印预览使用实例

qt打印机预览实用demo

啊渊的专栏 3677

经纬度坐标系转换实战:WGS84、GCJ-02与BD-09精准适配指南

经纬度坐标系是位置服务的底层基础设施,但WGS84、GCJ-02、BD-09三者并非简单数值映射,而是涉及椭球模型、非线性加密与地理信息安全的工程体系。其核心原理在于不同参考框架对地球形状的拟合差异,导致同一物理点在各坐标系下存在动态偏移(北京可达200–700米)。技术价值体现在保障轨迹精度、围栏触发可靠性和多地图平台兼容性;典型应用场景包括LBS小程序定位、物流调度系统、POI数据治理及高德/百度地图API集成。本文聚焦国产坐标系转换的实操瓶颈,深度融合GCJ-02加偏机制与BD-09二次偏移特性,提供

weixin_33970449的博客 262

【SpringBoot笔记44】SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置)

在SpringBoot应用开发中,一般情况下,都是只会配置一个数据源信息,之后整个工程都是对当前数据源进行增删改查的操作。但是,在实际开发里面,也有可能会遇到多数据源的情况,例如:当前工程中除了需要访问自己应用的数据库,还需要直接连接第三方系统的数据库进行业务处理,这种情况下,就需要进行多数据源的配置。SpringBoot考虑到了这一点,所以它是支持多数据源的配置的,下面介绍一下如何配置多数据源。

✅ Java 开发工程师 1116

JZLocationConverter终极指南:轻松实现iOS坐标转换的完整教程

如果您正在开发iOS地图应用或位置服务应用,那么您一定遇到过坐标系统转换的挑战。不同的地图服务使用不同的坐标系,这给开发者带来了不少困扰。JZLocationConverter就是为解决这一问题而生的终极坐标转换工具,它能够帮助您轻松实现WGS-84、GCJ-02(火星坐标)和BD-09(百度坐标)之间的无缝转换。 ## 📱 什么是JZLocationConverter? JZLocatio

gitblog_00651的博客 373

MIMIC数据库简介

一 、MIMIC简介 MIMIC(Medical Information Mart for Intensive Care),是一个大型的公开数据库。该数据库记录了2001年至2019年期间贝斯以色列女狄肯斯医疗中心重症监护病房患者的相关数据,拥有4万多名患者的医疗健康数据和记录。 MIMIC数据库记录了人口统计学信息,如病人的性别、身高、宗教等情况。记录了实验室检验信息,如血常规,肝功能,肾功能等实验室检测数据。记录了患者的用药信息,如高血压患者服用了治疗高血压类药物等。记录了护理人员以及患者的护理级别等。

越努力 越幸运 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: IOS 地图定位,标记位置,获取经纬度,MKMapView的使用
下一篇: IOS 点击空白处隐藏键盘的几种方法
SwingPyzf
博客等级 码龄15年 403粉丝 40原创
评论 29
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值