import android.app.ProgressDialog;
import android.content.Context;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
/**
* 地理编码
*
* @author 勺子
*
*/
public class GeocoderService implements OnGeocodeSearchListener {
private Context mContext;
private String addressName;
private ProgressDialog mProgressDialog = null;
private boolean isMove = false;
/* 搜索实例 */
private GeocodeSearch mGeocodeSearch;
/* 地图实例 */
private AMap mAMap;
/* 标记实例 */
private Marker mMarker;
private LatLonPoint mLatLonPoint;
/**
* 构造方法
*
* @param context
* @param isMove
* @param aMap
*/
public GeocoderService(Context context, boolean isMove, AMap aMap) {
this.mContext = context;
this.mAMap = aMap;
this.isMove = isMove;
init();
}
/**
* 初始化
*/
private void init() {
mProgressDialog = new ProgressDialog(mContext);
/* 初始化地址编码搜索 */
mGeocodeSearch = new GeocodeSearch(mContext);
mGeocodeSearch.setOnGeocodeSearchListener(this);
mMarker = mAMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(
BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
}
/**
* 响应地理编码
*
* @param name
*/
public void getLatlon(String name) {
showDialog();
// 第一个参数表示地址,第二个参数表示查询城市010,中文或者中文全拼,citycode、adcode
GeocodeQuery query = new GeocodeQuery(name, "adcode");
// 设置同步地理编码请求
mGeocodeSearch.getFromLocationNameAsyn(query);
}
/**
* 响应逆地理编码
*
* @param latLonPoint
*/
public void getAddress(LatLonPoint latLonPoint) {
showDialog();
this.mLatLonPoint = latLonPoint;
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,
GeocodeSearch.AMAP);
// 设置同步逆地理编码请求
mGeocodeSearch.getFromLocationAsyn(query);
}
/**
* 地理编码查询回调
*/
@Override
public void onGeocodeSearched(GeocodeResult result, int rCode) {
dismissDialog();
if (rCode == 0) {
if (result != null && result.getGeocodeAddressList() != null
&& result.getGeocodeAddressList().size() > 0) {
GeocodeAddress address = result.getGeocodeAddressList().get(0);
addressName = "经纬度值:" + address.getLatLonPoint() + "\n位置描述:"
+ address.getFormatAddress();
moveMapAndMarker(address.getLatLonPoint());
ToastUtil.show(mContext, addressName);
} else {
ToastUtil.show(mContext, "对不起,没有搜索到相关数据!");
}
} else {
ToastUtil.show(mContext, "搜索失败,请检查网络连接!");
}
}
/**
* 逆地理编码回调
*/
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
dismissDialog();
if (rCode == 0) {
if (result != null && result.getRegeocodeAddress() != null
&& result.getRegeocodeAddress().getFormatAddress() != null) {
addressName = result.getRegeocodeAddress().getFormatAddress()
+ "附近";
moveMapAndMarker(mLatLonPoint);
ToastUtil.show(mContext, addressName);
} else {
ToastUtil.show(mContext, "对不起,没有搜索到相关数据!");
}
} else {
ToastUtil.show(mContext, "搜索失败,请检查网络连接!");
}
}
/**
* 移动地图和标记
*
* @param latLonPoint
*/
private void moveMapAndMarker(LatLonPoint latLonPoint) {
if (isMove) {
/* 可视区域动画是指从当前可视区域转换到一个指定位置的可视区域的过程。 */
mAMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
AMapUtil.convertToLatLng(latLonPoint), 15));
/* 设置 marker 的经纬度位置。 */
mMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
}
}
/**
* 显示进度条对话框
*/
private void showDialog() {
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setIndeterminate(false);
mProgressDialog.setCancelable(true);
mProgressDialog.setMessage("正在获取地址...");
mProgressDialog.show();
}
/**
* 隐藏进度条对话框
*/
private void dismissDialog() {
if (mProgressDialog != null) {
mProgressDialog.dismiss();
}
}
}
高德官方Demo的几个类
/**
*
*/
package com.amap.map3d.demo.util;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.text.Html;
import android.text.Spanned;
import android.widget.EditText;
import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
public class AMapUtil {
/**
* 判断edittext是否null
*/
public static String checkEditText(EditText editText) {
if (editText != null && editText.getText() != null
&& !(editText.getText().toString().trim().equals(""))) {
return editText.getText().toString().trim();
} else {
return "";
}
}
public static Spanned stringToSpan(String src) {
return src == null ? null : Html.fromHtml(src.replace("\n", "<br />"));
}
public static String colorFont(String src, String color) {
StringBuffer strBuf = new StringBuffer();
strBuf.append("<font color=").append(color).append(">").append(src)
.append("</font>");
return strBuf.toString();
}
public static String makeHtmlNewLine() {
return "<br />";
}
public static String makeHtmlSpace(int number) {
final String space = " ";
StringBuilder result = new StringBuilder();
for (int i = 0; i < number; i++) {
result.append(space);
}
return result.toString();
}
public static String getFriendlyLength(int lenMeter) {
if (lenMeter > 10000) // 10 km
{
int dis = lenMeter / 1000;
return dis + ChString.Kilometer;
}
if (lenMeter > 1000) {
float dis = (float) lenMeter / 1000;
DecimalFormat fnum = new DecimalFormat("##0.0");
String dstr = fnum.format(dis);
return dstr + ChString.Kilometer;
}
if (lenMeter > 100) {
int dis = lenMeter / 50 * 50;
return dis + ChString.Meter;
}
int dis = lenMeter / 10 * 10;
if (dis == 0) {
dis = 10;
}
return dis + ChString.Meter;
}
public static boolean IsEmptyOrNullString(String s) {
return (s == null) || (s.trim().length() == 0);
}
/**
* 把LatLng对象转化为LatLonPoint对象
*/
public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
return new LatLonPoint(latlon.latitude, latlon.longitude);
}
/**
* 把LatLonPoint对象转化为LatLon对象
*/
public static LatLng convertToLatLng(LatLonPoint latLonPoint) {
return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());
}
/**
* 把集合体的LatLonPoint转化为集合体的LatLng
*/
public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shapes) {
ArrayList<LatLng> lineShapes = new ArrayList<LatLng>();
for (LatLonPoint point : shapes) {
LatLng latLngTemp = AMapUtil.convertToLatLng(point);
lineShapes.add(latLngTemp);
}
return lineShapes;
}
/**
* long类型时间格式化
*/
public static String convertToTime(long time) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(time);
return df.format(date);
}
public static final String HtmlBlack = "#000000";
public static final String HtmlGray = "#808080";
}
package com.amap.map3d.demo.util;
public class ChString {
public static final String Kilometer = "\u516c\u91cc";// "公里";
public static final String Meter = "\u7c73";// "米";
public static final String ByFoot = "\u6b65\u884c";// "步行";
public static final String To = "\u53bb\u5f80";// "去往";
public static final String Station = "\u8f66\u7ad9";// "车站";
public static final String TargetPlace = "\u76ee\u7684\u5730";// "目的地";
public static final String StartPlace = "\u51fa\u53d1\u5730";// "出发地";
public static final String About = "\u5927\u7ea6";// "大约";
public static final String Direction = "\u65b9\u5411";// "方向";
public static final String GetOn = "\u4e0a\u8f66";// "上车";
public static final String GetOff = "\u4e0b\u8f66";// "下车";
public static final String Zhan = "\u7ad9";// "站";
public static final String cross = "\u4ea4\u53c9\u8def\u53e3"; // 交叉路口
public static final String type = "\u7c7b\u522b"; // 类别
public static final String address = "\u5730\u5740"; // 地址
public static final String PrevStep = "\u4e0a\u4e00\u6b65";
public static final String NextStep = "\u4e0b\u4e00\u6b65";
public static final String Gong = "\u516c\u4ea4";
public static final String ByBus = "\u4e58\u8f66";
public static final String Arrive = "\u5230\u8FBE";// 到达
}
/**
*
*/
package com.amap.map3d.demo.util;
import android.content.Context;
import android.widget.Toast;
public class ToastUtil {
public static void show(Context context, String info) {
Toast.makeText(context, info, Toast.LENGTH_LONG).show();
}
public static void show(Context context, int info) {
Toast.makeText(context, info, Toast.LENGTH_LONG).show();
}
}