高德地图怎么搜索marker_2018-07-06 高德地图搜索定位,滑动地图显示周边信息,根据地址搜经...

emmmm,效果图先行(搜索定位以及自由滑动地图展示周边位置信息,根据点击的位置获取经纬度)

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) })        //设置地图拖动监听

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)

})        //搜索框监听

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的点击事件监听

private fun markerListener(marker: Marker): Boolean {        return true

}    private fun locationSuccess(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)))

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) {        //这三个参数,第一个是搜索关键字,第二个是搜索的类型,具体类型参照高德api

val query = PoiSearch.Query("", "", "")        //查询条数

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", ("经纬度值:" + 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

// 设置定位监听

aMap.setLocationSource(object : LocationSource {            override fun deactivate() {

}            override fun activate(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、定位信息object LocationInfo {    fun getLocationInfo(context: Context, success: (AMapLocation) -> Unit) {

val mLocationClient = AMapLocationClient(context)

val mLocationOption = AMapLocationClientOption()        // 初始化定位

// 设置高德地图定位回调监听

mLocationClient.setLocationListener { aMapLocation ->            if (aMapLocation != null) {                if (aMapLocation.errorCode == 0) {

val locationType = aMapLocation.locationType // 获取当前定位结果来源,如网络定位结果,详见定位类型表

val latitude = aMapLocation.latitude // 获取纬度

val longitude = aMapLocation.longitude // 获取经度

val accuracy = aMapLocation.accuracy // 获取精度信息

val address = aMapLocation.address // 地址,如果option中设置isNeedAddress为false,则没有此结果,

// 网络定位结果中会有地址信息,GPS定位不返回地址信息。

val country = aMapLocation.country // 国家信息

val province = aMapLocation.province // 省信息

val city = aMapLocation.city // 城市信息

val district = aMapLocation.district // 城区信息

val street = aMapLocation.street // 街道信息

val streetNum = aMapLocation.streetNum // 街道门牌号信息

val cityCode = aMapLocation.cityCode // 城市编码

val adCode = aMapLocation.adCode // 地区编码

val aoiName = aMapLocation.aoiName // 获取当前定位点的AOI信息

val buildingId = aMapLocation.buildingId // 获取当前室内定位的建筑物Id

val floor = aMapLocation.floor // 获取当前室内定位的楼层

val gpsAccuracyStatus = aMapLocation.gpsAccuracyStatus //获取GPS的当前状态

// 获取定位时间

val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

val date = 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、根据地址获取经纬度fun getLatLngByAddress(context: Context,city:String,address:String,success:(GeocodeResult)->Unit){//发起正地理编码搜索

//构造 GeocodeSearch 对象,并设置监听。

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设置查询参数,调用getFromLocationNameAsyn(GeocodeQuery geocodeQuery) 方法发起请求。//address表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode都ok

val query =GeocodeQuery(address, city)

geocodeSearch.getFromLocationNameAsyn(query)

}

作者:吴心良

链接:https://www.jianshu.com/p/da8676200d5d

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中log的底数理解

C 中log是以e为底的 log10 是以10为底的 现在来看看为什么底数具体为多少不重要&#xff1f; 读者只需要掌握&#xff08;依稀记得&#xff09;中学数学知识就够了。 假设有底数为2和3的两个对数函数&#xff0c;如上图。当X取N&#xff08;数据规模&#xff09;时&#xff0…

【性能测试】性能需求挖掘、性能方案制定及压测场景设计之疑惑与思考(一)

压力测试 模拟用户在同一时间对服务器发送大量请求&#xff0c;以此查看服务器性能指标&#xff0c;尤其关注大业务量情况下运行系统性能的变化&#xff08;反应变慢、是否会内存泄漏导致系统逐渐崩溃、是否能恢复&#xff09;&#xff0c;测试系统的限制和故障恢复能力&#…

条件编译 #ifndef _HEAD_H...中下划线的理解

1.下划线“__”属于编程风格的内容&#xff0c;对程序没有影响。不用下划线也可以&#xff0c;用几个下划线也由个人习惯。 2.其实质是一个宏名。由此我们可以防止发生重复定义或声明。 假设你的头文件名为head.h&#xff0c;根据习惯&#xff0c;我们声明一个宏HEAD_H,对应这…

java如何禁用usb_IT技巧分享59: 如何禁用USB端口以及光驱来保证数据不被泄露

现在电脑USB接口是最基本的一个配置&#xff0c;能快速的把电脑文件拷贝到u盘或者移动硬盘&#xff0c;大大的提高了我们的工作效率&#xff0c;但也容易感染病毒&#xff0c;把公司商业机密泄露出去&#xff0c;为了加强公司安全措施&#xff0c;现提供禁用USB办法。操作步骤&…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的&#xff0c;只有一个 single_table 表是不够的&#xff0c;所以为了故事的顺利发展&#xff0c;我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见&#xff0c;我们把 single_table 表称为 s1 表&#xff0…

jmeter模拟压测真实复杂用户场景,阶梯螺纹线程组Stepping Thread Group终极线程Ultimate Thread Group并发线程Concurrency Thread Group

我们有时需要模拟非常真实复杂的用户压测场景&#xff0c;可以用到此插件来设计场景 1、安装插件&#xff0c;选项——Plugins Manager打开安装页面 2、搜索standard set并安装&#xff0c;重启jmeter&#xff0c;查看测试计划——添加线程组——jpgc - Stepping Thread Group…

防止文件重复定义之方法

防止重复定义用#ifndef #define #endif 若文件为类中成员函数可以直接使用 若文件为函数&#xff0c;若函数的声明和定义放在一起&#xff0c;则只能采用static或者inline方法解决。用#ifndef不管用 若文件为函数时&#xff0c;函数的声明和定义分别放在.h和.cpp中&#xff…

部署java项目_企业最看重什么样的Java人才?

很多人学习Java真的不是为了梦想&#xff0c;不是爱好&#xff0c;仅仅是想成为拿到高薪的那个人&#xff0c;成为同学里赚的最多的人&#xff0c;成为别人嘴里谈着的那个人。要成为拿高薪的Java工程师&#xff0c;我们要先看看企业到底需要哪方面的人才。上图是某招聘网站上Ja…

jmeter如何通过后置处理器提取(正则提取器、json提取器)做接口关联?

一、后置处理器—正则表达式提取器 1、添加正则表达式提取 2、正则表达式提取面板介绍&#xff1a; 引用名称&#xff1a;提取引用名称&#xff0c;下个请求要引用此参数名称&#xff0c;如填写token&#xff0c;下个请求中用${token} 正则表达式&#xff1a;()&#xff1a;括…

数据结构树4-二叉搜索树2

二叉搜索树.h: #ifndef _二叉查找树_H #define _二叉查找树_H #include<iostream> #include<string>enum Boolean{ FALSE,TRUE}; template<class Type> class Element { public:Type key;//方便添加更新数据 }; // 错误我的写法&#xff1a;template<c…

mixin机制 vue_vue mixins组件复用的几种方式(小结)

最近在做项目的时候&#xff0c;研究了mixins&#xff0c;此功能有妙处。用的时候有这样一个场景&#xff0c;页面的风格不同&#xff0c;但是执行的方法&#xff0c;和需要的数据非常的相似。我们是否要写两种组件呢&#xff1f;还是保留一个并且然后另个一并兼容另一个呢&…

【功能业务篇】APP授权微信登录、绑定账号测试思考

参考https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1419317851&token&langzh_CN 准备工作 移动应用微信登录是基于OAuth2.0协议标准 构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登…

数据结构-树3-红黑树

1、刚开始建立的红黑树的红黑树只有一个指针&#xff08;实际为结点&#xff0c;它的右子树指向真正的根结点&#xff08;现在指向空结点&#xff09;。左子树为空结点&#xff0c;里面的数据为负无穷大&#xff09; 2、实现Insert函数

比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...

最早见到华为的HiCar&#xff0c;还是今年4月份的华为P40系列手机发布会。根据发布会公布的信息&#xff0c;HiCar主要的特点就是手机与汽车的顺畅连接体验。借由5G手机&#xff0c;汽车可以实现更强的数据传输能力&#xff0c;同时百万级别的手机APP也会扩展至汽车之上。在这次…

Python模拟实现multipart/form-data格式上传图片文件

一、单字段发送单个文件 url "http://httpbin.org/post" data None files { ... } r requests.post(url, data, filesfiles) 而这个files参数是可以接受很多种形式的数据&#xff0c;最基本的2种形式为字典类型和元祖列表类型 1、字典类型的files参数 { &q…

tensorflow9-mnist手写数字识别进阶-多层神经网络建模

大圆为一个神经元模型 全连接&#xff1a;相邻的两层之间所有的结点都会连接 神经网络的层数&#xff1a;一般指的谁隐藏层的数量 上图中的网络即为一层神经网络 以上即为两层的全连接神经网络 两层神经网络模型训练 神经网络的层次是不是越多越好&#xff1f;并不是越多越好…

arm9 中断向量 重定位_关于STM32中断向量表的位置 、重定向问题

关于STM32中断向量表的位置、重定向问题首先我们需要跳到main函数&#xff0c;这个就不多说了。那么&#xff0c;中断发生后&#xff0c;又是怎么跑到中断入口地址的呢&#xff1f;从stm32f10x.s可以看到&#xff0c;已经定义好了一大堆的中断响应函数&#xff0c;这就是中断向…

BurpSuit配置抓包http和https请求

1、下载安装burpsuit https://portswigger.net/burp/communitydownload 双击一直点下一步&#xff0c;可安装成功 2、burpsuit设置 2、浏览器设置代理 设置-高级-打开代理设置-局域网设置 3、这样可以抓取http包了 4、Burp Suite要抓HTTPS的包&#xff0c;是需要有Burp Sui…

TensorFlow10-多层神经网络建模,存储和载入

整体流程&#xff1a; 只保存最近5个模型 playground.tensorflow.org TensorFlow浏览器训练网址

手机突然电量消耗很快_手机掉电突然变快?这5点操作你肯定至少做了其中一个!...

许多人都遇到过手机掉电突然变快的情况。以前充一次电&#xff0c;明明可以用一整天的&#xff0c;某天突然发现&#xff0c;满电的手机没打几局游戏或才看一会电视&#xff0c;电量就没了一大半&#xff0c;一天充好几次都不够用。每每遇到这种情况时&#xff0c;很多人都觉得…