继续上次截图的工具类
本章包含的内容有,
1.移动指定的经纬度到中心点
2.将坐标收藏到收藏夹
3.移动点的斜率、角度、距离(官方)
4.进行轨迹移动
/**
* 百度地图工具类
* Created by kowal on 2016/12/8.
*/
public class BaiduMapUtils
{
/**
* 将地图移动到一个经纬度位置
* @param latlng
*/
public static void moveToLatlng(BaiduMap mBaiduMap, LatLng latlng , float ZOOM_LEVEL)
{
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(latlng).zoom(ZOOM_LEVEL);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
/**
* 将坐标收藏到收藏夹
* @param poiName 收藏点的名
* @param latitude 坐标
* @param longitude
* @return
*/
public static String favoMarker(Context context,String poiName, double latitude, double longitude )
{
FavoritePoiInfo info = new FavoritePoiInfo();
info.poiName(poiName );
LatLng pt = new LatLng(latitude, longitude);
info.pt(pt);
if (FavoriteManager.getInstance().add(info) == 1)
{
return context.getString(R.string.favo_succ);
} else
{
return context.getString(R.string.favo_failed);
}
}
}
/**
* 进行轨迹移动
*
* @param mMoveMarker 指定的marker
* @param mv_mapview 当前使用的mapview控件
* @param mHandler 执行的线程,使用mHandler = new Handler(Looper.getMainLooper());初始化
* @param latlngs 从服务器获取的数组,例如:
* private static final LatLng[] latlngs = new LatLng[]
* {
* new LatLng(39.95853, 116.103013),
* new LatLng(39.938506, 116.139808),
* new LatLng(39.931425, 116.167978),
* };
*/
public static void moveLooper(final Marker mMoveMarker,
final MapView mv_mapview, final Handler mHandler, final LatLng[] latlngs)
{
new Thread()
{
public void run()
{
SystemClock.sleep(2000);
for (int i = 0; i < latlngs.length - 1; i++)
{
final LatLng startPoint = latlngs[i];
final LatLng endPoint = latlngs[i + 1];
mMoveMarker
.setPosition(startPoint);
mHandler.post(new Runnable()
{
@Override
public void run()
{
// refresh marker's rotate
if (mv_mapview == null)
{
return;
}
mMoveMarker.setRotate((float) getAngle(startPoint,
endPoint));
}
});
double slope = getSlope(startPoint, endPoint);
// 是不是正向的标示
boolean isReverse = (startPoint.latitude > endPoint.latitude);
double intercept = getInterception(slope, startPoint);
double xMoveDistance = isReverse ? getXMoveDistance(slope) :
-1 * getXMoveDistance(slope);
for (double j = startPoint.latitude; !((j > endPoint.latitude) ^ isReverse);
j = j - xMoveDistance)
{
LatLng latLng = null;
if (slope == Double.MAX_VALUE)
{
latLng = new LatLng(j, startPoint.longitude);
} else
{
latLng = new LatLng(j, (j - intercept) / slope);
}
final LatLng finalLatLng = latLng;
mHandler.post(new Runnable()
{
@Override
public void run()
{
if (mv_mapview == null)
{
return;
}
mMoveMarker.setPosition(finalLatLng);
}
});
try
{
Thread.sleep(TIME_INTERVAL);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}.start();
}
对于使用方法我简单写个例子:
移动点:
这个比较简单,mBaiduMap 要求传入地图对象,latlng 给定的经纬度,ZOOM_LEVEL 放大级别, 例:
moveToLatlng(mBaiduMap, latLng, 15);
点收藏:
String favoResult = BaiduMapUtils.favoMarker(activity, getAddress(), mFavoLatlng.latitude, mFavoLatlng.longitude);
showToast(favoResult);
其中,getAddress()是String类型,是收藏点的名称(不是ID),比如xxx街道xx号,这个可以利用百度API获取,也可以自己设置,根据自己需求改,mFavoLatlng.latitude, mFavoLatlng.longitude是两个坐标点,一个经度一个维度,最后返回的是String类型,成功与失败,失败的原因基本上只有一个,那就是getAddress()得到的收藏点名称与已保存的收藏点名称有冲突,所以请确保收藏点名称唯一。
有很多人对轨迹回放有需求但是无从下手,这里工具类已经给出了,我们直接使用就可以了,首先解释一下传入的参数:
mMoveMarker 指定的marker
mv_mapview 当前使用的mapview控件
mHandler 执行的线程,使用mHandler = new Handler(Looper.getMainLooper());初始化
latlngs 从服务器获取的数组,例如:
private static final LatLng[] latlngs = new LatLng[]
{
new LatLng(39.95853, 116.103013),
new LatLng(39.938506, 116.139808),
new LatLng(39.931425, 116.167978),
};
由于我自己写的项目在跳转Activity的时候会黑屏大概2秒,所以写了一个休眠
SystemClock.sleep(2000);
可删
目前已经有官方的轨迹移动了,放上封装的代码
public static void moveLooper(final Marker mMoveMarker,
final MapView mv_mapview, final Handler mHandler, final LatLng[] latlngs)
{
new Thread()
{
public void run()
{
SystemClock.sleep(2000);
for (int i = 0; i < latlngs.length - 1; i++) // 遍历坐标
{
final LatLng startPoint = latlngs[i]; // 得到坐标开始的位置,结束的位置
final LatLng endPoint = latlngs[i + 1];
mMoveMarker
.setPosition(startPoint); // 将marker设置在当前坐标
mHandler.post(new Runnable()
{
@Override
public void run()
{
if (mv_mapview == null)
{
return;
}
mMoveMarker.setRotate((float) getAngle(startPoint,
endPoint)); // 根据坐标计算斜率
}
});
double slope = getSlope(startPoint, endPoint);
// 是不是正向的标示
boolean isReverse = (startPoint.latitude > endPoint.latitude);
double intercept = getInterception(slope, startPoint);
double xMoveDistance = isReverse ? getXMoveDistance(slope) :
-1 * getXMoveDistance(slope);
for (double j = startPoint.latitude; !((j > endPoint.latitude) ^ isReverse);
j = j - xMoveDistance)
{
LatLng latLng = null;
if (slope == Double.MAX_VALUE)
{
latLng = new LatLng(j, startPoint.longitude);
} else
{
latLng = new LatLng(j, (j - intercept) / slope);
}
final LatLng finalLatLng = latLng;
mHandler.post(new Runnable()
{
@Override
public void run()
{
if (mv_mapview == null)
{
return;
}
mMoveMarker.setPosition(finalLatLng);
}
});
try
{
Thread.sleep(TIME_INTERVAL);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}.start();
}
继续更新中。。。下载地址
http://download.youkuaiyun.com/detail/u012552275/9706959