google地图中, 纬度坐标在方形地图上定位问题的一点研究

最近工作遇到一个相关的问题, 随便小研究一下.情况如下

在一张360*360 的世界地图上, 点击任意点, 要算了这点的经纬度来, 咋一看一点也不也不难, 找出点击位置距离图左下解的距离, 再分别加上相应的经纬度偏移, 纬度再除以相应比例,不就完了么. 然后按这个想法去做. 结果是:经度没问题, 纬度偏移特别大. 于是我上googleMap特意在日期变更线附近标了下经纬度(在地图实验室里,有个选项,设置一下就可以标了),发现纬度分布是竟然不均匀的,如下图:

那么这个问题的核心,就可以转移到如何找出纬度与其在地图上的坐标,这样一个非线性的关系。

网上找了些资料,在一位同事的帮助下写了如下的两个函数。

其中 LBS_LatitudeGridNum 为 180 是方形地图高度的一半

#pragma mark 纬度坐标转换

//纬度转坐标

-(int) convertLatitude2GridY:(float) p_fLatitude{

int l_iGridY = 0;

double l_fSinY = sin(p_fLatitude * M_PI / 180);

double l_fY = log((1 + l_fSinY) / (1 - l_fSinY));

double l_fBiLi =  l_fY / (2 * M_PI);

 

l_iGridY = LBS_LatitudeGridNum*(1+l_fBiLi);

return l_iGridY;

 

/*

float l_fTotalLatitude = 85;

float l_fRadius = LBS_Height/(2*M_PI);

//角度(弧度制)

float l_fAngle;

int l_iGridY;

//北半球

if (p_fLatitude >= 0) {

l_fAngle = asin(p_fLatitude/l_fTotalLatitude);

l_iGridY = 2*(LBS_EndLatitude + l_fAngle*l_fRadius);

}else {

p_fLatitude = -1 *p_fLatitude;

l_fAngle = asin(p_fLatitude/l_fTotalLatitude);

l_iGridY = 2*(LBS_EndLatitude - l_fAngle*l_fRadius);

}

return l_iGridY;

*/

}

//坐标转纬度

-(float) convertGridY2Latitude:(int) p_iGridY{

float l_fLatitude;

 

double l_fY = 2 * M_PI *  (p_iGridY-LBS_LatitudeGridNum) / (LBS_LatitudeGridNum);

double l_fPow = pow(M_E, l_fY);

double l_fSinY = (l_fPow - 1) / (l_fPow + 1);

l_fLatitude = (float)(asin(l_fSinY) * 180 / M_PI);

 

return l_fLatitude;

 

/*

 

float l_fTotalLatitude = 85;

 

float l_fRadius = LBS_Height/(2*M_PI);

//弧度

float l_fAngle;

float l_fLatitude;

 

//北半球

if (p_iGridY >= 2*LBS_EndLatitude) {

l_fAngle = ((p_iGridY - 2*LBS_EndLatitude)/2)/l_fRadius;

CCLOG(@"l_fAngle:%f", l_fAngle);

l_fLatitude = sin(l_fAngle)*l_fTotalLatitude;

}

//南半球

else {

p_iGridY = 2*LBS_EndLatitude - p_iGridY;

l_fAngle = ((p_iGridY)/2)/l_fRadius;

l_fLatitude = -1 * sin(l_fAngle)*l_fTotalLatitude;

}

*/

 

 

return l_fLatitude;

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值