百度地图API Android SDK 常见问题

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

http://developer.baidu.com/map/sdkandev-question.htm#col32


常见问题

1 使用须知

在使用百度地图SDK(Android版)之前,请仔细阅读使用条款,一旦您使用了百度地图SDK(Android版),即表明您已阅读并接受使用条款中的全部内容。百度地图SDK(Android版)可帮助您在应用中以丰富的形式展示地图,实现兴趣点搜索、线路规划等操作。 您只可使用在百度地图SDK(Android版)开发文档中所列明开放的功能来对相关服务数据的结果进行展示,不得直接存取、使用内部数据、图片、程序、模块或是任何其他百度地图的服务或功能。在接受使用条款约束的情况下,您可以在向最终用户提供其他信息的同时,使用 API 获取相关服务数据。

2 百度用户和Key

2.1 如何注册百度用户?

公众用户请在百度个人中心注册用户。企业用户请联系我们

2.2 如何申请百度地图移动版API Key?

公众用户在获取密钥中自行申请,可以每个应用申请一个Key,可以用在不同移动平台上的相同应用中。申请的Key个数目前没有限制。企业用户请联系我们

2.3 忘记申请过的Key怎么办?

公众用户在获取密钥侧边栏中,点击“我的KEY”查看已申请过的Key和对应的应用名称。

3 Android问题集锦

3.1 定位、坐标相关

3.1.1 API如何获取定位信息?

说明:此部分是针对1.3.5及以前版本的说明,自2.0.0版本以后,定位功能已从Android SDK中分离,开发者在使用定位功能时,请具体参考定位SDK。

在百度地图移动版API中,我们提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。

在程序中,如果使用此功能,必须注册GPS和网络的使用权限。

在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率98%,在国内处于一枝独秀的地位。

3.1.2 如何得到定位的坐标和地址?

说明: 自2.0.0版本开始,获取定位坐标的方法请参考定位SDK中的说明,如下获取定位坐标的方法只针对1.3.5及以前的版本有效。

使用MKLocationManager 类的requestLocationUpdates 注册位置监听事件,在重写的回调函数onLocationChanged中,可获得定位的坐标(详见BMapApiDemoMain例程的MyLocation.java),通过调用MKSearch类的reverseGeocode接口,得到地址。


   
   
  1. 1@Override
  2. 2public void onLocationChanged ( Location location ) {
  3. 3.       if ( location != null ) {
  4. 4.           pt. setLatitudeE6 ( ( int ) (location. getLatitude ( ) * 1e6 ) ) ;
  5. 5.           pt. setLongtitudeE6 ( ( int ) (location. getLongtitude ( ) * 1e6 ) ) ;
  6. 6.           mSearch. reverseGeocode (pt ) ;
  7. 7.        }
  8. 8}
  9. 9public void onGetAddrResult ( MKAddrInfo res, int error ) {
  10. 10.       if ( error != 0 ) {
  11. 11.           String str = String. format ( "错误号:%d",error ) ;
  12. 12.           return ;
  13. 13.         }
  14. 14.        String strInfo = String. format ( "纬度:%f 经度:%f 地址:%s\r\n",
  15. 15.                    res. geoPt. getlatitudeE6 ( ) / 1e6,
  16. 16.                    res. geoPt. getLongtitudeE6 / 1e6,
  17. 17.                    res. addressComponents. city +
  18. 18.                    res. addressComponents. district +
  19. 19.                    res. addressComponents. street ) ;
  20. 20}
3.1.3 如何让我的地图自动定位?

说明: 此部分是针对1.3.5及以前版本的说明,自2.0.0版本以后,定位功能已从Android SDK中分离,开发者在实现自动定位操作时,请参考定位SDK中的具体说明

首先在程序中打开相关的权限,然后将MyLocationOverlay实例添加到MapView中,并调用enableMyLocation方法,即可实现当前位置的显示,如果想让地图跟随当前位置移动,需要继承MyLocationOverlay并实现其onLocationChanged方法,调用MapView.getController().animateTo()方法移动地图位置。

3.1.4 如何计算两点之间距离?

路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。

如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:

1.GeoPoint p1LL = new GeoPoint(39971802, 116347927);

2.GeoPoint p2LL = new GeoPoint(39892131, 116498555);

3.double distance = DistanceUtil.getDistance(p1LL, p2LL);

