19软件2班 百度地图

19软件2班 百度地图

登录账号 申请应用

https://map.baidu.com
http://lbsyun.baidu.com/
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

将dubug.keystore文件直接复制一份 放在 java bin目录下面
keytool -list -v -keystore debug.keystore

在这里插入图片描述

拿到sha1
32:13:5C:4F:9F:D0:96:DE:7E:5F:98:AE:77:DB:53:16:C7:42:60:5F
下载sdk,将需要的so和jar放到libs

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

MapApplication.java 内容
package com.example.demo;

import android.app.Application;
import android.util.Log;

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;

public class MapApplication extends Application {
    @Override
    public void onCreate() {
        Log.e("MapApplication", "onCreate");
        super.onCreate();

        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

在这里插入图片描述

布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.baidu.mapapi.map.MapView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/bmap_view"/>

</LinearLayout>
MainActivity.java
package com.example.demo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.baidu.mapapi.map.MapView;

public class MainActivity extends AppCompatActivity {
    private MapView bmap_view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bmap_view = findViewById(R.id.bmap_view);
    }

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

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        bmap_view.onDestroy();
    }
}
运行效果

在这里插入图片描述

切换地图类型

在这里插入图片描述
在这里插入图片描述

		bmap_view = findViewById(R.id.bmap_view);
        baiduMap = bmap_view.getMap();
        baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
交通图

//开启交通图   
mBaiduMap.setTrafficEnabled(true);

在这里插入图片描述
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(true);

显示定位

在这里插入图片描述

定义一个LocationListener

// 定义一个LocationListener
    class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
           Log.e("MyLocationListener", "onReceiveLocation location = " + location.toString());

            //mapView 销毁后不在处理新接收的位置
            if (bdLocation == null || bmap_view == null){
                return;
            }

            // 使用新的经纬度构建一个update属性
            LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng);
            baiduMap.animateMapStatus(update);

            // 调整缩放级别
           update = MapStatusUpdateFactory.zoomTo(18);
           baiduMap.animateMapStatus(update);


            /** 这段代码 屏幕没有刷新 。。。
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude()).build();

            baiduMap.setMyLocationData(locData);
             **/
        }
    }

使用客户端开启定位

 // 开启百度定位
    private void startLocate() {
        locationClient = new LocationClient(MainActivity.this);

        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd09ll");
        option.setScanSpan(1000);

        locationClient.setLocOption(option);

        MyLocationListener listener = new MyLocationListener();

        locationClient.registerLocationListener(listener);
        locationClient.start();
    }

在这里插入图片描述

设置定位图标
 // 设置定位图标
        MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(
                MyLocationConfiguration.LocationMode.NORMAL,
                true,
                BitmapDescriptorFactory.fromResource(R.drawable.location),
                0xAAFFFF88,
                0xAA00FF00
                );

        baiduMap.setMyLocationConfiguration(myLocationConfiguration);

事件交互

 // 1.设置地图状态变化的listener
       baiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus) {
                Log.e("onMapStatusChangeStart", mapStatus.toString());
                // MapStatus@4324312
            }

            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
                Log.e("onMapStatusChangeStart", mapStatus.toString() + "i = " + i);

            }

            @Override
            public void onMapStatusChange(MapStatus mapStatus) {
                Log.e("onMapStatusChange", mapStatus.toString());
            }

            @Override
            public void onMapStatusChangeFinish(MapStatus mapStatus) {
                Log.e("onMapStatusChangeFinish", mapStatus.toString());
            }
        });

        // 2 地图单击事件
        // Poi  point of intrest
        baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                Log.e("onMapClick", latLng.toString());
            }

            @Override
            public void onMapPoiClick(MapPoi mapPoi) {
                Log.e("onMapClick", mapPoi.getName() + mapPoi.getPosition().toString());
            }
        });

        // 3 地图双击事件
        baiduMap.setOnMapDoubleClickListener(new BaiduMap.OnMapDoubleClickListener() {
            @Override
            public void onMapDoubleClick(LatLng latLng) {
                Log.e("onMapDoubleClick", latLng.toString());
            }
        });

        // 4 地图长按事件
        baiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng latLng) {
                Log.e("onMapLongClick", latLng.toString());
                baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
            }
        });

        // 5 地图触摸事件
        baiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
            @Override
            public void onTouch(MotionEvent motionEvent) {
                Log.e("onTouch", motionEvent.toString());
            }
        });

        // 6 地图加载完成
        baiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                Log.e("onMapLoaded","地图加载完成");
            }
        });

        // 7 地图渲染完成
        baiduMap.setOnMapRenderCallbadk(new BaiduMap.OnMapRenderCallback() {
            @Override
            public void onMapRenderFinished() {
                Log.e("onMapRenderFinished","地图渲染完成");
            }
        });

        // 8 地图截屏
        baiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
            @Override
            public void onSnapshotReady(Bitmap bitmap) {
                Log.e("onSnapshotReady", "bitmap size = " + bitmap.getByteCount());
            }
        });
