利用百度地图Android sdk高仿微信发送位置功能

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶

假设须要完整demo。请评论留下邮箱

(眼下源代码已经不发送,假设须要源代码。加qq316701116,不喜勿扰)

 

 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出

1、在微信发送功能中,无论用户怎样拖拽地图。总有个覆盖物固定了MapView中央,怎么实现?

    事实上这非常easy实现。仅仅要MapView的布局文件里。将一个ImageView覆盖在MapView的中央,就行实现无论用户怎样拖拽地图。覆盖物(ImageView)总固定总MapView中央

2、怎样获取MapView中央的地理坐标。也即是屏幕覆盖物处的坐标?

    要获取MapView中央的地理坐标,首先先获取覆盖物在屏幕上的物理坐标。这里得差别一下地理坐标(经纬度)和物理坐标(xy轴);

   能够通过

[java] view
plain
copy

  1. <mCenterPoint = mBaiduMap.getMapStatus().targetScreen;//mBaiduMap是BaiduMap类的实例

来获取物理坐标,这个物理坐标是不变的,而物理坐标相应的地理坐标却是随着用户拖拽地图而改变。所以。当我们须要地理坐标时,能够通过

[java] view
plain
copy

  1. currentLatLng = mBaiduMap.getProjection().fromScreenLocation(
  2. mCenterPoint);

获取。

3、怎样获取该地理坐标周围的全部poi信息(也就是周围建筑物的信息),而不仅仅是某个类型的兴趣点?

为了实现这个功能,真是费了我好大劲,由于我之前一直以为用POI周边搜索实现的,有人提示我能够通过循环轴线搜索实现不同keyword搜索,但这样子确实非常难实现跟微信那样的效果。通过查看API,发现能够通过反地理编码解决问题,至于什么事反地理编码,能够到百度地图官网了解,通过调用它。能够返回一个该地理坐标附近建筑信息的一个列表

4、当用户拖拽地图,怎样让列表更新到眼下中心地理位置的周边信息?

这个困难事实上也不难实现。仅仅是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件,在触摸监听器的回调函数中

将MapView中央的物理坐标转换成相应的地理坐标,再通过反地理编码获取周边信息。道理同问题3

5、当点击listview某一项时。怎样将项地理位置显示在MapView也就是屏幕中央?

非常easy,通过listview的适配器获取item的位置信息,包含经纬度。然后用动画跳转到屏幕中央位置就可以。

我觉得上面5个问题是实现这个功能的关键所在,以下是效果图(假设须要完整demo,请评论留下邮箱)

上面是一个MapVIew。覆盖物固定在当中央,地图左下角的白色正方形是回到定位点的button。由于没找到好看的图片,就留着空白了

以下是一个listView。显示地图指示地点周围的一些位置信息

贴一下实现该功能的核心代码

Activity类

[java] view
plain
copy

  1. package com.vr.souhuodong.UI.Sou;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.graphics.Point;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.view.MotionEvent;
  10. import android.view.View;
  11. import android.widget.AdapterView;
  12. import android.widget.AdapterView.OnItemClickListener;
  13. import android.widget.ImageView;
  14. import android.widget.ListView;
  15. import android.widget.ProgressBar;
  16. import com.baidu.location.BDLocation;
  17. import com.baidu.location.BDLocationListener;
  18. import com.baidu.location.LocationClient;
  19. import com.baidu.location.LocationClientOption;
  20. import com.baidu.mapapi.map.BaiduMap;
  21. import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;
  22. import com.baidu.mapapi.map.BitmapDescriptor;
  23. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  24. import com.baidu.mapapi.map.MapStatusUpdate;
  25. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  26. import com.baidu.mapapi.map.MapView;
  27. import com.baidu.mapapi.map.MarkerOptions;
  28. import com.baidu.mapapi.map.MyLocationConfiguration;
  29. import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
  30. import com.baidu.mapapi.map.MyLocationData;
  31. import com.baidu.mapapi.map.OverlayOptions;
  32. import com.baidu.mapapi.model.LatLng;
  33. import com.baidu.mapapi.search.core.PoiInfo;
  34. import com.baidu.mapapi.search.core.SearchResult;
  35. import com.baidu.mapapi.search.geocode.GeoCodeResult;
  36. import com.baidu.mapapi.search.geocode.GeoCoder;
  37. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
  38. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
  39. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
  40. import com.vr.souhuodong.R;
  41. import com.vr.souhuodong.UI.Adapter.PlaceListAdapter;
  42. public class ChoosePlaceActivity extends Activity {
  43. MapView mMapView;
  44. BaiduMap mBaiduMap;
  45. ProgressBar mLoadBar;
  46. ImageView mSelectImg;
  47. // 定位
  48. LocationClient mLocationClient = null;
  49. MyBDLocationListner mListner = null;
  50. BitmapDescriptor mCurrentMarker = null;
  51. // 当前经纬度
  52. double mLantitude;
  53. double mLongtitude;
  54. LatLng mLoactionLatLng;
  55. // 设置第一次定位标志
  56. boolean isFirstLoc = true;
  57. // MapView中央对于的屏幕坐标
  58. Point mCenterPoint = null;
  59. // 地理编码
  60. GeoCoder mGeoCoder = null;
  61. // 位置列表
  62. ListView mListView;
  63. PlaceListAdapter mAdapter;
  64. List<PoiInfo> mInfoList;
  65. PoiInfo mCurentInfo;
  66. @Override
  67. protected void onCreate(Bundle savedInstanceState) {
  68. // TODO Auto-generated method stub
  69. super.onCreate(savedInstanceState);
  70. setContentView(R.layout.activity_chooseplace);
  71. initView();
  72. }
  73. /**
  74. * 初始化界面
  75. */
  76. private void initView() {
  77. // TODO Auto-generated method stub
  78. // 初始化地图
  79. mMapView = (MapView) findViewById(R.id.chooseplace_bmapView);
  80. mMapView.showZoomControls(false);
  81. mBaiduMap = mMapView.getMap();
  82. MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);
  83. mBaiduMap.setMapStatus(msu);
  84. mBaiduMap.setOnMapTouchListener(touchListener);
  85. // 初始化POI信息列表
  86. mInfoList = new ArrayList<PoiInfo>();
  87. // 初始化当前MapView中心屏幕坐标,初始化当前地理坐标
  88. mCenterPoint = mBaiduMap.getMapStatus().targetScreen;
  89. mLoactionLatLng = mBaiduMap.getMapStatus().target;
  90. // 定位
  91. mBaiduMap.setMyLocationEnabled(true);
  92. mLocationClient = new LocationClient(this);
  93. mListner = new MyBDLocationListner();
  94. mLocationClient.registerLocationListener(mListner);
  95. LocationClientOption option = new LocationClientOption();
  96. option.setOpenGps(true);// 打开gps
  97. option.setCoorType("bd09ll"); // 设置坐标类型
  98. option.setScanSpan(1000);
  99. mLocationClient.setLocOption(option);
  100. mLocationClient.start();
  101. // 地理编码
  102. mGeoCoder = GeoCoder.newInstance();
  103. mGeoCoder.setOnGetGeoCodeResultListener(GeoListener);
  104. // 周边位置列表
  105. mListView = (ListView) findViewById(R.id.place_list);
  106. mLoadBar = (ProgressBar) findViewById(R.id.place_progressBar);
  107. mListView.setOnItemClickListener(itemClickListener);
  108. mAdapter = new PlaceListAdapter(getLayoutInflater(), mInfoList);
  109. mListView.setAdapter(mAdapter);
  110. mSelectImg = new ImageView(this);
  111. }
  112. public void turnBack(View view) {
  113. // 实现动画跳转
  114. MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mLoactionLatLng);
  115. mBaiduMap.animateMapStatus(u);
  116. mBaiduMap.clear();
  117. // 发起反地理编码检索
  118. mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
  119. .location(mLoactionLatLng));
  120. }
  121. @Override
  122. protected void onDestroy() {
  123. // TODO Auto-generated method stub
  124. super.onDestroy();
  125. mLocationClient.stop();
  126. mGeoCoder.destroy();
  127. }
  128. // 定位监听器
  129. private class MyBDLocationListner implements BDLocationListener {
  130. @Override
  131. public void onReceiveLocation(BDLocation location) {
  132. // TODO Auto-generated method stub
  133. // map view 销毁后不在处理新接收的位置
  134. if (location == null || mMapView == null)
  135. return;
  136. MyLocationData data = new MyLocationData.Builder()//
  137. // .direction(mCurrentX)//
  138. .accuracy(location.getRadius())//
  139. .latitude(location.getLatitude())//
  140. .longitude(location.getLongitude())//
  141. .build();
  142. mBaiduMap.setMyLocationData(data);
  143. // 设置自己定义图标
  144. MyLocationConfiguration config = new MyLocationConfiguration(
  145. LocationMode.NORMAL, true, null);
  146. mBaiduMap.setMyLocationConfigeration(config);
  147. mLantitude = location.getLatitude();
  148. mLongtitude = location.getLongitude();
  149. LatLng currentLatLng = new LatLng(mLantitude, mLongtitude);
  150. mLoactionLatLng = new LatLng(mLantitude, mLongtitude);
  151. // 是否第一次定位
  152. if (isFirstLoc) {
  153. isFirstLoc = false;
  154. // 实现动画跳转
  155. MapStatusUpdate u = MapStatusUpdateFactory
  156. .newLatLng(currentLatLng);
  157. mBaiduMap.animateMapStatus(u);
  158. mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
  159. .location(currentLatLng));
  160. return;
  161. }
  162. }
  163. }
  164. // 地理编码监听器
  165. OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {
  166. public void onGetGeoCodeResult(GeoCodeResult result) {
  167. if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
  168. // 没有检索到结果
  169. }
  170. // 获取地理编码结果
  171. }
  172. @Override
  173. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
  174. if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
  175. // 没有找到检索结果
  176. }
  177. // 获取反向地理编码结果
  178. else {
  179. // 当前位置信息
  180. mCurentInfo = new PoiInfo();
  181. mCurentInfo.address = result.getAddress();
  182. mCurentInfo.location = result.getLocation();
  183. mCurentInfo.name = "[位置]";
  184. mInfoList.clear();
  185. mInfoList.add(mCurentInfo);
  186. // 将周边信息增加表
  187. if (result.getPoiList() != null) {
  188. mInfoList.addAll(result.getPoiList());
  189. }
  190. // 通知适配数据已改变
  191. mAdapter.notifyDataSetChanged();
  192. mLoadBar.setVisibility(View.GONE);
  193. }
  194. }
  195. };
  196. // 地图触摸事件监听器
  197. OnMapTouchListener touchListener = new OnMapTouchListener() {
  198. @Override
  199. public void onTouch(MotionEvent event) {
  200. // TODO Auto-generated method stub
  201. if (event.getAction() == MotionEvent.ACTION_UP) {
  202. if (mCenterPoint == null) {
  203. return;
  204. }
  205. // 获取当前MapView中心屏幕坐标相应的地理坐标
  206. LatLng currentLatLng;
  207. currentLatLng = mBaiduMap.getProjection().fromScreenLocation(
  208. mCenterPoint);
  209. System.out.println("----" + mCenterPoint.x);
  210. System.out.println("----" + currentLatLng.latitude);
  211. // 发起反地理编码检索
  212. mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
  213. .location(currentLatLng));
  214. mLoadBar.setVisibility(View.VISIBLE);
  215. }
  216. }
  217. };
  218. // listView选项点击事件监听器
  219. OnItemClickListener itemClickListener = new OnItemClickListener() {
  220. @Override
  221. public void onItemClick(AdapterView<?

    > parent, View view, int position,
  222. long id) {
  223. // TODO Auto-generated method stub
  224. // 通知是适配器第position个item被选择了
  225. mAdapter.setNotifyTip(position);
  226. BitmapDescriptor mSelectIco = BitmapDescriptorFactory
  227. .fromResource(R.drawable.icon_geo);
  228. mBaiduMap.clear();
  229. PoiInfo info = (PoiInfo) mAdapter.getItem(position);
  230. LatLng la = info.location;
  231. // 动画跳转
  232. MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(la);
  233. mBaiduMap.animateMapStatus(u);
  234. // 加入覆盖物
  235. OverlayOptions ooA = new MarkerOptions().position(la)
  236. .icon(mSelectIco).anchor(0.5f, 0.5f);
  237. mBaiduMap.addOverlay(ooA);
  238. // 选中项打勾
  239. mSelectImg.setBackgroundResource(R.drawable.greywhite);
  240. mSelectImg = (ImageView) view.findViewById(R.id.place_select);
  241. mSelectImg.setBackgroundResource(R.drawable.ic_select);
  242. //          Uri mUri = Uri.parse("geo:39.940409,116.355257");
  243. //          Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri);
  244. //          startActivity(mIntent);
  245. }
  246. };
  247. }

