项目中集成百度、高德、腾讯地图已是司空见惯的事情,今天我总结了一下项目中用到的高德地图常用的功能:

1.展示高德地图并定位显示定位图标;

2.添加实时大头针;

3.反地理编码获取周围兴趣点

效果如下:

现在开始展示集成流程

一.显示地图

1.申请key

至于如何申请高德地图开发者账号,请自行百度。在高德开放平台->控制台->创建新应用 ->添加新Key
需提前获取 SHA1: keytool -v -list -keystore  keystore 文件绝对路径或者先定位到keystore 文件所在路径后,后面只写keystone文件名
 

2.配置AndroidManifest.xml

1)添加权限
//地图SDK(包含其搜索功能)需要的基础权限
 <!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2)配置key
 <meta-data android:name="com.amap.api.v2.apikey" android:value="开发者申请的key "/> 

3.下载jar包(若选择3D地图包,还需要下载so文件)

地图SDK:http://lbs.amap.com/api/android-sdk/download
定位sdk:http://lbs.amap.com/api/android-location-sdk/download
 

4.将jar包放入libs目录下

对于每个jar文件,右键-选择Add As Library,导入到工程中。
或者使用菜单栏 选择 File ->Project Structure->Modules-> Dependencies。点击绿色的加号选择File dependency. 然后选择要添加的jar包即可,此时build.gradle中会自动生成如下信息(以地图、定位为例)
 
 

5.初始化地图容器

布局xml文件中添加地图控件(以地图2D):
 <com.amap.api.maps2d.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
管理地图生命周期
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
。。。。
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity创建地图
aMapView.onCreate(savedInstanceState);
//初始化地图控制器对象
if (aMap == null) {
aMap = mapView.getMap();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity销毁地图
aMapView.onDestroy();
//销毁定位对象
if (null != mlocationClient) {
mlocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
}
}
@Override
protected void onResume() {
super.onResume();
//在activity重新绘制加载地图
aMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}

二.显示定位小蓝点及反地理编码检索

地图 SDK 5.0.0版本之前

1.配置AndroidManifest.xml

请在application标签中声明service组件
 <service android:name="com.amap.api.location.APSService"></service>
声明权限
 <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
设置一些amap的属性
 private void setUpMap() {
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.drawable.location_marker));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
// myLocationStyle.anchor(int,int)//设置小蓝点的锚点
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
// 触摸监听
aMap.setOnCameraChangeListener(cameraChangeListener);
}

2.初始化定位

在aMap.setLocationSource(this)中包含两个回调:在activate()中设置定位初始化及启动定位,在deactivate()中写停止定位的相关调用。
 /**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
//初始化定位 需要传Context类型的参数。推荐用getApplicationConext()方法
mlocationClient = new AMapLocationClient(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位回调监听
mlocationClient.setLocationListener(this);
//设置单次定位 该方法默认为false。
mLocationOption.setOnceLocation(true);
//选择定位模式 SDK默认选择使用高精度定位模式。
// 高精度定位模式:Hight_Accuracy 同时使用网络定位和GPS定位
//低功耗定位模式:Battery_Saving 不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位)
//仅用设备定位模式:Device_Sensors 不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,自 v2.9.0 版本支持返回地址描述信息 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms 最低1000ms
mLocationOption.setInterval(5000);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否强制刷新WIFI,默认为true,强制刷新,会增加电量消耗。
mLocationOption.setWifiActiveScan(true);
// 设置定位请求超时时间,单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(30000);
//设置是否开启定位缓存机制 缓存机制默认开启true 网络定位结果均会生成本地缓存,
// 不区分单次定位还是连续定位。GPS定位结果不会被缓存
mLocationOption.setLocationCacheEnable(true);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();//启动定位
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁
}
mlocationClient = null;
}

3.定位回调中设置显示大头针

mlocationClient.setLocationListener(this);后,重写onLocationChanged回调
 /**
* 定位成功后回调函数
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null&&amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
//定位成功回调信息,设置相关消息
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
amapLocation.getAoiName();//获取当前定位点的AOI信息
amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
amapLocation.getFloor();//获取当前室内定位的楼层
amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位时间
    addMarker(locationLatLng, desc);//添加大头针 desc可为null
    //根据locationLatLng地图移至中心位置
         aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(locationLatLng, 15));
    //反地理编码搜索
    regeocodeSearch(latitude, longitude, 3000);
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
Log.e("AmapErr",errText);
}
}
}
/**
* 定位成功后往地图上添加marker
* 此处设置两个marker,来实现大头针下添加小原点
* @param latLng
*/
private void addMarker(LatLng latLng, String desc) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng); markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_fixed_location));//大头针图标
MarkerOptions options = new MarkerOptions();
options.position(latLng); options.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_location));//大头针下原点
options.anchor(0.5f,0.5f);//保证小蓝点的中心对应经纬度位置
     //markerOptions.icon(BitmapDescriptorFactory.defaultMarker());
