上次分享了Android百度地图开发的基本内容,这次分享一下百度地图的搜索功能,这里主要是借鉴了鸿洋老师的博客以及百度地图的官方demo。大家如果想进一步的学习的话可以参考百度地图给出的demo,里面会有更深一层的介绍。
由于百度地图的搜索功能比较多,这里我主要介绍一下地理编码检索。当然其他的检索页是类似,大家可以参照此方法学习,如果想进一步学习的话可以参考百度地图的官方demo,那里面会有更加全面的介绍。
地理编码检索也有两种模式,一种是正向地理编码检索,另外一种就是反向地理编码检索了。所谓的正向地理编码检索就是输入目的地地址进行搜索得到地址的经纬度,反向地理编码检索就是输入经纬度进行搜索得到目的地的地址信息。百度地图的官方也给出了解释。
一个搜索界面怎么可能没有搜索框呢,所以我们第一步还需要加一个搜索框,大家如果想自己的界面精美一点的话,可以好好写写这个搜索框,我这里为了方便,就直接调用了Android的搜索框。当然我还加了一个定位自己位置的按钮,这样主要是为了方便能让地图回到当前位置。具体的代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
LinearLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/my_location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/dingwei"
android:layout_marginBottom="10dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
RelativeLayout>
RelativeLayout>
当我们有了搜索框,必须还能获取搜索框内的内容,所以接下来我们就调用SearchView.OnQueryTextListener这个接口主要是为了对搜索框内进行监视,我们还得调用OnGetGeoCoderResultListener这个接口,这个是为了对搜索时结果有所反馈。如下所示:
@Override
public boolean onQueryTextSubmit(String query) {
// 实际应用中应该在该方法内执行实际查询
//搜索城市+关键字
mSearch.geocode(new GeoCodeOption().city(
query).address(query));
// 此处仅使用Toast显示用户输入的查询内容
Toast.makeText(this,"你输入的地址是:" + query,Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//当输入框中内容在改变时,执行此操作
return false;
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
baiduMap.clear();
baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_gcoding)));
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",
result.getLocation().latitude, result.getLocation().longitude);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
baiduMap.clear();
baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_gcoding)));
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
Toast.makeText(MainActivity.this, result.getAddress(),
Toast.LENGTH_LONG).show();
}
我们还得在main函数中添加Search搜索实例,以及为它进行初始化。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
floatingActionButton = (FloatingActionButton)findViewById(R.id.my_location);
searchView=(SearchView)findViewById(R.id.search_view);
searchView.setQueryHint("请输入地点");
searchView.setOnQueryTextListener(this);
mapView.showZoomControls(false);//将地图放大缩小设为不可见
baiduMap.setMyLocationEnabled(true);
//初始化搜索模块
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
.....
}
这样在搜索框内输入相应的城市就可以跳转到目的城市了,但是我们还想地图回到自己的位置应该如何呢,这里我们设置一个悬浮按钮,设置一个监听器,我们在之前定位的时候先记录一下,然后点击悬浮按钮就可以移动到我们自己的位置了。
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateMyLocation();
}
});
//更新自己的位置
private void updateMyLocation() {
LatLng ll = new LatLng(mCurrentLantitude,mCurrentLongitude);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(u);
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
StringBuilder currentPosition = new StringBuilder();
if (location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition.append("GPS");
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络");
//记录自己的经纬度信息
mCurrentLantitude = location.getLatitude();
mCurrentLongitude = location.getLongitude();
}
if (location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation) {
navigateTo(location);
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
这就是如何通过搜索将地图移动到目的城市,百度地图还有很多的搜索方式如POI搜索,其实每种搜索都差不多大致方法类似,大家感兴趣的话也可以看看其他搜索,具体的话可以参考百度地图给出的官方demo。在下一章的话我将分享如何在地图设置多个marker点,以及info窗口。敬请期待。
项目的源代码:http://pan.baidu.com/s/1mi64jRM 密码:hda9