经纬度坐标点与像素坐标点之间的转换

                              经纬度到屏幕像素点的换算方法

相关问题点:1)地球是不规则的球体,两极扁,赤道鼓。不能简单地作为圆球体来计算。2)每纬度在地理位置上的距离是一致的(约111公里),但是每经度之间的距离是不同的(越往两极,东西方向上的距离就越小),不能直接转换为直角坐标系。3)给出的经纬度坐标发生变化后,需要动态的缩放所显示地图的大小。
开发环境:.NET 2003 (MFC)
解决方法:
1. 定出动态参照原点的经纬度。
举个例子,如果设定窗体的显示方式是默认的MM_TEXT(即左上点为原点,X轴向右Y轴向下为正),就应找到其中纬度的最大值,经度的最小值,以定出最西最北的参照点,将其作为屏幕显示时的原点。例:
找到的值为N36.5563 E139.0155。这样做,就能解决上面的第三个问题,并为下面实际点的描画做准备。
2. 将参照点经纬度转化为弧度,并得到之后计算横轴纵轴上距离的中间量。
1)m_refLaRadian = refLatitudeM_PI/180;
m_refLoRadian = refLongitude
M_PI/180;
以上面的点为例:refLatitude = 36.5563 refLongitude = 139.0155
36.55633.14/180 = 0.6380rad 139.01553.14/180 = 2.4263rad
2)m_refY = POLAR_RADII + (EQUATOR_RADII - POLAR_RADII)(90 - refLatitude)/90;
m_refX = m_refY
cos(m_refLaRadian);
#define POLAR_RADII 6356752 //北極[南極]の半径
#define EQUATOR_RADII 6378137 //赤道の半径
例: 纵轴参照距离: m_refY = 6356752 + (6378137 - 6356752 )*(90 - 36.5563)/90 = 6369450.8090185188
横轴参照距离: m_refX = 6369450.8090185188 *COS( 0.6380) = 5116399.2044743169
3. 计算已知点到这个参照点(原点)的X轴Y轴地理距离
1) 将已知点的经纬度转换成弧度
laRadian = (latitude.Degree + latitude.Mintue/60 + latitude.Second/3600) * M_PI/180
loRadian = (longitude.Deree + longitude.Mintue/60 + longitude.Second/3600) * M_PI/180;
以大宫为例:N35.54.10.8 E139.37.37
laRadian = (35 + 54/60 + 10.8/3600) * 3.14 /180 = 0.6266rad
loRadian = (139 + 37/60 +37/3600) * 3.14 /180 = 2.4369rad
2) 计算地理位置上离开参照点的X轴Y轴距离
double dx = (loRadian - m_refLoRadian)*m_refX;
double dy = -(laRadian - m_refLaRadian)*m_refY;
以大宫为例:
横轴方向上地理距离: dx = ( 2.4369rad - 2.4263rad ) * 5116399.2045 = 54598.2928米
纵轴方向上地理距离: dy = -(0.6266rad - 0.6380rad) * 6369450.8090 = 72629.6869米
4. 换算成像素点,以供屏幕显示.
point.x = dx/DIVISOR;
point.y = dy/DIVISOR;
// DIVISOR为地理位置距离和像素点距离换算的系数,大小可根据情况自己定夺.
以大宫为例:
横轴方向上像素点位置: point.x = 54598.2928米/27 = 2022
纵轴方向上像素点位置: point.y = 72629.6869米/27 = 2689
经过以上几步,即可得到各已知经纬度的位置点到一个动态参照点的X轴Y轴上相距的屏幕像素点数量。给之后的描画提供方便。
网上有想换的经纬度坐标与像素坐标之间的转换函数可以作为参考。

你可能感兴趣的:(Map)