Android 使用高德地图

news2024/11/15 20:48:57

一、获取高德平台key

【1】基于application包名&sha1值在高德控制台获取key值,详情参考:  获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API

【2】在manifest中声明权限

【3】将拿到的key值在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" /> 
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="xxxxxxxxxxxx" />

二、集成依赖

在app build.gradle文件中增加高德地图依赖

implementation("com.amap.api:3dmap:9.8.2")

三、显示地图

概述-Android 地图SDK | 高德地图API

在xml文件中声明MapView控件,并在class中重写 onCreate 方法(此方法必须重写),注意生命周期的管理

<com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
private var mapView: MapView? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.test_activity)
    mapView = findViewById(R.id.map)
    mapView?.onCreate(savedInstanceState)
}

override fun onResume() {
    super.onResume()
    mapView?.onResume()
}

override fun onPause() {
    super.onPause()
    mapView?.onPause()
}

override fun onDestroy() {
    super.onDestroy()
    mapView?.onDestroy()
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    mapView?.onSaveInstanceState(outState)
}

地图默认中心点为北京天安门

四、高德地图具体使用

以下对于地图的控制使用之前需要拿到AMap对象

map = mapView?.map

1、切换城市中心点

private fun moveCenterTo(latLng: LatLng) {
    val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)
    map?.moveCamera(cameraUpdate)
}

Android高德地图切换城市中心点展示

2、设置缩放级别

moveCamera(CameraUpdateFactory.zoomTo(14.0f))

3、绘制marker

companion object {
    private val MARKER1 = LatLng(40.02855349893361, 116.3052948784071)
    private val MARKER2 = LatLng(41.093445392798934, 116.11030767409169)
}


val marker1: MarkerOptions = MarkerOptions().apply {
    position(MARKER1)
}
val marker2: MarkerOptions = MarkerOptions().apply {
    position(MARKER2)
}

val list = ArrayList<MarkerOptions>()
list.add(marker1)
list.add(marker2)
map?.addMarkers(list, false)

如下图所示,不设置icon默认展示蓝色定位图标。

11

针对marker可以设置的属性:

position在地图上标记位置的经纬度值,必填参数
title点标记的标题
snippet点标记的内容
draggable点标记是否可拖拽
visible点标记是否可见
anchor点标记的锚点
alpha点的透明度

public final java.util.ArrayList<Marker> addMarkers(java.util.ArrayList<MarkerOptions> options, boolean moveToCenter)

在地图上添一组图片标记(marker)对象,并设置是否改变地图状态以至于所有的marker对象都在当前地图可视区域范围内显示。

参数:

options - 多个markerOptions对象,它们分别定义了对应marker的属性信息。

moveToCenter - 是否改变地图状态,默认为false。

返回:

返回一组被添加的marker对象。

4、绘制折线

val latLngList = ArrayList<LatLng>()
latLngList.add(MARKER1)
latLngList.add(MARKER2)
map?.addPolyline(
    PolylineOptions().addAll(latLngList).width(3f).color(Color.RED)
)

5、轨迹

SmoothMoveMarker(map).apply {
setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.smooth))
                setPoints(latLngList)
                setTotalDuration(5)
                startSmoothMove()
            }

6、两点之间距离计算

AMapUtils.calculateLineDistance(latLng1,latLng2)

7、切换地图图层

【1】预设模式

mapType = AMap.MAP_TYPE_NIGHT

【2】在线自定义模式

val options = CustomMapStyleOptions().apply {
    isEnable = true
    styleId = ""
}
map?.setCustomMapStyle(options)

8、手势交互

map?.uiSettings.let {
    it.isRotateGesturesEnabled = false
    it.isZoomControlsEnabled = false
    it.isTiltGesturesEnabled = false
}

更多设置可参考:https://a.amap.com/lbs/static/unzip/Android_Map_Doc/3D/index.html?overview-summary.html

9、地图状态监听

            setOnMapLoadedListener(object : AMap.OnMapLoadedListener {
                override fun onMapLoaded() {
                    Log.e(TAG, "onMapLoaded...")
                }

            })
            //自带放大缩小接口
            setOnCameraChangeListener(object : AMap.OnCameraChangeListener {
                override fun onCameraChange(p0: CameraPosition?) {
                    //Log.e(TAG, "onCameraChange + ${p0?.toString()}")
                }

                override fun onCameraChangeFinish(p0: CameraPosition?) {
                    Log.e(TAG, "onCameraChangeFinish + ${p0?.toString()}")
                }

            })
            //map point点击事件
            addOnMapClickListener(object : AMap.OnMapClickListener {
                override fun onMapClick(p0: LatLng?) {
                    Log.e(TAG, "onMapClick + ${p0?.toString()}")
                }

            })
            //地图自带poi点击事件
            addOnPOIClickListener(object : AMap.OnPOIClickListener {
                override fun onPOIClick(p0: Poi?) {
                    Log.e(TAG, "onPOIClick + ${p0?.toString()}")
                }

            })
            addOnMarkerClickListener(object : AMap.OnMarkerClickListener {
                override fun onMarkerClick(p0: Marker?): Boolean {
                    Log.e(TAG, "onMarkerClick + ${p0?.id}")
                    return true
                }
            })

10、截图功能

拿到bitmap对象进行处理

map?.getMapScreenShot(object : AMap.OnMapScreenShotListener {
    override fun onMapScreenShot(p0: Bitmap?) {
        TODO("Not yet implemented")
    }

    override fun onMapScreenShot(p0: Bitmap?, p1: Int) {
        TODO("Not yet implemented")
    }

})

五、代码

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/bj"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:background="@drawable/button_bg"
            android:gravity="center"
            android:padding="10dp"
            android:text="北京"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/gz"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:background="@drawable/button_bg"
            android:gravity="center"
            android:padding="10dp"
            android:text="广州"
            android:textSize="18dp" />

        <TextView
            android:id="@+id/xa"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:background="@drawable/button_bg"
            android:gravity="center"
            android:padding="10dp"
            android:text="西安"
            android:textSize="18dp" />

        <ImageView
            android:id="@+id/share"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginLeft="20dp"
            android:scaleType="fitXY"
            android:src="@drawable/screenshot" />

    </LinearLayout>

</FrameLayout>
package com.example.myapplication

import android.graphics.Bitmap
import android.graphics.Color
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.ComponentActivity
import com.amap.api.maps.AMap
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.MapView
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Marker
import com.amap.api.maps.model.MarkerOptions
import com.amap.api.maps.model.Poi
import com.amap.api.maps.model.PolylineOptions
import com.amap.api.maps.utils.overlay.SmoothMoveMarker

class TestActivity : ComponentActivity() {

    private var mapView: MapView? = null
    private var map: AMap? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.test_activity)
        initMap(savedInstanceState)
        initView()
    }

    private fun initView() {
        findViewById<TextView>(R.id.bj).setOnClickListener { moveCenterTo(LATLNG_BJ) }
        findViewById<TextView>(R.id.gz).setOnClickListener { moveCenterTo(LATLNG_GZ) }
        findViewById<TextView>(R.id.xa).setOnClickListener { moveCenterTo(LATLNG_XA) }

        findViewById<ImageView>(R.id.share).setOnClickListener {
            map?.getMapScreenShot(object : AMap.OnMapScreenShotListener {
                override fun onMapScreenShot(p0: Bitmap?) {
                    TODO("Not yet implemented")
                }

                override fun onMapScreenShot(p0: Bitmap?, p1: Int) {
                    TODO("Not yet implemented")
                }

            })
        }
    }

    private fun initMap(savedInstanceState: Bundle?) {
        mapView = findViewById(R.id.map)
        mapView?.onCreate(savedInstanceState)
        mapView?.let {
            map = it.map
        }
        map?.apply {
            uiSettings.let {
                it.isRotateGesturesEnabled = false
                it.isZoomControlsEnabled = false
                it.isTiltGesturesEnabled = false
            }
            moveCamera(CameraUpdateFactory.zoomTo(8.0f))

            //自定义图层
//            val options = CustomMapStyleOptions().apply {
//                isEnable = true
//                styleId = ""
//            }
//            setCustomMapStyle(options)

//            mapType = AMap.MAP_TYPE_NIGHT

            setOnMapLoadedListener(object : AMap.OnMapLoadedListener {
                override fun onMapLoaded() {
                    Log.e(TAG, "onMapLoaded...")
                    //AnimatorUtil.obtainLinePointF(mapView, MARKER1, MARKER2)
//                    Handler().postDelayed(object : Runnable{
//                        override fun run() {
//                            AnimatorUtil.obtainLinePointF(mapView, MARKER2, MARKER3)
//                        }
//                    }, 500)
                }

            })
            //自带放大缩小接口
            setOnCameraChangeListener(object : AMap.OnCameraChangeListener {
                override fun onCameraChange(p0: CameraPosition?) {
                    //Log.e(TAG, "onCameraChange + ${p0?.toString()}")
                }

                override fun onCameraChangeFinish(p0: CameraPosition?) {
                    Log.e(TAG, "onCameraChangeFinish + ${p0?.toString()}")
                }

            })
            //map point点击事件
            addOnMapClickListener(object : AMap.OnMapClickListener {
                override fun onMapClick(p0: LatLng?) {
                    Log.e(TAG, "onMapClick + ${p0?.toString()}")
                }

            })
            //地图自带poi点击事件
            addOnPOIClickListener(object : AMap.OnPOIClickListener {
                override fun onPOIClick(p0: Poi?) {
                    Log.e(TAG, "onPOIClick + ${p0?.toString()}")
                }

            })
            addOnMarkerClickListener(object : AMap.OnMarkerClickListener {
                override fun onMarkerClick(p0: Marker?): Boolean {
                    Log.e(TAG, "onMarkerClick + ${p0?.id}")
                    return true
                }
            })

            setOnMyLocationChangeListener(object : AMap.OnMyLocationChangeListener {
                override fun onMyLocationChange(p0: Location?) {
                    Log.e(TAG, "setOnMyLocationChangeListener + ${p0?.toString()}")
                    p0?.let {
                        moveCamera(CameraUpdateFactory.newLatLng(LatLng(it.latitude, it.longitude)))
                    }
                }

            })
            //绘制marker点
            val marker1: MarkerOptions = MarkerOptions().apply {
                position(MARKER1)
            }
            val marker2: MarkerOptions = MarkerOptions().apply {
                position(MARKER2)
            }
            val list = ArrayList<MarkerOptions>()
            list.add(marker1)
            list.add(marker2)
            addMarkers(list, false)


//            val builder = LatLngBounds.builder().apply {
//                include(MARKER1)
//                include(MARKER2)
//                include(MARKER3)
//                include(MARKER4)
//            }
//            val bounds = builder.build()
//            moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 300))

            //绘制marker折线
            val latLngList = ArrayList<LatLng>()
            latLngList.add(MARKER1)
            latLngList.add(MARKER2)
            addPolyline(
                PolylineOptions().addAll(latLngList).width(3f)
                    .color(Color.RED)
            )

            //轨迹
            SmoothMoveMarker(map).apply {
                setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.smooth))
                setPoints(latLngList)
                setTotalDuration(5)
                startSmoothMove()
            }

        }

    }

    private fun moveCenterTo(latLng: LatLng) {
        val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)
        map?.moveCamera(cameraUpdate)
    }

    override fun onResume() {
        super.onResume()
        mapView?.onResume()
    }

    override fun onPause() {
        super.onPause()
        mapView?.onPause()
    }

    override fun onDestroy() {
        super.onDestroy()
        mapView?.onDestroy()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView?.onSaveInstanceState(outState)
    }

    companion object {
        private const val TAG = "TestActivity"
        private val MARKER1 = LatLng(40.02855349893361, 116.3052948784071)
        private val MARKER2 = LatLng(41.093445392798934, 116.11030767409169)
        private val LATLNG_BJ = LatLng(39.90508988475248, 116.4083842390264)
        private val LATLNG_GZ = LatLng(23.11523439186301, 113.24706837513949)
        private val LATLNG_XA = LatLng(34.321288624880815, 108.94042782381482)
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React-Native跟Android交互--简单示例记录

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

三步实现 Sentinel-Nacos 持久化

一、背景 版本&#xff1a;【Sentinel-1.8.6】 模式&#xff1a;【Push 模式】 参照官网介绍&#xff1a;生产环境下使用Sentinel &#xff0c;规则管理及推送模式有以下3种模式&#xff1a; 比较之后&#xff0c;目前微服务都使用了各种各样的配置中心&#xff0c;故采用Pus…

手机屏幕生产厂污废水处理需要哪些工艺设备

随着手机行业的快速发展&#xff0c;手机屏幕生产厂的规模也越来越大&#xff0c;但同时也带来了大量的污废水排放问题。为了保护环境和人类的健康&#xff0c;手机屏幕生产厂需要采取适当的工艺设备来处理污废水。本文将介绍手机屏幕生产厂污废水处理所需的工艺设备。 首先&am…

【环境配置】安装了pytorch但是报错torch.cuda.is_availabel()=Flase

解决思路&#xff1a;import torch正常&#xff0c;说明torch包安装正常&#xff0c;但是不能和gpu正常互动&#xff0c;猜测还是pytroch和cuda的配合问题 1.查看torch包所需的cuda版本 我的torch是2.0.1&#xff0c;在现在是比较新的包&#xff0c;需要12以上的cuda支持&…

【算法与数据结构】198、213、337LeetCode打家劫舍I, II, III

文章目录 一、198、打家劫舍二、213、打家劫舍 II三、337、打家劫舍III三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、198、打家劫舍 思路分析&#xff1a;打家劫舍是动态规划的的经典题目。本题的难点在于递归公式…

Android开发之UI控件

TextView 实现阴影效果的textview android:shadowColor"#ffff0000" 设置阴影颜色为红色android:shadowRadius"3" 设置阴影的模糊程度为3android:shadowDx"10" 设置阴影在水平方向的偏移android:shadowDy"10" 设置阴影在竖直方向的偏…

iOS17使用safari调试wkwebview

isInspectable配置 之前开发wkwebview的页面的时候一直使用safari调试&#xff0c;毕竟jssdk交互还是要用这个比较方便&#xff0c;虽说用一个脚本插件没问题。不过还是不太方便。 但是这个功能突然到了iOS17之后发现不能用了&#xff0c;还以为又是苹果搞得bug&#xff0c;每…

Unity 状态模式(实例详解)

文章目录 简介示例1&#xff1a;基础角色状态切换示例2&#xff1a;添加更多角色状态示例3&#xff1a;战斗状态示例4&#xff1a;动画同步状态示例5&#xff1a;状态机管理器示例6&#xff1a;状态间转换的条件触发示例7&#xff1a;多态行为与上下文类 简介 Unity 中的状态模…

一个产品是怎么诞生的

一个产品的诞生&#xff0c;首先从假设需求开始&#xff0c;或者从玩耍的创客开始。 假设需求往往风险很大&#xff0c;你如果没有结合实际的生活经验或者是玩耍经验&#xff0c;凭空在脑子里想到一个东西&#xff0c;要把它创造出来&#xff0c;这样的东西极有可能会遭遇商业上…

ASP.NET Core 使用 SignalR 的简单示例

写在前面 ASP.NET SignalR 是一个开源代码库&#xff0c;简化了Web实时通讯方案&#xff0c;可以实时地通过服务端将信息同步推送到各个客户端&#xff0c;可应用于 需要从服务器进行高频更新的应用&#xff1a;包括游戏、社交网络、投票、拍卖、地图和GPS应用&#xff1b; 仪…

Servlet过滤器个监听器

过滤器和监听器 过滤器 什么是过滤器 当浏览器向服务器发送请求的时候&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能&#xff0c;比如&#xff1a;编码设置、权限校验、日志记录等。 过滤器执行流程 Filter实例 package com.by.servlet;import jav…

2024年航海制造工程与海洋工程国际会议(ICNMEME2024)

一、【会议简介】 2024年航海制造工程与海洋工程国际会议(ICNMEME2024)旨在将研究人员、工程师、科学家和行业专业人士聚集在一个开放论坛上&#xff0c;展示他们在导航制造工程与海洋工程领域的激励研究和知识转移理念。然而&#xff0c;我们也认识到&#xff0c;工程师的未来…

【操作系统·考研】虚拟内存管理

1.概述 传统存储管理方式具有两个特征 一次性&#xff1a;作业必须一次性全部装入内存后&#xff0c;才能开始运行。驻留性&#xff1a;作业被装入内存后&#xff0c;就一直驻留在内存中&#xff0c;在其运行期间作业的任何部分都无法被换出。 显然&#xff0c;这两个特性非…

【深度学习】数据归一化/标准化 Normalization/Standardization

目录 一、实际问题 二、归一化 Normalization 三、归一化的类型 1. Min-max normalization (Rescaling) 2. Mean normalization 3.Z-score normalization (Standardization) 4.非线性归一化 4-1 对数归一化 4-2 反正切函数归一化 4-3 小数定标标准化&#xff08;Demi…

山海鲸智慧教育方案:教育数据的未来

作为山海鲸可视化软件的开发者&#xff0c;我们深知数据可视化在教育领域的重要价值。山海鲸智慧教育解决方案正是在这样的背景下应运而生&#xff0c;致力于为教育行业提供高效、直观的数据可视化解决方案。 随着教育信息化的深入推进&#xff0c;教育数据呈爆炸式增长。如何…

嵌入式学习 Day14

一. 三个函数 1.strncpy char *strncpy(char *dest, const char *src, size_t n) // 比正常拷贝多了一个n { n < strlen(src) // 只拷贝前n个字符&#xff0c;最终dest中不会有\0 n strlen(src) // 正常拷贝 n > strlen(src) …

【Golang】ModbusRTU协议CRC16校验算法

CRC校验码是通过在数据后面附加一个短的校验序列来生成的&#xff0c;用于检测数据在传输过程中是否发生错误。CRC16是一种特定的CRC校验算法&#xff0c;它生成一个16位的校验码。 下面是使用Go语言实现CRC16校验算法的代码&#xff1a; package main import ("encoding…

【01】Linux 基本操作指令

带⭐的为重要指令 &#x1f308; 01、ls 展示当前目录下所有文件&#x1f308; 02、pwd 显示用户当前所在路径&#x1f308; 03、cd 进入指定目录&#x1f308; 04、touch 新建文件&#x1f308; 05、tree 以树形结构展示所有文件⭐ 06、mkdir 新建目录⭐ 07、rmdir 删除目录⭐…

某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…