加载中...

Android(安卓) 接入高德地图 显示热力图 置顶!

安卓接入高德地图 API 展示热力图

概述:因为要用到这个,所以记一下怎么弄的,以后可能会用到。废话不多说;

首先,去高德地图 API 官网搞一个 key

mark

KEY 名称自定义,中英文都可以,只是让你分辨你的 key, 安全码 SHA1 的获取见:

https://www.lonuslan.com/articles/2020/06/23/1592905144300.html

建立好后会在我的应用里生成一个 KEY ,记住这个,复制下这个后面会用到。

之后在 AndroidManifest.xml<application 标签内添加:

<!-- //配置应用的AppKey,唯一的,需申请 -->
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="您刚刚申请的key"/>
        <!-- 声明定位 service-->
        <service android:name="com.amap.api.location.APSService"/>

<manifest 标签内添加获取网络权限等:

<!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

build.gradledependencies 中添加获取高德地图 sdk 依赖:

    //高德地图配置开始

    //3D地图so及jar
    implementation 'com.amap.api:3dmap:latest.integration'
//    implementation 'com.amap.api:3dmap:latest.integration'
    //定位功能
//    implementation 'com.amap.api:map2d:latest.integration'
    //定位功能
    implementation 'com.amap.api:location:latest.integration'
    //搜索功能
    implementation 'com.amap.api:search:latest.integration'

    //高德地图配置结束

针对不同架构,添加 3d 支持:

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.example.testapplication"
        minSdkVersion 15
        targetSdkVersion 29
//        multiDexEnabled true
        multiDexEnabled false
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //高德地图配置开始
        ndk {
            //设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
            abiFilters "armeabi", "armeabi-v7a"
        }
        //    , "arm64-v8a" , "x86","x86_64" , "arm64-v8a"
        //高德地图配置结束
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath true
            }
        }
    }
    //高德地图配置开始
    packagingOptions {
        doNotStrip "*/armeabi/*.so"
        doNotStrip "*/armeabi-v7a/*.so"
//        doNotStrip "*/arm64-v8a/*.so"
//        doNotStrip "*/x86/*.so"
//        doNotStrip "*/x86_64/*.so"
//        doNotStrip "*/mips/*.so"
//        doNotStrip "*/mips64/*.so"
    // 高德地图配置结束
    }
    
    //其他配置...
}

这里可能会出现 地图闪退 或者 APP 崩溃 的现象。建议尝试一下使用 gradle 工具 clean 之后再 build.

mark

之后就可以按照官方文档愉快的进行开发了,给个示例参考,其实官方代码也有:

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
    android:background="#FFFFFF"
    android:orientation="vertical"
    tools:context=".activity.BaseUseActivity">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="热力图"
        android:textSize="18sp"
        android:textAlignment="center"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:textColor="@color/defineBlue"/>

    <LinearLayout
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:orientation="vertical">
        <com.amap.api.maps.MapView
            android:id="@+id/gaode_map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_gravity="center"
        >

        <TextView
            android:id="@+id/tv_open_hot_area"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:textColor="#ffffff"
            android:text="显示热力图"
            android:textSize="18sp"
            android:textAlignment="center"
            android:paddingTop="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="20dp"
            android:background="@drawable/btn_all_shape"
            />

        <TextView
            android:id="@+id/tv_close_hot_area"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="40dp"
            android:textColor="#ffffff"
            android:text="关闭热力图"
            android:textSize="18sp"
            android:textAlignment="center"
            android:paddingTop="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginRight="50dp"
            android:background="@drawable/btn_all_shape"
            />

    </LinearLayout>

</LinearLayout>

activity.class

package com.example.testapplication.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.Gradient;
import com.amap.api.maps.model.HeatmapTileProvider;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.maps.model.TileOverlayOptions;
import com.amap.api.maps.model.WeightedLatLng;
import com.example.testapplication.R;
import com.example.testapplication.util.HotAreaUtil;

import java.io.IOException;
import java.util.Arrays;

public class BaseUseActivity extends AppCompatActivity implements View.OnClickListener {

    private MapView mapView;

