地图工程坐标定位允许偏差有偏差怎么办

trackbacks-0
用手机获取GPS坐标 显示在手机地图偏差大约在100-200米左右,我把坐标放在
搜索坐标定位则相当精确。
可能是.....为了安全吧故意加的偏差
不过可以计算偏差使位置精确
public class EvilTransform {
static double
pi = 3.79324;
static double a = ;
static double ee = 0.;
public static double mgL
public static double mgL
public static void transform( double wgLat, double wgLon)
if (outOfChina(wgLat, wgLon))
mgLat = wgL
mgLon = wgL
double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 *
double magic = Math.sin(radLat);
magic = 1 - ee * magic *
double sqrtMagic = Math. sqrt(magic);
dLat = (dLat * 180.0) / (( a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / ( a / sqrtMagic * Math.cos(radLat) * pi);
mgLat = wgLat + dL
mgLon = wgLon + dL
static Boolean outOfChina( double lat, double lon)
if (lon & 72.004 || lon & 137.8347)
if (lat & 0.8293 || lat & 55.8271)
static double transformLat( double x, double y)
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math. sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math. sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math. sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
static double transformLon( double x, double y)
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math. sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math. sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math. sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
阅读(...) 评论()iOS地图定位偏差问题解决(不同坐标系转化) - 简书
下载简书移动应用
写了2709字,被1人关注,获得了0个喜欢
iOS地图定位偏差问题解决(不同坐标系转化)
国际共识:WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置;中国:GCJ-02的坐标系统。在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,称之为火星坐标;百度:BD-09的坐标系统,百度坐标是在国测局制定的GCJ-02,对地理位置进行首次加密的基础上,进行了BD-09二次加密措施,更加保护了个人隐私。下面直接上代码,直接创建一个坐标转化类,用的时候将定位到的CLLocationCoordinate2D,直接通过所定义的类转化一下,再用的时候,地图定位偏差较大的问题即可解决。创建一个坐标转化类.***件#import《Foundation/Foundation.h》#import《CoreLocation/CoreLocation.h》@interface KNLocationConverter : NSObject/***
判断是否在中国*/+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)/***
将WGS-84转为GCJ-02(火星坐标):*/+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsL/***
将GCJ-02(火星坐标)转为百度坐标:*/+(CLLocationCoordinate2D)transformFromGCJToBaidu:(CLLocationCoordinate2D)p;/***
将百度坐标转为GCJ-02(火星坐标):*/+(CLLocationCoordinate2D)transformFromBaiduToGCJ:(CLLocationCoordinate2D)p;/***
将GCJ-02(火星坐标)转为WGS-84:*/+(CLLocationCoordinate2D)transformFromGCJToWGS:(CLLocationCoordinate2D)p;@end.m文件#import "TQLocationConverter.h"#import《math.h》static const double a = ;static const double ee = 0.;static const double pi = 3.79324;static const double xPi = M_PI
* 3000.0 / 180.0;@implementation KNLocationConverter+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc{CLLocationCoordinate2D adjustLif([self isLocationOutOfChina:wgsLoc]){adjustLoc = wgsL}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];long double radLat = wgsLoc.latitude / 180.0 *long double magic = sin(radLat);magic = 1 - ee * magic *long 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 + adjustLadjustLoc.longitude = wgsLoc.longitude + adjustL}return adjustL}+ (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(fabs(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;}+ (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(fabs(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;}+(CLLocationCoordinate2D)transformFromGCJToBaidu:(CLLocationCoordinate2D)p{long double z = sqrt(p.longitude * p.longitude + p.latitude * p.latitude) + 0.00002 * sqrt(p.latitude * pi);long double theta = atan2(p.latitude, p.longitude) + 0.000003 * cos(p.longitude * pi);CLLocationCoordinate2D geoPgeoPoint.latitude
= (z * sin(theta) + 0.006);geoPoint.longitude = (z * cos(theta) + 0.0065);return geoP}+(CLLocationCoordinate2D)transformFromBaiduToGCJ:(CLLocationCoordinate2D)p{double x = p.longitude - 0.0065, y = p.latitude - 0.006;double z = sqrt(x * x + y * y) - 0.00002 * sin(y * xPi);double theta = atan2(y, x) - 0.000003 * cos(x * xPi);CLLocationCoordinate2D geoPgeoPoint.latitude
= z * sin(theta);geoPoint.longitude = z * cos(theta);return geoP}+(CLLocationCoordinate2D)transformFromGCJToWGS:(CLLocationCoordinate2D)p{double threshold = 0.00001;// The boundarydouble minLat = p.latitude - 0.5;double maxLat = p.latitude + 0.5;double minLng = p.longitude - 0.5;double maxLng = p.longitude + 0.5;double delta = 1;int maxIteration = 30;// Binary searchwhile(true){CLLocationCoordinate2D leftBottom
= [[self class] transformFromWGSToGCJ:(CLLocationCoordinate2D){.latitude = minLat,.longitude = minLng}];CLLocationCoordinate2D rightBottom = [[self class] transformFromWGSToGCJ:(CLLocationCoordinate2D){.latitude = minLat,.longitude = maxLng}];CLLocationCoordinate2D leftUp
= [[self class] transformFromWGSToGCJ:(CLLocationCoordinate2D){.latitude = maxLat,.longitude = minLng}];CLLocationCoordinate2D midPoint
= [[self class] transformFromWGSToGCJ:(CLLocationCoordinate2D){.latitude = ((minLat + maxLat) / 2),.longitude = ((minLng + maxLng) / 2)}];delta = fabs(midPoint.latitude - p.latitude) + fabs(midPoint.longitude - p.longitude);if(maxIteration-- &= 0 || delta &= threshold){return (CLLocationCoordinate2D){.latitude = ((minLat + maxLat) / 2),.longitude = ((minLng + maxLng) / 2)};}if(isContains(p, leftBottom, midPoint)){maxLat = (minLat + maxLat) / 2;maxLng = (minLng + maxLng) / 2;}else if(isContains(p, rightBottom, midPoint)){maxLat = (minLat + maxLat) / 2;minLng = (minLng + maxLng) / 2;}else if(isContains(p, leftUp, midPoint)){minLat = (minLat + maxLat) / 2;maxLng = (minLng + maxLng) / 2;}else{minLat = (minLat + maxLat) / 2;minLng = (minLng + maxLng) / 2;}}}static bool isContains(CLLocationCoordinate2D point, CLLocationCoordinate2D p1, CLLocationCoordinate2D p2){return (point.latitude &= MIN(p1.latitude, p2.latitude) && point.latitude &= MAX(p1.latitude, p2.latitude)) && (point.longitude &= MIN(p1.longitude,p2.longitude) && point.longitude &= MAX(p1.longitude, p2.longitude));}/***
判断是不是在中国*/+(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;}@end用的时候,直接把国际坐标转换成火星坐标,就可以直接显示定位信息了
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:坐标点有了,弹出框也有了,就差最后地图显示了!!
[问题点数:80分,结帖人abz878]
坐标点有了,弹出框也有了,就差最后地图显示了!!
[问题点数:80分,结帖人abz878]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年2月 总版技术专家分月排行榜第二2014年2月 总版技术专家分月排行榜第二2013年4月 总版技术专家分月排行榜第二
2016年8月优秀小版主2016年7月优秀小版主优秀小版主2015年7月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2014年11月论坛优秀版主
2016年2月 总版技术专家分月排行榜第二2014年2月 总版技术专家分月排行榜第二2013年4月 总版技术专家分月排行榜第二
2016年8月优秀小版主2016年7月优秀小版主优秀小版主2015年7月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2014年11月论坛优秀版主
本帖子已过去太久远了,不再提供回复功能。iOS8.1地图百度地图坐标转高德地图坐标出现偏差,求大神~~~
[问题点数:40分]
iOS8.1地图百度地图坐标转高德地图坐标出现偏差,求大神~~~
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

参考资料

 

随机推荐