Android使用Google Map服务-根据地址定位

根据地址定位是对根据GPS信息定位的一个改进,我们可以直接输入地址,获取到自己想要定位的地方,这更符合用户的需求。因为Google Map的地图定位是根据经纬度来完成的,所以我们需要根据地址信息,把地址解析成经纬度。这里需要:

1.地址解析 (服务地址为:http://maps.google.com/api/geocode/json?parameters)

2.反向地址解析 (服务地址为:http://maps.google.com/api/geocode/json?lalng=40.714,-73.96&sensor=true_or_false)

下面是解决这两种解析的工具类:

package org.wwj.map;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONObject;public class ConvertUtil{// 根据地址获取对应的经纬度public static double[] getLocationInfo(String address){// 定义一个HttpClient,用于向指定地址发送请求HttpClient client = new DefaultHttpClient();// 向指定地址发送GET请求HttpGet httpGet = new HttpGet("http://maps.google."+ "com/maps/api/geocode/json?address=" + address+ "ka&sensor=false");StringBuilder sb = new StringBuilder();try{// 获取服务器的响应HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();// 获取服务器响应的输入流InputStream stream = entity.getContent();int b;// 循环读取服务器响应while ((b = stream.read()) != -1){sb.append((char) b);}// 将服务器返回的字符串转换为JSONObject对象JSONObject jsonObject = new JSONObject(sb.toString());// 从JSONObject对象中取出代表位置的location属性JSONObject location = jsonObject.getJSONArray("results").getJSONObject(0)   .getJSONObject("geometry").getJSONObject("location");// 获取经度信息double longitude = location.getDouble("lng");// 获取纬度信息double latitude = location.getDouble("lat");// 将经度、纬度信息组成double[]数组return new double[]{longitude , latitude};}catch (Exception e){e.printStackTrace();}return null;} // 根据经纬度获取对应的地址public static String getAddress(double longitude, double latitude){// 定义一个HttpClient,用于向指定地址发送请求HttpClient client = new DefaultHttpClient();// 向指定地址发送GET请求HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/"+ "geocode/json?latlng="+ latitude + "," + longitude + "&sensor=false®ion=cn");StringBuilder sb = new StringBuilder();try{// 执行请求HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();// 获取服务器响应的字符串InputStream stream = entity.getContent();int b;while ((b = stream.read()) != -1){sb.append((char) b);}// 把服务器相应的字符串转换为JSONObjectJSONObject jsonObj = new JSONObject(sb.toString());// 解析出响应结果中的地址数据return jsonObj.getJSONArray("results").getJSONObject(0).getString("formatted_address");}catch (Exception e){e.printStackTrace();}return null;}  }


创建项目:AddressLocMap

项目运行效果:

代码清单:

AddressLocMap.java

PosOverLay.java

package org.wwj.map;import java.util.List;import android.graphics.Bitmap;import android.graphics.BitmapFactory;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.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;public class AddressLocMap extends MapActivity {//定义界面上的可视化控件Button locBn;MapView mv;EditText etAddress;//定义MapController对象MapController controller;Bitmap posBitmap;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        posBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pos);        //获取界面上MapView对象        mv = (MapView) findViewById(R.id.mv);        etAddress = (EditText) findViewById(R.id.address);        //设置放大、缩小控制的按钮        mv.setBuiltInZoomControls(true);        //创建MapController对象        controller = mv.getController();        //获得Button对象        locBn = (Button) findViewById(R.id.loc);        locBn.setOnClickListener(new OnClickListener() {public void onClick(View v) {// TODO Auto-generated method stubString address = etAddress.getEditableText().toString().trim();if(address.equals("")){//判断是否输入空值Toast.makeText(AddressLocMap.this, "请输入有效的地址!", Toast.LENGTH_LONG).show();return;}//调用ConverUtil执行地址解析double[] results = ConvertUtil.getLocationInfo(address);//调用方法更新MapViewupdateMapView(results[0], results[1]);}});        //触发按钮的单击事件        locBn.performClick();    }@Overrideprotected boolean isRouteDisplayed() {// TODO Auto-generated method stubreturn true;}//根据经度、纬度将MapView定位到指定地点的方法private void updateMapView(double lng, double lat){GeoPoint gp = new GeoPoint((int)(lat * 1E6), (int)(lng * 1E6));//设置显示放大缩小按钮mv.displayZoomControls(true);//将地图移动到指定的地理位置controller.animateTo(gp);//获得MapView上原有的Overlay对象List<Overlay> ol = mv.getOverlays();//清除原有的Overlay对象ol.clear();//添加一个新的overLay对象ol.add(new PosOverLay(gp, posBitmap));}    }


package org.wwj.map;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Point;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.Projection;public class PosOverLay extends Overlay{//定义该PosOverLay所绘制的位图Bitmap posBitmap;//定义该PosOverLay绘制位图的位置GeoPoint gp;public PosOverLay(GeoPoint gp, Bitmap posBitmap){super();this.gp = gp;this.posBitmap = posBitmap;}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {// TODO Auto-generated method stubif(!shadow){//获取MapView的Projection对象Projection proj = mapView.getProjection();Point p = new Point();//将真实的地理坐标转换为屏幕上的坐标proj.toPixels(gp, p);//在指定位置绘制图片canvas.drawBitmap(posBitmap, p.x - posBitmap.getWidth() / 2, p.y - posBitmap.getHeight() / 2, null);}}}


更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. 你需要知道的Android上下文Context
  3. android中相关的图形类
  4. Android(安卓)Binder框架实现之Framework层服务注册过程源码分析
  5. Android开发(一):Android(安卓)Studio及SDK下载安装教程2020
  6. Android(安卓)控件架构
  7. 使用Vitamio打造自己的Android万能播放器(9)—— 在线播放 (在线电
  8. Android的Message机制(简单小结)
  9. Android的五大基本组件

随机推荐

  1. spring框架中一个跟String的trim方法一样
  2. java中的Unicode到String但很棘手
  3. hbase中出现的java.net.BindException-Pr
  4. 处理“您确定您想要离开这个页面”Msg在S
  5. javascript 操作流——回调的回调
  6. Java中字符流和字节流到底有什么区别!!!
  7. 5个java面试题。。。请高手给个答案。。
  8. java中匹配字符串中的中文字符(含中文标
  9. Java nio 学习笔记(一) Buffer(缓冲区)与Chan
  10. 如何知道Object是否为String类型对象?