您的位置:首页 > 编程语言 > Go语言

Google Maps API 编码折线算法实现

2009-03-17 20:12 411 查看
Google Maps API 编码折线算法实现

在Google Maps API二次开发中,我们碰到了编码折线算法问题,通过GPolyline.fromEncoded调用可以有效地提高呈现速度.基于网上现在没有相关的实现,下面我给出编码折线中经纬度和级别算法,以供读者参考. 它用MFC和标准c实现,其它环境请读者自行修改相关代码即可.

一. 二进制转十进制(8位)

inline int BintoDec(char* b)
{
int i,j,v;
v = 0;
int len = strlen(b);
if (len < 1) return v;
i = 0;v = 0; j = 0;
for (i = len - 1;i >=0 ;i--)
{
if (b[i] == '1')
v += (int)pow(2,j);
j++;
}
return v;
}

二. 相关算法

1. 经纬度算法

CString polyline_lonlat_encode(double num)
{
int m,i;
CString s;

int d[8];

char m_buf[8][6];
int N = 32;
char buf[256]={0};
bool is_negative = false;
double t = num;

//微调数据,防止数据失真
t += ((t<1e-8)?-1:1)*1e-8;
t *= 1e5;
m = int(t);
if (m < 0) is_negative = true;

//十进制转二进制
for(i = 0;i<N;i++)
{
if ((1<<(N - i-1)) & m)
buf[i]='1';
else
buf[i]='0';
}

//求反码,并加上后缀1位(负数为1,正数为0)
if (is_negative)
{
for(i = 0;i<N;i++)
{
if (buf[i]=='0')
buf[i]='1';
else
buf[i]='0';

}
}
s = buf;
s += is_negative?"1":"0";
//去除前端的0,从1开始
i = s.Find("1",0);
if (i != -1)
s = s.Right(s.GetLength() - i);

else

s = "0";

//计算分组(5位一组)

m = s.GetLength()/5;
if (m*5 <s.GetLength())
m += 1;
//对分组数据先xor 0x20(最后一组不用),然后加63
for(i=0;i<m;i++)
{
sprintf(m_buf[i],"%s",s.Right(5));
if (i == m -1)
d[i] = BintoDec(m_buf[i])+63;
else
d[i] = BintoDec(m_buf[i])+32+63;

s = s.Left(s.GetLength()-5);
}

//转换成ascii
s ="";
for(i=0;i<m;i++)
{
s += toascii(d[i]);
}
return s;
}

2. 编码级别算法

CString polyline_level_encode(int level)

{
int m,i;
CString s;

int d[8];

char m_buf[8][6];
int N = 32;
char buf[256]={0};

m = level;

//十进制转二进制
for(i = 0;i<N;i++)
{
if ((1<<(N - i-1)) & m)
buf[i]='1';
else
buf[i]='0';
}

//求反码,并加上后缀1位(负数为1,正数为0)
if (is_negative)
{
for(i = 0;i<N;i++)
{
if (buf[i]=='0')
buf[i]='1';
else
buf[i]='0';

}
}
s = buf;
//去除前端的0,从1开始
i = s.Find("1",0);
if (i != -1)
s = s.Right(s.GetLength() - i);

else

s = "0";

//计算分组(5位一组)

m = s.GetLength()/5;
if (m*5 <s.GetLength())
m += 1;
//对分组数据先xor 0x20(最后一组不用),然后加63
for(i=0;i<m;i++)
{
sprintf(m_buf[i],"%s",s.Right(5));
if (i == m -1)
d[i] = BintoDec(m_buf[i])+63;
else
d[i] = BintoDec(m_buf[i])+32+63;

s = s.Left(s.GetLength()-5);
}

//转换成ascii
s ="";
for(i=0;i<m;i++)
{
s += toascii(d[i]);
}
return s;
}

三. 调用说明

AfxMessageBox(" Level: "+polyline_level_encode(16));
AfxMessageBox("Points (38.5 -120.2),(40.7, -120.95), (43.252, -126.453): "+

polyline_lonlat_encode(38.5)+polyline_lonlat_encode(-120.2) +

polyline_lonlat_encode(40.7-38.5)+

polyline_lonlat_encode(-120.95+120.2)+

polyline_lonlat_encode(43.252-40.7)+

polyline_lonlat_encode(-126.453+120.95));

四. 相关说明

1. 编码折线算法格式见http://code.google.com/intl/zh-CN/apis/maps/documentation/polylinealgorithm.html,可以核对调用说明中的呈现结果

2. sprintf,toascii,pow等是标准的c函数

最后,希望各位多多捧场, 3Q! 我的Email:wxy3064one@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: