[AS2.3.3]高德地图使用学习记录

一篇来自自己学习官方文档的文章。

使用的sdk

  1. AMap3DMap_5.7.0
  2. AMapNavi_5.6.0
  3. AMapSearch_5.7.0
  4. AMapLocation_3.7.0

主要内容如下

  • 地图相关
    创建显示地图
    地图属性设置
  • Marker相关
    创建Marker显示在地图上
    Marker操作
  • 绘画相关
    绘制了线和圆
  • poi相关
    关键字搜索
    周边检索
    ID检索
    自动提示
    公交检索

地图相关

创建显示地图

public class MainActivity extends AppCompatActivity {

    private MapView mapView;
    private AMap aMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapView = (MapView) findViewById(R.id.map);
        //创建地图
        mapView.onCreate(savedInstanceState);

        if (aMap == null) {
            aMap = mapView.getMap();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        mapView.onDestroy();
        super.onDestroy();
    }
}

地图属性设置

  • 设置地图层级
    //设置地图层级 3-19
    aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
  • 移动地图中心点到经纬度
    //设置中心点到26.099794 119.296154
    LatLng latLng = new LatLng(26.099794,119.296154);
    aMap.moveCamera(CameraUpdateFactory
            //CameraPosition参数说明 LatLng var1, float var2, float var3, float var4
            //目标位置的屏幕中心点经纬度坐标
            //目标可视区域的缩放级别
            //目标可视区域的倾斜度,以角度为单位
            //可视区域指向的方向,以角度为单位,从正北向逆时针方向计算,从0度到360度
            .newCameraPosition(new CameraPosition(latLng,16,45,0)));
  • 地图UI
    //地图ui相关
    UiSettings uiSettings = aMap.getUiSettings();
    //缩放+ -
    uiSettings.setZoomControlsEnabled(true);
    //定位按钮
    uiSettings.setMyLocationButtonEnabled(true);
    //指南针
    uiSettings.setCompassEnabled(true);
    //比例尺
    uiSettings.setScaleControlsEnabled(true);
    //地图Logo位置
    uiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);
    //手势相关
    //双击手势
    uiSettings.setZoomGesturesEnabled(true);
    //滑动手势
    uiSettings.setScaleControlsEnabled(true);
    //旋转手势
    uiSettings.setRotateGesturesEnabled(false);
    //倾斜手势
    uiSettings.setTiltGesturesEnabled(false);
  • 地图点击事件
    //地图点击
    aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latLng) {
            Log.d(TAG, "click: "+latLng.latitude+","+latLng.longitude);
        }
    });

    //地图poi点击
    aMap.setOnPOIClickListener(new AMap.OnPOIClickListener() {
        @Override
        public void onPOIClick(Poi poi) {
            //poiId
            poi.getPoiId();
            //poi名称
            poi.getName();
            //poi经纬度
            poi.getCoordinate();
        }
    });
  • 地图定位
    //定位相关
    MyLocationStyle myLocationStyle = new MyLocationStyle();
    //连续定位的触发间隔
    myLocationStyle.interval(5000)
            //定位类型 循环定位
            .myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
    //设置定位蓝点属性
    aMap.setMyLocationStyle(myLocationStyle);
    //设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false
    aMap.setMyLocationEnabled(true);

定位蓝点扩展

    //定位模式设置
    //只定位一次。MyLocationStyle.LOCATION_TYPE_SHOW
    //定位一次,且将视角移动到地图中心点。
    MyLocationStyle.LOCATION_TYPE_LOCATE
    //连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位)
    MyLocationStyle.LOCATION_TYPE_FOLLOW
    //连续定位、且将视角移动到地图中心点,地图依照设备方向旋转,定位点会跟随设备移动。(1秒1次定位)
    MyLocationStyle.LOCATION_TYPE_MAP_ROTATE
    //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。
    MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE
    //以下三种模式从5.1.0版本开始提供
    //连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
    MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER
    //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。
    MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER
    //连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。
    MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER

    //设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。
    showMyLocation(boolean visible);
    //设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。
    myLocationIcon(BitmapDescriptor myLocationIcon);
    //设置定位蓝点图标的锚点方法。
    anchor(float u, float v);
    //设置定位蓝点精度圆圈的边框颜色的方法。
    strokeColor(int color);
    //设置定位蓝点精度圆圈的填充颜色的方法。
    radiusFillColor(int color);
    //设置定位蓝点精度圈的边框宽度的方法。
    strokeWidth(float width);
    //从location对象中获取经纬度信息,地址描述信息,建议拿到位置之后调用逆地理编码接口获取
    public void onMyLocationChange(android.location.Location location){}

