专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

GoogleMap离线开发总结

发布时间:2011-06-29 18:23:57 文章来源:www.iduyao.cn 采编人员:星星草
GoogleMap离线开发小结

好久没写东西了,最近单位有个项目要用到地图。先说说需求:

(1) 雷达位于地图上的某个点,目标在雷达探测范围内发行时可以显示目标的运动轨迹

(2)整个系统在不连网的环境下运行。


刚开始接到这个需求,感觉蛮简单的,现在的地图应用这么成熟,应该两三于就搞定了。事实上,估计错了。


先来说说我那时的思路吧,大休上分两个阶段。

(一)MapX阶段: 既然要在内网运行,首先在线的地图如百度,Google,51map, 等 就排除了,我直接 去查的关于MapX的资料。

          方法挺简单,就是在gst地图上添加一个临时图层,在临时图层上放置雷达图标,并画出目标轨迹,增加自绘图层,绘出比例尺。

         缺点: 没有当时项目中要求的那个城市地图数据, 虽然可以自己做地图,但时间成本高,又不舍得花钱买。最后从网上下了一个全国地图,3G多,凑合能用,但定位不准,偏差有点多。


(二) Google Map阶段: 由于采用MAPX,效果实在不佳,打算重新看下Google 百度等在线地图。对比了几家如Google, 百度, 51map ,  mapbar等 ,最后决定用Google地图。至于原因,主要是由于个人情怀吧。

国内可以访问 Google 地图,但是不能访问 Google map api, 这真是天朝的一大特色,都赶得上朝鲜了,其实还有更奇葩的。只好买了个VPN帐户,才顺利访问GOOGLE MAP API。    Google 地图的开发包括三个方面,如图

如果在线开发的话,要先申请个Google 开发的一个Key, 本地调试时用的域名在申请时一定要填上,否则用其它域名无法访问。

要想在内网使用,必须把地图部署在本地上。先来看地图数据,Google 地图数据其实是 Google Tiles ,俗称瓷片。网上找的瓷片下载程序,要么收费,要么有水印,还不全。没办法,在研究 了瓷片的相关知识后自己写了一个瓷片下载程序。主要的一个代码如下。



 const string urlpath = "http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x={0}&y={1}&z={2}&s=Galil";


 //根据经纬度坐标以及缩放等级获取像素坐标 
        private Pixel getPixelFromLatLngZoom(double lng, double lat, double zoom)        
    
			{                       
           
			double pow = Math.Pow(2, zoom);            
      
			Pixel pixel = new Pixel(); 
          

			  pixel.X = ((lng + 180) / 360) * pow; 
          
			 double sinLatitude = Math.Sin(lat * Math.PI / 180); 
  
			 double temp = Math.Log((1 + sinLatitude) / (1 - sinLatitude));
            pixel.Y = Math.Abs((0.5 - temp / (4 * Math.PI)) * pow); 
            return pixel;
        }



根据经纬度和要缩放的级别得出瓷片的地图坐标,先从google 地图上查找出需要的城市的左上角的经纬 度和右下角的经纬度,利用上述函数求出坐标,然后把在这个坐标范围里每一级的所有图片都下载下来,格式为png的,我当时共下载了16级,google map共22级,下载时,通过Fidder抓包,分析 这样,地图数据就有了。


 然后可以找离线版的API, 找了好多个版本,最后终于在一个叫太乐地图的demo里发现了google map 离线版的API,版本号应该是3.8.6,这个版本的一个问题是在地图中添加Marker时没有默认的图标,需要手动在hmtl页面增加这个图标路径。这样离线API的问题也解决了


最后通过网页编程访问地图数据,这时就不需要KEY了,然后能过在MFC中使用webbrowser控件,来将网页嵌套进去。


最最最后补充一下就是地图的纠编问题,这是天朝的又一特色。两个思路,一种是利用纠编数据库,从网上下,另一种是写一个可以纠编的算法,这个从网上也能找到。 本人采用的是后者。还要注意的是GPS接收器传过来的数据格式。有度分秒, 有xx.xxxxxxxx度,还有两者的混合。我这个项目中就是两者的混合,由于粗心,坑死爹了。


有需要相关资料的可以与我联系: kee_2006@163.com

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: