文档章节

百度地图——在地图上显示当前位置

古雨
 古雨
发布于 2015/02/06 16:58
字数 1422
阅读 136
收藏 2

最近在做的项目中有部分内容涉及到地图。经过项目组的讨论,最后决定还是使用百度地图。

设计到的主要功能如下:

1、在地图上显示当前位置

2、点击地图,获取点击处的位置地址,并在地图上标出点击位置

3、获取点击处所处城市的城市Id

其实这些功能都不复杂,根据官方提供的demo,很容就能实现,主要记录一下实现的过程。

实现后的效果图如上,其中蓝色小点是通过定位获取的当前位置,红色标记是点击地图后再地图上的标记的。

主要过程如下:

1、获取密钥

        使用百度sdk开发产品,无论是地图方面,还是推送等等,都需要去百度注册开发者账号,然后创建项目,获取密钥。此过程不赘述。

2、测试密钥是否正确

        这里提供一个稍微简单一点的方法:

  •         确保在“百度API控制台”已创建应用;

  •         下载百度提供的demo;

  •         将demo的包名(即AndroidManifest.xml中的package)改为自己工程的报名,并将AndroidManifest.xml中API_KEY改为自己前边获取到的key;

  •         运行demo,如果demo不提示“key验证错误”,则表示密钥正确。

3、分步实现

实现这些功能,需要按照官方的api文档导入相应的jar包,如下图所示:

首先实现基础地图显示功能。

布局文件很简单,主要是mapview

<com.baidu.mapapi.map.MapView
        android:id="@+id/map_bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/map_rl_title"
        android:layout_marginBottom="@dimen/main_top_bar_height"
        android:clickable="true" />

百度提供的定位需要哦开启服务,所以,需要在AndroidManifest.xml中注册服务。

然后是代码的编写:

需要注意的是使用百度sdk,需要在setContentView()之前初始化SDK

SDKInitializer.initialize(getApplicationContext());

利用LocationClient类实现定位功能。

/**
	 * 定位SDK监听函数
	 */
	private class MyLocationListenner implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 销毁后不在处理新接收的位置
			if (location == null || mapView == null)
				return;
			MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
			// 此处设置开发者获取到的方向信息,顺时针0-360
					.direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				ll = new LatLng(location.getLatitude(), location.getLongitude());
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
			}
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}
//这两句话可以实现定位后刷新地图,将定位后的当前位置显示在地图上
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);


然后是实现点击地图显示点击处的地址:

点击地图主要是去给MapView添加MyMapClickListener监听

而要获取位置,则需要实现OnGetGeoCoderResultListener接口。

//重写这个方法,result.getAddress(),即为当前位置地址
@Override
	public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
		
	}

//在地图上标记处点击位置
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding)));
		mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result.getLocation()));


下面主要说一下CityId的问题(如成都的id为75)

城市id的主要用途为传到后台,后台根据此id去完成周围事物检索的功能

一直未找到好的方法,最终在离线地图中发现了CityId的存在,所以,这里的cityid的获取是通过离线地图中searchCity()方法获取到的,不知道给位有没有更好的办法。

具体如下

MKOfflineMap offine = new MKOfflineMap();
offine.init(this);
//此处的result为上边OnGetGeoCoderResultListener中的result
List<MKOLSearchRecord> record = offine.searchCity(result.getAddressDetail().city);    
int cityId = record.get(0).cityID;

完整代码如下,没来得及整理,见谅:

package com.daojian.pink;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.offline.MKOLSearchRecord;
import com.baidu.mapapi.map.offline.MKOfflineMap;
import com.baidu.mapapi.map.offline.MKOfflineMapListener;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.daojian.pink.util.Utils;

public class MapActivity extends Activity implements OnClickListener, OnGetGeoCoderResultListener, MKOfflineMapListener {