Marker相关

创建Marker显示在地图上

    MarkerOptions markerOptions = new MarkerOptions();
    LatLng latLng = new LatLng(26.061328,119.291608);
    markerOptions.position(latLng)  //经纬度
            .title("Title") //标题
            .snippet("Snippet") //内容
            .visible(true)  //是否显示
            .draggable(false)   //是否拖拽
            .anchor(0.5f,1.0f)  //锚点 默认0.5f,1.0f
            .alpha(1.0f)    //透明度
            //自定义图标
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
    aMap.addMarker(markerOptions);

Marker操作

  • Marker删除方法

    marker.remove();

    //删除特定marker
    //可以设置marker的object方法
    marker.setObject(xxx.class);
    //碰到删除的地方可以进行判断
    if (marker.getObject() == xxx.class) {
        marker.remove();
    }
    //或者加入数组中保存
    markers.add(marker);
    //碰到删除的地方
    for(Marker marker : markers){
        marker.remove();
    }
  • Marker动画
    Marker marker = aMap.addMarker(markerOptions);
    //设置Marker缩放动画
    Animation animation = new ScaleAnimation(0,1,0,1);
    //动画时间
    animation.setDuration(1000);
    animation.setInterpolator(new LinearInterpolator());
    marker.setAnimation(animation);
    marker.startAnimation();
  • Marker点击事件
    aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            //是否显示info
            if (marker.isInfoWindowShown()) {
                marker.hideInfoWindow();
            }else{
                marker.showInfoWindow();
            }
            //marker经纬度
            marker.getPosition();
            return true;
        }
    });
  • Marker拖拽事件
        aMap.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
            @Override
            public void onMarkerDragStart(Marker marker) {

            }

            @Override
            public void onMarkerDrag(Marker marker) {

            }

            @Override
            public void onMarkerDragEnd(Marker marker) {

            }
        });
  • Marker的InfoWindow设置相关
    //InfoWindow 点击事件
    aMap.setOnInfoWindowClickListener(new AMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {

        }
    });
    //自定义InfoWindow布局
    aMap.setInfoWindowAdapter(new AMap.InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    });
//    View getInfoWindow(Marker marker)
//    当实现此方法并返回有效值时(返回值不为空,则视为有效),SDK 将不会使用默认的样式,而采用此方法返回的样式(即 View)。
//    默认会将Marker 的 title 和 snippet 显示到 InfoWindow 中。
//    如果此时修改了 Marker 的 title 或者 snippet 内容,再次调用类 Marker 的 showInfoWindow() 方法,InfoWindow 内容不会更新。
//    自定义 InfoWindow 之后所有的内容更新都需要用户自己完成。
//    当调用 Marker 类的 showInfoWindow() 方法时,SDK 会调用 getInfoWindow(Marker marker) 方法和 getInfoContents(Marker marker) 方法(之后会提到),在这些方法中更新 InfoWindow 的内容即可。
//    注意:如果此方法返回的 View 没有设置 InfoWindow 背景图,SDK 会默认添加一个背景图。
//    View getInfoContents(Marker marker)
//    此方法和 getInfoWindow(Marker marker) 方法的实质是一样的,唯一的区别是:此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框。

绘画相关

