Android开发,MapBox的使用及部分功能实现(一)----- 初始化、标记、定位、styleurl

本文介绍了MapBox在Android开发中的使用,包括如何申请accessToken、初始化MapView、异步加载地图,以及详细讲解了如何设置地图位置、自定义Marker、地图定位和风格URL。适合刚开始接触MapBox的开发者参考。
摘要由CSDN通过智能技术生成

近期,应公司要求,开始接触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



                
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值