`
zmfbird
  • 浏览: 49404 次
  • 性别: Icon_minigender_2
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

google map 折线编码c++实现

阅读更多

查了些资料,找到一种方法,可以解决坐标点很多的问题。google maps的GPolygon类提供一种工厂方法fromEncoded(),这种方法可以加载由大量坐标点变换成的折线编码。google给出了编码折线的算法格式,如下:

编码折线存储任意给定的一组点的两种类型的编码信息:这些点的经纬度,以及用于显示这些点的最大缩放级别。级别使用无符号值编码,而点坐标需要使用有符号的值,所以这两种情况的编码过程稍有不同。下面说明了此过程。如果仅有几个静态的点,您还可以使用交互的折线编码工具。

编码经纬度
编码过程将二进制值转换为一系列使用常见的 base64 编码的 ASCII 字符代码:为了确保正确显示这些字符,将编码值转换为 ASCII 之前编码值会加上 63(ASCII 字符“?”)。这种算法还通过检查每个字节组中的最低有效位,来确定给定点中是否还有额外的字符代码;如果该位设置为 1,则该点未完全形成,可能后面有其他数据。

此外,为了节省空间,点仅包含与上个点的偏移值(除了第一个点外)。所有点都使用 Base64 编码为有符号整数,因为经度和纬度是有符号值。折线中的编码格式需要表示两个坐标,分别以合理精度表示经度和纬度。如果最大经度是 +/- 180 度,精度为 5 个小数位(180.00000 到 -180.00000),则可能会需要 32 位有符号二进制整数值。

请注意在字符字面值 (string literal) 中,反斜杠被解释为转义符。 此工具的任何输出都会将反斜杠字符转换为字符串字面值中的双反斜杠。

下面说明了编码此类有符号值的步骤。

取初始有符号值:
-179.9832104 
将其取十进制值乘以 1e5,并取整:
-17998321 
将十进制值转换为二进制值。请注意负值必须求反,并以值填充字节边界:
00000001 00010010 10100001 11110001
11111110 11101101 10100001 00001110
11111110 11101101 01011110 00001111 
变换二进制值:
11111110 11101101 01011110 00001111 0 
如果原来的十进制值是负数,则对以下编码求反:
00000001 00010010 10100001 11110000 1 
将该二进制值分为 5 位一组的块(从右手边开始):
00001 00010 01010 10000 11111 00001 
将这些 5 位一组的块倒序放置:
00001 11111 10000 01010 00010 00001 
如果后面还有一个位块,则将每个值与 0x20 进行或操作 (OR):
100001 111111 110000 101010 100010 000001 
将每个值转换为十进制值:
33 63 48 42 34 1 
将每个值加上 63:
96 126 111 105 97 64 
将每个值转换为其 ASCII 对应值:
`~oia@ 

 算法里的有些步骤呢不是很明白,不过根据算法写出了c++代码。

#include "stdafx.h"
#include "math.h"
#include "string"
#include "iostream"
//四舍五入取整函数
int interger(double x)
{
	int y;
	if(x<0)
		y=int(x-0.5);
	else if(x>=0)
		y=int(x+0.5);
	return y;
}
int _tmain(int argc, _TCHAR* argv[])
{
	double col=-179.9832104;//设置成double型,双精度浮点型,10位有效数字,float是单精度浮点型,只有6位有效数字
	int num;
	num=interger(col*100000);		
	int sgn_num;
	//变换二进制值,左移,低位补0
	sgn_num=num<<1;

	if(num<0)
	{
		sgn_num=~(sgn_num);//对负数求反
	}

	string result="";
	 //将该二进制值分为5位一组的块
 
   while(sgn_num>=0x20)
//0x20是ascII码中可见字符的开始
   {
	   int x;
                  //与0x1f与,保证只取后5位二进制
	   x=sgn_num&0x1f;	  
	   //进行异或加上63
	   x=x|0x20;
                   x=x+63;
                  //char(x)可以得到对应的ASCII符号,加入result
	   result+=char(x);
                  //二进制右移5位
	   sgn_num>>=5;	   
   }  
   result+=char(sgn_num+63);//最后一组值
   cout<<result;
		return 0;
}

 

输出值为:·~oia@

分享到:
评论

