您的位置:首页 > 其它

百度地图,百度定位。

2015-09-22 20:24 211 查看

百度地图

百度地图是第三方的东西,由百度提供接口,我们只要用他的接口就可以了。

环境搭配

在百度地图的API中下载相关的实例,在实例中的libs中粘贴1)baidumapapi_v3_5_0.jarhe和locSDK_5.2.jar这两个jar包到我们的libs中。将所有的so文件粘贴过来,在我们的main中建立一个jniLibs文件夹,将so文件拷入这个文件夹中。

2)将jar包导入。

申请密钥

具体的过程在百度中说的非常清楚,这里不再讨论,只是注意包名一定要是你的工程的文件,debug码在copy的时候前后不要有空格。

当我们按照百度的提示写好代码后就可以出现百度地图了,有关百度地图的其他功能都在demo中有提及,这里我们主要讲search地点,在我们输入地址的名称后,可以在地图中显示出来。还可以在两点之间画直线。在demo的GeoCoderDemo中是有关地理编码功能的例子。

反Geo搜索是什么我也不知道。这里理顺一下思路:

地理编码

1)获得GeoCoder的实例mSearch。

GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
mSearch = GeoCoder.newInstance();


2)设置mSearch 的监听事件,在监听事件中有两个方法onGetGeoCodeResult()是获得Geo搜索的结果,另一个onGetReverseGeoCodeResult()获得反Geo搜索的结果。

通过:

mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));


在所寻找的点上标有图标,R.mipmap.icon_marka,就是那个图标。

通过:

result.getLocation().latitude, result.getLocation().longitude


获得维度和经度。

完整的代码如下:

//对mSearch加入监听事件。
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mbaidu.clear();
mbaidu.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.pp)));
mbaidu.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",
geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
if(count==1){

LatLng point1 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
points.add(point1);
}else if(count==2){

LatLng point2 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
points.add(point2);
}

}

@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {

}
});
}


这里的 mbaidu = mMapView.getMap();//会的map实例。

通过mMapView.getMap()获得百度地图的实例。

这里的 LatLng point2 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);是LatLng 是以经纬度确定的点。在画线的时候会用到。

在button的点击事件中输入地址就可以找到我们想找的结果了。

mSearch.geocode(new GeoCodeOption().city("北京").address("中关村"));


当点击的时候会定位到我们需要的点。

在地图中划线

demo中GeometryDemo是换各种图形的示例:

public void addCustomElementsDemo() {
// 添加折线
LatLng p1 = new LatLng(39.97923, 116.357428);
LatLng p2 = new LatLng(39.94923, 116.397428);
LatLng p3 = new LatLng(39.97923, 116.437428);
List<LatLng> points = new ArrayList<LatLng>();
points.add(p1);
points.add(p2);
points.add(p3);
OverlayOptions ooPolyline = new PolylineOptions().width(10)
.color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);


从上面的代码可以看到是非常清晰的,

1)将要连接的点通过LatLng 实例获得经纬度点,

2)将这些点add到list中,剩下的代码就不是我们关心的问题了。

定位

定位并不是百度地图的功能必须另外下载SDK;

注意当地图鱼定位同时在一个项目中的时候,注意libs的SDKjar只需要最新的就可以了。比如说6.02.so文件也是这样删掉5.0的保留6.0的不可以都存在。

具体的就不写了,可以看百度的SDK,这里只说一下思路:

1)获得LocationClient的实例,并对实例进行注册监听:

mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
mLocationClient.registerLocationListener( myListener );    //注册监听函数


我们再myListener 的实例中可以得到我们的位置:

public BDLocationListener myListener = new MyLocationListener();


class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
mytextview.setText(location.getAddress().address);
array[4]= location.getLatitude();
array[5]= location.getLongitude();
LatLng point = new LatLng(location.getLatitude(),location.getLongitude());
points.add(point);
mbaidu.addOverlay(new MarkerOptions().position(point)
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.pp)));
mbaidu.setMapStatus(MapStatusUpdateFactory.newLatLng(point));

StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
sb.append("\nspeed : ");
sb.append(location.getSpeed());// 单位:公里每小时
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
sb.append("\nheight : ");
sb.append(location.getAltitude());// 单位:米
sb.append("\ndirection : ");
sb.append(location.getDirection());// 单位度
sb.append("\naddr : ");
sb.append(location.getAddrStr());
sb.append("\ndescribe : ");
sb.append("gps定位成功");

} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
sb.append("\naddr : ");
sb.append(location.getAddrStr());
//运营商信息
sb.append("\noperationers : ");
sb.append(location.getOperators());
sb.append("\ndescribe : ");
sb.append("网络定位成功");
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe());// 位置语义化信息
List<Poi> list = location.getPoiList();// POI数据
if (list != null) {
sb.append("\npoilist size = : ");
sb.append(list.size());
for (Poi p : list) {
sb.append("\npoi= : ");
sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
}
}
Log.i("BaiduLocationApiDem", sb.toString());
mLocationClient.stop();

}
}


这里location.getAddress().address就可以获得我们的地理位置的名称。

2)初始化

initLocation();

3)start:

mLocationClient.start();


这样就结束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: