分享一下我老师大神的人工智能教程!零基础,通俗易懂!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.
@Override
-
2.
public
void
onLocationChanged
(
Location location
)
{
-
3.
if
( location
!=
null
)
{
-
4.
pt.
setLatitudeE6
(
(
int
)
(location.
getLatitude
(
)
*
1e6
)
)
;
-
5.
pt.
setLongtitudeE6
(
(
int
)
(location.
getLongtitude
(
)
*
1e6
)
)
;
-
6.
mSearch.
reverseGeocode
(pt
)
;
-
7.
}
-
8.
}
-
9.
public
void
onGetAddrResult
(
MKAddrInfo res,
int
error
)
{
-
10.
if
( error
!=
0
)
{
-
-
12.
return
;
-
13.
}
-
-
15.
res.
geoPt.
getlatitudeE6
(
)
/
1e6,
-
16.
res.
geoPt.
getLongtitudeE6
/
1e6,
-
17.
res.
addressComponents.
city
+
-
18.
res.
addressComponents.
district
+
-
19.
res.
addressComponents.
street
)
;
-
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.
static
double DEF_PI
=
3.14159265359
;
// PI
-
2
.
static
double
DEF_2PI
=
6.28318530712
;
// 2*PI
-
3
.
static
double
DEF_PI180
=
0.01745329252
;
// PI/180.0
-
4
.
static
double
DEF_R
=
6370693.5
;
// radius of earth
-
5
.
public
double
GetShortDistance
(
double
lon1,
double
lat1,
double
lon2,
double
lat2
)
-
6
.
{
-
7
.
double
ew1, ns1, ew2, ns2
;
-
8
.
double
dx, dy, dew
;
-
9
.
double
distance
;
-
10
.
// 角度转换为弧度
-
11
.
ew1
=
lon1
*
DEF_PI180
;
-
12
.
ns1
=
lat1
*
DEF_PI180
;
-
13
.
ew2
=
lon2
*
DEF_PI180
;
-
14
.
ns2
=
lat2
*
DEF_PI180
;
-
15
.
// 经度差
-
16
.
dew
=
ew1
-
ew2
;
-
17
.
// 若跨东经和西经180 度,进行调整
-
18
.
if
(
dew
>
DEF_PI
)
-
19
.
dew
=
DEF_2PI
-
dew
;
-
20
.
else
if
(
dew
<
-
DEF_PI
)
-
21
.
dew
=
DEF_2PI
+
dew
;
-
-
23
.
dy
=
DEF_R
*
(
ns1
-
ns2
)
;
// 南北方向长度(在经度圈上的投影长度)
-
24
.
// 勾股定理求斜边长
-
-
26
.
return
distance
;
-
27
.
}
-
28
.
public
double
GetLongDistance
(
double
lon1,
double
lat1,
double
lon2,
double
lat2
)
-
29
.
{
-
30
.
double
ew1, ns1, ew2, ns2
;
-
31
.
double
distance
;
-
32
.
// 角度转换为弧度
-
33
.
ew1
=
lon1
*
DEF_PI180
;
-
34
.
ns1
=
lat1
*
DEF_PI180
;
-
35
.
ew2
=
lon2
*
DEF_PI180
;
-
36
.
ns2
=
lat2
*
DEF_PI180
;
-
37
.
// 求大圆劣弧与球心所夹的角(弧度)
-
-
39
.
// 调整到[-1..1]范围内,避免溢出
-
40
.
if
(
distance
>
1.0
)
-
41
.
distance
=
1.0
;
-
42
.
else
if
(
distance
<
-
1.0
)
-
43
.
distance
=
-
1.0
;
-
44
.
// 求大圆劣弧长度
-
-
46
.
return
distance
;
-
47
.
}
-
48
.
double
mLat1
=
39.90923
;
// point1纬度
-
49
.
double
mLon1
=
116.357428
;
// point1经度
-
50
.
double
mLat2
=
39.90923
;
// point2纬度
-
51
.
double
mLon2
=
116.397428
;
// point2经度
-
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.
MapViewTest mapView
=
(MapViewTest
)findViewById
(R.
id.
bmapView
)
;
-
2.
class
MapViewTest
extends
MapView
-
3
.
{
-
-
5
.
{
-
6.
super
(context
)
;
-
7.
}
-
-
9
.
{
-
10.
super
( context, attrs
)
;
-
11.
}
-
-
13
.
{
-
14.
super
( context, attrs,defStyle
)
;
-
15.
}
-
16.
@Override
-
17.
public
boolean
onTouchEvent
(
MotionEvent event
)
-
18
.
{
-
19.
//获得屏幕点击的位置
-
20
.
int
x
=
(
int
)
event.
getX
(
)
;
-
21
.
int
y
=
(
int
)
event.
getY
(
)
;
-
22
.
//将像素坐标转为地址坐标
-
23
.
GeoPoint
pt
=
this
.
getProjection()
.
fromPixels
(
x,y
)
;
-
24
.
return
super
.
onTouchEvent
(
event
)
;
-
25
.
}
-
26
.
}
3.1.6 百度地图地址解析服务Geocoder如何使用?
地址解析服务在MKSearch类中有两个接口:reverseGeocode、geocode。
初始化搜索类MKSearch并注册结构监听对象MKSearchListener:
-
1.
//初始化搜索模块,注册事件监听
-
2
.
mSearch
=
new
MKSearch
(
)
;
-
3
.
mSearch
.
init
(
app.
mBMapMan
,
new
MySearchListener
(
)
)
;
实现MySearchListener的onGetAddrResult获取得到的地址信息
-
1.
@Override
-
2.
public
void
onGetAddrResult
(
MKAddrInfo res,
int
error
)
{
-
3.
if
( error
!=
0
)
{
-
-
5.
return
;
-
6.
}
-
-
8.
res.
geoPt.
getlatitudeE6
(
)
/
1e6,
-
9.
res.
geoPt.
getLongtitudeE6
/
1e6,
-
10.
res.
addressComponents.
city
+
-
11.
res.
addressComponents.
district
+
-
12.
res.
addressComponents.
street
)
;
-
13.
}
geocode:根据地址名称获取地址信息:
-
1.
mSearch.
geocode
(
"天安门",
"北京"
)
;
reverseGeocode:根据地理坐标点获取地址: