近期,应公司要求,开始接触MapBox For Android的开发。
经过初步的接触,发现MapBox与我之前使用的Arcgis有很多不同,相比起来,MapBox更清洁,更轻便,也更容易使用,但是相对的,MapBox相对于Arcgis缺少了很多的功能实现,许多的东西都需要自己去进行处理才能实现。
下面是我一步步接触并使用MapBox的记录,可能会比较乱。我这里提供了目录的功能,请不要使用csdn的极客模式,不然看不到目录的,另外,由于是一步步的写下来了,可能前期的看法或者结论,到了后期就不一样了,我会定期修改,但是可能会存在漏网的,欢迎指出。
首先是接入,相比于Arcgis又需要导入包文件,又需要导入lib,又需要设置jcenter,打包下来,直接就几十兆的Apk,一编译就是一分钟。
MapBox只需要导入一下代码即可
compile('com.mapbox.mapboxsdk:mapbox-android-sdk:5.0.2@aar') {
transitive = true
}
哦,对了,还有mavencentral,一般来说,应该都设置了的
allprojects {
repositories {
jcenter()
mavenCentral()
}
}
一般来说,下载一段时间后,就可以了,如果不可以,就试着翻墙,设置代理什么的,这里不细说了。
MapBox和Arcgis相同,在Xml中添加一个MapView就可以了
<com.mapbox.mapboxsdk.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
如果是从网上,或者demo上学习的朋友,可能会遇到一个问题
就是在xml上无法设置初始坐标,zoom等参数,只能强行写出来,我估计是该控件item的问题。为了更好的学习,我将这些功能都放到了代码中来实现。
申请accessToken
就和arcgis的key类似,就是一个使用凭证,就不多说了,可以去官方网站申请。
进行初始化
申请完毕后,在Activity的onCreate()中添加如下代码,进行初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置accessToken
Mapbox.getInstance(this, getString(R.string.accessToken));
setContentView(R.layout.activity_simple_map); }
敲黑板,这里的初始化代码一定要放到setContentView之前,否则无法使用。
初始化Mapview
mapView = (MapView) findViewById(R.id.mapView);
mapView.setStyleUrl("mapbox://styles/mapbox/streets-v9");
mapView.onCreate(savedInstanceState);
注意,其中的setStyleUrl,就是设置地图样式,可以采用默认样式,Light,Dark等,也可以使用网络地址,事实上默认的Style.LIGHT也是一个地址
还有下面的
mapView.onCreate(savedInstanceState);
需要在初始化的时候设置,同时,除了onCreate,还包括以下
// Add the mapView lifecycle to the activity's lifecycle methods
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
}
@Override
protected void onStop() {
super.onStop();
mapView.onStop();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
都要进行设置,建议封装到baseactvity中
异步加载地图
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
}
});
该方法即是对地图进行加载,加载成功后,会返回MapboxMap对象,只有有了这个对象,我们才可能对地图进行各种操作,和Arcgis不同,arcgis的大部分操作,都是在mapview上进行操作的,但是MapBox的mapview并没有太多的功能元素,像地图定点、polygon、marker等操作,都得对mapboxmap进行操作,我估计很多朋友都会和我一样,想进行初始化时中心点设置的时候,尝试了centerAt、location、setCenter、setPosition、moveTo、moveCamere。。等等一系列的姿势去设置,都失败了。
更多操作
从上一步开始,地图已经可以跑起来了,下面就是一些进一步的使用,一下排序不分先后,纯粹是我做到哪,写到哪,不过我提供了目录,需要的朋友可以直接在目录中进行搜索,如果是和我一样才开始学习的,可以跟着我的代码一直敲就可以了。
将地图移动到某一点
这个方法有很多
LatLng latLng = new LatLng(29.735281, 106.99155);
mapboxMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
最简单的地图定点,是的,没错,这就centerAt的功能
首先我来看前面的方法moveCamera;这个方法就是简单将地图中心定到某个位置,更多的还有
注意,这个LatLng不仅仅可以传入坐标,还可以传入location的
mapboxMap.animateCamera(CameraUpdateFactory.newLatLng(latLng),2000);//动画移动,花费两秒时间,动态的移动到该位置,时间可以不写
mapboxMap.easeCamera(CameraUpdateFactory.newLatLng(latLng),2000);//讲真,我也没发现和其他的有什么区别
然后是后面的参数
后面可以有四种形式
很显然,一个必填,三个可填。
主要呢是必填项CamerUpdate类型的参数,CameraUpdate呢,其实可以当做一个数据处理命令集来使用,即先将要move到的位置的各种参数设置完成,封装好后,再来进行处理。
CameraUpdate的构造需要用到CamaeraUpdateFactory(目前就我了解的话)
CamaeraUpdateFactory专门是用来构建CameraUpdate的,是他的工厂类,我们来看看他的new方法(zoomby,scrollby我没用过。。)
①.newLatLng 根据简单的坐标点来进行构造
这里只需要传入一个坐标参数即可,LatLng,用过Arcgis等地图的都知道,这就是一个坐标,可以用new LatLng(double latitude,double longitude)来进行构造,同下,我们统一用animateCamera来进行举例。
mapboxMap.animateCamera(CameraUpdateFactory.newLatLng(latLng),2000);
②.newCameraPosition 根据CameraPosition来进行构造
这里需要传入的是一个CameraPosition的对象,初始化
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latLng.getLatitude(), latLng.getLongitude()))
.zoom(17)//放大尺度 从0开始,0即最大比例尺,最大未知,17左右即为街道层级
.bearing(180)//地图旋转,但并不是每次点击都旋转180度,而是相对于正方向180度,即如果已经为相对正方向180度了,就不会进行旋转
.tilt(30)//地图倾斜角度,同上,相对于初始状态(平面)成30度
.build();//创建CameraPosition对象
敲黑板了,注意其中的参数,这几个参数在很多地方都有用到。
mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 2000);
使用就很简单了,大同小异。
③.newLatLngBounds 根据一个坐标坐标边界进行移动,这个有两种方法,除了必传的LatLngBounds,都一样,不一样的就是padding,一种是统一padding,一种是四个方向,这个我就不细细说了,我只说统一padding