百度地图
百度地图是第三方的东西,由百度提供接口,我们只要用他的接口就可以了。
环境搭配
在百度地图的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();
这样就结束了。