	private RelativeLayout rlBack;
	private TextView tvAddress;
	private TextView tvBack;
	private TextView tvConfirm;
	private MapView mapView;
	private BaiduMap mBaiduMap;
	private GeoCoder mSearch;
	private LocationClient mLocClient;
	boolean isFirstLoc = true;// 是否首次定位
	private LatLng ll;
	public MyLocationListenner myListener;
	private MKOfflineMap offine;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.activity_map);

		initView();
		initMembers();
	}

	private void initView() {
		mapView = (MapView) findViewById(R.id.map_bmapView);
		tvAddress = (TextView) findViewById(R.id.map_tv_address);
		rlBack = (RelativeLayout) findViewById(R.id.map_rl_back);
		tvBack = (TextView) findViewById(R.id.map_tv_back);
		tvConfirm = (TextView) findViewById(R.id.map_tv_confirm);
		
		rlBack.setOnClickListener(this);
		tvBack.setOnClickListener(this);
		tvConfirm.setOnClickListener(this);
	}
	
	private void initMembers(){
		mBaiduMap = mapView.getMap();
		mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(19).build()));// 设置缩放级别
		mSearch = GeoCoder.newInstance();
		mSearch.setOnGetGeoCodeResultListener(this);
		mBaiduMap.setMyLocationEnabled(true);
		mBaiduMap.setOnMapClickListener(new MyMapClickListener());
		// 定位初始化
		offine = new MKOfflineMap();
		offine.init(this);
		mLocClient = new LocationClient(this);
		myListener = new MyLocationListenner();
		mLocClient.registerLocationListener(myListener);
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 打开gps
		option.setCoorType("bd09ll"); // 设置坐标类型
		option.setScanSpan(1000);
		mLocClient.setLocOption(option);
		mLocClient.start();
	}

	 @Override
	 protected void onDestroy() {
	 super.onDestroy();
	 mapView.onDestroy();
	 }
	
	 @Override
	 protected void onResume() {
	 super.onResume();
	 mapView.onResume();
	 }
	
	 @Override
	 protected void onPause() {
	 super.onPause();
	 mapView.onPause();
	 }

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.map_rl_back:
			this.finish();
			break;
			
		case R.id.map_tv_back:
			MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
			mBaiduMap.animateMapStatus(u);
			mBaiduMap.clear();
			break;
			
		case R.id.map_tv_confirm:
			if(Utils.isStringEmpty(tvAddress.getText().toString())){
				Toast.makeText(MapActivity.this, "请在地图上选择上课地点", Toast.LENGTH_LONG).show();
				return;
			}
			Message msg = ReleaseActivity.refreshHandler.obtainMessage();
			msg.what = ReleaseActivity.GET_MAP_ADDRESS;
			msg.obj=  tvAddress.getText().toString();
			msg.sendToTarget();
			MapActivity.this.finish();
			break;

		default:
			break;
		}
	}
	
	/**
	 * 定位SDK监听函数
	 */
	private class MyLocationListenner implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 销毁后不在处理新接收的位置
			if (location == null || mapView == null)
				return;
			MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
			// 此处设置开发者获取到的方向信息,顺时针0-360
					.direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				ll = new LatLng(location.getLatitude(), location.getLongitude());
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
			}
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}
	
	private class MyMapClickListener implements OnMapClickListener{

		@Override
		public void onMapClick(LatLng arg0) {
			mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(arg0));
		}

		@Override
		public boolean onMapPoiClick(MapPoi arg0) {
			return false;
		}
		
	}

	@Override
	public void onGetGeoCodeResult(GeoCodeResult arg0) {
		
	}

	@Override
	public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
			Toast.makeText(MapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		mBaiduMap.clear();
		mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding)));
		mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result.getLocation()));
		List<MKOLSearchRecord> record = offine.searchCity(result.getAddressDetail().city);
//		int cityId = record.get(0).cityID;
		tvAddress.setText(result.getAddress());	
	}

	@Override
	public void onGetOfflineMapState(int arg0, int arg1) {
		
	}
}


© 著作权归作者所有

古雨
粉丝 1
博文 1
码字总数 1422
作品 0
成都
私信 提问
社交APP--方圆十里

《方圆十里》—— 基于IM(环信即时通讯云)+LBS(百度地图SDK+GeoHash距离算法)的社交APP 一、功能列表: 登录、注册(采用后端授权注册的方式绑定环信id,更安全) 用户资料:头像、昵称、性别...

午夜狂魔
2016/07/29
2.5K
2
百度地图API简单应用——1.根据地址查询经纬度

这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的。只要简单几步注册下,就可以获得一个Key,就能直接调用(PS:好像1.3版本...

凯文加内特
2015/10/22
523
0
百度地图API简单应用——1.根据地址查询经纬度

这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的。只要简单几步注册下,就可以获得一个Key,就能直接调用(PS:好像1.3版本...

Edwyn王
2015/12/10
44
0
微信公众号开发之用户地理位置坐标转百度坐标

微信公众号开发之用户地理位置坐标转百度坐标(搜狗、google地图坐标转百度地图坐标) 上海为卓信息科技——专业实现电子地图二次开发应用百度谷歌地图API调用开发。 我们知道,Google地图、s...

睡得
2015/03/18
18.9K
3
二、android百度地图定位显示当前位置(android百度地图SDK系列)

上一篇文章,我们知道了如何集成百度地图并且显示出来,那么这一篇文章我们就来看看如何对百度地图进行需要的设置以及定位并且显示当前的位置。 一、android集成百度地图(android百度地图SDK...

猫儿不吃鱼鱼
2017/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部