    private AMap aMap;

    private TextView tvOpenHotArea;

    private TextView tvCloseHotArea;

    private UiSettings uiSettings;

    private MyLocationStyle myLocationStyle;


    private static final int[] ALT_HEATMAP_GRADIENT_COLORS = {
            Color.rgb( 0, 0, 255),
            Color.rgb( 0, 211, 248),
            Color.rgb(0, 255, 0),
            Color.rgb(185, 71, 0),
            Color.rgb(255, 0, 0)
    };

    public static final float[] ALT_HEATMAP_GRADIENT_START_POINTS = { 0.1f,
            0.2f, 0.25f, 0.4f, 1f };


    public static final Gradient ALT_HEATMAP_GRADIENT = new Gradient(
            ALT_HEATMAP_GRADIENT_COLORS, ALT_HEATMAP_GRADIENT_START_POINTS);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_use);
        mapView = findViewById(R.id.gaode_map);
        mapView.onCreate(savedInstanceState);
        if (aMap == null){
            aMap = mapView.getMap();
        }
        uiSettings = aMap.getUiSettings();
        initView();
        moveToTargetLocation();
    }

    private void initLocation() {
        myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
//        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) ;//定位一次,且将视角移动到地图中心点。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
        uiSettings.setMyLocationButtonEnabled(true);
        aMap.setMyLocationEnabled(true);// 可触发定位并显示当前位置
        uiSettings.setScaleControlsEnabled(true);//控制比例尺控件是否显示
        aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        aMap.moveCamera(CameraUpdateFactory.zoomTo(15));//设置中心点和缩放比例
    }

    private void moveToTargetLocation(){
        aMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(**, **), 15, 0, 0)));
    }

    private void initView() {
        tvOpenHotArea = findViewById(R.id.tv_open_hot_area);
        tvOpenHotArea.setOnClickListener(this);

        tvCloseHotArea = findViewById(R.id.tv_close_hot_area);
        tvCloseHotArea.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_close_hot_area:
                //TODO 关闭当前定位优化;
                aMap.clear();
                aMap.removecache();
                moveToTargetLocation();
                break;
            case R.id.tv_open_hot_area:
                //随机生成热力点坐标列表
//                LatLng[] latlngs = new LatLng[500];
//                double x = 30.457958;
//                double y = 106.631689;
//
//                for (int i = 0; i < 500; i++) {
//                    double x_ = 0;
//                    double y_ = 0;
//                    x_ = Math.random() * 0.5 - 0.25;
//                    y_ = Math.random() * 0.5 - 0.25;
//                    latlngs[i] = new LatLng(x + x_, y + y_);
//                }
                // 构建热力图 HeatmapTileProvider
                HeatmapTileProvider.Builder builder = new HeatmapTileProvider.Builder();
                try {
                    WeightedLatLng[] weightedLatLng = HotAreaUtil.getHotAreaData("data.txt");
                    // 设置热力图绘制的数据
                    builder.weightedData(Arrays.asList(weightedLatLng))
                            .radius(25)
                            .gradient(ALT_HEATMAP_GRADIENT);
                    // 设置热力图渐变,有默认值 DEFAULT_GRADIENT,可不设置该接口
                    // Gradient 的设置可见参考手册
                    //这里也可以试试官方的随机数据看看效果
                    //builder.data(Arraysd.asList(latlngs)
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 构造热力图对象
                HeatmapTileProvider heatmapTileProvider = builder.build();
                // 初始化 TileOverlayOptions
                TileOverlayOptions tileOverlayOptions = new TileOverlayOptions();
                tileOverlayOptions.tileProvider(heatmapTileProvider); // 设置瓦片图层的提供者
                // 向地图上添加 TileOverlayOptions 类对象
                aMap.addTileOverlay(tileOverlayOptions);
                break;
        }
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

}

详细的接口文档,可参照官方:

https://a.amap.com/lbs/static/unzip/Android_Map_Doc/index.html


标题:Android(安卓) 接入高德地图 显示热力图
作者:lonuslan
地址:https://lonuslan.com/articles/2020/06/23/1592907794639.html


评论