设定显示范围
LatLng latLng1 = new LatLng(37.441307881538215, 116.36555252193881);
        LatLng latLng2 = new LatLng(39.09109951809685, 117.20809122585733);
        LatLng latLng3 = new LatLng(38.310215424237924, 116.84558003730572);

        LatLngBounds bounds = new LatLngBounds.Builder().
                include(latLng1).include(latLng2).include(latLng3).build();
        baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLngBounds(bounds));
绘制Marker
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
                        .fromResource(R.drawable.marker);
                OverlayOptions options = new MarkerOptions()
                        .icon(bitmapDescriptor)
                        .position(latLng);

                baiduMap.addOverlay(options);

在这里插入图片描述

绘制方框
  LatLng p1 = new LatLng(latLng.latitude+0.005, latLng.longitude-0.005);
                LatLng p2 = new LatLng(latLng.latitude-0.005, latLng.longitude-0.005);
                LatLng p3 = new LatLng(latLng.latitude-0.005, latLng.longitude+0.005);
                LatLng p4 = new LatLng(latLng.latitude+0.005, latLng.longitude+0.005);

                List<LatLng> points = new ArrayList<LatLng>();
                points.add(p1);
                points.add(p2);
                points.add(p3);
                points.add(p4);
                points.add(p1);

                OverlayOptions mOverlayOptions = new PolylineOptions()
                        .width(10)
                        .color(0xAAFF0000)
                        .points(points);

                baiduMap.addOverlay(mOverlayOptions);

在这里插入图片描述

绘制弧形

    /**
     * 绘制弧线
     * @param latLng
     */
    private void drawArc(LatLng latLng) {
        LatLng p1 = new LatLng(latLng.latitude-0.002, latLng.longitude-0.005);
        LatLng p2 = latLng;
        LatLng p3 = new LatLng(latLng.latitude-0.002, latLng.longitude+0.005);

        OverlayOptions overlayOptions = new ArcOptions()
                .color(Color.RED).width(10).points(p1, p2, p3);

        baiduMap.addOverlay(overlayOptions);
    }

绘制圆形

    /**
     * 绘制圆形
     * @param latLng 圆心坐标
     */
    private void drawCircle(LatLng latLng) {

        //构造CircleOptions对象
        CircleOptions mCircleOptions = new CircleOptions().center(latLng)
                .radius(500)
                .fillColor(0xAA0000FF) //填充颜色
                .stroke(new Stroke(5, 0xAA00ff00)); //边框宽和边框颜色

        baiduMap.addOverlay(mCircleOptions);
    }

绘制多边形

    /**
     * 绘制多边形
     * @param latLng
     */
    private void drawPolygon(LatLng latLng) {
        LatLng p1 = latLng;
        LatLng p2 = new LatLng(latLng.latitude, latLng.longitude+0.005);
        LatLng p3 = new LatLng(latLng.latitude-0.005, latLng.longitude+0.01);
        LatLng p4 = new LatLng(latLng.latitude-0.01, latLng.longitude+0.005);
        LatLng p5 = new LatLng(latLng.latitude-0.01, latLng.longitude);
        LatLng p6 = new LatLng(latLng.latitude-0.005, latLng.longitude-0.005);

        List<LatLng> pointList = new ArrayList<>();
        pointList.add(p1);
        pointList.add(p2);
        pointList.add(p3);
        pointList.add(p4);
        pointList.add(p5);
        pointList.add(p6);


        //构造PolygonOptions
        PolygonOptions mPolygonOptions = new PolygonOptions()
                .points(pointList)
                .fillColor(0xAAFFFF00) //填充颜色
                .stroke(new Stroke(5, 0xAA00FF00)); //边框宽度和颜色

        baiduMap.addOverlay(mPolygonOptions);

    }

绘制文字

    /**
     * 绘制文本
     * @param latLng
     */
    private void drawText(LatLng latLng) {
        //构建TextOptions对象
        OverlayOptions mTextOptions = new TextOptions()
                .text("百度地图SDK") //文字内容
                .bgColor(0xAAFFFF00) //背景色
                .fontSize(24) //字号
                .fontColor(0xFFFF00FF) //文字颜色
//                .rotate(-30) //旋转角度
                .position(latLng);

        baiduMap.addOverlay(mTextOptions);
    }

绘制信息窗

/**
     * 绘制信息窗
     * @param latLng
     */
    private void drawInfoWindow(LatLng latLng) {
        //用来构造InfoWindow的Button
        Button button = new Button(getApplicationContext());
        button.setBackgroundResource(R.drawable.button);
        button.setText("故宫你好");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "InfoWindow被点击事件", Toast.LENGTH_SHORT).show();
            }
        });

        //构造InfoWindow
        //point 描述的位置点
        //-100 InfoWindow相对于point在y轴的偏移量
        InfoWindow mInfoWindow = new InfoWindow(button, latLng, -100);

        //使InfoWindow生效
        baiduMap.showInfoWindow(mInfoWindow);

    }

