最近工作遇到一个相关的问题, 随便小研究一下.情况如下
在一张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;
}