自己定义的listView适配器

[java] view
plain
copy

  1. package com.vr.souhuodong.UI.Adapter;
  2. import java.util.List;
  3. import android.R.integer;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.ViewGroup;
  8. import android.widget.BaseAdapter;
  9. import android.widget.ImageView;
  10. import android.widget.TextView;
  11. import com.baidu.mapapi.search.core.PoiInfo;
  12. import com.vr.souhuodong.R;
  13. public class PlaceListAdapter extends BaseAdapter {
  14. List<PoiInfo> mList;
  15. LayoutInflater mInflater;
  16. int notifyTip ;
  17. private class MyViewHolder {
  18. TextView placeName;
  19. TextView placeAddree;
  20. ImageView placeSelected;
  21. }
  22. public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {
  23. super();
  24. this.mList = mList;
  25. this.mInflater = mInflater;
  26. notifyTip = -1 ;
  27. }
  28. /**
  29. * 设置第几个item被选择
  30. * @param notifyTip
  31. */
  32. public void setNotifyTip(int notifyTip) {
  33. this.notifyTip = notifyTip;
  34. }
  35. @Override
  36. public int getCount() {
  37. // TODO Auto-generated method stub
  38. return mList.size();
  39. }
  40. @Override
  41. public Object getItem(int position) {
  42. // TODO Auto-generated method stub
  43. return mList.get(position);
  44. }
  45. @Override
  46. public long getItemId(int position) {
  47. // TODO Auto-generated method stub
  48. return position;
  49. }
  50. @Override
  51. public View getView(int position, View convertView, ViewGroup parent) {
  52. // TODO Auto-generated method stub
  53. MyViewHolder holder;
  54. if (convertView == null) {
  55. System.out.println("----aa-");
  56. convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);
  57. holder = new MyViewHolder();
  58. holder.placeName = (TextView) convertView
  59. .findViewById(com.vr.souhuodong.R.id.place_name);
  60. holder.placeAddree = (TextView) convertView
  61. .findViewById(com.vr.souhuodong.R.id.place_adress);
  62. holder.placeSelected = (ImageView) convertView
  63. .findViewById(com.vr.souhuodong.R.id.place_select);
  64. holder.placeName.setText(mList.get(position).name);
  65. holder.placeAddree.setText(mList.get(position).address);
  66. holder.placeSelected.setBackgroundResource(R.drawable.greywhite);
  67. convertView.setTag(holder);
  68. } else {
  69. holder = (MyViewHolder) convertView.getTag();
  70. }
  71. holder.placeName.setText(mList.get(position).name);
  72. holder.placeAddree.setText(mList.get(position).address);
  73. //依据又一次载入的时候第position条item是否是当前所选择的,选择载入不同的图片
  74. if(notifyTip == position ){
  75. holder.placeSelected.setBackgroundResource(R.drawable.ic_select);
  76. }
  77. else {
  78. holder.placeSelected.setBackgroundResource(R.drawable.greywhite);
  79. }
  80. return convertView;
  81. }
  82. //  class MyItemClickListener implements OnClickListener {
  83. //
  84. //      ImageView mImg;
  85. //      public MyItemClickListener(ImageView mImg) {
  86. //          this.mImg = mImg;
  87. //      }
  88. //      @Override
  89. //      public void onClick(View v) {
  90. //          // TODO Auto-generated method stub
  91. //          mImg.setBackgroundResource(R.drawable.ic_select);
  92. //      }
  93. //
  94. //  }
  95. }
