Android 使用高德地图

一、获取高德平台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)
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

沈阳地铁四号线部署智和信通运维方案,实现对工业交换机统一纳管

沈阳地铁4号线一期工程线路起于正新路站&#xff0c;途经和平区、沈河区、大东区、苏家屯区、浑南区&#xff0c;贯穿沈阳北站、沈阳南站、太原街、沈阳大学、长白岛、浑南产业区等区域&#xff0c;止于创新路站&#xff0c;大致呈南北走向。 项目现状 沈阳地铁4号线一期工程线…

点餐APP开发需要用到的一些源代码

在数字化日益普及的今天&#xff0c;点餐APP已经成为人们日常生活的重要组成部分&#xff0c;从校园食堂到高级餐厅&#xff0c;从快餐外卖到定制化营养餐&#xff0c;点餐APP的多样性和便利性满足了不同用户的需求&#xff0c;本文将深入探讨在开发一款点餐APP时可能用到的源代…

Android Studio 出现 “Index is not created for `Stubs‘“ 的原因,如何解决?

亲爱的朋友们&#xff01;大家好我是咕噜铁蛋&#xff01;&#xff0c;今天我将与大家分享一个在Android Studio开发过程中可能遇到的问题&#xff1a;“Index is not created for Stubs”。这个问题看似不起眼&#xff0c;但实际上可能会对开发效率产生不小的影响。下面&#…

c++之说_9_6|自定义类型 struct operator 重载运算符关键字

c中 struct 和 class 特性几乎一模一样 所以很多都是共有的特性 篇幅就很多了 c中 我觉得最牛皮的概念之一 就是 重载运算符 operator 关键字 这个东西 能将 我们的 运算符 &#xff08;-*/&#xff09; new delete 类型转换 写在类里面当成员函数 并制定 该类型变…

大数据-Spark-关于Json数据格式的数据的处理与练习

上一篇&#xff1a; 大数据-MapReduce-关于Json数据格式的数据的处理与练习-CSDN博客 16.7 Json在Spark中的引用 依旧利用上篇的数据去获取每部电影的平均分 {"mid":1,"rate":6,"uid":"u001","ts":15632433243} {"m…

linux系统查看占用cpu程序

目录 一&#xff1a;top 二&#xff1a; ps 三&#xff1a;perf 四&#xff1a;/proc/stat 五&#xff1a;pidstat 一&#xff1a;top 使用 top 命令&#xff1a;在终端中输入 top 命令&#xff0c;系统会显示当前正在运行的进程和它们的资源占用情况。默认情况下&#…

使用AKStream对接gb28181

优点&#xff1a;功能比较多&#xff0c;C#开发的&#xff0c;容易修改&#xff0c;内嵌入了zlmk流媒体服务品&#xff0c;启动简单 缺点&#xff1a;sip对摄像头兼容还有问题&#xff0c;大华接入非常不稳定&#xff0c;注册等待时间久&#xff0c;对海康是正常&#xff0c;占…

Oracle 的闪回技术是什么

什么是闪回 Oracle 数据库闪回技术是一组独特而丰富的数据恢复解决方案&#xff0c;能够有选择性地高效撤销一个错误的影响&#xff0c;从人为错误中恢复。闪回是一种数据恢复技术&#xff0c;它使得数据库可以回到过去的某个状态&#xff0c;可以满足用户的逻辑错误的快速恢复…

LabVIEW电液伺服控制系统

介绍了如何利用ARM微处理器和LabVIEW软件开发一个高效、精准的电液伺服控制系统。通过结合这两种技术&#xff0c;我们能够提高系统的数字化程度、集成化水平&#xff0c;以及控制精度&#xff0c;从而应对传统电液伺服控制器面临的问题。 该电液伺服控制系统由多个关键部分组…

TypeScript(八) number和string

1. TypeScript number 1.1. 描述 Number对象是原始数值的包装对象。 1.2.语法 var num new Number(value);;注意&#xff1a;如果一个参数值不能转换为一个数字&#xff0c;将返回NaN&#xff08;非数字值&#xff09;。 1.3. 对象属性 属性描述MAX_VALUE可表示的最大的数…

Postman-接口测试教程

接口是软件开发中常用的概念&#xff0c;是软件生产过程中比较核心的任务。对于接口开发者&#xff0c;调试接口是一件较为繁琐的事情&#xff0c;很多时候需要线上线下来回切换。在这里&#xff0c;我就跟大家介绍一个只需要在本地就可以调试接口的方法&#xff0c;即使用post…

Dubbo 3.x源码(17)—Dubbo服务发布导出源码(6)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(16)—Dubbo服务发布导出源码(5)&#xff0c;也就是Dubbo远程服务在导出远程服务得到Exporter之后&#xff0c;继续通过Registry将其注册到远程注册中心的源码。 实际上&#x…

git的分支操作

目录 简介&#xff1a; 操作&#xff1a;查看 操作&#xff1a;创建 操作&#xff1a;切换​编辑 操作&#xff1a;本地分支推送到远程 操作&#xff1a;git merge [name]合并分支​编辑 简介&#xff1a; 在Git中&#xff0c;可以通过分支来管理和处理不同的版本和功能。分…

DSP系统时钟总结

一、stm32中断偏移向量介绍 1.1 为什么要设置中断向量偏移 上图可以看出程序上电先进入0x08000000开始运行&#xff0c;紧接着执行复位中断向量&#xff0c;然后执行复位中断程序&#xff0c;然后进入main函数。 如果想要app的中断正常运行&#xff0c;那就必须手动设置中断向…

在本地电脑上打开服务器里面的localhost网址

远程连接服务器&#xff0c;启动了一个服务 显示访问地址为&#xff1a;http://127.0.0.1:7860 在本地浏览器将127.0.0.1改成服务器ip但是无法访问 解决办法&#xff1a; 1. ssh新建一个远程连接&#xff0c;将服务器的7860端口重定向到本机 ssh -L 18097:127.0.0.1:7860 us…

LeetCode 54 螺旋矩阵

题目描述 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#x…

qt-C++笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别

qt-C笔记之QStringList、QList、QString、QChar、QList区别 —— 杭州 2024-01-30 凌晨0:27 参考博文&#xff1a;qt-C笔记之QStringList code review! 文章目录 qt-C笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别1.Qt的字符容器类1.QSt…

PHP抽奖设置中奖率,以及防高并发

一、中奖率,先在后台设定好奖项名称,抽奖份数,以及中奖百分比 奖品表draw 二、 借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙" 阻塞(等待)模式,一般都是用这个模…

五大架构之一:系统架构数据流风格

系统架构数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格&#xff0c;它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程&#xff0c;以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff…

-1- Python环境安装

1、Python安装 1、Windows安装Python 进入python官网&#xff1a;Welcome to Python.org点击 download——>all releases&#xff1b;建议选择3.7.2版本&#xff08;网页链接&#xff1a;Python Release Python 3.7.2 | Python.org&#xff09;&#xff1b;下拉&#xff0…