emmmm,效果图先行(搜索定位以及自由滑动地图展示周边位置信息,根据点击的位置获取经纬度)
aa.gif
主要代码packagecom.dydd.wsp.dreamtree.ui.mapimportandroid.content.Contextimportandroid.os.Bundleimportandroid.support.v7.widget.LinearLayoutManagerimportandroid.util.Logimportandroid.view.KeyEventimportcom.amap.api.location.AMapLocationimportcom.amap.api.maps.AMapimportcom.amap.api.maps.CameraUpdateFactoryimportcom.amap.api.maps.LocationSourceimportcom.amap.api.maps.model.*importcom.dydd.wsp.dreamtree.Rimportcom.dydd.wsp.dreamtree.ui.base.BaseActivityimportcom.dydd.wsp.dreamtree.utils.LocationInfoimportcom.amap.api.services.core.LatLonPointimportcom.amap.api.services.core.PoiItemimportcom.amap.api.services.geocoder.GeocodeResultimportcom.amap.api.services.poisearch.PoiResultimportcom.amap.api.services.poisearch.PoiSearchimportcom.dydd.wsp.dreamtree.monAdapterimportcom.dydd.wsp.dreamtree.mon.ViewHolderimportcom.dydd.wsp.dreamtree.utils.InitAmap.initAmapimportcom.dydd.wsp.dreamtree.utils.TOTimportcom.dydd.wsp.dreamtree.utils.getLatLngByAddressimportkotlinx.android.synthetic.main.activity_map_search.*importandroid.view.WindowManagerimportandroid.view.inputmethod.InputMethodManager/**
*Createdby${吴心良}on/7/5.
*E-mail:wusongpingsmile@
*Describe:搜索地址展示附近地址
*/classMapSearchActivity:BaseActivity(){privatelateinitvaraMap:AMapprivatevarlocationMaker:Marker?=nullprivatevarmListener:LocationSource.OnLocationChangedListener?=null
overridefunbindLayout()=R.layout.activity_map_search
overridefunbeforeSetContentView(){
super.beforeSetContentView()
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
}
overridefuninit(savedInstanceState:Bundle?){//初始化地图
map_ams.onCreate(savedInstanceState)
aMap=map_ams.map
initAmap(aMap,{locationSourceListener(it)},{markerListener(it)})//设置地图拖动监听
aMap.setOnCameraChangeListener(object:AMap.OnCameraChangeListener{
overridefunonCameraChangeFinish(cameraPosition:CameraPosition){
vallatLng=cameraPosition.target
searchNearby(latLng)
}
overridefunonCameraChange(p0:CameraPosition?){
}
})//定位初始化
LocationInfo.getLocationInfo(this,{
locationSuccess(it)
})//搜索框监听
et_search_ams.setOnKeyListener{v,keyCode,event->if(keyCode==KeyEvent.KEYCODE_ENTER){
valstring=et_search_ams.text.toString()
getLatLngByAddress(this,string,string,{getLatlngSuccess(it)})
valimm=getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager//强制隐藏软键盘
imm.hideSoftInputFromWindow(et_search_ams.windowToken,0)
}false
}
}privatefunlocationSourceListener(locationSource:LocationSource.OnLocationChangedListener?){
mListener=locationSource
}//marker的点击事件监听
privatefunmarkerListener(marker:Marker):Boolean{returntrue
}privatefunlocationSuccess(location:AMapLocation){//显示系统小蓝点
mListener?.let{mListener!!.onLocationChanged(location)}//设置缩放级别
aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude,location.longitude),17f))//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(
LatLng(location.latitude,location.longitude)))
valmarkerOption=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))
}/**
*开始搜索附近
*/
privatefunsearchNearby(latLng:LatLng){//这三个参数,第一个是搜索关键字,第二个是搜索的类型,具体类型参照高德api
valquery=PoiSearch.Query("","","")//查询条数
query.pageSize=6
valsearch=PoiSearch(this,query)
search.bound=PoiSearch.SearchBound(LatLonPoint(latLng.latitude,latLng.longitude),10000)
search.setOnPoiSearchListener(object:PoiSearch.OnPoiSearchListener{
overridefunonPoiItemSearched(p0:PoiItem?,p1:Int){
}
overridefunonPoiSearched(result:PoiResult?,code:Int){if(code==1000){
valquery=result?.query
valpois=result?.pois
rlv_search_ams.layoutManager=LinearLayoutManager(this@MapSearchActivity)
rlv_search_ams.adapter=object:CommonAdapter(this@MapSearchActivity
,R.layout.item_rlv_search_ams,pois){
overridefunconvert(holder:ViewHolder,t:Any?,position:Int){
valdata=tasPoiItem
holder.setText(R.id.tv_title_irsa,data.title)
holder.setText(R.id.tv_address_irsa,data.snippet)
holder.convertView.setOnClickListener{
valaddress=data.provinceName+data.cityName+data.adName+data.snippet
Log.e("aa","点击的地址:$address")
getLatLngByAddress(this@MapSearchActivity,data.cityCode,address,{getLatlngSuccess(it)})
}
}
}
}else{
TOT("搜索错误")
}
}
})
search.searchPOIAsyn()
}privatefungetLatlngSuccess(geocodeResult:GeocodeResult){
valaddress=geocodeResult.geocodeAddressList[0]
Log.e("aa",("经纬度值:"+address.latLonPoint+"\n位置描述:"
+address.formatAddress))
vallatLng=LatLng(address.latLonPoint.latitude,address.latLonPoint.longitude)
searchNearby(latLng)
aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng))//设置返回值
}
overridefunonResume(){
super.onResume()//重新绘制加载地图
map_ams.onResume()
}
overridefunonPause(){
super.onPause()//暂停地图的绘制
map_ams.onPause()
}
overridefunonDestroy(){
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、initAmapobjectInitAmap{funinitAmap(aMap:AMap,locationSource:(LocationSource.OnLocationChangedListener?)->Unit,
marker:(Marker)->Boolean){
aMap.uiSettings.isZoomControlsEnabled=false
//设置地图默认的指南针是否显示
aMap.uiSettings.isCompassEnabled=false
//设置定位监听
aMap.setLocationSource(object:LocationSource{overridefundeactivate(){
}overridefunactivate(p0:LocationSource.OnLocationChangedListener?){
locationSource(p0)
}
})//设置默认定位按钮是否显示
aMap.uiSettings.isMyLocationButtonEnabled=false
//设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.isMyLocationEnabled=true//aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE)
aMap.setOnMarkerClickListener{
marker(it)
}
}
}
2、定位信息objectLocationInfo{fungetLocationInfo(context:Context,success:(AMapLocation)->Unit){
valmLocationClient=AMapLocationClient(context)
valmLocationOption=AMapLocationClientOption()//初始化定位
//设置高德地图定位回调监听
mLocationClient.setLocationListener{aMapLocation->if(aMapLocation!=null){if(aMapLocation.errorCode==0){
vallocationType=aMapLocation.locationType//获取当前定位结果来源,如网络定位结果,详见定位类型表
vallatitude=aMapLocation.latitude//获取纬度
vallongitude=aMapLocation.longitude//获取经度
valaccuracy=aMapLocation.accuracy//获取精度信息
valaddress=aMapLocation.address//地址,如果option中设置isNeedAddress为false,则没有此结果,
//网络定位结果中会有地址信息,GPS定位不返回地址信息。
valcountry=aMapLocation.country//国家信息
valprovince=aMapLocation.province//省信息
valcity=aMapLocation.city//城市信息
valdistrict=aMapLocation.district//城区信息
valstreet=aMapLocation.street//街道信息
valstreetNum=aMapLocation.streetNum//街道门牌号信息
valcityCode=aMapLocation.cityCode//城市编码
valadCode=aMapLocation.adCode//地区编码
valaoiName=aMapLocation.aoiName//获取当前定位点的AOI信息
valbuildingId=aMapLocation.buildingId//获取当前室内定位的建筑物Id
valfloor=aMapLocation.floor//获取当前室内定位的楼层
valgpsAccuracyStatus=aMapLocation.gpsAccuracyStatus//获取GPS的当前状态
//获取定位时间
valdf=SimpleDateFormat("yyyy-MM-ddHH:mm:ss")
valdate=Date(aMapLocation.time)
df.format(date)
success(aMapLocation)
}else{//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
TOT("获取定位失败")
}
}
}//初始化AMapLocationClientOption对象
//高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式
mLocationOption.locationMode=AMapLocationClientOption.AMapLocationMode.Hight_Accuracy//低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);
//设置定位模式为AMapLocationMode.Battery_Saving,低功耗模式。
//mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,自v2.9.0版本支持返回地址描述信息。
//设置定位模式为AMapLocationMode.Device_Sensors,仅设备模式。
//mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
//SDK默认采用连续定位模式,时间间隔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
//设置是否开启定位缓存机制
//缓存机制默认开启,可以通过以下接口进行关闭。
//当开启定位缓存功能,在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。
//关闭缓存机制
mLocationOption.isLocationCacheEnable=false
//设置是否只定位一次,默认为false
mLocationOption.isOnceLocation=true
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption)//启动高德地图定位
mLocationClient.startLocation()
}
}
3、根据地址获取经纬度fungetLatLngByAddress(context:Context,city:String,address:String,success:(GeocodeResult)->Unit){//发起正地理编码搜索
//构造GeocodeSearch对象,并设置监听。
valgeocodeSearch=GeocodeSearch(context)
geocodeSearch.setOnGeocodeSearchListener(object:GeocodeSearch.OnGeocodeSearchListener{overridefunonRegeocodeSearched(p0:RegeocodeResult?,position:Int){
}overridefunonGeocodeSearched(geocodeResult:GeocodeResult?,position:Int){if(position==AMapException.CODE_AMAP_SUCCESS){if(geocodeResult?.geocodeAddressList!=null
&&geocodeResult.geocodeAddressList.size>0){
success(geocodeResult)
}
}
}
})//通过GeocodeQuery设置查询参数,调用getFromLocationNameAsyn(GeocodeQuerygeocodeQuery)方法发起请求。//address表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode都ok
valquery=GeocodeQuery(address,city)
geocodeSearch.getFromLocationNameAsyn(query)
}
作者:吴心良
链接:/p/da8676200d5d