勇哥的随笔记 - amap
type: channel
link: https://blog.nas.hi.cn/tag/amap/
items: 国内外地图差异分析
items: Fragment中使用地图切换会闪一下黑屏的问题

国内外地图差异分析
type: item
date: 2017-07-11T10:25:00+08:00
description: 概念1 火星坐标系统（GCJ02 / 国测局坐标）是一种通过国家保密插件（也叫做加密插件或者加偏或者SM模组）加密后的坐标系统标准，其实就是对真实坐标系统进行人为的加偏处理，按照特殊的算法，将真实的坐标加密成虚假的坐标，而这个加偏并不是线性的加偏，所以各地的偏移情况都会有所不同，目前该坐标只在中国大陆、香港和澳门地区使用，其他地区不适用该系统标准。 2 世界大地测量系统（WGS84 / 国际标准坐标）是一种用于地图学、大地测量学和导航（包括全球定位系统）的大地测量系统标准，WGS包含一套地球的标准经纬坐标系、一个用于计算原始海拔数据的参考椭球体，和一套用以定义海平面高度的引力等势面数据；最新版本为WGS 84（也称作WGS 1984、EPSG:4326），1984年定义、最后修订于2004年，之前的版本有WGS 72、WGS 66、WGS 60，目前全球大部分国家使用的是该系统标准。 3 百度坐标系统（BD09）是百度自己在自家地图内所使用的一种坐标系统，是在国测局的坐标基础上，二次加密得到的坐标，该坐标只适用于百度系地图系统，与其他家系统不兼容。 4 其他坐标系统与百度坐标系统类似，属于非主流的坐标系统，适用范围也只在自家系统内使用。 现状目前国内内有多家地图服务提供商，其中有提供互联网地图服务资质的厂商主要有：高德软件有限公司、北京四维图新科技股份有限公司、北京搜狗信息服务有限公司、北京百度网讯科技有限公司、诺基亚联新互联网服务有限公司、北京新浪互联信息服务有限公司、深圳市凯立德计算机系统技术有限公司等，主流的地图软件主要数据来源实际上是高德、凯立德和四维图新这三家公司。国外基本上每个国家都有一个本地的地图服务提供商，也有一些主流的互联网公司，像是Google，Apple，Nokia等通过购买和自行测绘来获得其他国家的地图数据，目前做的最好就是Google。 公司现有App集成的地图使用的是高德地图，但是高德地图面临一个国际化的问题，高德地图目前虽然在部分国家和地区已经能提供地图服务，但是该服务无法与主流的Google地图、OpenStreetMap相媲美，而且还存在着地图数据标注错误的问题，所以App现行的做法是两套地图，国内建议使用高德地图，国外建议使用Google地图，这样就能完美覆盖全球大部分的区域。 问题根据产品定位和业务发展，App面临着地图需要提供国际化服务的问题，现有的接口根据App或者Web提供的度分秒坐标反转成WGS84经纬度坐标，App再从接口获取坐标后把WGS84坐标转换成国内的火星坐标，该坐标在国内范围内是适用的，但是在除去国内以外的地区，该套坐标数据就不再适用，因为国外大部分地区不使用火星坐标，App后续准备添加高德地图和Google地图切换功能，在切换到Google地图以后，直接使用WGS84在国外是能够显示正常，在国内如果不转换成火星坐标，会导致道路数据对不上，但Google卫星图显示正常。这是因为Google在国内没有地图测绘资质，使用的是高德地图的道路数据，所以在该套数据上需要使用火星坐标进行标记点位，但是Google的卫星图是从数字地球等第三方购买的， 该卫星图是使用WGS84来进行绘制的，所以在该套数据上需要使用WGS84坐标进行标记点位。通过图示，可以看出卫星图与道路图存在偏移，卫星图往西北方向偏移了一定距离建议建议接口统一经纬度数据格式，在向后台传入经纬度坐标的时候标记下该坐标是WGS84还是GCJ02坐标，在App界面上抛弃度分秒的数据人工录入，直接使用定位或者地图选点的数据结果，防止用户个人录入数据导致出错的概率，对于卫星图和道路地图切换，需要重新进行点位的标记，区分国内外地图数据，在标记点位时，判断该点位是否位于国内，如果位于国内，需要使用GCJ02坐标进行标记，位于国外，需要使用WGS84进行标记，对于接口需要新增火星坐标字段，方便App直接使用，避免本地转换坐标带来的效率下降。因此，对于涉及到地图数据的处理，建议对每一条经纬度数据需要标记该数据的坐标系统来源，以便于后台对于该数据的录入处理，对于返回的经纬度数据，接口也需要做相应的处理，支持对多种坐标的返回，通过请求入参，判断返回一种或者多种经纬度数据，使得对于经纬度坐标的数据处理更灵活。

Fragment中使用地图切换会闪一下黑屏的问题
type: item
date: 2016-08-24T10:30:35+08:00
description: 最近项目中使用高德地图，发现一个问题，就是切换Fragment会出现黑屏闪一下的问题，可能和fragment的加载机制和surfactview的绘制有关，我用的是高德的3D地图，用2D地图无此问题。网上搜索了很久，发现了两个解决办法：1.在使用到地图的Activity中的onCreate中添加以下代码：getWindow().setFormat(PixelFormat.TRANSLUCENT); 2.在根布局中添加一个不可见的SurfaceView：最佳做法是在Activity 的 root view 里面 加入一个 长宽都是0px的 不可见 SurfaceView元素