通过地名获得经纬度并标识在地图上

转载请注明出处

主要是调用Geocoder的getFromLocationName(),该方法可以传入地名。
在使用该方法前需要geo = new Geocoder(this, Locale.CHINA);
不然在地图上是查询不到的。

/**
 * 
 */
package com.decarta.demo;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

/**
 * @author Tony Shen
 * 
 */
public class Main extends MapActivity {

	// 地图显示控制相关变量定义
	private MapView map = null;
	private MapController mapCon;
	private Geocoder geo;
	
	private static final int ERROR_DIALOG = 1;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		geo = new Geocoder(this, Locale.CHINA);
		// 获取MapView
		map = (MapView) findViewById(R.id.map);
		// 设置显示模式
		map.setTraffic(true);
		map.setSatellite(false);
		map.setStreetView(true);
		// 设置可以缩放
		map.setBuiltInZoomControls(true);

		List<Address> addresses = null;
		try {
			addresses = geo.getFromLocationName("江苏省苏州市寒山寺", 1);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(addresses.size() == 0) {
			showDialog(ERROR_DIALOG);
			GeoPoint geoBeijing = new GeoPoint(
					(int) (39.906033* 1000000),
					(int) (116.397700 * 1000000));
			mapCon = map.getController();
			mapCon.setCenter(geoBeijing);
			mapCon.setZoom(4);
		} else {
			Address address = addresses.get(0);
			// 设置初始地图的中心位置
			GeoPoint geoPoint = new GeoPoint(
					(int) (address.getLatitude() * 1000000),
					(int) (address.getLongitude() * 1000000));
			mapCon = map.getController();
			mapCon.setCenter(geoPoint);
			mapCon.setZoom(16);
			List<Overlay> overlays = this.map.getOverlays(); 
			overlays.add(new PositionOverlay(geoPoint, this, R.drawable.ic_red_pin));
		}
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
		return new AlertDialog.Builder(this).setTitle("查询出错哦")
				.setMessage("路名/地名出错,请重新输入!").create();
	}
	
	class PositionOverlay extends Overlay {
		private GeoPoint geoPoint; 
	    private Context context;
	    private int drawable;
	    
		public PositionOverlay(GeoPoint geoPoint, Context context, int drawable) { 
	        super(); 
	        this.geoPoint = geoPoint; 
	        this.context = context;
	        this.drawable = drawable;
	    }
		
		@Override 
	    public void draw(Canvas canvas, MapView mapView, boolean shadow) {

	        Projection projection = mapView.getProjection(); 
	        Point point = new Point(); 
	        projection.toPixels(geoPoint, point);

	        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
	                drawable); 
	        canvas.drawBitmap(bitmap, point.x-bitmap.getWidth()/2 , point.y-bitmap.getHeight(), null); 
	        super.draw(canvas, mapView, shadow); 
	    } 
	}
}


效果图如下:

通过地名获得经纬度并标识在地图上

程序就这么简单,作为demo我把地名写死了

你可能感兴趣的:(.net,android,Google,OS)