这边就提及绘制线和绘制圆,其他可以查看官方文档

  • 绘制线
    //点数组
    List<LatLng> latLngs = new ArrayList<>();
    LatLng latLng1 = new LatLng(26.099794,119.296154);
    LatLng latLng2 = new LatLng(26.061328,119.291608);
    latLngs.add(latLng1);
    latLngs.add(latLng2);
    //设置点属性
    PolylineOptions opt = new PolylineOptions();
    opt.addAll(latLngs)//添加点
            //设置颜色
            .color(Color.BLUE)
            //设置线大小
            .width(10);
    Polyline polyline = aMap.addPolyline(opt);

删除线方法polyline.remove();

  • 绘制圆
    //设置圆属性
    CircleOptions copt = new CircleOptions();
    copt.center(latLng1)//经纬度
            .radius(100)//圆半径
            //填充颜色
            .fillColor(Color.argb(50,1,1,1))
            .strokeColor(Color.argb(100,1,1,1))
            //线大小
            .strokeWidth(15);
    Circle circle = aMap.addCircle(copt);

删除线方法circle.remove();


POI相关

关键字搜索

    //查询条件
    //第一个参数表示搜索字符串,
    //第二个参数表示POI搜索类型,第一个参数和第二个参数二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考官方文档
    //第三个参数表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
    PoiSearch.Query query = new PoiSearch.Query("肯德基","","福州");
    //每页的数量
    query.setPageSize(10);
    //第几页
    query.setPageNum(1);
    //检索设置
    PoiSearch poiSearch = new PoiSearch(this,query);
    //异步检索
    poiSearch.searchPOIAsyn();
    //结果监听
    PoiSearch.OnPoiSearchListener listener = new PoiSearch.OnPoiSearchListener() {
        @Override
        public void onPoiSearched(PoiResult poiResult, int code) {
            if (code == 1000) {
                //成功
                for (PoiItem poiItem : poiResult.getPois()) {
                    //poi标题
                    poiItem.getTitle();
                    //poi内容
                    poiItem.getSnippet();
                    //poi经纬度
                    poiItem.getLatLonPoint();
                    //poiID
                    id = poiItem.getPoiId();

                    LatLng l = new LatLng(poiItem.getLatLonPoint().getLatitude(),
                            poiItem.getLatLonPoint().getLongitude());
                    String t = poiItem.getTitle();
                    String s = poiItem.getSnippet();

                    MarkerOptions options = new MarkerOptions();
                    options.position(l)
                            .title(t)
                            .snippet(s)
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
                    aMap.addMarker(options);
                }
            }else{
                //失败
            }
        }

        @Override
        public void onPoiItemSearched(PoiItem poiItem, int code) {
            if (code == 1000) {
                //成功
                //poi标题
                poiItem.getTitle();
                //poi内容
                poiItem.getSnippet();
                //poi经纬度
                poiItem.getLatLonPoint();

            }else{
                //失败
            }
        }
    };
    poiSearch.setOnPoiSearchListener(listener);

周边检索

搜索的条件、初始化、监听和上面一样

    //圆形区域周边检索
    LatLonPoint latLonPoint = new LatLonPoint(26.099794,119.296154);
    int r = 2000;
    poiSearch.setBound(new PoiSearch.SearchBound(latLonPoint,r));
    //执行检索
    poiSearch.searchPOIAsyn();

    //多边形区别检索
    List<LatLonPoint> points = new ArrayList<LatLonPoint>();
    points.add(new LatLonPoint(39.941711, 116.382248));
    points.add(new LatLonPoint(39.884882, 116.359566));
    points.add(new LatLonPoint(39.878120, 116.437630));
    points.add(new LatLonPoint(39.941711, 116.382248));
    poiSearch.setBound(new SearchBound(points));//设置多边形区域
    //执行检索
    poiSearch.searchPOIAsyn();

ID检索

    //ID检索 初始化的时候去掉query条件
    //初始化
    PoiSearch poiSearch1 = new PoiSearch(this,null);
    //ID异步检索
    poiSearch1.searchPOIIdAsyn(id);
    //监听还是一样不过 实现的方法是onPoiItemSearched
    poiSearch1.setOnPoiSearchListener(listener);

