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
在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
相关文章推荐
- Google Maps API 编码折线算法实现
- Google Map 编码折线算法Java实现
- JavaScript 组件之旅(二)编码实现和算法
- 用opencv实现的PCA算法,非API调用
- C# 实现线段的编码裁剪算法(vs2010)
- 多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(4)编码过程——排序扫描
- 使用opencl实现编码算法中运动搜索模块速度对比
- 普林斯顿公开课 算法4-1:优先级队列API和基本实现
- arcgis api for js共享干货系列之一自写算法实现地图量算工具
- 快速分段3次样条曲线拟合和折线重采样算法实现
- base64编码算法与c语言实现
- 左右编码的树形组织结构在mfc中显示的宽度实现算法
- 自己编码使用去色、曲线、色阶算法实现照片怀旧特效。
- C# 实现线段的编码裁剪算法(vs2010)
- 多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(5)编码过程——精细扫描
- Huffman 编码算法之 Java 实现
- 计算机图形学(3.2)——编码裁剪算法实现
- iPhone开发笔记(13)调用GoogleMap API实现地理逆向编码
- 三层神经网络自编码算法推导和MATLAB实现
- H.264编码算法的实现