最新版百度地图定位sdk6.2.2集成,定位并显示

尴尬改改吧,头一次写博客,出来的结果太丢人,只剩下一堆不知所云的代码,哈哈,明天端午了,抽时间写写

学习android绝对是偶然,但也像是命运的必然,扔下代码将近两年的我,又重新捡起了代码,神奇的是,学校里不明白的一些东西竟然豁然开朗的懂了。

废话不多说了,开始我们的定位吧,第一次看百度地图的文档一头雾水,后来才发现,按步骤来就行,百度的文档还是很详细的,但是只看文档又会让你迷失方向,因为你也不知道那一坨坨的代码是怎么让地图显示出来的,接下来就看看我这一个月的小白是怎么让地图出来并且定位的。

需要的资源:

1、你的地图项目

2、创建登录百度地图开发者账号,在百度地图创建你的项目(点我创建)(跟你的ide里的项目同名同包),正确填写sha1码和包名=====这里注意,很多显示不出来的地图都是因为sha1码不对,如果你的地图显示的是网格,那么有可能就是这个问题,百分百获取正确sha1码的方法,点我惊讶http://zhidao.baidu.com/question/937515725320609612.html?from=pubpage&msgtype=2从这个地址下载个app,获取的sha1码是绝对不会出错的。

3、百度地图官方demo,找到百度地图定位相关的类。然后按照百度地图文档引入各种包(需要添加到libs里的)、配置manifest.xml,将百度地图的定位相关类粘到你的项目里,稍作修改,OK。

待地图显示,很有成就感,接下来就是在以后的时间里慢慢熟悉代码,研究各部分逻辑,集成东西蛮简单,刚开始集成时大可不必研究那么透彻,慢慢的,做多了,自然理解。与小伙伴们共勉。

下面是我的代码,里面掺杂了周边检索的功能,练习的时候做的,自己挑挑吧,把周边检索的东西都去掉了就是定位的,哈哈。

详细的步骤就不说了,页面什么的自己弄吧,贴下定位类吧,方便后来人:

<pre name="code" class="java">package com.example.navigation.fragment;

import java.util.List;

import android.app.Fragment;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
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.location.LocationClientOption.LocationMode;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.CityInfo;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener;
import com.baidu.mapapi.search.sug.SuggestionResult;
import com.baidu.mapapi.search.sug.SuggestionSearch;
import com.example.navigation.R;
import com.example.navigation.util.CommUtil;
import com.example.navigation.util.PoiOverlay;

/**
 * 便民地图页面
 * @author mishaoshuai
 *
 */
