Android 使用高德SDK编写周边搜索定位

2023-11-17

转载请注明!

前言

使用高德SDK实现定位及周边的搜索界面,先看效果图:

效果图看这,传不上

使用到了高德以下sdk:

com.amap.api:3dmap:latest.integration
com.amap.api:search:latest.integration

思路分析

本文不对高德sdk的集成做介绍,主要说说实现该页面的思路。

需求:

  • 进入页面自动定位,并且展示周边
  • 搜索地点,并且展示该地点周边
  • 周边列表的点击,然后切换地图的定位蓝点

具体实现

首先需要注意权限的获取。
初始化高德相关的东西:

    /**
     * 初始化定位相关
     */
    private fun initLocationAbout() {
        val myLocationStyle = MyLocationStyle()
        myLocationStyle.showMyLocation(true)
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW)
        //设置默认定位按钮是否显示
        mMap.uiSettings.isMyLocationButtonEnabled = false
        //设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false
        mMap.isMyLocationEnabled = true
        mMap.myLocationStyle = myLocationStyle
        //第一次定位
        mMap.setOnMyLocationChangeListener {
            val latLng = LatLng(it.latitude, it.longitude)
            cameraMove(latLng)
        }
        mMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener {
            override fun onCameraChangeFinish(p0: CameraPosition) {
                cameraMarkers(p0.target)
                //判断是否需要搜索周边
                if (isSearchRound) {
                    poiSearch(p0.target)
                }
                isSearchRound = true
            }

            override fun onCameraChange(p0: CameraPosition) {
            }

        })
    }

移动定位点的方法:

    /**
     * 移动地图
     * @param latLng 坐标
     */
    private fun cameraMove(latLng: LatLng) {
        //其中的18f表示的是地图放大级别
        val camera = CameraUpdateFactory.newCameraPosition(CameraPosition(latLng, 18f, 0f, 0f))
        mMap.moveCamera(camera)
    }

周边搜索的方法:

/**
     * 周边搜索
     */
    private fun poiSearch(latLng: LatLng) {
        val point = LatLonPoint(latLng.latitude, latLng.longitude)
        val geocodeSearch = GeocodeSearch(this)
        val regeocodeQuery = RegeocodeQuery(point, 200f, GeocodeSearch.AMAP)

        geocodeSearch.getFromLocationAsyn(regeocodeQuery)
        geocodeSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
            /**
             * 逆地理编码
             */
            override fun onRegeocodeSearched(p0: RegeocodeResult, p1: Int) {
                if (p1 == AMapException.CODE_AMAP_SUCCESS) {
                    //创建当前位置的poi
                    val nowPoiltem = PoiItem(
                        "111",
                        p0.regeocodeQuery.point,
                        "地图位置",
                        p0.regeocodeAddress.formatAddress
                    )
                    nowPoiltem.adCode = p0.regeocodeAddress.adCode
                    nowPoiltem.provinceName = p0.regeocodeAddress.province
                    nowPoiltem.cityName = p0.regeocodeAddress.city
                    nowPoiltem.adName = p0.regeocodeAddress.district
                    val locationList = mutableListOf<PoiItem>()
                    //因为搜索的周边列表并不包含当前搜索的位置,所以需要把当前位置插进去
                    locationList.add(nowPoiltem)
                    locationList.addAll(p0.regeocodeAddress.pois)
                    //周边展示的Adapter
                    mAdapter.setCityAbout(
                        p0.regeocodeAddress.province,
                        p0.regeocodeAddress.city,
                        p0.regeocodeAddress.district
                    )
                    mAdapter.replaceData(locationList)
                    mAdapter.setEmptyView(mNoData)
                } else {
                    mAdapter.setEmptyView(mErrorLoad)
                }
            }

            /**
             * 地理编码
             */
            override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
                hideLoading()
            }

        })
    }

