高德地图怎么搜索marker_2018-07-06 高德地图搜索定位,滑动地图显示周边信息,根据地址搜经...
emmmm,效果圖先行(搜索定位以及自由滑動地圖展示周邊位置信息,根據(jù)點擊的位置獲取經(jīng)緯度)
aa.gif
主要代碼package?com.dydd.wsp.dreamtree.ui.mapimport?android.content.Contextimport?android.os.Bundleimport?android.support.v7.widget.LinearLayoutManagerimport?android.util.Logimport?android.view.KeyEventimport?com.amap.api.location.AMapLocationimport?com.amap.api.maps.AMapimport?com.amap.api.maps.CameraUpdateFactoryimport?com.amap.api.maps.LocationSourceimport?com.amap.api.maps.model.*import?com.dydd.wsp.dreamtree.Rimport?com.dydd.wsp.dreamtree.ui.base.BaseActivityimport?com.dydd.wsp.dreamtree.utils.LocationInfoimport?com.amap.api.services.core.LatLonPointimport?com.amap.api.services.core.PoiItemimport?com.amap.api.services.geocoder.GeocodeResultimport?com.amap.api.services.poisearch.PoiResultimport?com.amap.api.services.poisearch.PoiSearchimport?com.dydd.wsp.dreamtree.ui.adapter.common.CommonAdapterimport?com.dydd.wsp.dreamtree.ui.adapter.common.ViewHolderimport?com.dydd.wsp.dreamtree.utils.InitAmap.initAmapimport?com.dydd.wsp.dreamtree.utils.TOTimport?com.dydd.wsp.dreamtree.utils.getLatLngByAddressimport?kotlinx.android.synthetic.main.activity_map_search.*import?android.view.WindowManagerimport?android.view.inputmethod.InputMethodManager/**
*?Created?by?${吳心良}?on?2018/7/5.
*?E-mail:wusongpingsmile@gmail.com
*?Describe:搜索地址展示附近地址
*/class?MapSearchActivity?:?BaseActivity()?{????private?lateinit?var?aMap:?AMap????private?var?locationMaker:?Marker??=?null????private?var?mListener:?LocationSource.OnLocationChangedListener??=?null
override?fun?bindLayout()?=?R.layout.activity_map_search
override?fun?beforeSetContentView()?{
super.beforeSetContentView()
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
}
override?fun?init(savedInstanceState:?Bundle?)?{????????//初始化地圖
map_ams.onCreate(savedInstanceState)
aMap?=?map_ams.map
initAmap(aMap,?{?locationSourceListener(it)?},?{?markerListener(it)?})????????//設置地圖拖動監(jiān)聽
aMap.setOnCameraChangeListener(object?:?AMap.OnCameraChangeListener?{
override?fun?onCameraChangeFinish(cameraPosition:?CameraPosition)?{
val?latLng?=?cameraPosition.target
searchNearby(latLng)
}
override?fun?onCameraChange(p0:?CameraPosition?)?{
}
})????????//定位初始化
LocationInfo.getLocationInfo(this,?{
locationSuccess(it)
})????????//搜索框監(jiān)聽
et_search_ams.setOnKeyListener?{?v,?keyCode,?event?->????????????if?(keyCode?==?KeyEvent.KEYCODE_ENTER)?{
val?string?=?et_search_ams.text.toString()
getLatLngByAddress(this,?string,?string,?{?getLatlngSuccess(it)?})
val?imm?=?getSystemService(Context.INPUT_METHOD_SERVICE)?as?InputMethodManager????????????????//?強制隱藏軟鍵盤
imm.hideSoftInputFromWindow(et_search_ams.windowToken,?0)
}????????????false
}
}????private?fun?locationSourceListener(locationSource:?LocationSource.OnLocationChangedListener?)?{
mListener?=?locationSource
}????//marker的點擊事件監(jiān)聽
private?fun?markerListener(marker:?Marker):?Boolean?{????????return?true
}????private?fun?locationSuccess(location:?AMapLocation)?{????????//顯示系統(tǒng)小藍點
mListener?.let?{?mListener!!.onLocationChanged(location)?}????????//?設置縮放級別
aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude,?location.longitude),?17f))????????//?將地圖移動到定位點
aMap.moveCamera(CameraUpdateFactory.changeLatLng(
LatLng(location.latitude,?location.longitude)))
val?markerOption?=?MarkerOptions()
markerOption
.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_location))
.position(LatLng(location.latitude,?location.longitude))
.draggable(true)
.title("")
.snippet("哼哼哈哈哈")
locationMaker?=?aMap.addMarker(markerOption)
locationMaker?.setPositionByPixels(map_ams.width?/?2,
map_ams.height?/?2)
searchNearby(LatLng(location.latitude,?location.longitude))
}????/**
*?開始搜索附近
*/
private?fun?searchNearby(latLng:?LatLng)?{????????//這三個參數(shù),第一個是搜索關鍵字,第二個是搜索的類型,具體類型參照高德api
val?query?=?PoiSearch.Query("",?"",?"")????????//查詢條數(shù)
query.pageSize?=?6
val?search?=?PoiSearch(this,?query)
search.bound?=?PoiSearch.SearchBound(LatLonPoint(latLng.latitude,?latLng.longitude),?10000)
search.setOnPoiSearchListener(object?:?PoiSearch.OnPoiSearchListener?{
override?fun?onPoiItemSearched(p0:?PoiItem?,?p1:?Int)?{
}
override?fun?onPoiSearched(result:?PoiResult?,?code:?Int)?{????????????????if?(code?==?1000)?{
val?query?=?result?.query
val?pois?=?result?.pois
rlv_search_ams.layoutManager?=?LinearLayoutManager(this@MapSearchActivity)
rlv_search_ams.adapter?=?object?:?CommonAdapter(this@MapSearchActivity
,?R.layout.item_rlv_search_ams,?pois)?{
override?fun?convert(holder:?ViewHolder,?t:?Any?,?position:?Int)?{
val?data?=?t?as?PoiItem
holder.setText(R.id.tv_title_irsa,?data.title)
holder.setText(R.id.tv_address_irsa,?data.snippet)
holder.convertView.setOnClickListener?{
val?address?=?data.provinceName?+?data.cityName?+?data.adName?+?data.snippet
Log.e("aa",?"點擊的地址:$address")
getLatLngByAddress(this@MapSearchActivity,?data.cityCode,?address,?{?getLatlngSuccess(it)?})
}
}
}
}?else?{
TOT("搜索錯誤")
}
}
})
search.searchPOIAsyn()
}????private?fun?getLatlngSuccess(geocodeResult:?GeocodeResult)?{
val?address?=?geocodeResult.geocodeAddressList[0]
Log.e("aa",?("經(jīng)緯度值:"?+?address.latLonPoint?+?"\n位置描述:"
+?address.formatAddress))
val?latLng?=?LatLng(address.latLonPoint.latitude,?address.latLonPoint.longitude)
searchNearby(latLng)
aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng))????????//設置返回值
}
override?fun?onResume()?{
super.onResume()????????//?重新繪制加載地圖
map_ams.onResume()
}
override?fun?onPause()?{
super.onPause()????????//?暫停地圖的繪制
map_ams.onPause()
}
override?fun?onDestroy()?{
super.onDestroy()????????//?銷毀地圖
map_ams.onDestroy()
}
}
html代碼<?xml ?version="1.0"?encoding="utf-8"?>
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/map_ams"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/rlv_search_ams"
android:background="@color/colorWhite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:paddingBottom="12dp">
android:id="@+id/et_search_ams"
android:layout_width="match_parent"
android:imeOptions="actionSearch"
android:inputType="text"
android:maxLines="1"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:padding="8dp"
android:hint="輸入詳細地址查詢"
android:background="@drawable/shape_fill_white_with_gray_rec_bg"/>
用到的工具類方法:
1、initAmapobject?InitAmap?{????fun?initAmap(aMap:?AMap,?locationSource:?(LocationSource.OnLocationChangedListener?)?->?Unit,
marker:?(Marker)?->?Boolean)?{
aMap.uiSettings.isZoomControlsEnabled?=?false
//?設置地圖默認的指南針是否顯示
aMap.uiSettings.isCompassEnabled?=?false
//?設置定位監(jiān)聽
aMap.setLocationSource(object?:?LocationSource?{????????????override?fun?deactivate()?{
}????????????override?fun?activate(p0:?LocationSource.OnLocationChangedListener?)?{
locationSource(p0)
}
})????????//?設置默認定位按鈕是否顯示
aMap.uiSettings.isMyLocationButtonEnabled?=?false
//?設置為true表示顯示定位層并可觸發(fā)定位,false表示隱藏定位層并不可觸發(fā)定位,默認是false
aMap.isMyLocationEnabled?=?true//????????aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE)
aMap.setOnMarkerClickListener?{
marker(it)
}
}
}
2、定位信息object?LocationInfo?{????fun?getLocationInfo(context:?Context,?success:?(AMapLocation)?->?Unit)?{
val?mLocationClient?=?AMapLocationClient(context)
val?mLocationOption?=?AMapLocationClientOption()????????//?初始化定位
//?設置高德地圖定位回調監(jiān)聽
mLocationClient.setLocationListener?{?aMapLocation?->????????????if?(aMapLocation?!=?null)?{????????????????if?(aMapLocation.errorCode?==?0)?{
val?locationType?=?aMapLocation.locationType?//?獲取當前定位結果來源,如網(wǎng)絡定位結果,詳見定位類型表
val?latitude?=?aMapLocation.latitude?//?獲取緯度
val?longitude?=?aMapLocation.longitude?//?獲取經(jīng)度
val?accuracy?=?aMapLocation.accuracy?//?獲取精度信息
val?address?=?aMapLocation.address?//?地址,如果option中設置isNeedAddress為false,則沒有此結果,
//?網(wǎng)絡定位結果中會有地址信息,GPS定位不返回地址信息。
val?country?=?aMapLocation.country?//?國家信息
val?province?=?aMapLocation.province?//?省信息
val?city?=?aMapLocation.city?//?城市信息
val?district?=?aMapLocation.district?//?城區(qū)信息
val?street?=?aMapLocation.street?//?街道信息
val?streetNum?=?aMapLocation.streetNum?//?街道門牌號信息
val?cityCode?=?aMapLocation.cityCode?//?城市編碼
val?adCode?=?aMapLocation.adCode?//?地區(qū)編碼
val?aoiName?=?aMapLocation.aoiName?//?獲取當前定位點的AOI信息
val?buildingId?=?aMapLocation.buildingId?//?獲取當前室內定位的建筑物Id
val?floor?=?aMapLocation.floor?//?獲取當前室內定位的樓層
val?gpsAccuracyStatus?=?aMapLocation.gpsAccuracyStatus?//獲取GPS的當前狀態(tài)
//?獲取定位時間
val?df?=?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss")
val?date?=?Date(aMapLocation.time)
df.format(date)
success(aMapLocation)
}?else?{????????????????????//?定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼表。
TOT("獲取定位失敗")
}
}
}????????//?初始化AMapLocationClientOption對象
//?高精度定位模式:會同時使用網(wǎng)絡定位和GPS定位,優(yōu)先返回最高精度的定位結果,以及對應的地址描述信息
//?設置定位模式為AMapLocationMode.Hight_Accuracy,高精度模式
mLocationOption.locationMode?=?AMapLocationClientOption.AMapLocationMode.Hight_Accuracy????????//?低功耗定位模式:不會使用GPS和其他傳感器,只會使用網(wǎng)絡定位(Wi-Fi和基站定位);
//設置定位模式為AMapLocationMode.Battery_Saving,低功耗模式。
//mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//?僅用設備定位模式:不需要連接網(wǎng)絡,只使用GPS進行定位,這種模式下不支持室內環(huán)境的定位,自?v2.9.0?版本支持返回地址描述信息。
//?設置定位模式為AMapLocationMode.Device_Sensors,僅設備模式。
//mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
//?SDK默認采用連續(xù)定位模式,時間間隔2000ms
//?設置定位間隔,單位毫秒,默認為2000ms,最低1000ms。
mLocationOption.interval?=?60000
//?設置定位同時是否需要返回地址描述
//設置是否返回地址信息(默認返回地址信息)
mLocationOption.isNeedAddress?=?true
//?設置是否強制刷新WIFI,默認為強制刷新。每次定位主動刷新WIFI模塊會提升WIFI定位精度,但相應的會多付出一些電量消耗。
//?設置是否強制刷新WIFI,默認為true,強制刷新。//????????mLocationOption.isWifiActiveScan?=?true
//?設置是否允許模擬軟件Mock位置結果,多為模擬GPS定位結果,默認為false,不允許模擬位置。
//?設置是否允許模擬位置,默認為false,不允許模擬位置
mLocationOption.isMockEnable?=?false
//?設置定位請求超時時間,默認為30秒
//?單位是毫秒,默認30000毫秒,建議超時時間不要低于8000毫秒。
mLocationOption.httpTimeOut?=?50000
//?設置是否開啟定位緩存機制
//?緩存機制默認開啟,可以通過以下接口進行關閉。
//?當開啟定位緩存功能,在高精度模式和低功耗模式下進行的網(wǎng)絡定位結果均會生成本地緩存,不區(qū)分單次定位還是連續(xù)定位。GPS定位結果不會被緩存。
//?關閉緩存機制
mLocationOption.isLocationCacheEnable?=?false
//?設置是否只定位一次,默認為false
mLocationOption.isOnceLocation?=?true
//?給定位客戶端對象設置定位參數(shù)
mLocationClient.setLocationOption(mLocationOption)????????//?啟動高德地圖定位
mLocationClient.startLocation()
}
}
3、根據(jù)地址獲取經(jīng)緯度fun?getLatLngByAddress(context:?Context,city:String,address:String,success:(GeocodeResult)->Unit){//發(fā)起正地理編碼搜索
//構造?GeocodeSearch?對象,并設置監(jiān)聽。
val?geocodeSearch?=?GeocodeSearch(context)
geocodeSearch.setOnGeocodeSearchListener(object?:GeocodeSearch.OnGeocodeSearchListener{????????????override?fun?onRegeocodeSearched(p0:?RegeocodeResult?,?position:?Int)?{
}????????????override?fun?onGeocodeSearched(geocodeResult:?GeocodeResult?,?position:?Int)?{????????????????if?(position?==?AMapException.CODE_AMAP_SUCCESS)?{????????????????????if?(geocodeResult?.geocodeAddressList?!=?null
&&?geocodeResult.geocodeAddressList.size?>?0)?{
success(geocodeResult)
}
}
}
})//通過GeocodeQuery設置查詢參數(shù),調用getFromLocationNameAsyn(GeocodeQuery?geocodeQuery)?方法發(fā)起請求。//address表示地址,第二個參數(shù)表示查詢城市,中文或者中文全拼,citycode、adcode都ok
val?query?=GeocodeQuery(address,?city)
geocodeSearch.getFromLocationNameAsyn(query)
}
作者:吳心良
鏈接:https://www.jianshu.com/p/da8676200d5d
總結
以上是生活随笔為你收集整理的高德地图怎么搜索marker_2018-07-06 高德地图搜索定位,滑动地图显示周边信息,根据地址搜经...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 连接mysql工具类_java
- 下一篇: 抓包工具Stream之接口调试和加密解码