一开始我的想法是用NASA的地图服务功能,不过画质太差了,然后就用高德地图的API做了。
高德地图的缺点在于使用起来需要认证,但是有更丰富的API,生态也很好。
- 首先创建一个JSK文件,然后使用Toolkey(JDK)命令,解析获取正式版的SHA
- 在.Android下有一个debug.keystore,可以获取到所有APP的debug版本SHA
- 填入SHA获得Key
myLocationStyle = new MyLocationStyle();
myLocationStyle.interval(2000);
aMap = mapView.getMap();
aMap.setMyLocationStyle(myLocationStyle);
aMap.setMyLocationEnabled(true); //声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation.getErrorCode() == 0) {
// 解析aMapLocation,获取当前的位置信息
double curLongitude = aMapLocation.getLongitude();
double curLatitude = aMapLocation.getLatitude();
}else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
};
// 获取当前经纬度
private void getCurrentLocation() {
try {
mLocationClient = new AMapLocationClient(getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}一开始我的想法是点击屏幕上的点完成标点,但是发现高德地图没有提供这样的API,我需要自己解析屏幕的位置,然后计算出其经纬度,然后通过高德的API完成标点。后来偶然间看到可以通过POI搜索出经纬度,然后用经纬度完成标点。
(106条消息) Android 高德地图根据地址获取经纬度,计算两个坐标的距离_meixi_android的博客-CSDN博客_android 高德根据地名获取经纬度
// 通过地址名,调用高德地图接口获取其经纬度
private void getLocation(String addressName){
GeocodeSearch geocodeSearch= null;
try {
geocodeSearch = new GeocodeSearch(this);
} catch (AMapException e) {
e.printStackTrace();
}
final boolean[] success = {true};
assert geocodeSearch != null;
geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
if (i==1000){
try {
GeocodeAddress geocodeAddress = geocodeResult.getGeocodeAddressList().get(0);
double latitude = geocodeAddress.getLatLonPoint().getLatitude();//纬度
double longititude = geocodeAddress.getLatLonPoint().getLongitude();//经度
String adcode= geocodeAddress.getAdcode();//区域编码
Log.e("地理编码", geocodeAddress.getAdcode()+"");
Log.e("纬度",latitude+"");
Log.e("经度",longititude+"");
} catch (Exception e){
Toast.makeText(MainActivity.this,"目的地出错",Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(MainActivity.this,"目的地出错",Toast.LENGTH_SHORT).show();
}
}
});
GeocodeQuery geocodeQuery = new GeocodeQuery(addressName.trim(),"29");
geocodeSearch.getFromLocationNameAsyn(geocodeQuery);
}测试结果:这样的标点方式是很准的,可以满足我们的需求。当找不到这个位置的时候,也会返回错误信息。
// 这个是计算直线距离
double distance = AMapUtils.calculateLineDistance(cur, to); 在onCreate函数种添加
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);p1:搜索不存在地址提示出错误
p2:正确标准搜索位置
p3:3D图标准中心校区(7000米时候闹钟响了,证明直线距离小于7000m)
p4:测试在科研楼附近,到图书馆的距离小于100m,闹钟响了




