当前位置:   article > 正文

地图开发笔记一

地图开发笔记一

这几天了解了一下借助于百度地图API的地图开发,做一下笔记以方便以后深入学习。


一、开发准备


开发第一步,下载百度地图的android sdk:http://developer.baidu.com/map/index.php?title=androidsdk

此页面对key的申请,以及SDK的下载和使用都有详细介绍,此处不做赘述。


工程配置介绍:http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap


demo下载:

http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool

在此页面可以下载SDK,demo,类参考。由于SDK v2.1.3以后的版本跟之前的版本有一定的差距,所以最好根据demo来实现自己想要的功能,而不是直接在网上找源码。


二、功能示例


1、坐标转换:将经纬度转换为具体地址 

使用LocationManager获取坐标再使用 GeoCoder进行转换

  1. package com.dream.locationdemo;
  2. import com.baidu.mapapi.model.LatLng;
  3. import com.baidu.mapapi.search.core.SearchResult;
  4. import com.baidu.mapapi.search.geocode.GeoCodeResult;
  5. import com.baidu.mapapi.search.geocode.GeoCoder;
  6. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
  7. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
  8. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
  9. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult.AddressComponent;
  10. import android.app.Activity;
  11. import android.content.Context;
  12. import android.location.Location;
  13. import android.location.LocationListener;
  14. import android.location.LocationManager;
  15. import android.os.Bundle;
  16. import android.support.v4.app.Fragment;
  17. import android.util.Log;
  18. import android.view.LayoutInflater;
  19. import android.view.View;
  20. import android.view.View.OnClickListener;
  21. import android.view.ViewGroup;
  22. import android.widget.Button;
  23. import android.widget.TextView;
  24. public class PlaceholderFragment extends Fragment{
  25. public PlaceholderFragment() {
  26. }
  27. private static final String TAG=PlaceholderFragment.class.getSimpleName();
  28. View rootView;
  29. private TextView latitudeTv;
  30. private TextView longitudeTv;
  31. private TextView altitudeTv;
  32. private TextView detailTv;
  33. private Button enterMapBtn;
  34. LocationManager manager;
  35. @Override
  36. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  37. Bundle savedInstanceState) {
  38. rootView = inflater.inflate(R.layout.fragment_main, container,
  39. false);
  40. return rootView;
  41. }
  42. @Override
  43. public void onActivityCreated(Bundle savedInstanceState) {
  44. // TODO Auto-generated method stub
  45. super.onActivityCreated(savedInstanceState);
  46. setLocationListener();
  47. initView();
  48. }
  49. private void initView() {
  50. latitudeTv=(TextView)rootView.findViewById(R.id.tv_main_latitude);
  51. longitudeTv=(TextView)rootView.findViewById(R.id.tv_main_longitude);
  52. altitudeTv=(TextView)rootView.findViewById(R.id.tv_main_altitude);
  53. detailTv=(TextView)rootView.findViewById(R.id.tv_main_detailaddress);
  54. enterMapBtn=(Button)rootView.findViewById(R.id.btn_main_entermap);
  55. enterMapBtn.setOnClickListener(new OnClickListener() {
  56. @Override
  57. public void onClick(View v) {
  58. try {
  59. Activity act=getActivity();
  60. if(act instanceof MainActivity){
  61. ((MainActivity)getActivity()).enterMap();
  62. }
  63. } catch (Exception e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. }
  68. });
  69. Location location=manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
  70. showLocation(location);
  71. }
  72. public void setLocationListener(){
  73. manager=(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
  74. LocationListener listener=new LocationListener() {
  75. @Override
  76. public void onStatusChanged(String provider, int status, Bundle extras) {
  77. // TODO Auto-generated method stub
  78. }
  79. @Override
  80. public void onProviderEnabled(String provider) {
  81. // TODO Auto-generated method stub
  82. }
  83. @Override
  84. public void onProviderDisabled(String provider) {
  85. // TODO Auto-generated method stub
  86. }
  87. @Override
  88. public void onLocationChanged(Location location) {
  89. showLocation(location);
  90. }
  91. };
  92. manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
  93. }
  94. protected void showLocation(Location location) {
  95. try {
  96. double latitude=location.getLatitude();
  97. double longitude=location.getLongitude();
  98. double altitude=location.getAltitude();
  99. latitudeTv.setText(latitude+"");
  100. longitudeTv.setText(longitude+"");
  101. altitudeTv.setText(altitude+"");
  102. LatLng ll=new LatLng(latitude, longitude);
  103. GeoCoder gc=GeoCoder.newInstance();
  104. OnGetGeoCoderResultListener listener=new OnGetGeoCoderResultListener() {
  105. @Override
  106. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
  107. if(result==null || result.error !=SearchResult.ERRORNO.NO_ERROR){
  108. return;
  109. }
  110. AddressComponent ac=result.getAddressDetail();
  111. StringBuilder sb=new StringBuilder();
  112. sb.append(ac.province).append(" ").
  113. append(ac.city).append(" ").
  114. append(ac.district).append(" ").
  115. append(ac.street).append(" ").append(ac.streetNumber);
  116. detailTv.setText(sb.toString());
  117. }
  118. @Override
  119. public void onGetGeoCodeResult(GeoCodeResult arg0) {
  120. // TODO Auto-generated method stub
  121. }
  122. };
  123. gc.setOnGetGeoCodeResultListener(listener);
  124. ReverseGeoCodeOption rhco=new ReverseGeoCodeOption();
  125. rhco.location(ll);
  126. gc.reverseGeoCode(rhco);
  127. } catch (Exception e) {
  128. // TODO Auto-generated catch block
  129. e.printStackTrace();
  130. }
  131. }
  132. }


2、定位

使用LocationClient和MyLocationListener ; 定位有一个单独的SDK:http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v4-2


  1. package com.dream.locationdemo;
  2. import android.app.Activity;
  3. import android.media.DeniedByServerException;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.widget.Toast;
  7. import com.baidu.location.BDLocation;
  8. import com.baidu.location.BDLocationListener;
  9. import com.baidu.location.LocationClient;
  10. import com.baidu.location.LocationClientOption;
  11. import com.baidu.location.LocationClientOption.LocationMode;
  12. import com.baidu.mapapi.map.BaiduMap;
  13. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  14. import com.baidu.mapapi.map.MapStatusUpdate;
  15. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  16. import com.baidu.mapapi.map.MapView;
  17. import com.baidu.mapapi.map.MyLocationConfiguration;
  18. import com.baidu.mapapi.map.MyLocationData;
  19. import com.baidu.mapapi.model.LatLng;
  20. import com.baidu.mapapi.search.core.SearchResult;
  21. import com.baidu.mapapi.search.geocode.GeoCodeResult;
  22. import com.baidu.mapapi.search.geocode.GeoCoder;
  23. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
  24. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
  25. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
  26. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult.AddressComponent;
  27. public class MyMapActivity extends Activity {
  28. public static final String TAG = MyMapActivity.class.getSimpleName();
  29. MapView mapView;
  30. BaiduMap map;
  31. LocationClient client;
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. // TODO Auto-generated method stub
  35. super.onCreate(savedInstanceState);
  36. setContentView(R.layout.activity_map);
  37. mapView = (MapView) findViewById(R.id.mv_main_map);
  38. map = mapView.getMap();
  39. map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  40. map.setMyLocationEnabled(true);
  41. client = new LocationClient(this);
  42. MyLocationListener listener = new MyLocationListener();
  43. client.registerLocationListener(listener);
  44. LocationClientOption locationClientOption = new LocationClientOption();
  45. locationClientOption.setCoorType("bd09ll");
  46. locationClientOption.setScanSpan(1000);
  47. locationClientOption.setOpenGps(true);
  48. client.setLocOption(locationClientOption);
  49. // MyLocationConfiguration config = new MyLocationConfiguration(
  50. // com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL,
  51. // true, null);
  52. // map.setMyLocationConfigeration(config);
  53. client.start();
  54. }
  55. @Override
  56. protected void onResume() {
  57. // TODO Auto-generated method stub
  58. mapView.onResume();
  59. super.onResume();
  60. }
  61. @Override
  62. protected void onPause() {
  63. mapView.onPause();
  64. super.onPause();
  65. }
  66. @Override
  67. protected void onDestroy() {
  68. // 退出时销毁定位
  69. client.stop();
  70. // 关闭定位图层
  71. map.setMyLocationEnabled(false);
  72. mapView.onDestroy();
  73. mapView = null;
  74. super.onDestroy();
  75. }
  76. private boolean isFirstLoc = true;
  77. public class MyLocationListener implements BDLocationListener {
  78. @Override
  79. public void onReceiveLocation(BDLocation location) {
  80. double latitude=location.getLatitude();
  81. double longitude=location.getLongitude();
  82. MyLocationData locData = new MyLocationData.Builder()
  83. .accuracy(location.getRadius()).direction(100)
  84. .latitude(latitude)
  85. .longitude(longitude).build();
  86. map.setMyLocationData(locData);
  87. if (isFirstLoc) {
  88. isFirstLoc = false;
  89. LatLng ll = new LatLng(location.getLatitude(),
  90. location.getLongitude());
  91. MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
  92. map.animateMapStatus(u);
  93. }
  94. LatLng ll=new LatLng(latitude, longitude);
  95. GeoCoder gc=GeoCoder.newInstance();
  96. OnGetGeoCoderResultListener listener=new OnGetGeoCoderResultListener() {
  97. @Override
  98. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
  99. if(result==null || result.error !=SearchResult.ERRORNO.NO_ERROR){
  100. return;
  101. }
  102. AddressComponent ac=result.getAddressDetail();
  103. StringBuilder sb=new StringBuilder();
  104. sb.append(ac.province).append(" ").
  105. append(ac.city).append(" ").
  106. append(ac.district).append(" ").
  107. append(ac.street).append(" ").append(ac.streetNumber);
  108. Toast.makeText(getApplicationContext(), sb.toString(), Toast.LENGTH_LONG).show();
  109. }
  110. @Override
  111. public void onGetGeoCodeResult(GeoCodeResult arg0) {
  112. // TODO Auto-generated method stub
  113. }
  114. };
  115. gc.setOnGetGeoCodeResultListener(listener);
  116. ReverseGeoCodeOption rhco=new ReverseGeoCodeOption();
  117. rhco.location(ll);
  118. gc.reverseGeoCode(rhco);
  119. }
  120. }
  121. }

这两个例子,一个使用android api进行定位,一个使用 baidumap api 进行定位;在测试中发现,使用 baidumap api 定位更加精确,但是也存在不小的偏差。这是因为 由于我国政府的法律明确规定GPS数据需要偏转才能匹配到电子地图上,因此android等3G手机定位出的位置都是经过偏移的,和实际的地理位置确实存在一定的偏差。而百度地图在这个基础上又进行了二次纠偏。

手机定位方式有:基站定位,网络定位,GPS定位,AGPS定位这几种方式。其中,基站定位比较快,能够在室内使用,但是精确度比较低,但是随着基站的密集度越来越高,定位也会越来越准确。GPS定位会比较耗时,不能够在室内使用,耗电量大,但是精确度比较高,不过绝大部分用户默认都是不开起GPS服务的。还有就是网络定位,它是根据IP地址等信息来进行定位。AGPS定位,很多人将它和基站定位混为一谈,但其实AGPS的本质仍然是GPS,只是它会使用基站信息对获取GPS进行辅助,然后还能对获取到的GPS结果进行修正,所以AGPS要比传统的GPS更快,准确度略高。




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/536542
推荐阅读
相关标签
  

闽ICP备14008679号