自动提示

    //条件
    InputtipsQuery inputquery = new InputtipsQuery("医院", "福州");
    //限制在当前城市
    inputquery.setCityLimit(true);
    //初始化
    Inputtips inputTips = new Inputtips(this, inputquery);
    //异步检索
    inputTips.requestInputtipsAsyn();
    //监听
    inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
        @Override
        public void onGetInputtips(List<Tip> list, int code) {
            if (code == 1000) {
                //成功
                for (Tip tip : list) {
                    //完整名词
                    tip.getName();
                    //地址
                    tip.getAddress();
                    //poiID
                    tip.getPoiID();
                    //经纬度
                    tip.getPoint();
                    Log.e("TAG", "==>"+tip.getName());
                }
            }else{
                //失败
            }
        }
    });

结果如下

E/TAG: ==>福建医科大学附属协和医院
E/TAG: ==>福州鼓楼医院
E/TAG: ==>福建省第二人民医院东二环院区
E/TAG: ==>福州市人民医院
E/TAG: ==>福建中医药大学附属康复医院
E/TAG: ==>福建中医药大学附属第二人民医院
E/TAG: ==>福州总医院
E/TAG: ==>福建省立医院
E/TAG: ==>福州中医药大学附属福州中医院
E/TAG: ==>福州市第一医院

公交检索

    //站点检索
    //条件 第一个填公交站点
    BusStationQuery busStationQuery = new BusStationQuery("站点", "福州");
    //检索初始化
    BusStationSearch busStationSearch = new BusStationSearch(this, busStationQuery);
    //异步检索
    busStationSearch.searchBusStationAsyn();
    //监听
    busStationSearch.setOnBusStationSearchListener(new BusStationSearch.OnBusStationSearchListener() {
        @Override
        public void onBusStationSearched(BusStationResult busStationResult, int code) {
            if (code == 1000) {
                //成功
                for (BusStationItem item : busStationResult.getBusStations()) {
                    //公交车站点名称
                    item.getBusStationName();
                    //公交车站点经纬度
                    item.getLatLonPoint();
                    //公交车站点ID
                    item.getBusStationId();
                    //公交车站点路过的全部线路
                    item.getBusLineItems();
                    Log.e("TAG", "==>"+item.getBusStationName());
                    for (BusLineItem busLineItem : item.getBusLineItems()) {
                        //公交线路名称
                        busLineItem.getBusLineName();
                        Log.e("TAG", "line==>"+busLineItem.getBusLineName());
                    }
                }
            }else{
                //失败
            }
        }
    });

    //线路查询,第二个参数 BY_LINE_NAME 和 BY_LINE_ID两个参数,名称查询可以模糊查询 id查询就是精确查询
    BusLineQuery query = new BusLineQuery("K1", BusLineQuery.SearchType.BY_LINE_NAME,"福州");
    //初始化检索
    BusLineSearch search = new BusLineSearch(this,query);
    //异步检索
    search.searchBusLineAsyn();
    //监听
    search.setOnBusLineSearchListener(new BusLineSearch.OnBusLineSearchListener() {
        @Override
        public void onBusLineSearched(BusLineResult busLineResult, int code) {
            if (code == 1000) {
                //成功
                for (BusLineItem busLineItem : busLineResult.getBusLines()) {
                    //线路名称
                    busLineItem.getBusLineName();
                    //线路id
                    busLineItem.getBusLineId();
                    //线路站点
                    busLineItem.getBusStations();
                    Log.e("TAG",busLineItem.getBusLineName());
                    Log.e("TAG", "=>"+busLineItem.getBusStations().size());
                }
            }else{
                //失败
            }
        }
    });

模糊查找K1结果如下

E/TAG: K1路(火车站北广场--福州东南眼科医院金山新院)
E/TAG: =>28
E/TAG: K1路(福州东南眼科医院金山新院--火车站北广场)
E/TAG: =>28
E/TAG: 平潭K1路(区管委会--海关)
E/TAG: =>7
E/TAG: 平潭K1路(海关--区管委会)
E/TAG: =>7

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值