zoukankan      html  css  js  c++  java
  • 开发百度地图之实现

    在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。

    新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView 。设计代码如下:

    Xml代码 [url=]


    [/url]

    1.<?xml version="1.0" encoding="utf-8"?>
    2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="fill_parent"
    4. android:layout_height="fill_parent"
    5. android:orientation="vertical" >
    6. <FrameLayout
    7. android:id="@+id/map_layout"
    8. android:layout_width="fill_parent"
    9. android:layout_height="fill_parent"
    10. android:orientation="vertical" >
    11. <!-- 百度MapView控件 -->
    12. <com.baidu.mapapi.MapView
    13. android:id="@+id/map_view"
    14. android:layout_width="fill_parent"
    15. android:layout_height="fill_parent"
    16. android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw"
    17. android:clickable="true"
    18. android:enabled="true" />
    19. <LinearLayout
    20. android:layout_width="wrap_content"
    21. android:layout_height="wrap_content"
    22. android:layout_gravity="center"
    23. android:orientation="vertical"
    24. android:paddingBottom="105dip" >
    25. <!-- 地址信息显示TextView -->
    26. <TextView
    27. android:id="@+id/map_bubbleText"
    28. android:layout_width="wrap_content"
    29. android:layout_height="wrap_content"
    30. android:background="@drawable/location_tips"
    31. android:gravity="left|center"
    32. android:maxEms="12"
    33. android:paddingLeft="12dip"
    34. android:paddingRight="10dip"
    35. android:text="@string/load_tips"
    36. android:textColor="#cfcfcf"
    37. android:textSize="14sp" />
    38. </LinearLayout>
    39. <LinearLayout
    40. android:layout_width="wrap_content"
    41. android:layout_height="wrap_content"
    42. android:layout_gravity="center"
    43. android:orientation="vertical" >
    44. <!-- 位置指标显示ImageView -->
    45. <ImageView
    46. android:id="@+id/point_image"
    47. android:layout_width="wrap_content"
    48. android:layout_height="wrap_content"
    49. android:layout_gravity="center"
    50. android:layout_marginBottom="30dip"
    51. android:src="@drawable/point_start" />
    52. </LinearLayout>
    53. </FrameLayout>
    54.</LinearLayout>


    三:创建覆盖整个地图捕捉触控事件的MyMapOverlay继承Overlay

    Java代码 [url=]


    [/url]

    1.import android.view.MotionEvent;
    2.import com.baidu.mapapi.GeoPoint;
    3.import com.baidu.mapapi.MapView;
    4.import com.baidu.mapapi.Overlay;
    5.//覆盖整个地图捕捉触控事件的OverLay
    6.public abstract class MyMapOverlay extends Overlay{
    7.private int point_X;
    8.private int point_Y;
    9.private GeoPoint newPoint;
    10.public MyMapOverlay(int x,int y){
    11.point_X = x;
    12.point_Y = y;
    13.}
    14.boolean flagMove=false;
    15.//这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标
    16. @Override
    17. public boolean onTouchEvent(MotionEvent event, MapView mapView) {
    18. System.out.println("X->"+event.getX()+":"+point_X);
    19. System.out.println("Y->"+event.getY()+":"+point_Y);
    20. if(event.getAction() == MotionEvent.ACTION_DOWN){
    21. changePoint(newPoint,1);
    22. }else if(event.getAction() == MotionEvent.ACTION_UP){
    23. newPoint = mapView.getProjection().fromPixels(point_X,point_Y);
    24. changePoint(newPoint,2);
    25. }
    26. return false;
    27. }
    28.
    29. public abstract void changePoint(GeoPoint newPoint,int type);
    30.}


    四:LocationActivity类继承百度库的MapActivity以及实现LocationListener接口,代码如下:
    package com.location.activity;Java代码 [url=]


    [/url]

    1.import java.io.IOException;
    2.import java.util.List;
    3.import java.util.Locale;
    4.
    5.import android.content.Intent;
    6.import android.location.Address;
    7.import android.location.Geocoder;
    8.import android.location.Location;
    9.import android.os.Bundle;
    10.import android.os.Handler;
    11.import android.os.Message;
    12.import android.view.View;
    13.import android.view.Window;
    14.import android.widget.TextView;
    15.
    16.import com.android.map.MyMapOverlay;
    17.import com.baidu.mapapi.BMapManager;
    18.import com.baidu.mapapi.GeoPoint;
    19.import com.baidu.mapapi.LocationListener;
    20.import com.baidu.mapapi.MKAddrInfo;
    21.import com.baidu.mapapi.MKBusLineResult;
    22.import com.baidu.mapapi.MKDrivingRouteResult;
    23.import com.baidu.mapapi.MKLocationManager;
    24.import com.baidu.mapapi.MKPoiResult;
    25.import com.baidu.mapapi.MKSearch;
    26.import com.baidu.mapapi.MKSearchListener;
    27.import com.baidu.mapapi.MKSuggestionResult;
    28.import com.baidu.mapapi.MKTransitRouteResult;
    29.import com.baidu.mapapi.MKWalkingRouteResult;
    30.import com.baidu.mapapi.MapActivity;
    31.import com.baidu.mapapi.MapController;
    32.import com.baidu.mapapi.MapView;
    33.import com.baidu.mapapi.Overlay;
    34.
    35.public class LocationActivity extends MapActivity implements LocationListener {
    36.
    37. private MapView mapView;
    38. private MapController mMapCtrl;
    39. private List<Overlay> mapOverlays;
    40. public GeoPoint locPoint;
    41. private MyMapOverlay mOverlay;
    42. private TextView desText;
    43. private String lost_tips;
    44. private int point_X;
    45. private int point_Y;
    46.
    47. public final int MSG_VIEW_LONGPRESS = 10001;
    48. public final int MSG_VIEW_ADDRESSNAME = 10002;
    49. public final int MSG_GONE_ADDRESSNAME = 10003;
    50. private Intent mIntent;
    51. private int mLatitude;
    52. private int mLongitude;
    53. private String name;
    54. private BMapManager mapManager;
    55. private MKLocationManager mLocationManager = null;
    56. private boolean isLoadAdrr = true;
    57. private MKSearch mMKSearch;
    58.
    59. @Override
    60. public void onCreate(Bundle savedInstanceState) {
    61. super.onCreate(savedInstanceState);
    62. requestWindowFeature(Window.FEATURE_NO_TITLE);
    63. setContentView(R.layout.main);
    64. initMap();
    65. mIntent = getIntent();
    66. mLatitude = mIntent.getIntExtra("latitude", 0);
    67. mLongitude = mIntent.getIntExtra("longitude", 0);
    68. name = mIntent.getStringExtra("name");
    69. mapView = (MapView) findViewById(R.id.map_view);
    70. desText = (TextView) this.findViewById(R.id.map_bubbleText);
    71. lost_tips = getResources().getString(R.string.load_tips);
    72. if (mLatitude != 0 && mLongitude != 0) {
    73. locPoint = new GeoPoint((int) (mLatitude * 1E6),
    74. (int) (mLongitude * 1E6));
    75. desText.setText(name);
    76. }
    77. mapView.setBuiltInZoomControls(true);
    78. mapView.setClickable(true);
    79. mMapCtrl = mapView.getController();
    80. point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;
    81. point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;
    82. mOverlay = new MyMapOverlay(point_X, point_Y) {
    83. @Override
    84. public void changePoint(GeoPoint newPoint, int type) {
    85. if (type == 1) {
    86. mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);
    87. } else {
    88. locPoint = newPoint;
    89. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
    90. }
    91.
    92. }
    93. };
    94. mapOverlays = mapView.getOverlays();
    95. if (mapOverlays.size() > 0) {
    96. mapOverlays.clear();
    97. }
    98. mapOverlays.add(mOverlay);
    99. mMapCtrl.setZoom(20);
    100.
    101. }
    102.
    103. private void initMap() {
    104.
    105. // 初始化MapActivity
    106. mapManager = new BMapManager(getApplication());
    107. // init方法的第一个参数需填入申请的API Key
    108. mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null);
    109. super.initMapActivity(mapManager);
    110. // 实例化搜索地址类
    111. mMKSearch = new MKSearch();
    112. // 初始化搜索地址实例
    113. mMKSearch.init(mapManager, new MySearchListener());
    114. mLocationManager = mapManager.getLocationManager();
    115. // 注册位置更新事件
    116. mLocationManager.requestLocationUpdates(this);
    117. // 使用GPS定位
    118. mLocationManager
    119. .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);
    120. }
    121.
    122. @Override
    123. protected void onResume() {
    124. if (mapManager != null) {
    125. mapManager.start();
    126. }
    127. super.onResume();
    128.
    129. }
    130.
    131. @Override
    132. protected void onPause() {
    133. isLoadAdrr = false;
    134. if (mapManager != null) {
    135. mapManager.stop();
    136. }
    137. super.onPause();
    138. }
    139.
    140. @Override
    141. protected boolean isRouteDisplayed() {
    142. // TODO Auto-generated method stub
    143. return false;
    144. }
    145.
    146.
    147. /**
    148. * 通过经纬度获取地址
    149. *
    150. * @param point
    151. * @return
    152. */
    153. private String getLocationAddress(GeoPoint point) {
    154. String add = "";
    155. Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
    156. try {
    157. List<Address> addresses = geoCoder.getFromLocation(
    158. point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,
    159. 1);
    160. Address address = addresses.get(0);
    161. int maxLine = address.getMaxAddressLineIndex();
    162. if (maxLine >= 2) {
    163. add = address.getAddressLine(1) + address.getAddressLine(2);
    164. } else {
    165. add = address.getAddressLine(1);
    166. }
    167. } catch (IOException e) {
    168. add = "";
    169. e.printStackTrace();
    170. }
    171. return add;
    172. }
    173.
    174.
    175. private Handler mHandler = new Handler() {
    176. @Override
    177. public void handleMessage(Message msg) {
    178. switch (msg.what) {
    179. case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息
    180. {
    181. if (null == locPoint)
    182. return;
    183. mMKSearch.reverseGeocode(locPoint);
    184. desText.setVisibility(View.VISIBLE);
    185. desText.setText(lost_tips);
    186. mMapCtrl.animateTo(locPoint);
    187. mapView.invalidate();
    188. }
    189. break;
    190. case MSG_VIEW_ADDRESSNAME:
    191. desText.setText((String) msg.obj);
    192. desText.setVisibility(View.VISIBLE);
    193. break;
    194. case MSG_GONE_ADDRESSNAME:
    195. desText.setVisibility(View.GONE);
    196. break;
    197. }
    198. }
    199. };
    200.
    201. // 关闭程序也关闭定位
    202. @Override
    203. protected void onDestroy() {
    204. if (mapManager != null) {
    205. mapManager.destroy();
    206. mapManager = null;
    207. }
    208. super.onDestroy();
    209. }
    210.
    211. /**
    212. * 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置
    213. */
    214. @Override
    215. protected boolean isLocationDisplayed() {
    216. return false;
    217. }
    218.
    219. /**
    220. * 当位置发生变化时触发此方法
    221. *
    222. * @param location
    223. * 当前位置
    224. */
    225. public void onLocationChanged(Location location) {
    226. if (location != null) {
    227. locPoint = new GeoPoint((int) (location.getLatitude()* 1E6),
    228. (int) (location.getLongitude()* 1E6));
    229. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
    230. }
    231. }
    232.
    233. /**
    234. * 内部类实现MKSearchListener接口,用于实现异步搜索服务
    235. *
    236. * @author liufeng
    237. */
    238. public class MySearchListener implements MKSearchListener {
    239. /**
    240. * 根据经纬度搜索地址信息结果
    241. *
    242. * @param result
    243. * 搜索结果
    244. * @param iError
    245. * 错误号(0表示正确返回)
    246. */
    247. public void onGetAddrResult(MKAddrInfo result, int iError) {
    248. if (result == null) {
    249. return;
    250. }
    251. Message msg = new Message();
    252. msg.what = MSG_VIEW_ADDRESSNAME;
    253. msg.obj = result.strAddr;
    254. mHandler.sendMessage(msg);
    255.
    256. }
    257.
    258. /**
    259. * 驾车路线搜索结果
    260. *
    261. * @param result
    262. * 搜索结果
    263. * @param iError
    264. * 错误号(0表示正确返回)
    265. */
    266. public void onGetDrivingRouteResult(MKDrivingRouteResult result,
    267. int iError) {
    268. }
    269.
    270. /**
    271. * POI搜索结果(范围检索、城市POI检索、周边检索)
    272. *
    273. * @param result
    274. * 搜索结果
    275. * @param type
    276. * 返回结果类型(11,12,21:poi列表 7:城市列表)
    277. * @param iError
    278. * 错误号(0表示正确返回)
    279. */
    280. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
    281. }
    282.
    283. /**
    284. * 公交换乘路线搜索结果
    285. *
    286. * @param result
    287. * 搜索结果
    288. * @param iError
    289. * 错误号(0表示正确返回)
    290. */
    291. public void onGetTransitRouteResult(MKTransitRouteResult result,
    292. int iError) {
    293. }
    294.
    295. /**
    296. * 步行路线搜索结果
    297. *
    298. * @param result
    299. * 搜索结果
    300. * @param iError
    301. * 错误号(0表示正确返回)
    302. */
    303. public void onGetWalkingRouteResult(MKWalkingRouteResult result,
    304. int iError) {
    305. }
    306.
    307. public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
    308. // TODO Auto-generated method stub
    309.
    310. }
    311.
    312. public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
    313. // TODO Auto-generated method stub
    314.
    315. }
    316. }
    317.
    318.}


    五:在AndroidManifest.xml住添加相关的访问权限

    <!-- 访问网络的权限 -->
    Xml代码 [url=]


    [/url]

    1. <uses-permission android:name="android.permission.INTERNET" />
    2. <!-- 访问精确位置的权限 -->
    3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    4. <!-- 访问网络状态的权限 -->
    5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    6. <!-- 访问WIFI网络状态的权限 -->
    7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    8. <!-- 改变WIFI网络状态的权限 -->
    9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    10. <!-- 读写存储卡的权限 -->
    11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    12. <!-- 读取电话状态的权限 -->
    13.<uses-permission android:name="android.permission.READ_PHONE_STATE" />

    作者:-xu 邮箱:860072925@qq.com QQ群:IOS/Android 25961346
  • 相关阅读:
    .NET 6.0 —— 网络监视器 (TODO)
    Google adwords api —— report & AWQL
    Linux 镜像更新 为国内镜像源 for debian
    优化代码 —— 二八法则 & 编完代码,再优化
    鳥哥的 Linux 私房菜 ——— 第十八章、 服务的防火墙管理 xinetd, TCP Wrappers(3)
    端口号port 是什么
    aptget的install、update、upgrade的区别(转发)
    Google ads api —— github
    .net 6.00 —— record 类型 (TODO)
    Compiled models —— .NET Core 6.0
  • 原文地址:https://www.cnblogs.com/qiaoxu/p/3985417.html
Copyright © 2011-2022 走看看