百度地图4.1_1开发教程(7)工具类

继续上次截图的工具类	
本章包含的内容有,
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.csdn.net/detail/u012552275/9706959


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值