如果开发者使用的是1.3.5及以前的版本,在计算任意两点之前的距离时,有如下两种方法:一种利用勾股定理计算,适用于两点距离很近的情况;一种按标准的球面大圆劣弧长度计算,适用于距离较远的情况。


   
   
  1. 1static double DEF_PI = 3.14159265359 ; // PI
  2. 2 static double DEF_2PI = 6.28318530712 ; // 2*PI
  3. 3 static double DEF_PI180 = 0.01745329252 ; // PI/180.0
  4. 4 static double DEF_R = 6370693.5 ; // radius of earth
  5. 5 public double GetShortDistance ( double lon1, double lat1, double lon2, double lat2 )
  6. 6 {
  7. 7 .   double ew1, ns1, ew2, ns2 ;
  8. 8 .   double dx, dy, dew ;
  9. 9 .   double distance ;
  10. 10 .   // 角度转换为弧度
  11. 11 .   ew1 = lon1 * DEF_PI180 ;
  12. 12 .   ns1 = lat1 * DEF_PI180 ;
  13. 13 .   ew2 = lon2 * DEF_PI180 ;
  14. 14 .   ns2 = lat2 * DEF_PI180 ;
  15. 15 .   // 经度差
  16. 16 .   dew = ew1 - ew2 ;
  17. 17 .   // 若跨东经和西经180 度,进行调整
  18. 18 .   if ( dew > DEF_PI )
  19. 19 .   dew = DEF_2PI - dew ;
  20. 20 .   else if ( dew < - DEF_PI )
  21. 21 .   dew = DEF_2PI + dew ;
  22. 22 .   dx = DEF_R * Math . cos ( ns1 ) * dew ; // 东西方向长度(在纬度圈上的投影长度)
  23. 23 .   dy = DEF_R * ( ns1 - ns2 ) ; // 南北方向长度(在经度圈上的投影长度)
  24. 24 .   // 勾股定理求斜边长
  25. 25 .   distance = Math . sqrt ( dx * dx + dy * dy ) ;
  26. 26 .   return distance ;
  27. 27 }
  28. 28 public double GetLongDistance ( double lon1, double lat1, double lon2, double lat2 )
  29. 29 {
  30. 30 .   double ew1, ns1, ew2, ns2 ;
  31. 31 .   double distance ;
  32. 32 .   // 角度转换为弧度
  33. 33 .   ew1 = lon1 * DEF_PI180 ;
  34. 34 .   ns1 = lat1 * DEF_PI180 ;
  35. 35 .   ew2 = lon2 * DEF_PI180 ;
  36. 36 .   ns2 = lat2 * DEF_PI180 ;
  37. 37 .   // 求大圆劣弧与球心所夹的角(弧度)
  38. 38 .   distance = Math . sin ( ns1 ) * Math . sin ( ns2 ) + Math . cos ( ns1 ) * Math . cos ( ns2 ) * Math . cos ( ew1 - ew2 ) ;
  39. 39 .   // 调整到[-1..1]范围内,避免溢出
  40. 40 .   if ( distance > 1.0 )
  41. 41 .       distance = 1.0 ;
  42. 42 .   else if ( distance < - 1.0 )
  43. 43 .        distance = - 1.0 ;
  44. 44 .   // 求大圆劣弧长度
  45. 45 .   distance = DEF_R * Math . acos ( distance ) ;
  46. 46 .   return distance ;
  47. 47 }
  48. 48 double mLat1 = 39.90923 ; // point1纬度
  49. 49 double mLon1 = 116.357428 ; // point1经度
  50. 50 double mLat2 = 39.90923 ; // point2纬度
  51. 51 double mLon2 = 116.397428 ; // point2经度
  52. 52 double distance = GetShortDistance ( mLon1, mLat1, mLon2, mLat2 ) ;
3.1.5 点击MapView上一点,如何获取该点坐标?

通过继承MapView类重写onTouchEvent方法来获取点击屏幕的位置,再通过接口Projection的 fromPixels 方法将点击位置转换为该点的地址坐标,并且将地图空间bMapView的类型由com.baidu.mapapi.MapView改为子类类型,本例中为com.baidu.mapapi.demo.MapViewTest具体代码如下:


   
   
  1. 1MapViewTest mapView = (MapViewTest )findViewById (R. id. bmapView ) ;
  2. 2class MapViewTest extends MapView
  3. 3 {
  4. 4.       public MapViewTest ( Context context )
  5. 5 .       {
  6. 6.           super (context ) ;
  7. 7.        }
  8. 8.       public MapViewTest ( Context context, AttributeSet attrs )
  9. 9 .       {
  10. 10.           super ( context, attrs ) ;
  11. 11.        }
  12. 12.   public MapViewTest ( Context context, AttributeSet attrs, int defStyle )
  13. 13 .    {
  14. 14.        super ( context, attrs,defStyle ) ;
  15. 15.     }
  16. 16.     @Override
  17. 17.     public boolean onTouchEvent ( MotionEvent event )
  18. 18 .     {
  19. 19.         //获得屏幕点击的位置
  20. 20 .          int x = ( int ) event. getX ( ) ;
  21. 21 .          int y = ( int ) event. getY ( ) ;
  22. 22 .         //将像素坐标转为地址坐标
  23. 23 .          GeoPoint pt = this . getProjection() . fromPixels ( x,y ) ;
  24. 24 .         return super . onTouchEvent ( event ) ;
  25. 25 .      }
  26. 26 }
3.1.6 百度地图地址解析服务Geocoder如何使用?

地址解析服务在MKSearch类中有两个接口:reverseGeocode、geocode。 
初始化搜索类MKSearch并注册结构监听对象MKSearchListener:


   
   
  1. 1//初始化搜索模块,注册事件监听
  2. 2 mSearch = new MKSearch ( ) ;
  3. 3 mSearch . init ( app. mBMapMan , new MySearchListener ( ) ) ;

实现MySearchListener的onGetAddrResult获取得到的地址信息


   
   
  1. 1@Override
  2. 2public void onGetAddrResult ( MKAddrInfo res, int error ) {
  3. 3.       if ( error != 0 ) {
  4. 4.           String str = String. format ( "错误号:%d",error ) ;
  5. 5.           return ;
  6. 6.         }
  7. 7.        String strInfo = String. format ( "纬度:%f 经度:%f 地址:%s\r\n",
  8. 8.                    res. geoPt. getlatitudeE6 ( ) / 1e6,
  9. 9.                    res. geoPt. getLongtitudeE6 / 1e6,
  10. 10.                    res. addressComponents. city +
  11. 11.                    res. addressComponents. district +
  12. 12.                    res. addressComponents. street ) ;
  13. 13}

geocode:根据地址名称获取地址信息:


   
   
  1. 1mSearch. geocode ( "天安门", "北京" ) ;

reverseGeocode:根据地理坐标点获取地址:

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值