marker = aMap.addMarker(options);//先添加的在底层
locationMarker = aMap.addMarker(markerOptions);
}
注意:需要在系统 onDestroy() 方法中销毁定位对象
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
// 销毁定位对象
if(null != mlocationClient){
mlocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
}
}

4.滑动地图事件或调用aMap.moveCamera后回调

 AMap.OnCameraChangeListener cameraChangeListener = new AMap.OnCameraChangeListener() {
/*设置定位图标位置*/
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLng latLng = cameraPosition.target;
if (locationMarker != null) {
locationMarker.setPosition(latLng);
}
if (null != marker)
marker.setPosition(latLng);
}
/*更新地址列表*/
@Override
public void onCameraChangeFinish(CameraPosition position) {
final LatLng latLng = position.target;
if (null != marker && !marker.isVisible())
marker.setVisible(true);//设置可见性
//marker.setVisible(false);
adapter.index = 0;
regeocodeSearch(latLng.latitude, latLng.longitude, 3000);
}
};

5.反地理编码设置

 private void regeocodeSearch(double lat, double lng, float radius) {
LatLonPoint point = new LatLonPoint(lat, lng);
GeocodeSearch geocodeSearch = new GeocodeSearch(this);
geocodeSearch.setOnGeocodeSearchListener(this);
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery regeocodeQuery = new RegeocodeQuery(point, radius, GeocodeSearch.AMAP);
geocodeSearch.getFromLocationAsyn(regeocodeQuery);
}
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int rCode) {
String preAdd = "";//地址前缀
if (1000 == rCode) {
RegeocodeAddress address = regeocodeResult.getRegeocodeAddress();
StringBuffer stringBuffer = new StringBuffer();
String area = address.getProvince();//省或直辖市
String loc = address.getCity();//地级市或直辖市
String subLoc = address.getDistrict();//区或县或县级市
String ts = address.getTownship();//乡镇
String thf = null;//道路
List<RegeocodeRoad> regeocodeRoads = address.getRoads();//道路列表
if (regeocodeRoads != null && regeocodeRoads.size() > 0) {
RegeocodeRoad regeocodeRoad = regeocodeRoads.get(0);
if (regeocodeRoad != null) {
thf = regeocodeRoad.getName();
}
}
String subthf = null;//门牌号
StreetNumber streetNumber = address.getStreetNumber();
if (streetNumber != null) {
subthf = streetNumber.getNumber();
}
String fn = address.getBuilding();//标志性建筑,当道路为null时显示
if (area != null) {
stringBuffer.append(area);
preAdd += area;
}
if (loc != null && !area.equals(loc)) {
stringBuffer.append(loc);
preAdd += loc;
}
if (subLoc != null) {
stringBuffer.append(subLoc);
preAdd += subLoc;
}
if (ts != null)
stringBuffer.append(ts);
if (thf != null)
stringBuffer.append(thf);
if (subthf != null)
stringBuffer.append(subthf);
if ((thf == null && subthf == null) && fn != null && !subLoc.equals(fn))
stringBuffer.append(fn + "附近");
String ps = "poi";
List<PoiItem> pois = address.getPois();//获取周围兴趣点
if (pois != null && pois.size() > 0) {
for (int i = 0; i < pois.size(); i++) {
String title = pois.get(i).getTitle();
String adName = pois.get(i).getAdName();
String snippet = pois.get(i).getSnippet();
LatLonPoint latLonPoint = pois.get(i).getLatLonPoint();
double latitude = latLonPoint.getLatitude();
double longitude = latLonPoint.getLongitude();
ps = ps + ",title=" + title + ",adName=" + adName + ",snippet=" + snippet;
}
Log.e("PoiItem" + "pois.size=" ,pois.size() + "----" + ps);
}
}
}

