以前在,新浪博客上写,也写了好多了,一直舍不得换,后来发现,还是这上面写的方便,就忍痛割爱了。
最近在写一个基于mapBox框架的地图项目。从网上搜索,也基本上没找到太多有用的内容。我现在自己总结下,分享给大家。
首先,创建项目以后,有三个代理非常重要。
WhirlyGlobeViewControllerDelegate,
MaplyViewControllerDelegate,
Maply3dTouchPreviewDatasource
因为我们写的是2D地图,大部分的代理方法,都在第二个里面,但是这三个还是都需要写的,否则总会莫名的报错。
// A source of elevation data, if we're in that mode
NSObject
这个代理方法,是需要加载数据初始化的时候用到,主要是为了优化内存。设置加载的优先级。
在加载数据前,一定先写上这句话
TBQuadTreeNode *awpNode;
在处理数据的时候,需要把数据转成TBQuadTreeNodeData 类型。或者MaplyCoordinate这个类型。主要是根据得到的数据类型,已经需要绘制的内容。
mapbox已经帮助我们队内存做了一定的优化处理,如果加载的数据比较大需要用到这个方法
-(void)startFetchForTile:(MaplyTileID)tileID forLayer:(MaplyQuadPagingLayer *)layer
这个方法,主要是根据地图的高度,对数据进行分级处理,避免卡顿。(需要和开启子线程这个方法一起使用:dispatch_asy......)
这是最基本的加载数据方法。
mapBox提供了两个对象:MaplyScreenMarker,MaplyScreenLabel这个基本满足一些点,线的需求。如果你加载的是一些点,就用Mark,或者是绘制图片最后也需要转成Mark来做。其他的纯文字,就直接使用lable这个对象即可。
如果是多种类型的Mark需要一起加载,或者根据高度不同,慢慢一起加载出来,那这里有一个非常重要的属性layoutImportance。
layoutImportance 这个属性,简单来说,就是当加载过程中,是否需要和其他的对象进行竞争。也就是说,如果此对象为必须加载,则直接设置为MAXFLOAT。其他的则可以随意设置,但是只要是不是MAXFLOAT的话,那么有可能会被优先级更高的挤掉,不显示。
MaplyComponentObject 这个对象也很重要。Mark是把数据处理以后放进来,而MaplyComponentObject则是最终呈现出来的载体。
MaplyComponentObject *airportCompObj = [layer.viewC addScreenMarkers:markers
desc:@{
kMaplyEnable: @(NO),
kMaplyMinVis: @(0.0),
kMaplyMaxVis: @(0.7),
kMaplyFade: @(1.0)}
mode:MaplyThreadCurrent];
这个就是把maker 放进来,最后显示出来。除了有addmarker,还有addlable。
以上就是这个地图最基本的一些方法,有喜欢的可以去研究下。
我以前都是写APP的,没做过这种地图类的开发,虽然这个框架给人自由发挥的空间比较大,但也同样的,某些基本功能也需要咱们自己去实现。比如点击变成高亮,在UIButon里就是一句话的事,但是这里需自己要写高亮的实现,一步步琢磨。
此项目还让我学习了mvvm这个开发模式,毕竟地图只有一个controller,不需要push。所以如果都在controller里那太多了,所以最后都尽量写到layer层里,然后controller里直接创建然后一句话加载。
这个框架,还有个特别的,就是里面的layer,并不是咱们UIView里的CALayer,而是NSObject,只不过名字叫layer。