相关推荐

    Map (c++实现的简易map)

    在C++标准库中,`Map`被实现为`std::map`,但在这个场景中,我们讨论的是一个用户自定义的简易`Map`实现,名为"MyMap",这是在Visual Studio 2013环境下编写的。 自定义`Map`的主要目的是为了学习和理解数据结构的...

    香农编码之C++实现

    这里我们将深入探讨香农编码的原理及其C++实现中的可能问题。 首先,理解香农编码的基本步骤: 1. **统计字符频率**:对输入的文本或数据流进行分析,统计每个字符出现的次数,得到字符频率分布。 2. **排序字符**...

    霍夫曼编码C++实现

    在C++中实现霍夫曼编码,需要理解以下几个关键知识点: 1. 频率统计:首先,我们需要对输入的文本进行字符频率统计。C++中可以使用`std::map`或`std::unordered_map`来存储每个字符及其出现次数。 ```cpp std::map...

    Huffman编码C++实现

    在C++中实现Huffman编码需要理解以下几个关键概念: 1. **字符频率统计**:首先,我们需要统计输入文本中各个字符出现的频率。这通常通过遍历整个文本并维护一个哈希表(如`std::unordered_map`)来完成,哈希表的...

    googleMap折线示例

    本文将通过一个具体的示例来详细介绍如何使用Google Maps API实现折线的绘制,并对代码进行深入剖析。 #### 二、示例概述 本示例主要实现了以下功能: 1. 在地图上动态创建标记(Marker),用户可以通过双击地图...

    C++调用GOOGLEMAP代码

    标题 "C++调用GOOGLEMAP代码" 涉及到的是在C++程序中集成和使用Google Maps API的技术。Google Maps API是一个强大的工具,允许开发者在他们的应用程序中嵌入地图、路线规划、地理编码(地址转经纬度)等功能。在C++...

    c_code_哈夫曼编码的C++实现_

    在C++中实现哈夫曼编码涉及几个关键步骤,包括构建哈夫曼树、生成哈夫曼编码以及编码和解码过程。 首先,我们需要创建一个`HuffmanNode`结构体或类,表示哈夫曼树中的节点。这个节点通常包含两个子节点(左子节点和...

    googlemap折线标记路径

    本教程将聚焦于如何在Android应用中使用Google Maps API来绘制折线标记路径。 首先,你需要在你的Android项目中添加Google Play Services库,这是使用Google Maps API的前提。在`build.gradle`文件中,添加以下依赖...

    哈弗曼编码译码(C++实现,源码+可执行程序+实验报告)

    哈弗曼编码是一种高效的数据压缩方法,由美国学者大卫...通过以上步骤,我们可以理解哈弗曼编码的核心原理和C++实现的细节。在实际应用中,哈弗曼编码常被用于文本压缩、图像压缩等领域,以提高数据存储和传输的效率。

    c++中map的基本用法和嵌套用法实例分析

    `map`的数据结构通常实现为红黑树,提供了O(log n)的时间复杂度进行插入、查找和删除操作。下面我们将详细探讨`map`的基本用法和嵌套用法。 ### 一、map基本用法 1. **头文件** 使用`&lt;map&gt;`头文件来包含`map`...

    Huffman编码的C++实现

    在C++中实现Huffman编码涉及到了数据结构、算法以及文件操作等多个知识点。 首先,我们要理解Huffman编码的基本原理。它通过以下步骤工作: 1. **统计字符频率**:对输入文本中的每个字符出现的次数进行统计,形成...

    C++ Google地图API源码

    用c++实现利用Google地图API实现的定位查找,可以和IP数据库一起做定位查找程序,很好用。也可以用来调用任意网页里的Javascript函数。 --忘了地图文件了,不好意思,是用GoogleAPI写的Map.html文件。单独上传,供...

    C++实现哈夫曼树及哈夫曼编码.rar

    C++实现哈夫曼树和哈夫曼编码,通常包括以下步骤: 1. 定义节点类(HuffmanNode),包含字符、频率以及左右子节点等属性。 2. 创建优先队列,用于存储节点并按权值排序。 3. 实现哈夫曼树的构建函数,利用优先队列...

    map.h C++ 头文件下载

    map.h C++ 头文件下载 C++17 标准库文件 unordered_map map

    二进制哈弗曼编码C++程序

    在C++中实现这些功能,可以使用STL中的`priority_queue`作为最小堆,`map`或`unordered_map`存储字符频率和哈弗曼编码。程序应该包含读取输入数据、构建哈弗曼树、生成编码、计算相关参数和验证克拉夫特不等式等功能...

    map_map_增删查改_STL_C++_

    `map`内部实现为红黑树,这保证了插入、删除和查找操作的时间复杂度为O(log n)。在C++中,`map`的定义位于`&lt;map&gt;`头文件中。 ### 基本概念 1. 键(key):每个元素都有一个键,用于唯一标识该元素。 2. 值(value...

    信息论Shannon 编码算法C++

    以上就是Shannon编码算法的基本原理和C++实现方式。理解并掌握这一算法有助于提升在信息处理、数据压缩和通信领域的能力。在实际应用中,Shannon编码常常与其他数据压缩技术结合,如LZ77、LZ78等,以达到更好的压缩...

    哈夫曼编码的原理及C++实现

    ### 哈夫曼编码的原理及C++实现 #### 一、编码原理 哈夫曼编码(Huffman Coding)是一种高效的数据压缩方法,通过基于数据中各字符出现的频率来构建一种特殊的二叉树——哈夫曼树,进而根据这棵树为每个字符分配一...

    哈弗曼编码C++程序

    4. **C++实现细节**: - `main.cpp`是程序的主入口,负责调用哈弗曼树的构建和编码/解码功能。 - `huffman.h`可能包含了哈弗曼树的定义以及相关的函数声明。在这个头文件中,你可以看到关于`HuffmanNode`类的定义...

    GoogleMap谷歌地图demo

    本文将深入探讨GoogleMap谷歌地图API的使用,以及如何通过它实现一个全面的地图工具。 首先,让我们从标题"GoogleMap谷歌地图demo"开始。这个标题暗示我们将会讨论一个基于GoogleMap API开发的示例应用。一个demo...

Global site tag (gtag.js) - Google Analytics