本文为博主原创文章,请尊重版权,未经博主允许不得转载,转载请注明出处:http://www.cnblogs.com/details-666/p/AMap.html

另附定位类型对照表:
 

高德地图添加marker及反地理编码获取POI的更多相关文章

  1. (转载) 百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 百度地图工具类封装(包括定位,附近.城市.范围poi检索, ...

  2. Android百度地图开发02之添加覆盖物 + 地理编码和反地理编码

    下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造Ov ...

  3. iOS 原生地图地理编码与反地理编码

    当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 ...

  4. iOS地图 -- 地理编码和反地理编码

    地理编码和反地理编码 用到的类和方法 CLGeocoder --> 地理编码管理器 - (void)geocodeAddressString:(NSString *)addressString ...

  5. 【iOS】7.4 定位服务->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理编码和反地理编码

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. python地理处理包——geopy使用之地理编码与反地理编码

    由于专业需要,经常接触一些地理处理的工具包,文档都是英文的,自己看的同时将其翻译一下,一方面自己学习的同时有个记录,要是能同时给一起的学习的童鞋们一些帮助,想想也是极好的.以下的文档内容主要翻译自官方 ...

  7. 基于CLGeocoder - 反地理编码

    iOS中CoreLocatio框架中的CLGeocoder 类不但为我们提供了地理编码方法,而且还提供了反地理编码: 同样需要导入框架: #import <CoreLocation/CoreLo ...

  8. 猫猫学iOS 之CoreLocation反地理编码小Demo输入经纬度得到城市

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 输入经纬度,能够得到相应的地名 二:思路 跟地里编码差 ...

  9. iOS地理反地理编码--CoreLocation

    .sidebar{float:left;width:220px;} .container-fluid>.content{margin-left:240px;} a{color:#0069d6;t ...

随机推荐

  1. FortiGate日志设置

    1.默认 FGT5HD3916802737 # config log syslogd setting FGT5HD3916802737 (setting) # show config log sysl ...

  2. 298. Binary Tree Longest Consecutive Sequence最长连续序列

    [抄题]: Given a binary tree, find the length of the longest consecutive sequence path. The path refers ...

  3. Java15-java语法基础(十五)——内部类

    java16-java语法基础(十五)内部类 一.内部类: 可以在一个类的内部定义另一个类,这种类称为内部类. 二.内部类分为两种类型: 1.静态内部类: 静态内部类是一个具有static修饰词的类, ...

  4. CSS实现左侧多级菜单栏

    首先看要实现的效果, 主要是关心技术实现, 所以没怎么美化 我也是初学html, 所以写的比较啰嗦 1. 使用列表将内容显示出来 <!DOCTYPE html><html>&l ...

  5. CentOS_mini下安装docker 之 安装docker CE

    警告:切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker. 原文地址:https://yeasy.gitbooks.io/docker_practice/inst ...

  6. AX_Currency

    Currency::curAmount(9.23,"HKD");  Currency::curAmount2CurAmount(9.23,"RMB"," ...

  7. kbmmw中向服务器端传递对象的一种简单方式

    运行环境:delphi 10.2+kbmmw 5.6.20 在kbmmw 的老版本中,要向服务器传送一个本地的对象,一般都需要进行一些转换,例如通过序列化的方式. 在新版的kbmmw中这一切都变的很简 ...

  8. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...

  9. 【部署问题】解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid" failed(2:No such file or directory)

    问题:环境问题 解决方法: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 使用nginx -c的参数指定nginx.c ...

  10. qhfl-3 Course模块

    课程模块,包括免费课程以及专题课程两个,主要是课程的展示,点击课程进入课程详细页面 根据功能设计表结构 为了方便,每张表在数据库中添加了中文名 from django.db import models ...