最新公司需要做一个基于gis地图的应用系统,由于之前公司项目中的电子地图模块都是我开发的,所以这个新系统也自然让我先去了解如何开发,可以说做个简单的调研。
和之前的项目中开发的电子地图模块不同,这次是开发gis地图,是要显示真实的地理位置,能有gps定位功能的。而之前开发过的电子地图功能,都只是基于svg的矢量可配置地图(之前采用batik开发过C/S版,用raphael开发过B/S版,都在项目中正常使用)。
下面描述下我开始开发前做的准备和了解工作,希望对首次接触并想要开发gis离线地图应用的coder有帮助。
总体要求
(这里只提取和地图相关的,其他业务需求就不描述了)
1. 支持离线使用
2. 优先支持百度地图,不行选择google也可
3. 支持地图基本操作,放大、缩小、平移
4. 支持车载设备的GPS定位显示在地图上
5. 支持在地图上标注自定义的内容(图标、文字)
6. 支持自定义内容的操作,拖拽、右键显示信息和菜单
7. 设计上支持以后替换不同地图引擎,如从google换成高德,替换后尽量少做开发工作就能正常使用。
地图显示方案选择
1.调用地图API进行开发
各个地图开发商都提供了自己的api供大家调用,以方便进行二次开发,如google、百度、高德等,这些api往往比较完善和成熟,可以充分满足我们系统中的业务功能,但有几个要求无法满足:
1)无法支持离线使用,很多api通过http请求去各个地图开发商服务器获取数据,离线情况下有很多功能限制,其中最主要的GPS定位纠偏api就必须联网。
2)不易支持多个gis引擎,如果api进行开发,则肯定不兼容其他厂商gis的api,如果通过设计上在每个api上封装一层,则工作量太大。
所以使用某个厂商的api进行开发的方案基本不可行。
2.使用第三方库openlayers显示地图
OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问。
使用openlayer进行网页上地图的显示和操作控制,而不去调用各个厂商的api,通过工具获取google的离线地图瓦片数据,存在自己的服务器上,并可进行离线的开发和使用。
这样理论上只要更换后台服务器上的图片数据,做一些必要的配置,而不用改前台网页显示地图的代码,就可以支持不同厂商的地图展示。
显然在显示地图方案上,是要选择方案2才能满足离线和支持多地图引擎的要求。
地图的选择
原本希望使用百度地图,但是上网查了一圈,发现使用百度地图进行离线开发,似乎不大可行。
1) 百度官方的api中就不支持web开发离线地图。这个正常,一般的都不支持web离线开发,手机的倒是都支持。
2) 离线地图的一个需要解决的问题,GPS纠偏,百度地图的似乎不好处理,百度有自己的偏移加密。
这里顺便引用下对坐标系的介绍:
1.火星坐标系统 GCJ-02
国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照几行代码的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所 以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
目前使用火星坐标系的地图商:
腾讯搜搜地图
搜狐搜狗地图
阿里云地图
高德MapABC地图
灵图51ditu地图
(重要)所有的电子地图所有的导航设备,都需要加入国家保密插件。第一步,地图公司测绘地图,测绘完成后,送到国家测绘局,将真实坐标的电子地图,加密成“火星坐标”,这样的地图才是可以出版和发布的,然后才可以让GPS公司处理。第二步,所有的GPS公司,只要需要汽车导航的,需要用到导航电子地图的,统统需要在软件中加入国家保密算法,将COM口读出来的真实的坐标信号,加密转换成国家要求的保密的坐标,这样,GPS导航仪和导航电子地图就可以完全匹配,GPS也就可以正常工作。
2.大地坐标系统 WGS-84
用来表述地球上点的位置的一种地区坐标系统。它采用一个十分近似于地球自然形状的参考椭球作为描述和推算地面点位置和相互关系的基准面。一个大地坐标系统必须明确定义其三个坐标轴的方向和其中心的位置。通常人们用旋转椭球的短轴与某一规定的起始子午面分别平行干地球某时刻的平均自转轴和相应的真起始子午面来确定坐标轴的方向。若使参考椭球中心与地球平均质心重合,则定义和建立了地心大地坐标系。它是航天与远程武器和空间科学中各种定位测控测轨的依据。若椭球表面与一个或几个国家的局部大地水准面吻合最好,则建立了一个国家或区域的局部大地坐标系。大地坐标系中点的位置是以其大地坐标表示的,大地坐标均以椭球面的法线来定义。其中,过某点的椭球面法线与椭球赤道面的交角为大地纬度;包含该法线和大地子午面与起始大地子午面的二面角为该点的大地经度;沿法线至椭球面的距离为该点的大地高。大地纬度、大地经度和大地高分别用大写英文字母B、L、H表示。
3.百度坐标系统 BD-09
百度坐标对火星坐标系进行了一次加密,形成了百度坐标系.目前使用百度坐标系的地图商:百度Baidu地图图吧MapBar地图
可见百度地图比较特殊,有着自己的二次加密。
假设以后车载设备将GPS信息实时推送给我们,如果直接将位置坐标输入地图中显示,则会有偏移,这样肯定无法满足要求,所以纠偏一直是开发离线gis应用的难点。对google离线地图的纠偏,google由于离线开发者多,所以相应的方法也较多,纠偏问题应该能较好的解决,而且查到了别人所谓的纠偏算法,只是没有验证。百度地图的纠偏相对复杂,一般人使用在线api可以直接调用纠偏接口,而离线则没有很好的方式,其纠偏算法网络上也没有找到,一般百度地图的纠偏数据库也是收费的。所以在纠偏问题上,百度地图比较难解决,而google地图相对较容易。
总的来看,我应该会选择开发google的离线地图,风险相对小一点,web采用openlayers进行加载显示,正式开发前的准备工作就差不多啦,接下来应该要弄个demo试一下,或者直接开干!