时间: 2024-10-10 09:17:15

利用百度地图Android sdk高仿微信发送位置功能的相关文章

百度地图 Android SDK - 检索功能使用的简单示例

百度地图 SDK 不仅为广大开发者提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发者提供了多种 LBS 检索的能力.通过这些接口,开发者可以轻松的访问百度的 LBS 数据,丰富自己的移动端地图应用. 目前百度地图 SDK 为开发者提供的检索服务有: POI 检索:可以检索百度 POI 数据信息: 线路规划:利用百度的引擎帮助开发者规划线路: 在线建议检索.短链接分享.地理编码等等.... 本文将以一个很简单的 POI 城市内检索为例,像广大开发者介绍接口的使用. 第一步,选择并下载 SD

百度地图 Android SDK - Hello Baidu Map

如下内容主要向广大开发者介绍如何利用百度地图Android SDK来构建一个最基本的地图应用! 第一步,创建Android工程,将百度地图Android SDK的开发包导入到工程相应位置: 在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示: 注:l

百度地图 Android SDK - 标注(Marker)的基本使用

标注(Marker)是开发者最常使用的地图覆盖物志一,今天就来向大家介绍一些标注(Marker)的最基本使用方法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处添加 Marker: 3.实现 Marker 的点击事件响应: 4.实现 Marker 的添加和灵活删除: 为了实现以上目标,我们会分成以下若干步骤来进行. 第一步.创建工程,导入百度地图 Android SDK: 具体创建工程的方式(略).本示例主要是为了实现地图及相关的覆盖物功能,因此这里我只使用 SDK 开发资源下载平台