public class MapFragment extends Fragment implements
		OnGetPoiSearchResultListener, OnGetSuggestionResultListener,
		OnClickListener {

	View view;
	private MapView mMapView;
	private StringBuffer sb;
	private LocationClient mLocationClient = null;
	private BDLocationListener mBDlocationListener = new MyBDlocationListener();
	public BaiduMap mBaiduMap;
	public BitmapDescriptor mCurrentMarker;
	public com.baidu.mapapi.map.MyLocationConfiguration.LocationMode mCurrentMode;
	protected InfoWindow mInfoWindow;
	public String registrationID;
	private double mCurrentLatitude;// 经度
	private double mCurrentLongitude;// 纬度

	public static LatLng cenpt;

	/**
	 * 周边检索相关
	 */
	private PoiSearch mPoiSearch = null;
	private SuggestionSearch mSuggestionSearch = null;
	/**
	 * 搜索关键字输入窗口
	 */
	private AutoCompleteTextView keyWorldsView = null;
	private ArrayAdapter<String> sugAdapter = null;
	private int load_Index = 0;
	private String tempStr;
	private EditText etSearchKey;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		SDKInitializer.initialize(getActivity().getApplicationContext());
		view = inflater.inflate(R.layout.fragment_map, null);
		init();
		return view;
	}

	private void init() {
		// TODO Auto-generated method stub
		initViews();
		initObj();
	}

	protected void initViews() {
		mMapView = (MapView) view.findViewById(R.id.bmapView);
		mBaiduMap = mMapView.getMap();
		mLocationClient = new LocationClient(getActivity()
				.getApplicationContext());
		etSearchKey = (EditText) view.findViewById(R.id.et_poi_map);
	}

	protected void initObj() {
		mLocationClient.registerLocationListener(mBDlocationListener);
		initLocation();
		if (CommUtil.isNetConnected(getActivity())) {
			mLocationClient.start();
		}else {
			Toast.makeText(getActivity(), "无网络", Toast.LENGTH_SHORT).show();
		}
		view.findViewById(R.id.btn_search_map).setOnClickListener(this);
		view.findViewById(R.id.btn_hospital_map).setOnClickListener(this);
		view.findViewById(R.id.btn_wc_map).setOnClickListener(this);
		view.findViewById(R.id.btn_park_map).setOnClickListener(this);
	}

	/**
	 * 定位参数
	 */
	private void initLocation() {
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
		option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
		int span = 1000;
		option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
		option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
		option.setOpenGps(true);// 可选,默认false,设置是否使用gps
		option.setLocationNotify(false);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
		option.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
		option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
		option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
		option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
		option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤gps仿真结果,默认需要
		mLocationClient.setLocOption(option);
	}

	/***
	 * 实现BDLocationListener接口,重写onReceiveLocation处理接收的定位数据
	 * 
	 * @author mishaoshuai
	 *
	 */
	class MyBDlocationListener implements BDLocationListener {
		@Override
		public void onReceiveLocation(BDLocation location) {
			// 开启定位图层
			mBaiduMap.setMyLocationEnabled(true);
			// 构造定位数据
			MyLocationData locData = new MyLocationData.Builder()
					.accuracy(location.getRadius())
					// 此处设置开发者获取到的方向信息,顺时针0-360
					.direction(0).latitude(location.getLatitude())
					.longitude(location.getLongitude()).build();
			// 设置定位数据
			mBaiduMap.setMyLocationData(locData);
			// 定位图标
			mCurrentMarker = BitmapDescriptorFactory
					.fromResource(R.drawable.map);
			MyLocationConfiguration config = new MyLocationConfiguration(
					com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL,
					true, mCurrentMarker);
			mBaiduMap.setMyLocationConfigeration(config);
			 mBaiduMap.getUiSettings().setScrollGesturesEnabled(true);

			// 纬度
			mCurrentLongitude = location.getLongitude();
			// 经度
			mCurrentLatitude = location.getLatitude();
			/**
			 * 定位关键代码
			 */
			keyLocation();

			// // 当不需要定位图层时关闭定位图层
			// mBaiduMap.setMyLocationEnabled(false);
			// Receive Location
			sb = new StringBuffer(256);
			if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
				sb.append("\ndescribe : ");
				sb.append("gps定位成功");
			} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
				sb.append("\ndescribe : ");
				sb.append("网络定位成功");
			} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
				sb.append("\ndescribe : ");
				sb.append("离线定位成功,离线定位结果也是有效的");
			} else if (location.getLocType() == BDLocation.TypeServerError) {
				sb.append("\ndescribe : ");
				sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
			} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
				sb.append("\ndescribe : ");
				sb.append("网络不同导致定位失败,请检查网络是否通畅");
			} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
				sb.append("\ndescribe : ");
				sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
			}
			sb.append("\nlocationdescribe : ");
			sb.append(location.getLocationDescribe());// 位置语义化信息
			List<Poi> list = location.getPoiList();// POI数据
			if (list != null) {
				sb.append("\npoilist size = : ");
				sb.append(list.size());
				for (Poi p : list) {
					sb.append("\npoi= : ");
					sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
				}
			}
			sb.append("\nregistrationID:");
			sb.append(registrationID);
			mLocationClient.stop();// 关闭定位,否则会一直定位在你当前位置
		}
	}

	/**
	 * 定位
	 */
	public void keyLocation() {
		cenpt = new LatLng(mCurrentLatitude, mCurrentLongitude);// 参数分别是:经度,纬度
		// 定义地图状态
		MapStatus mMapStatus = new MapStatus.Builder().target(cenpt).zoom(14)
				.build();
		// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
		MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
				.newMapStatus(mMapStatus);
		// 改变地图状态
		mBaiduMap.setMapStatus(mMapStatusUpdate);
	}

	/**
	 * 周边检索
	 */
	private void PoiSearch(String str) {
		// TODO Auto-generated method stub
		mPoiSearch = PoiSearch.newInstance();
		mPoiSearch.setOnGetPoiSearchResultListener(this);
		mSuggestionSearch = SuggestionSearch.newInstance();
		mSuggestionSearch.setOnGetSuggestionResultListener(this);
		keyWorldsView = (AutoCompleteTextView) view
				.findViewById(R.id.et_poi_map);
		sugAdapter = new ArrayAdapter<String>(getActivity(),
				android.R.layout.simple_dropdown_item_1line);
		keyWorldsView.setAdapter(sugAdapter);

		// EditText editCity = (EditText) view.findViewById(R.id.et_city_map);

		// 搜索附近poi
		mPoiSearch.searchNearby(new PoiNearbySearchOption().keyword(str)
				.location(cenpt).pageNum(3).radius(10000));
		// 城市内关键字搜索poi
		// mPoiSearch.searchInCity((new PoiCitySearchOption())
		// .city(editCity.getText().toString())
		// .keyword(editSearchKey.getText().toString())
		// .pageNum(load_Index));

		/**
		 * 当输入关键字变化时,动态更新建议列表
		 */
		keyWorldsView.addTextChangedListener(new TextWatcher() {

			@Override
			public void afterTextChanged(Editable arg0) {

			}

			@Override
			public void beforeTextChanged(CharSequence arg0, int arg1,
					int arg2, int arg3) {

			}

			@Override
			public void onTextChanged(CharSequence cs, int arg1, int arg2,
					int arg3) {
				if (cs.length() <= 0) {
					return;
				}
				// String city = ((EditText)
				// view.findViewById(R.id.et_city_map))
				// .getText().toString();
				// /**
				// * 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
				// */
				// mSuggestionSearch
				// .requestSuggestion((new SuggestionSearchOption())
				// .keyword(cs.toString()).city(city));
			}
		});
	}

	@Override
	public void onGetSuggestionResult(SuggestionResult res) {
		// TODO Auto-generated method stub

		if (res == null || res.getAllSuggestions() == null) {
			return;
		}
		sugAdapter.clear();
		for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) {
			if (info.key != null)
				sugAdapter.add(info.key);
		}
		sugAdapter.notifyDataSetChanged();

	}

	@Override
	public void onGetPoiDetailResult(PoiDetailResult result) {
		// TODO Auto-generated method stub

		if (result.error != SearchResult.ERRORNO.NO_ERROR) {
			Toast.makeText(getActivity(), "抱歉,未找到结果", Toast.LENGTH_SHORT)
					.show();
		} else {
			Toast.makeText(getActivity(),
					result.getName() + ": " + result.getAddress(),
					Toast.LENGTH_SHORT).show();
		}

	}

	@Override
	public void onGetPoiResult(PoiResult result) {
		// TODO Auto-generated method stub

		if (result == null
				|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
			Toast.makeText(getActivity(), "未找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		if (result.error == SearchResult.ERRORNO.NO_ERROR) {
			mBaiduMap.clear();
			PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
			mBaiduMap.setOnMarkerClickListener(overlay);
			overlay.setData(result);
			overlay.addToMap();
			overlay.zoomToSpan();
			return;
		}
		if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

			// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
			String strInfo = "在";
			for (CityInfo cityInfo : result.getSuggestCityList()) {
				strInfo += cityInfo.city;
				strInfo += ",";
			}
			strInfo += "找到结果";
			Toast.makeText(getActivity(), strInfo, Toast.LENGTH_LONG).show();
		}

	}

	private class MyPoiOverlay extends PoiOverlay {

		public MyPoiOverlay(BaiduMap baiduMap) {
			super(baiduMap);
		}

		@Override
		public boolean onPoiClick(int index) {
			super.onPoiClick(index);
			PoiInfo poi = getPoiResult().getAllPoi().get(index);
			// if (poi.hasCaterDetails) {
			mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
					.poiUid(poi.uid));
			// }
			return true;
		}
	}

	/**
	 * 重写的onclick事件
	 */
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (CommUtil.isNetConnected(getActivity())) {
			switch (v.getId()) {
			case R.id.btn_search_map:
				if (TextUtils.isEmpty(etSearchKey.getText())) {
					Toast.makeText(getActivity(), "请输入您要查询的地址", Toast.LENGTH_SHORT).show();
					break;
				}else{
					PoiSearch(etSearchKey.getText().toString());
				}
				
				break;
			case R.id.btn_park_map:
				PoiSearch("市场");
				break;
			case R.id.btn_hospital_map:
				PoiSearch("医院");
				break;
			case R.id.btn_wc_map:
				PoiSearch("厕所");
				break;
			}
		}else {
			Toast.makeText(getActivity(), "无网络", Toast.LENGTH_SHORT).show();
		}
	}
}


 
 
