基于map box开发的地图

       以前在,新浪博客上写,也写了好多了,一直舍不得换,后来发现,还是这上面写的方便,就忍痛割爱了。

    最近在写一个基于mapBox框架的地图项目。从网上搜索,也基本上没找到太多有用的内容。我现在自己总结下,分享给大家。

首先,创建项目以后,有三个代理非常重要。

WhirlyGlobeViewControllerDelegate,

MaplyViewControllerDelegate,

Maply3dTouchPreviewDatasource

因为我们写的是2D地图,大部分的代理方法,都在第二个里面,但是这三个还是都需要写的,否则总会莫名的报错。

// A source of elevation data, if we're in that mode

 NSObject *elevSource;

这个代理方法,是需要加载数据初始化的时候用到,主要是为了优化内存。设置加载的优先级。

在加载数据前,一定先写上这句话

具体干啥的不好说,但肯定对内存有优化作用


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。

你可能感兴趣的:(基于map box开发的地图)