百度地图 Android SDK - 新的版本号(v3.2.0)正式上线

百度地图 Android SDK v3.2.0 在版本号 2014 年 11 月 07 日本正式推出工作完成! watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FsbG1lc2Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 在这个版本号中.我们主要为广大开发人员开放了百度城市热力图层,帮助开发人员构建形式更加丰富的地图应用! 那么这里可能

Android 关于百度地图Android SDK几处修正使用说明(非官方)

本篇主要是因为最近在学习使用百度地图,发现了一些问题,跟大伙分享一下. 1.根据android sdk开发指南中"Hello World"的例子,构建一个基础的地图页面,如果大家完全按照示例代码中所写的那样,是不会执行成功的,会有以下问题的错误提示"java.lang.RuntimeException: Unable to instantiate activity ComponentInfo" 这个问题出现的原因是 在第二步,配置Activity部分,android

分享:百度地图Android SDK开发指南

最新的百度地图(v3.2)下载包中居然没有开发指南,自己整理了一下网页版的百度地图Android SDK开发指南,分享给和自己一样需要Demo的学生党.下载链接: http://pan.baidu.com/s/1jGqYF5c 密码: wpf9.

百度地图 Android SDK - 新版本(v3.2.0)正式上线

百度地图 Android SDK v3.2.0 版本于 2014 年 11 月 07 日完成正式上线工作! 在这个版本中,我们主要为广大开发者开放了百度城市热力图层,帮助开发者构建形式更加丰富的地图应用! 那么这里可能一些细心的开发者就会有疑问了,曾经的 v3.1.0 版本貌似就有一个什么热力图,这两个之间是怎么回事,有什么区别呢?别急,听我慢慢道来: v3.1.0 版本所开放的是热力图的绘制能力,说白了就是你来给我们提供数据,我们来帮助您实现本地的一个热力图绘制,最主要的前提是由开发者传入位置

百度地图 Android SDK - 坐标转换方法

百度地图 Android SDK 或者 iOS SDK 或者各种各样的 API 工具产品,都使用的是百度自己经过加密的坐标体系. 众多开发者在使用过程中,位置点都是通过 GPS 或者其他途径获取的,所以与百度地图所使用的坐标系存在差异. 开发者在将这些空间位置信息运用到地图地图上得时候,需要进行响应的纠偏(坐标转换),Android SDK 为广大开发者早已开放了响应的坐标转换方法, 开发者只需要短短的几行代码就可以实现相应的坐标转换操作了. 具体方法如下: // 将google地图.soso地

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK? 百度个性化地图Android SDK是一套基于Android 2.2及以上版本设备的应用程序接口,您可以通过该套接口实现基本的地图功能,并且可以定制地图样式,实现个性化地图. 该接口提供以下功能: 1.基本地图:提供地图(2D.3D)的展示和缩放.平移.旋转.改变视角等地图操作: 2.个性化地图:可以更改地图样式,让您的地图与众不同,实现个性化定制: 3.覆盖物:提供常见地图覆盖物(自定义标注.几何图形等),满足开发者的各种需求: 4.坐标映射:提供