如何显示在Android应用谷歌地图API的路线? [英] How to display route with Google Maps API in Android application?

查看:159
本文介绍了如何显示在Android应用谷歌地图API的路线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白这一点,我无法找到我自己。如何使用谷歌地图API来显示(和更新)两个位置(例如,当前设备位置和目的地)的Andr​​oid应用程序之间的路线?

I don't get it and I can't find it by myself. How to display (and update) a route between two locations (for example, current device location and destination) in Android application using Google Maps API?

推荐答案

下面是链接 <一href="http://$c$c.google.com/p/j2memaprouteprovider/source/browse/#svn/trunk/J2MEMapRouteAndroidEx/src/org/ci/geo/route/android">Click在这里,

package org.ci.geo.route.android;

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    import java.util.List;

    import org.ci.geo.route.Road;
    import org.ci.geo.route.RoadProvider;

    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.Bitmap.Config;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.LinearLayout;
    import android.widget.TextView;

    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapController;
    import com.google.android.maps.MapView;
    import com.google.android.maps.Overlay;

    public class MapRouteActivity extends MapActivity {

            LinearLayout linearLayout;
            MapView mapView;
            private Road mRoad;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                    mapView = (MapView) findViewById(R.id.mapview);
                    mapView.setBuiltInZoomControls(true);

                    new Thread() {
                            @Override
                            public void run() {
                                    double fromLat = 49.85, fromLon = 24.016667, toLat = 50.45, toLon = 30.523333;
                                    String url = RoadProvider
                                                    .getUrl(fromLat, fromLon, toLat, toLon);
                                    InputStream is = getConnection(url);
                                    mRoad = RoadProvider.getRoute(is);
                                    mHandler.sendEmptyMessage(0);
                            }
                    }.start();
            }

            Handler mHandler = new Handler() {
                    public void handleMessage(android.os.Message msg) {
                            TextView textView = (TextView) findViewById(R.id.description);
                            textView.setText(mRoad.mName + " " + mRoad.mDescription);
                            MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
                            List<Overlay> listOfOverlays = mapView.getOverlays();
                            listOfOverlays.clear();
                            listOfOverlays.add(mapOverlay);
                            mapView.invalidate();
                    };
            };

            private InputStream getConnection(String url) {
                    InputStream is = null;
                    try {
                            URLConnection conn = new URL(url).openConnection();
                            is = conn.getInputStream();
                    } catch (MalformedURLException e) {
                            e.printStackTrace();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
                    return is;
            }

            @Override
            protected boolean isRouteDisplayed() {
                    return false;
            }
    }

    class MapOverlay extends com.google.android.maps.Overlay {
            Road mRoad;
            ArrayList<GeoPoint> mPoints;

            public MapOverlay(Road road, MapView mv) {
                    mRoad = road;
                    if (road.mRoute.length > 0) {
                            mPoints = new ArrayList<GeoPoint>();
                            for (int i = 0; i < road.mRoute.length; i++) {
                                    mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000),
                                                    (int) (road.mRoute[i][0] * 1000000)));
                            }
                            int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                            mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                                            .getLatitudeE6()) / 2);
                            int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                            mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                                            .getLongitudeE6()) / 2);
                            GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);

                            MapController mapController = mv.getController();
                            mapController.animateTo(moveTo);
                            mapController.setZoom(7);
                    }
            }

            @Override
            public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                    super.draw(canvas, mv, shadow);
                    drawPath(mv, canvas);
                    return true;
            }

            public void drawPath(MapView mv, Canvas canvas) {
                    int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
                    Paint paint = new Paint();
                    paint.setColor(Color.GREEN);
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setStrokeWidth(3);
                    for (int i = 0; i < mPoints.size(); i++) {
                            Point point = new Point();
                            mv.getProjection().toPixels(mPoints.get(i), point);
                            x2 = point.x;
                            y2 = point.y;
                            if (i > 0) {
                                    canvas.drawLine(x1, y1, x2, y2, paint);
                            }
                            x1 = x2;
                            y1 = y2;
                    }
            }
    }

这篇关于如何显示在Android应用谷歌地图API的路线?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