Android开发 GoogleMap之位置查找
上篇博客:GoogleMap之用户定位
这篇博客主要在上篇博客的基础上,介绍在地图上进行位置关键字搜索,效果图如下:搜索结果以列表形式显示,最终可以标明在地图上。
获取方式有两种:
1、使用android Api中的android.location.Geocoder类提供的方法
List<Address> getFromLocationName(StringlocationName, int maxResults) //参数分别为位置名称的关键字和查询结果的最大记录数。不过在模拟器上测试不成功,返回结果为空。查看官方文档介绍:The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.意思说该查询方法依赖于后台的一个service,如果没有该服务,返回结果为空。我采用了第二种方法获取位置的信息。
2、从Google Geocoding Api接口中获取json/xml数据,详细见官方文档:http://code.google.com/intl/zh-CN/apis/maps/documentation/geocoding/
代码如下:
/** * * Desc:根据地名查询 * @param locationName */ private void searchLocation(String locationName) { String url = "http://maps.google.com/maps/api/geocode/json?"; Map<String, String> paramMap = new HashMap<String, String>(); paramMap.put("address", locationName); paramMap.put("sensor", "true"); Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if (HttpConnectionUtil.SUCCESS == msg.what) { String response = (String) msg.getData().get("response"); Log.d(TAG, "response : " + response); GeocodeResult geoResult = ResponseParser.parseGeocodeRes(response); String status = geoResult.getStatus(); if (OK.equals(status)) { mLocInfos = geoResult.getResults(); showDialog(DIALOG_SEARCH_RESULT); } else { Toast.makeText(getBaseContext(), status, Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getBaseContext(), R.string.loc_error, Toast.LENGTH_LONG).show(); } } }; HttpConnectionUtil httpConnUtil = new HttpConnectionUtil(this, handler, url, paramMap); httpConnUtil.doStart(); }HttpConnectionUtil类如下: package com.channelsoft.map.utils; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.util.EntityUtils; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import com.channelsoft.map.GoogleMapActivity; import com.channelsoft.map.R; public class HttpConnectionUtil extends Thread{ private Context mContext; private Handler mHandler; private String mUrl; //请求地址 private Map<String, String> mParamMap; //请求参数 private ProgressDialog mProgressDialog; public static final int SUCCESS = 0; public static final int ERROR = 1; public HttpConnectionUtil(Context context, Handler handler, String url, Map<String, String> paramMap) { this.mContext = context; this.mHandler = handler; this.mUrl = url; this.mParamMap = paramMap; } public void doStart() { mProgressDialog = new ProgressDialog(mContext); mProgressDialog.setMessage(mContext.getString(R.string.loading_text)); mProgressDialog.show(); start(); } @Override public void run() { super.run(); try { String response = callWebService(); Message message = mHandler.obtainMessage(); Bundle b = new Bundle(); message.what = SUCCESS; // 这里是消息的类型 b.putString("response", response); message.setData(b); mHandler.sendMessage(message); } catch (Exception ex) { Message message = mHandler.obtainMessage(); Bundle b = new Bundle(); message.what = ERROR; message.setData(b); mHandler.sendMessage(message); } if (mProgressDialog != null) { mProgressDialog.dismiss(); } } private String callWebService() throws Exception { String requestUrl = parserReqParam(mUrl, mParamMap); Log.d(GoogleMapActivity.TAG, requestUrl); HttpClient httpClient = new DefaultHttpClient(); HttpResponse response = null; String bodyString = ""; try { setConnectionTimeOut(httpClient); response = httpClient.execute(new HttpGet(requestUrl)); System.out.println("status: " + response.getStatusLine().getStatusCode()); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { bodyString = EntityUtils.toString(response.getEntity()); } } catch (Exception e) { throw new Exception("HTTP Proxy :"+response.getStatusLine().getStatusCode(), e); } return bodyString; } /** * * Desc: 设置请求超时 * @param httpClient */ private void setConnectionTimeOut(HttpClient httpClient) { HttpParams httpParams = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 10000); HttpConnectionParams.setSoTimeout(httpParams, 10000); } /** * * Desc:拼装请求参数 * @param url * @param paramMap * @return */ private String parserReqParam(String url, Map<String, String> paramMap) { StringBuffer requestUrl = new StringBuffer(); requestUrl.append(url); for (String key : paramMap.keySet()) { String value = paramMap.get(key); requestUrl.append(key).append("=").append(value).append("&"); } return requestUrl.substring(0, requestUrl.length() - 1); } }以列表形式的Dialog显示查询的结果 @Override protected Dialog onCreateDialog(int id) { Dialog dialog = null; switch (id) { case DIALOG_SEARCH_RESULT: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.search_result); CharSequence[] charSequences = new CharSequence[mLocInfos.size() + 1]; charSequences[0] = getString(R.string.display_result); for (int i = 1; i < charSequences.length; i++) { charSequences[i] = mLocInfos.get(i - 1).getFormatted_address(); } builder.setItems(charSequences, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO 地点显示 mDisLocInfos.clear(); if (which == 0) { mDisLocInfos.addAll(mLocInfos); } else { mDisLocInfos.add(mLocInfos.get(which - 1)); } addOverLay(); removeDialog(DIALOG_SEARCH_RESULT); } }); dialog = builder.create(); break; default: break; } return dialog; }
addOverLay()方法介绍: /** * * Desc:添加图层 */ private void addOverLay() { Drawable marker = getResources().getDrawable(R.drawable.pin); marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); CustomItemOverlay customItemOverlay = new CustomItemOverlay(marker); // mMapView.getOverlays().clear(); mMapView.getOverlays().add(customItemOverlay); GeoPoint geoPoint = customItemOverlay.getCenter(); mMapController.setCenter(geoPoint); //设置缩放比例 1~21 // mMapController.setZoom(7); } //在地图上显示查询结果的图层 class CustomItemOverlay extends ItemizedOverlay { private List<OverlayItem> locations = new ArrayList<OverlayItem>(); private Drawable marker; public CustomItemOverlay(Drawable marker) { super(marker); this.marker = marker; if (null != mLocInfos) { for (LocationInfo info : mLocInfos) { double lat = Double.valueOf(info.getGeometry().getLocation().getLat()); double lng = Double.valueOf(info.getGeometry().getLocation().getLng()); Log.d(TAG, "Lat:" + lat + ";lng:" + lng); GeoPoint itemPoint = new GeoPoint((int)(lat * 1000000), (int)(lng * 1000000)); locations.add(new OverlayItem(itemPoint, info.getFormatted_address(), "")); } } populate(); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow); boundCenterBottom(marker); } @Override protected OverlayItem createItem(int i) { return locations.get(i); } @Override public int size() { return locations.size(); } }返回的Json数据解析,采用Google Gson
package com.channelsoft.map.utils; import com.channelsoft.map.entity.GeocodeResult; import com.google.gson.Gson; public class ResponseParser { public static GeocodeResult parseGeocodeRes(String response) { //数据解析 Gson gson = new Gson(); GeocodeResult geoResult = gson.fromJson(response, GeocodeResult.class); return geoResult; } }GecodeResult类对应JSON的数据结构。