Android百度地图——根据城市名,地址名获取GPS纬度、经度值

场景:我知道某个城市名和这个城市里的一个小地方的地址,我想知道哪这个城市里这个小地方的GPS纬度、经度值。

例如:我想知道上海市,益江路盛夏路的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();
    }

}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值