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/[email protected]&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控件,来将网页嵌套进去。

有需要相关资料的可以与我联系: [email protected]
时间: 2024-10-22 10:50:31

GoogleMap离线开发小结的相关文章

iOS线程开发小结

/* 方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSelectorInBackground:@selector(test) withObject:nil]; *回到主线程执行任务 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 2.GCD

借助Service Worker和cacheStorage缓存及离线开发 (转载)

一.缓存和离线开发 说得HTML5离线开发,我们通常第一反应是使用html5 manifest缓存技术,此技术已经出现很多年了,我以前多次了解过,也见过一些实践案例,但是却从未在博客中介绍过,因为并不看好. 为什么不看好呢?用一句话解释就是“投入产出比有些低”. 对于web应用,掉线不能使用是理所当然的,绝不会有哪个开发人员会因为网页在没网的时候打不开被测试MM提bug,或者被用户投诉,所以,我们的web页面不支持离线完全不会有什么影响.但如果我们希望支持离线,会发现,我投入的精力和成本啊还真不

百度地图离线开发

:  百度地图离线开发,用在内网于局域网项目开发上,完全脱离互联网访问,可支持完整的全国瓦片图下载,使用目前最新的V2.0百度API,支持热力,聚合,海量标注,根据范围米数来圈范围,画图工具等完全支持.http:api.jjszd.com:8081apituiguanggisysw.html 以下是测试中的截图 地图标注,点击标注弹出层 地图标注,点击标注弹出层 支持多层弹出显示,也支持每次只显示一个层,可自由更改标注图标,大家发现没有,这个层不是带有箭头标识的层,箭头标识的是MBap中自带的,

PHP服务器文件管理器开发小结(总结):总结、索引和源代码

PHP服务器文件管理器的开发经过前一阶段的介绍基本完成了功能搭建,包括目录的检索.增加.删除.重命名,文件的增加.浏览.修改.重命名.移动,以及文件的上传和下载等功能.本文对前一阶段工作的相关博文进行索引,并提供源代码供有兴趣的同学一同讨论. PHP服务器文件管理器开发小结(一):功能规划 本节讨论了文件管理器的目标功能和运行环境. PHP服务器文件管理器开发小结(二):版面设计和css 本节讨论了页面布局所需的css内容,并介绍了引入jQuery和jQueryUI的方法. PHP服务器文件管理

XXX系统开发小结(SSH+Jquery EasyUI)

一.项目总体介绍 前一段时间的工作中,笔者大概用了两三个月开发了一个Web管理信息系统,使用的框架集为Struts2.3.1+Spring3.0+Hibernate3+Jquery EasyUI1.3.5,系统业务逻辑并不复杂,完成数据的采集(以问卷的形式).计算处理和形成报告发布.EasyUI是一个很优秀的JS UI框架,使用简单方便,效果也还可以,是UI效果和带宽速度之间的一个折中之选.系统中还有新闻发布模块,用到了富文本编辑器,在比较了很多插件之后,选择了kindeditor,原因很简单,

arcserver开发小结(三)

一.关于网络数据集的制作 由于要做实现网络分析的功能,而手中却没有网络数据集,关于网络数据集的制作,网上也有不少的资料.我参考的是ESRI为我们提供的帮助文档(Network_Analyst_Tutorial.pdf,该文档位于C:\Program Files\ArcGIS\Documentation,当然这个路径会随着ArcGIS安装路径的不同而有所不同),参照里面的做了下,我觉得最重要的是当你一步步NEXT后生成了.ND文件(网络数据集network dataset)之后,这里还没完,务必要

arcserver开发小结(一)

一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodatabase, shapefile, dBase table, coverage, INFO table-- "AREA" (2)personal geodatabase--[AREA] (3)ArcSDE geodatabase--AREA (4)Excel file (.xls file)

arcserver开发小结(二)

一.关于服务器上下文 1,服务器上下文(ServerContext)本质上是一个GIS服务器上的进程,它是服务器端编程的起点. 2,只有本地资源才能得到服务器上下文,通常得到服务器上下文的主线是: MapResourceLocal——>ServerContextInfo——>ServerContext 3,在gis服务器上创建对象,只能通过ServerContext的CreateObject方法,而不能用new关键字,new关键字创建的是在本机上创建,而非gis服务器上. 4,CreateOb

OneDrive模块开发小结(二)--- 性能及其他问题解决方案

继上篇OneDrive模块开发小结(一)--- 获取登陆时email http://blog.csdn.net/vic_fang/article/details/23282311 之后,再做一个阶段性小结 1. 关于同步方法和异步方法 onedrive的demon项目中提供了两种方式的api,以获取文件详细信息为例:get(String id), getAsync(String id, LiveOperationListener listener).get(String id)方式是纯异步的,