Android百度地图——根据城市名,地址名获取GPS纬度、经度值
2013-02-13 00:45
316 查看
场景:我知道某个城市名和这个城市里的一个小地方的地址,我想知道哪这个城市里这个小地方的GPS纬度、经度值。
例如:我想知道上海市,益江路盛夏路的GPS纬度、经度值是多少?
注:一些基本的概念什么的就都不讲了,前面已经讲过了,想要了解的请查看:Android 百度地图SDK (v2.0.0)初探
一、假设基于百度地图SDK,底图(最基本的图层)你已经实现了,并且设置显示的地图为上海市的。
二、获取上海市,益江路盛夏路的GPS纬度、经度值:
1、创建MKSearch类的实例,并初始化。
2、调用 mMKSearch.geocode(String address, String city)方法,返回值是int类型的。
参数列表:某个城市中某个地方的地址,城市名。例如:陆家嘴,上海市
3、在回调onGetAddrResult(MKAddrInfo result, int error)里面处理查到的结果。
将得到的结果用两种方式呈现:a. 以对话框的形式展现;b. 在地图上标注出来。
运行效果图如下:
a. 对话框形式
b. 在地图上标注
完整代码:
例如:我想知道上海市,益江路盛夏路的GPS纬度、经度值是多少?
注:一些基本的概念什么的就都不讲了,前面已经讲过了,想要了解的请查看:Android 百度地图SDK (v2.0.0)初探
一、假设基于百度地图SDK,底图(最基本的图层)你已经实现了,并且设置显示的地图为上海市的。
二、获取上海市,益江路盛夏路的GPS纬度、经度值:
1、创建MKSearch类的实例,并初始化。
mMKSearch = new MKSearch(); mMKSearch.init(mMapManager, new MKSearchListener(){ @Override public void onGetAddrResult(MKAddrInfo result, int error) { } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) { } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } });
2、调用 mMKSearch.geocode(String address, String city)方法,返回值是int类型的。
参数列表:某个城市中某个地方的地址,城市名。例如:陆家嘴,上海市
mMKSearch.geocode("益江路盛夏路", "上海市");
3、在回调onGetAddrResult(MKAddrInfo result, int error)里面处理查到的结果。
将得到的结果用两种方式呈现:a. 以对话框的形式展现;b. 在地图上标注出来。
@Override public void onGetAddrResult(MKAddrInfo result, int error) { // error的含义: 错误号,0表示结果正确,result中有相关结果信息; // 100表示结果正确,result中无相关地址信息 if(error != 0 || result == null){ String str = String.format("错误号:%d", error); Toast.makeText(BaiduMapGeocodeActivity.this, str, Toast.LENGTH_LONG).show(); return; } GeoPoint mPoint = result.geoPt; // 将得到的结果以对话框的形式展现 showGeocode(result.strAddr, mPoint); // 将找到的位置设置为在手机屏幕内可见地图的中心点 mMapView.getController().animateTo(mPoint); // 得到需要标在地图上的资源 Drawable marker = getResources().getDrawable(R.drawable.icon_marka); // 为maker定义位置和边界 // marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(new MyOverlay(marker, mPoint, result.strAddr)); mMapView.refresh(); }
运行效果图如下:
a. 对话框形式
b. 在地图上标注
完整代码:
package com.android.baidu.map; import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.ItemizedOverlay; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.OverlayItem; import com.baidu.mapapi.search.MKAddrInfo; import com.baidu.mapapi.search.MKBusLineResult; import com.baidu.mapapi.search.MKDrivingRouteResult; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKSearch; import com.baidu.mapapi.search.MKSearchListener; import com.baidu.mapapi.search.MKSuggestionResult; import com.baidu.mapapi.search.MKTransitRouteResult; import com.baidu.mapapi.search.MKWalkingRouteResult; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * 根据城市名,地址名获取地址信息 (GPS纬度、经度值) * @author android_ls * */ public class BaiduMapGeocodeActivity extends Activity { public static final String TAG = "BaiduMapGeocodeActivity"; public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB"; private BMapManager mMapManager = null; private MapView mMapView = null; private MKSearch mMKSearch = null; private Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = BaiduMapGeocodeActivity.this.getApplicationContext(); mMapManager = new BMapManager(getApplicationContext()); mMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() { @Override public void onGetNetworkState(int errorCode) { if (errorCode == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(mContext, "您的网络出错啦!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int errorCode) { if (errorCode == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText(mContext, "请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } }); setContentView(R.layout.main); mMapView = (MapView) this.findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); MapController mMapController = mMapView.getController(); // 上海市的GPS纬度经度值:31.232310,121.469160 GeoPoint mGeoPoint = new GeoPoint( (int) (31.232310 * 1E6), (int) (121.469160 * 1E6) ); mMapController.setCenter(mGeoPoint); mMapController.setZoom(18); mMKSearch = new MKSearch(); mMKSearch.init(mMapManager, new MKSearchListener(){ @Override public void onGetAddrResult(MKAddrInfo result, int error) { // error的含义: 错误号,0表示结果正确,result中有相关结果信息; // 100表示结果正确,result中无相关地址信息 if(error != 0 || result == null){ String str = String.format("错误号:%d", error); Toast.makeText(BaiduMapGeocodeActivity.this, str, Toast.LENGTH_LONG).show(); return; } GeoPoint mPoint = result.geoPt; // 将得到的结果以对话框的形式展现 showGeocode(result.strAddr, mPoint); // 将找到的位置设置为在手机屏幕内可见地图的中心点 mMapView.getController().animateTo(mPoint); // 得到需要标在地图上的资源 Drawable marker = getResources().getDrawable(R.drawable.icon_marka); // 为maker定义位置和边界 // marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); mMapView.getOverlays().clear(); mMapView.getOverlays().add( new MyOverlay(marker, mPoint, result.strAddr)); mMapView.refresh(); } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) { } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } }); // 根据地址名获取地址信息 异步函数,返回结果在MKSearchListener里的onGetAddrResult方法通知 mMKSearch.geocode("益江路盛夏路", "上海市"); // 测试:下面的都获取不到GPS纬度、经度值。感慨:百度地图这方面有待提高。 // mMKSearch.geocode("浦东软件园", "上海市"); // mMKSearch.geocode("广兰路", "上海市"); // mMKSearch.geocode("祖冲之路金科路", "上海市"); // mMKSearch.geocode("陆家嘴", "上海市"); } /** * 以Dialog的形式显示查找结果 * @param address 地址 * @param mPoint 地理坐标点 */ private void showGeocode(String address, GeoPoint mPoint) { // 将以微度的整数形式存储的地理坐标点转换成GPS纬度经度值 double latitude = mPoint.getLatitudeE6()/1E6; // 纬度 double longitude = mPoint.getLongitudeE6()/1E6;// 经度 Log.i(TAG, "latitude = " + latitude + "\t longitude = " + longitude); StringBuilder sb = new StringBuilder(address); sb.append("\n") .append("纬度:\t").append(latitude) .append("\n") .append("经度:\t").append(longitude); new AlertDialog.Builder(this) .setTitle("根据地址名获取GPS纬度、经度值") .setMessage(sb) .show(); } class MyOverlay extends ItemizedOverlay<OverlayItem>{ private ArrayList<OverlayItem> overlayList = new ArrayList<OverlayItem>(); public MyOverlay(Drawable drawable, GeoPoint point, String address) { super(drawable); overlayList.add(new OverlayItem(point, address, address)); populate(); } @Override protected OverlayItem createItem(int index) { return overlayList.get(index); } @Override public int size() { return overlayList.size(); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } @Override protected void onResume() { mMapView.onResume(); if (mMapManager != null) { mMapManager.start(); } super.onResume(); } @Override protected void onPause() { mMapView.onPause(); if (mMapManager != null) { mMapManager.stop(); } super.onPause(); } @Override protected void onDestroy() { mMapView.destroy(); if (mMapManager != null) { mMapManager.destroy(); mMapManager = null; } super.onDestroy(); } }
相关文章推荐
- 凨-百度地图API之地图标注(JS版),地理位置信息,根据地址获取经度纬度
- 根据地址获取经度纬度
- 根据地址获取经度和纬度
- 根据地址获取经度纬度
- 百度地图获取地址信息由纬度和经度
- 根据IP地址获取地址所在城市帮助类(IPHelper)
- 百度地图获取某个城市的经度纬度
- 开发你的LBS应用,使用Google地图引擎,根据地理位置获取纬度、经度。
- Android——使用百度API获取经度纬度以及所在城市
- c#根据ip获取城市地址
- 根据IP地址获取地址所在城市帮助类(IPHelper)
- 通过经度、纬度获取地址名称[JS实现]
- iOS. 原生获取当前经度 纬度。 地址
- 获取当前经纬度并根据经纬度反编译城市地址
- 百度地图API调用(php 版本)输入地址 获取经度纬度
- 【WebAPI】高德地图根据GPS获取地址描述
- GPS定位纬度,经度后,通过GOOGLE MAP API解析出地址
- 根据手机ip地址获取城市,避免申请地图定位, String .split("\\s+")
- 根据ip地址获取所在省市城市地区的真实地址/php函数
- GPS获取当前的经度和纬度