1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 百度地图API之根据经纬度查询地址信息(Android)

百度地图API之根据经纬度查询地址信息(Android)

时间:2020-02-12 17:00:55

相关推荐

百度地图API之根据经纬度查询地址信息(Android)

本文主要讲解如何通过百度地图API根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。

百度地图移动版API不仅包含构建地图的基本接口,还集成了众多搜索服务,包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索、地址信息查询等。

百度地图移动版API提供的搜索服务主要是通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener来实现异步搜索服务。首先需要自定义一个MySearchListener类,它实现MKSearchListener接口,然后通过实现接口中不同的回调方法,来获得对应的搜索结果。MySearchListener类的定义如下:

/***实现MKSearchListener接口,用于实现异步搜索服务,得到搜索结果**@authorliufeng*/publicclassMySearchListenerimplementsMKSearchListener{/***根据经纬度搜索地址信息结果*@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetAddrResult(MKAddrInforesult,intiError){}/***驾车路线搜索结果*@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intiError){}/***POI搜索结果(范围检索、城市POI检索、周边检索)*@paramresult搜索结果*@paramtype返回结果类型(11,12,21:poi列表7:城市列表)*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetPoiResult(MKPoiResultresult,inttype,intiError){}/***公交换乘路线搜索结果*@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intiError){}/***步行路线搜索结果*@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intiError){}}说明:上面的类定义只是在说明MKSearchListener类的5个方法的作用,全都是空实现,并未给出具体的实现。根据你要检索的内容,再去具体实现上面对应的方法,就能获取到搜索结果。例如:1)你想通过一个地理坐标(经纬度值)来搜索地址信息,那么只需要具体实现上面的onGetAddrResult()方法就能得到搜索结果;2)如果你想搜索驾车路线信息,只需要具体实现onGetDrivingRouteResult()方法就能得到搜索结果。

紧接着,需要初始化MKSearch类:

//初始化MKSearchmMKSearch=newMKSearch();mMKSearch.init(mapManager,newMySearchListener());

经过上面两步之后,就可以通过调用MKSearch所提供的一些检索方法来搜索你想要的信息了。

下面给出一个具体的示例:根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。

1)布局文件res/layout/query_address.xml<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:Android="/apk/res/android"Android:layout_width="fill_parent"Android:layout_height="fill_parent"><LinearLayoutAndroid:orientation="vertical"Android:layout_width="fill_parent"Android:layout_height="fill_parent"><TextViewAndroid:layout_width="fill_parent"Android:layout_height="wrap_content"Android:text="经度:"/><EditTextAndroid:id="@+id/longitude_input"Android:layout_width="fill_parent"Android:layout_height="wrap_content"Android:text="106.720397"/><TextViewAndroid:layout_width="fill_parent"Android:layout_height="wrap_content"Android:text="纬度:"/><EditTextAndroid:id="@+id/latitude_input"Android:layout_width="fill_parent"Android:layout_height="wrap_content"Android:text="26.597239"/><ButtonAndroid:id="@+id/query_button"Android:layout_width="wrap_content"Android:layout_height="wrap_content"Android:layout_gravity="right"Android:text="地址查询"/><TextViewAndroid:id="@+id/address_text"Android:layout_width="wrap_content"Android:layout_height="wrap_content"/><!--虽然定义了MapView,但是设置了Android:visibility="gone"将其隐藏因为本示例并不需要显示地图,但不定义又不行(baidumapapi的要求)--><com.baidu.mapapi.MapViewAndroid:id="@+id/map_View"Android:layout_width="fill_parent"Android:layout_height="fill_parent"Android:clickable="true"Android:visibility="gone"/></LinearLayout></ScrollView>2)继承com.baidu.mapapi.MapActivity的Activity类packagecom.liufeng.baidumap;importAndroid.os.Bundle;importAndroid.view.View;importAndroid.view.View.OnClickListener;importAndroid.widget.Button;importAndroid.widget.EditText;importAndroid.widget.TextView;importcom.baidu.mapapi.BMapManager;importcom.baidu.mapapi.GeoPoint;importcom.baidu.mapapi.MKAddrInfo;importcom.baidu.mapapi.MKDrivingRouteResult;importcom.baidu.mapapi.MKPoiInfo;importcom.baidu.mapapi.MKPoiResult;importcom.baidu.mapapi.MKSearch;importcom.baidu.mapapi.MKSearchListener;importcom.baidu.mapapi.MKTransitRouteResult;importcom.baidu.mapapi.MKWalkingRouteResult;importcom.baidu.mapapi.MapActivity;/***根据经纬度查询地址信息**@authorliufeng*@date-05-03*/publicclassQueryAddressActivityextendsMapActivity{//定义地图引擎管理类privateBMapManagermapManager;//定义搜索服务类privateMKSearchmMKSearch;privateEditTextlongitudeEditText;privateEditTextlatitudeEditText;privateTextViewaddressTextView;privateButtonqueryButton;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.query_address);//初始化MapActivitymapManager=newBMapManager(getApplication());//init方法的第一个参数需填入申请的APIKeymapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4",null);super.initMapActivity(mapManager);//初始化MKSearchmMKSearch=newMKSearch();mMKSearch.init(mapManager,newMySearchListener());//通过id查询在布局文件中定义的控件longitudeEditText=(EditText)findViewById(R.id.longitude_input);latitudeEditText=(EditText)findViewById(R.id.latitude_input);addressTextView=(TextView)findViewById(R.id.address_text);queryButton=(Button)findViewById(R.id.query_button);//给地址查询按钮设置单击事件监听器queryButton.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//用户输入的经度值StringlongitudeStr=longitudeEditText.getText().toString();//用户输入的纬度值StringlatitudeStr=latitudeEditText.getText().toString();try{//将用户输入的经纬度值转换成int类型intlongitude=(int)(1000000*Double.parseDouble(longitudeStr));intlatitude=(int)(1000000*Double.parseDouble(latitudeStr));//查询该经纬度值所对应的地址位置信息mMKSearch.reverseGeocode(newGeoPoint(latitude,longitude));}catch(Exceptione){addressTextView.setText("查询出错,请检查您输入的经纬度值!");}}});}@OverrideprotectedbooleanisRouteDisplayed(){returnfalse;}@OverrideprotectedvoidonDestroy(){if(mapManager!=null){//程序退出前需调用此方法mapManager.destroy();mapManager=null;}super.onDestroy();}@OverrideprotectedvoidonPause(){if(mapManager!=null){//终止百度地图APImapManager.stop();}super.onPause();}@OverrideprotectedvoidonResume(){if(mapManager!=null){//开启百度地图APImapManager.start();}super.onResume();}/***内部类实现MKSearchListener接口,用于实现异步搜索服务**@authorliufeng*/publicclassMySearchListenerimplementsMKSearchListener{/***根据经纬度搜索地址信息结果**@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetAddrResult(MKAddrInforesult,intiError){if(result==null){return;}StringBuffersb=newStringBuffer();//经纬度所对应的位置sb.append(result.strAddr).append("/n");//判断该地址附近是否有POI(PointofInterest,即兴趣点)if(null!=result.poiList){//遍历所有的兴趣点信息for(MKPoiInfopoiInfo:result.poiList){sb.append("----------------------------------------").append("/n");sb.append("名称:").append(poiInfo.name).append("/n");sb.append("地址:").append(poiInfo.address).append("/n");sb.append("经度:").append(poiInfo.pt.getLongitudeE6()/1000000.0f).append("/n");sb.append("纬度:").append(poiInfo.pt.getLatitudeE6()/1000000.0f).append("/n");sb.append("电话:").append(poiInfo.phoneNum).append("/n");sb.append("邮编:").append(poiInfo.postCode).append("/n");//poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路sb.append("类型:").append(poiInfo.ePoiType).append("/n");}}//将地址信息、兴趣点信息显示在TextView上addressTextView.setText(sb.toString());}/***驾车路线搜索结果**@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intiError){}/***POI搜索结果(范围检索、城市POI检索、周边检索)**@paramresult搜索结果*@paramtype返回结果类型(11,12,21:poi列表7:城市列表)*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetPoiResult(MKPoiResultresult,inttype,intiError){}/***公交换乘路线搜索结果**@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intiError){}/***步行路线搜索结果**@paramresult搜索结果*@paramiError错误号(0表示正确返回)*/@OverridepublicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intiError){}}}

3)AndroidManifest.xml中的配置<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:Android="/apk/res/android"package="com.liufeng.baidumap"Android:versionCode="1"Android:versionName="1.0"><applicationAndroid:icon="@drawable/icon"android:label="@string/app_name"><activityAndroid:name=".QueryAddressActivity"android:label="@string/app_name"><intent-filter><actionAndroid:name="android.intent.action.MAIN"/><categoryAndroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application><uses-sdkAndroid:minSdkVersion="4"/><!--访问网络的权限--><uses-permissionAndroid:name="android.permission.INTERNET"/><!--访问精确位置的权限--><uses-permissionAndroid:name="android.permission.ACCESS_FINE_LOCATION"/><!--访问网络状态的权限--><uses-permissionAndroid:name="android.permission.ACCESS_NETWORK_STATE"/><!--访问WIFI网络状态的权限--><uses-permissionAndroid:name="android.permission.ACCESS_WIFI_STATE"/><!--改变WIFI网络状态的权限--><uses-permissionAndroid:name="android.permission.CHANGE_WIFI_STATE"/><!--读写存储卡的权限--><uses-permissionAndroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--读取电话状态的权限--><uses-permissionAndroid:name="android.permission.READ_PHONE_STATE"/></manifest>

4)运行结果截图及说明

程序在模拟器上运行的初始效果如上图所示。可以看出,地图并没有显示出来,这和我们在设计时布局时所设想的一样;另外两个输入框中也分别显示了默认给出的经纬度值。

点击“地址查询”按钮后,将看到如下图所示包含了查询结果的界面:

说明:图上的“贵州省贵阳市云岩区普陀路”正是我们要查询的地理坐标(经度:106.720397,纬度:26.597239)所对应的地址信息;同时该地址信息下方还显示出了该地址附近的10个兴趣点(POI),每个兴趣点分别包含了“名称”、“地址”、“经纬度”、“电话”、“邮编”和“兴趣点类型”信息。

备注:如果本文的示例继续做下去,就应该将MapView显示出来,同时结合第8篇文章“百度地图API之ItemizedOverlay的使用(Android)/Linux/-07/38864.htm”所介绍的内容将地址信息和兴趣点标注在地图上。我想这两方面的内容都已做过详细讲解并给出了示例,再来实现这个应该并不是什么难事,看文章的你就动动手来完成它吧!

原文地址:/Linux/-07/38866p2.htm

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。