最近因项目需要,在app中要集成Mapbox,并且要能与苹果地图切换使用。从最早认识Mapbox到最终集成完毕,中间有一些断断续续,但总的时间也不算短了,关于这方面的资料其实是比较少的,能参考的基本都来自官方文档和Demo,在我的app中涉及到了地图基本操作、自定义annotation及行为、画线等功能,在这里将一些使用心得记录下来吧。
一、概述
Mapbox是一个支持多种平台及SDK开发(Web/iOS/Android)的地图,能显示全球地图数据,你可以简单的将它想象成类似Google Map那样的地图,也同样具备很丰富的多种功能,并且很重要的一点,它在全球都能访问的到!
我做的是iOS SDK开发,其开发页面是:https://docs.mapbox.com/ios/maps/overview/
基本的集成方法、文档及Demo请参考以上页面,而且目前为止我能参考的所有资料几乎也都只有这些。
二、Mapbox SDK与苹果地图的一些对比
-
基本类型定义(MKMapView、MGLMapView)
Mapbox中的地图类名为MGLMapView,与苹果地图MKMapView中基本的大部分属性是类似的,或通过名字能很快知道其含义,但具体看还是有自己的特点,首先看下设置地图类型:
MKMapView中设置很简单,通过设置mapType属性(枚举类型)就可以了,而MGLMapView中的方式是,设置styleURL中对应的网址,常用的对应苹果地图中的标准/卫星/混合类型都已经在SDK中定义好了,比如卫星图对应的是:https://docs.mapbox.com/ios/maps/examples/satellite-style,更多的可以在SDK中找到。这样做还有一个好处,可以方便的指定在Mapbox Studio中自己做的地图!
又比如设置当前可见区域中所用到的参数类型MGLCoordinateBounds,不同于MKMapView中的区域定义,它是用south west及north east的坐标来定义一个地图区域,这样的定义还是比较特别的,但也是好理解的,所以就得自己来计算一些需要的值。
typedef struct __attribute__((objc_boxable)) MGLCoordinateBounds {
/** Coordinate at the southwest corner. */
CLLocationCoordinate2D sw;
/** Coordinate at the northeast corner. */
CLLocationCoordinate2D ne;
} MGLCoordinateBounds;
另外Mapbox地图默认是有点类似2.5D的视觉效果,双指同时上下滑动可调整视角的俯瞰角度。
2. 坐标系
除了具体的类型/函数定义外,另外一个很重要的问题就是:坐标系。通过与Mapbox支持团队的邮件确认,在大陆是使用GCJ02坐标,也就是俗称的火星坐标,其余地区都使用WGS84坐标,所以我们就要自己作这一转换&#x