关键字搜索:

    /**
     * 搜索关键字
     */
    private fun doSearchQuery(keyWord: String) {
        val query = PoiSearch.Query(keyWord, "", mCity)
        query.pageSize = 50
        query.pageNum = 0
        //搜索
        val poiSearch = PoiSearch(this, query)
        poiSearch.setOnPoiSearchListener(this)
        poiSearch.searchPOIAsyn()
        showLoading()
    }

    /**
     * 可以在回调中解析result,获取POI信息
     * result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类
     * 返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
     */
    override fun onPoiSearched(p0: PoiResult, p1: Int) {
        hideLoading()
        if (p1 == AMapException.CODE_AMAP_SUCCESS) {
            mPopupLocation.replaceData(p0.pois)
            //弹出框
            mXPopup?.show()
        } else {
            App.mApplication.toast("搜索地址错误!")
        }
    }

周边列表的点击:

    mAdapter.setOnItemClickListener { adapter, view, position ->

            val data: PoiItem = adapter.data[position] as PoiItem
            isSearchRound = false
            mSelectLocation = position
            mAdapter.selectLocation(position)
            //移动点
            val latLng = LatLng(data.latLonPoint.latitude, data.latLonPoint.longitude)
            //创建
            cameraMove(latLng)
    }

页面功能通过以上方法就能实现,如果发现某些监听不会回调,先看看引入的sdk。在编写时,我一开始引用的高德的2dmap,发现地图移动的监听不会回调,然后换到3dmap就好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 使用高德SDK编写周边搜索定位 的相关文章

  • 服务在后台运行?

    我正在构建的应用程序的功能之一是记录功能 我通过在服务中启动 MediaRecorder 对象来实现此目的 Intent intent new Intent v getContext RecordService class Messenge
  • Android,让文本切换器成为中心?

    如何集中我的文本切换器 我尝试过设置重力 但似乎不起作用 ts setFactory new ViewFactory public View makeView TextView t new TextView this t setTypefa
  • 相当于Android中的javax.swing.Timer

    有没有类似的东西javax swing Timer在安卓上 我知道如何创建自己的线程 但是有类似摆动计时器的东西吗 您可能正在寻找课程android os CountDownTimer http developer android com
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • 安卓;在 AdapterViewFlipper 上设置输入/输出动画:未知的动画师名称翻译

    我有一些非常简单的动画 可以与 ViewFlipper 完美配合 但如果我尝试在 AdapterViewFlipper 输入 输出上设置它们 我会收到运行时错误 未知的动画师名称翻译 查看每个方法的相应方法 看起来 ViewFlipper
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Android接收通知打开和取消事件

    我从 webService 接收数据以生成自定义通知 我想追踪Intent要知道open 点击 或cancel 滑动 通知上的事件 以报告服务器进行分析 有没有听众onIntentStart or onIntentCanceled 也许是通
  • 来自外部 XML 的 Android 本地化

    是否可以使用从服务接收到的 XML 在运行时翻译 Android 应用程序 如果可能的话 请有人指出我正确的方向 谢谢 Warning 我读到的所有内容都表明 让您的应用程序更改语言不是一个好主意 因为 Android 框架不支持它 并且可
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 如何使用 onSearchRequested() 调用搜索对话框

    我正在尝试实现搜索对话框 但无法显示活动中的搜索 我在清单文件中定义了主要活动 此活动向用户显示了他们必须从中选择的选项列表 选项之一是 搜索 选项
  • Android框架结构与MFC/Win32结构的比较?

    我为 Android 和 Windows 进行开发 使用 MFC 有时使用 win32 昨天我随意比较了这两个框架 它们显然非常非常不同 因此 Windows 开发与 Android 开发有很大不同 我想知道人们认为 Android 这样的
  • 如何在Android中隐藏应用程序标题? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想隐藏应用程序标题栏 您可以通过编程来完成 import android app Activity import android os
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • onTouch 给出奇怪的触摸点 Android

    我正在做的事情非常简单 我以前做过 但现在它没有按我的预期运行 无论如何 让我简要解释一下我正在尝试做什么以及我得到了什么 设想 我有一个RelativeLayout其中一个ImageView已放置 现在我设置touchlistener像这
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

    我已将 firebase 消息传递添加到我的 Flutter 项目中 在 iOS 上运行良好 在 Android 上运行时出现错误 Android dependency androidx localbroadcastmanager loca

随机推荐