唉,还是不放心,再说说定位的关键代码吧,里面注释里的:定位参数、定位、 
实现BDLocationListener接口,重写onReceiveLocation处理接收的定位数据,这三个注释的方法,是主要的定位逻辑,漫漫android路,加油! 


                
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Logstash-6.2.2是一个用于数据收集、转换和发送的开源数据处理引擎。它是Elastic Stack(ELK Stack)的一个组件,用于处理各种类型的数据并将其发送到Elasticsearch用于后续分析和可视化。 Logstash-6.2.2可用于Windows操作系统。要在Windows上安装Logstash-6.2.2,首先需要确保你的系统满足以下要求:至少2GB的内存、Java JDK 8的安装以及网络连接。 在安装前,你需要下载Logstash-6.2.2的Windows版本。然后,将压缩包解压到你想要安装的目录。接下来,在Logstash的安装目录中,你需要使用文本编辑器打开config文件夹中的logstash.yml文件。 在logstash.yml文件中,你需要配置输入、过滤器和输出。输入决定了要从哪里收集数据,如文件、数据库或网络。过滤器用于处理和转换数据。输出用于发送数据到目标地点,如Elasticsearch或其他目标。 完成配置后,你可以通过运行bin目录下的logstash.bat文件来启动Logstash。运行时,Logstash会加载配置文件并开始收集、处理和发送数据。 Logstash-6.2.2提供了丰富的插件库,可以用于扩展其功能。你可以在安装目录的plugins文件夹中找到并安装所需的插件。这些插件包括输入插件、过滤器插件和输出插件,可以满足不同场景下的数据处理需求。 总结来说,Logstash-6.2.2 windows版本是一个强大的数据处理引擎,可以帮助你收集、转换和发送各种类型的数据。通过配置输入、过滤器和输出,你可以灵活地处理数据,并将其发送到目标地点。使用Logstash的插件库,你可以扩展其功能以满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值