Android 使用高德SDK編寫周邊搜索定位

轉(zhuǎn)載請注明阿宅!

前言

使用高德SDK實現(xiàn)定位及周邊的搜索界面候衍,先看效果圖:

圖片上傳不了,沒得法洒放,點擊查看吧蛉鹿。。往湿。

使用到了高德以下sdk:

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

思路分析

本文不對高德sdk的集成做介紹妖异,主要說說實現(xiàn)該頁面的思路惋戏。

需求:

  • 進入頁面自動定位,并且展示周邊
  • 搜索地點他膳,并且展示該地點周邊
  • 周邊列表的點擊响逢,然后切換地圖的定位藍點

具體實現(xiàn)

首先需要注意權(quán)限的獲取。
初始化高德相關(guān)的東西:

    /**
     * 初始化定位相關(guān)
     */
    private fun initLocationAbout() {
        val myLocationStyle = MyLocationStyle()
        myLocationStyle.showMyLocation(true)
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW)
        //設(shè)置默認定位按鈕是否顯示
        mMap.uiSettings.isMyLocationButtonEnabled = false
        //設(shè)置為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) {
                    //創(chuàng)建當前位置的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()
            }

        })
    }

關(guān)鍵字搜索:

    /**
     * 搜索關(guān)鍵字
     */
    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()
    }

    /**
     * 可以在回調(diào)中解析result散罕,獲取POI信息
     * result.getPois()可以獲取到PoiItem列表分歇,Poi詳細信息可參考PoiItem類
     * 返回結(jié)果成功或者失敗的響應(yīng)碼。1000為成功欧漱,其他為失斨奥铡(詳細信息參見網(wǎng)站開發(fā)指南-實用工具-錯誤碼對照表)
     */
    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)
            //創(chuàng)建
            cameraMove(latLng)
    }

頁面功能通過以上方法就能實現(xiàn)误甚,如果發(fā)現(xiàn)某些監(jiān)聽不會回調(diào)缚甩,先看看引入的sdk。在編寫時窑邦,我一開始引用的高德的2dmap擅威,發(fā)現(xiàn)地圖移動的監(jiān)聽不會回調(diào),然后換到3dmap就好了冈钦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郊丛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞧筛,更是在濱河造成了極大的恐慌厉熟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较幌,死亡現(xiàn)場離奇詭異揍瑟,居然都是意外死亡,警方通過查閱死者的電腦和手機乍炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門绢片,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岛琼,你說我怎么就攤上這事底循。” “怎么了衷恭?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵此叠,是天一觀的道長。 經(jīng)常有香客問我,道長灭袁,這世上最難降的妖魔是什么猬错? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮茸歧,結(jié)果婚禮上倦炒,老公的妹妹穿的比我還像新娘。我一直安慰自己软瞎,他們只是感情好逢唤,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涤浇,像睡著了一般鳖藕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上只锭,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天著恩,我揣著相機與錄音,去河邊找鬼蜻展。 笑死喉誊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的纵顾。 我是一名探鬼主播伍茄,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼施逾!你這毒婦竟也來了敷矫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤音念,失蹤者是張志新(化名)和其女友劉穎沪饺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闷愤,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年件余,在試婚紗的時候發(fā)現(xiàn)自己被綠了讥脐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡啼器,死狀恐怖旬渠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情端壳,我是刑警寧澤告丢,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站损谦,受9級特大地震影響岖免,放射性物質(zhì)發(fā)生泄漏岳颇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一颅湘、第九天 我趴在偏房一處隱蔽的房頂上張望话侧。 院中可真熱鬧,春花似錦闯参、人聲如沸瞻鹏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽新博。三九已至,卻和暖如春脚草,著一層夾襖步出監(jiān)牢的瞬間叭披,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工玩讳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涩蜘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓熏纯,卻偏偏與公主長得像同诫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樟澜,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容