POI检索


    // 检索初始化
    private void initPoiSearch(){
        poiSearch = PoiSearch.newInstance();

        OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                List<PoiInfo> allPoi = poiResult.getAllPoi();
                //创建OverlayOptions的集合
                List<OverlayOptions> options = new ArrayList<OverlayOptions>();

               for(PoiInfo poiInfo : allPoi){
                    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.marker);
                    OverlayOptions overlayOptions = new MarkerOptions()
                            .position(poiInfo.location).icon(bitmapDescriptor).title(poiInfo.name);
                    options.add(overlayOptions);
                }

                baiduMap.addOverlays(options);
            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                Log.e("onGetPoiDetailResult", poiDetailResult.toString());
            }

            @Override
            public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
                Log.e("onGetPoiDetailResult", poiDetailSearchResult.toString());
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
                Log.e("onGetPoiIndoorResult", poiIndoorResult.toString());
            }
        };

        poiSearch.setOnGetPoiSearchResultListener(listener);
    }

    // 周边检索
    private void nearBySearch() {
        //23.189885425697206, longitude: 113.3582592194312
        poiSearch.searchNearby(new PoiNearbySearchOption()
                .location(new LatLng(23.189885425697206, 113.3582592194312))
                .radius(1000)
                .keyword("美食")
                .pageNum(10));
    }

    /**
     * POI城市检索
     */
    private void poiCitySearch() {
        poiSearch.searchInCity(new PoiCitySearchOption().city("广州").keyword("美食").pageNum(10));
    }
区域检索
 private void boundSearch() {
        //latitude: 23.135834966085195, longitude: 113.2912276622988
        //latitude: 23.197118720735396, longitude: 113.36530193462711
        /**
         * 设置矩形检索区域
         */
        LatLngBounds searchBounds = new LatLngBounds.Builder()
                .include(new LatLng( 23.135834966085195, 113.2912276622988 ))
                .include(new LatLng( 23.197118720735396, 113.36530193462711))
                .build();

        poiSearch.searchInBound(new PoiBoundSearchOption().bound(searchBounds).keyword("银行").pageNum(10));

    }
地点输入提示检索
private void suggestSearch() {
        SuggestionSearch suggestionSearch = SuggestionSearch.newInstance();

        OnGetSuggestionResultListener listener =  new OnGetSuggestionResultListener() {
            @Override
            public void onGetSuggestionResult(SuggestionResult suggestionResult) {
                Log.e("onGetSuggestionResult", suggestionResult.getAllSuggestions().toString());
            }
        };

        suggestionSearch.setOnGetSuggestionResultListener(listener);

        suggestionSearch.requestSuggestion(new SuggestionSearchOption().city("广州").keyword("广州"));
    }
公交检索

在这里插入图片描述

private void busSearch() {
//        poiSearch.searchInCity(new PoiCitySearchOption().city("广州").keyword("1号线"));
        //uid = 6ceda41e4c1e9a9b3ce231b7 name = 地铁1号线(广州东站-西塱)
        BusLineSearch busLineSearch = BusLineSearch.newInstance();
        OnGetBusLineSearchResultListener listener = new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {
                Log.e("onGetBusLineResult", busLineResult.toString());
                BusLineOverlay overlay = new BusLineOverlay(baiduMap);
                overlay.setData(busLineResult);
                overlay.addToMap();
                overlay.zoomToSpan();

            }
        };

        busLineSearch.setOnGetBusLineSearchResultListener(listener);

        busLineSearch.searchBusLine(new BusLineSearchOption().city("广州").uid("6ceda41e4c1e9a9b3ce231b7"));
    }

天气检索
/**
     * 天气检索
     */
    private void weatherSearch() {
        String districtID = "110105"; // 天安门区域ID
        WeatherSearchOption weatherSearchOption = new WeatherSearchOption()
                .weatherDataType(WeatherDataType.WEATHER_DATA_TYPE_ALL)
                .districtID(districtID);

        WeatherSearch mWeatherSearch = WeatherSearch.newInstance();
        mWeatherSearch.setWeatherSearchResultListener(new OnGetWeatherResultListener() {
            @Override
            public void onGetWeatherResultListener(final WeatherResult weatherResult) {
                WeatherSearchRealTime realTimeWeather = weatherResult.getRealTimeWeather();
                Log.e("onGetWeather", realTimeWeather.getPhenomenon() + realTimeWeather.getTemperature());
            }
        });

        mWeatherSearch.request(weatherSearchOption);
    }
推荐上车点
 /**
     * 推荐上车点
     */
    private void stepSearch() {
        RecommendStopSearch recommendStopSearch = RecommendStopSearch.newInstance();
        OnGetRecommendStopResultListener listener = new OnGetRecommendStopResultListener() {
            @Override
            public void onGetRecommendStopResult(RecommendStopResult recommendStopResult) {
                Log.e("onGetRecommend", recommendStopResult.getRecommendStopInfoList().get(1).getName());
            }
        };

        recommendStopSearch.setOnGetRecommendStopResultListener(listener);
//        latitude: 23.135834966085195, longitude: 113.2912276622988
        LatLng latLng = new LatLng( 23.135834966085195,113.2912276622988);
        recommendStopSearch.requestRecommendStop(new RecommendStopSearchOption().location(latLng));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值