Android(安卓) 接入高德地图 显示热力图
安卓接入高德地图API展示热力图
概述:因为要用到这个,所以记一下怎么弄的,以后可能会用到。废话不多说;
首先,去高德地图 API
官网搞一个 key
。
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.gradle 下 dependencies 中添加获取高德地图 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
.
之后就可以按照官方文档愉快的进行开发了,给个示例参考,其实官方代码也有:
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(安卓) 接入高德地图 显示热力图
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议。转载请注明来自 Hi I'm LouisLan!
评论
0 评论