• 百度地图之地址信息和坐标的转换


    在实际运用中,经常需要进行地理编码和地理反编码,即将地址信息转换成坐标和将坐标转换成地址信息,此demo就是用来展示如何进行地理编码搜索(用地址检索坐标)、反地理编码搜索(用坐标检索地址)以及展示如何使用ItemizedOverlay在地图上标注结果点,代码原型来自百度Demo,代码如下:

    Activity:

    package com.home;
    
    import android.app.Activity;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import com.baidu.mapapi.map.ItemizedOverlay;
    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.MKShareUrlResult;
    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;
    
    public class GeoCoderActivity extends Activity implements OnClickListener {
    	// UI相关
    	private Button mBtnReverseGeoCode = null; // 将坐标反编码为地址
    	private Button mBtnGeoCode = null; // 将地址编码为坐标
    	private EditText lat = null;
    	private EditText lon = null;
    	private EditText editCity = null;
    	private EditText editGeoCodeKey = null;
    	// 地图相关
    	private MapView mMapView = null; // 地图View
    	// 搜索相关
    	private MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
    
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		DemoApplication app = (DemoApplication) this.getApplication();
    		setContentView(R.layout.geocoder);
    		CharSequence titleLable = "地理编码功能";
    		setTitle(titleLable);
    
    		// 地图初始化
    		mMapView = (MapView) findViewById(R.id.geocoder_bmapView);
    		mMapView.getController().enableClick(true);
    		mMapView.getController().setZoom(12);
    
    		// UI初始化
    		lat = (EditText) findViewById(R.id.geocoder_et_lat);
    		lon = (EditText) findViewById(R.id.geocoder_et_lon);
    		editCity = (EditText) findViewById(R.id.geocoder_et_city);
    		editGeoCodeKey = (EditText) findViewById(R.id.geocoder_et_geocodekey);
    		mBtnReverseGeoCode = (Button) findViewById(R.id.geocoder_btn_reversegeocode);
    		mBtnGeoCode = (Button) findViewById(R.id.geocoder_btn_geocode);
    		mBtnReverseGeoCode.setOnClickListener(this);
    		mBtnGeoCode.setOnClickListener(this);
    
    		// 初始化搜索模块,注册事件监听
    		mSearch = new MKSearch();
    		mSearch.init(app.mBMapManager, new MKSearchListener() {
    			@Override
    			public void onGetPoiDetailSearchResult(int type, int error) {
    			}
    
    			public void onGetAddrResult(MKAddrInfo res, int error) {
    				if (error != 0) {
    					String str = String.format("错误号:%d", error);
    					Toast.makeText(GeoCoderActivity.this, str,
    							Toast.LENGTH_LONG).show();
    					return;
    				}
    				// 地图移动到该点
    				mMapView.getController().animateTo(res.geoPt);
    				if (res.type == MKAddrInfo.MK_GEOCODE) {
    					// 地理编码:通过地址检索坐标点
    					String strInfo = String.format("纬度:%f 经度:%f",
    							res.geoPt.getLatitudeE6() / 1e6,
    							res.geoPt.getLongitudeE6() / 1e6);
    					Toast.makeText(GeoCoderActivity.this, strInfo,
    							Toast.LENGTH_LONG).show();
    				}
    				if (res.type == MKAddrInfo.MK_REVERSEGEOCODE) {
    					// 反地理编码:通过坐标点检索详细地址及周边poi
    					String strInfo = res.strAddr;
    					Toast.makeText(GeoCoderActivity.this, strInfo,
    							Toast.LENGTH_LONG).show();
    
    				}
    				// 生成ItemizedOverlay图层用来标注结果点
    				ItemizedOverlay<OverlayItem> itemOverlay = new ItemizedOverlay<OverlayItem>(
    						null, mMapView);
    				// 生成Item
    				OverlayItem item = new OverlayItem(res.geoPt, "", null);
    				// 得到需要标在地图上的资源
    				Drawable marker = getResources().getDrawable(
    						R.drawable.icon_markf);
    				// 为maker定义位置和边界
    				marker.setBounds(0, 0, marker.getIntrinsicWidth(),
    						marker.getIntrinsicHeight());
    				// 给item设置marker
    				item.setMarker(marker);
    				// 在图层上添加item
    				itemOverlay.addItem(item);
    
    				// 清除地图其他图层
    				mMapView.getOverlays().clear();
    				// 添加一个标注ItemizedOverlay图层
    				mMapView.getOverlays().add(itemOverlay);
    				// 执行刷新使生效
    				mMapView.refresh();
    			}
    
    			public void onGetPoiResult(MKPoiResult res, int type, int error) {
    
    			}
    
    			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
    					int error) {
    			}
    
    			public void onGetTransitRouteResult(MKTransitRouteResult res,
    					int error) {
    			}
    
    			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
    					int error) {
    			}
    
    			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
    			}
    
    			@Override
    			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
    			}
    
    			@Override
    			public void onGetShareUrlResult(MKShareUrlResult result, int type,
    					int error) {
    			}
    
    		});
    
    	}
    
    	@Override
    	public void onClick(View v) {
    		if (v == mBtnGeoCode) {
    			// Geo搜索
    			mSearch.geocode(editGeoCodeKey.getText().toString(), editCity
    					.getText().toString());
    		}
    		if (v == mBtnReverseGeoCode) {
    			GeoPoint ptCenter = new GeoPoint((int) (Float.valueOf(lat.getText()
    					.toString()) * 1e6), (int) (Float.valueOf(lon.getText()
    					.toString()) * 1e6));
    			// 反Geo搜索
    			mSearch.reverseGeocode(ptCenter);
    		}
    	}
    
    	@Override
    	protected void onPause() {
    		mMapView.onPause();
    		super.onPause();
    	}
    
    	@Override
    	protected void onResume() {
    		mMapView.onResume();
    		super.onResume();
    	}
    
    	@Override
    	protected void onDestroy() {
    		mMapView.destroy();
    		super.onDestroy();
    	}
    
    	@Override
    	protected void onSaveInstanceState(Bundle outState) {
    		super.onSaveInstanceState(outState);
    		mMapView.onSaveInstanceState(outState);
    
    	}
    
    	@Override
    	protected void onRestoreInstanceState(Bundle savedInstanceState) {
    		super.onRestoreInstanceState(savedInstanceState);
    		mMapView.onRestoreInstanceState(savedInstanceState);
    	}
    }
    


    布局XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <EditText
                android:id="@+id/geocoder_et_city"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="北京" />
    
            <EditText
                android:id="@+id/geocoder_et_geocodekey"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="海淀区上地十街10号" />
    
            <Button
                android:id="@+id/geocoder_btn_geocode"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/button_style"
                android:text="Geo" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <EditText
                android:id="@+id/geocoder_et_lat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="39.904965" />
    
            <EditText
                android:id="@+id/geocoder_et_lon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="116.327764" />
    
            <Button
                android:id="@+id/geocoder_btn_reversegeocode"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/button_style"
                android:text="ReverseGeo" />
        </LinearLayout>
    
        <com.baidu.mapapi.map.MapView
            android:id="@+id/geocoder_bmapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true" />
    
    </LinearLayout>


    配置文件同之前地图示例

    附上图片效果:

  • 相关阅读:
    [C]recursion递归计算阶乘
    [Python]reduce function & lambda function & factorial
    [C/JAVA] ceil, floor
    OC项目调用C++
    Xcode 代码注释
    百度云加速器
    UITableView和MJReFresh结合使用问题记录
    OC 类的load方法
    JLRoutes笔记
    推送通知项目记录
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3315250.html
Copyright © 2020-2023  润新知