应用程序内的Android谷歌地图方向和道路路径

时间:2012-06-09 20:12:03

标签: android google-maps

我正在寻找几个小时,我似乎无法达成任何解决方案。 我正在开发一个在地图中显示一些参考点的应用程序。我想绘制这些点之间的道路,并显示我的应用程序内的相应方向。我不想启动谷歌地图应用程序来显示那些信息。

这可能吗?如果是的话,你能指出一些教程吗?

事先说。

3 个答案:

答案 0 :(得分:3)

KML输出在Google地图上不再有效。 您必须使用路线api从谷歌获取路线。

http://maps.googleapis.com/maps/api/directions/xml?origin= {lat_lon_origin}&安培;目的地= {lat_lon_dest}&安培,即= UTF8&安培; OE = UTF8&安培0安培; OM = 0&安培;传感器=假

有关信息,请参阅此帖子:

Google Maps API Version difference

答案 1 :(得分:1)

当然这是可能的。网上有足够的关于此的教程。 一个搜索请求给出了以下结果:

在Android开发者网站上查看API演示:

http://developer.android.com/resources/tutorials/views/hello-mapview.html

是实现MapView的起点。

在这个堆栈溢出线程中,您可以在地图上找到关于绘制路线的问题的答案:

How to display a route between two geocoords in google maps?

提示:在提出问题之前先在Android开发者网站上搜索并在堆栈溢出上搜索。

有很好的发展!

答案 2 :(得分:0)

我已经在地图上用绘图路径完成了行走和行车路线。 为此,我使用2个位置。 1)当前位置lat和lon 2)用户点击标记以显示点1和2之间的路径。 为此你只需要获得lat和长点击标记点,而不是我的代码是有用的。

    drawPath(Utils.ConvertToFloat(kiosk.Lat),
    Utils.ConvertToFloat(kiosk.Lon), true);

功能是:

private void drawPath(final double lat, final double lon,
        final boolean isWalking) {
    new Thread() {
        @Override
        public void run() {
            double fromLat = 0, fromLon = 0, toLat, toLon;
            if (curLocation != null) {
                fromLat = curLocation.getLatitude();
                fromLon = curLocation.getLongitude();
            }
            toLat = lat;
            toLon = lon;
            // For Testing
            // fromLat = 36.00;
            // fromLon = -115.16116333007813;
            String url = RoadProvider.getUrl(fromLat, fromLon, toLat,
                    toLon, isWalking);
            InputStream is = getConnection(url);
            mRoad = RoadProvider.getRoute(is);
            mHandler.sendEmptyMessage(0);
        }
    }.start();
}
   Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {

        MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        ArrayList<Overlay> objs = new ArrayList<Overlay>();

        for (Overlay o : listOfOverlays) {
            if (o instanceof MapOverlay) {
                objs.add(o);
            }
        }
        for (Overlay overlay : objs) {
            listOfOverlays.remove(overlay);
        }
        // listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);
        mapView.invalidate();
    };
};

这里是绘制路径的地方::

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(13);
        }
    }

    @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);
        if (mPoints != null && mPoints.size() > 0) {

            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;
            }
        }
    }
}

您需要在相同或不同的包中使用这3个文件。

point.java

public class Point {
String mName;
String mDescription;
String mIconUrl;
double mLatitude;
double mLongitude;

}

Road.java

public class Road {
public String mName;
public String mDescription;
public int mColor;
public int mWidth;
public double[][] mRoute = new double[][] {};
public Point[] mPoints = new Point[] {};

}

RoadProvider.java

  public class RoadProvider {

    public static Road getRoute(InputStream is) {
            KMLHandler handler = new KMLHandler();
            try {
                    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
                    parser.parse(is, handler);
            } catch (ParserConfigurationException e) {
                    e.printStackTrace();
            } catch (SAXException e) {
                    e.printStackTrace();
            } catch (IOException e) {
                    e.printStackTrace();
            }
            return handler.mRoad;
    }

    public static String getUrl(double fromLat, double fromLon, double toLat,
                    double toLon, boolean isWalking) {// connect to map web service
            StringBuffer urlString = new StringBuffer();
            urlString.append("http://maps.google.com/maps?f=d&hl=en");
            urlString.append("&saddr=");// from
            urlString.append(Double.toString(fromLat));
            urlString.append(",");
            urlString.append(Double.toString(fromLon));
            urlString.append("&daddr=");// to
            urlString.append(Double.toString(toLat));
            urlString.append(",");
            urlString.append(Double.toString(toLon));
            urlString.append("&ie=UTF8&0&om=0&output=kml");
            if(isWalking){
                urlString.append("&dirflg=w");
            }
            Utils.LogInfo(urlString.toString());
            return urlString.toString();
    }
    }

    class KMLHandler extends DefaultHandler {
    Road mRoad;
    boolean isPlacemark;
    boolean isRoute;
    boolean isItemIcon;
    private Stack mCurrentElement = new Stack();
    private String mString;

    public KMLHandler() {
            mRoad = new Road();
    }

    public void startElement(String uri, String localName, String name,
                    Attributes attributes) throws SAXException {
            mCurrentElement.push(localName);
            if (localName.equalsIgnoreCase("Placemark")) {
                    isPlacemark = true;
                    mRoad.mPoints = addPoint(mRoad.mPoints);
            } else if (localName.equalsIgnoreCase("ItemIcon")) {
                    if (isPlacemark)
                            isItemIcon = true;
            }
            mString = new String();
    }

    public void characters(char[] ch, int start, int length)
                    throws SAXException {
            String chars = new String(ch, start, length).trim();
            mString = mString.concat(chars);
    }

    public void endElement(String uri, String localName, String name)
                    throws SAXException {
            if (mString.length() > 0) {
                    if (localName.equalsIgnoreCase("name")) {
                            if (isPlacemark) {
                                    isRoute = mString.equalsIgnoreCase("Route");
                                    if (!isRoute) {
                                            mRoad.mPoints[mRoad.mPoints.length - 1].mName = mString;
                                    }
                            } else {
                                    mRoad.mName = mString;
                            }
                    } else if (localName.equalsIgnoreCase("color") && !isPlacemark) {
                            mRoad.mColor = Integer.parseInt(mString, 16);
                    } else if (localName.equalsIgnoreCase("width") && !isPlacemark) {
                            mRoad.mWidth = Integer.parseInt(mString);
                    } else if (localName.equalsIgnoreCase("description")) {
                            if (isPlacemark) {
                                    String description = cleanup(mString);
                                    if (!isRoute)
                                            mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description;
                                    else
                                            mRoad.mDescription = description;
                            }
                    } else if (localName.equalsIgnoreCase("href")) {
                            if (isItemIcon) {
                                    mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString;
                            }
                    } else if (localName.equalsIgnoreCase("coordinates")) {
                            if (isPlacemark) {
                                    if (!isRoute) {
                                            String[] xyParsed = split(mString, ",");
                                            double lon = Double.parseDouble(xyParsed[0]);
                                            double lat = Double.parseDouble(xyParsed[1]);
                                            mRoad.mPoints[mRoad.mPoints.length - 1].mLatitude = lat;
                                            mRoad.mPoints[mRoad.mPoints.length - 1].mLongitude = lon;
                                    } else {
                                            String[] coodrinatesParsed = split(mString, " ");
                                            int lenNew = coodrinatesParsed.length;
                                            int lenOld = mRoad.mRoute.length;
                                            double[][] temp = new double[lenOld + lenNew][2];
                                            for (int i = 0; i < lenOld; i++) {
                                                    temp[i] = mRoad.mRoute[i];
                                            }
                                            for (int i = 0; i < lenNew; i++) {
                                                    String[] xyParsed = split(coodrinatesParsed[i], ",");
                                                    for (int j = 0; j < 2 && j < xyParsed.length; j++)
                                                            temp[lenOld + i][j] = Double
                                                                            .parseDouble(xyParsed[j]);
                                            }
                                            mRoad.mRoute = temp;
                                    }
                            }
                    }
            }
            mCurrentElement.pop();
            if (localName.equalsIgnoreCase("Placemark")) {
                    isPlacemark = false;
                    if (isRoute)
                            isRoute = false;
            } else if (localName.equalsIgnoreCase("ItemIcon")) {
                    if (isItemIcon)
                            isItemIcon = false;
            }
    }

    private String cleanup(String value) {
            String remove = "<br/>";
            int index = value.indexOf(remove);
            if (index != -1)
                    value = value.substring(0, index);
            remove = "&#160;";
            index = value.indexOf(remove);
            int len = remove.length();
            while (index != -1) {
                    value = value.substring(0, index).concat(
                                    value.substring(index + len, value.length()));
                    index = value.indexOf(remove);
            }
            return value;
    }

    public Point[] addPoint(Point[] points) {
            Point[] result = new Point[points.length + 1];
            for (int i = 0; i < points.length; i++)
                    result[i] = points[i];
            result[points.length] = new Point();
            return result;
    }

    private static String[] split(String strString, String strDelimiter) {
            String[] strArray;
            int iOccurrences = 0;
            int iIndexOfInnerString = 0;
            int iIndexOfDelimiter = 0;
            int iCounter = 0;
            if (strString == null) {
                    throw new IllegalArgumentException("Input string cannot be null.");
            }
            if (strDelimiter.length() <= 0 || strDelimiter == null) {
                    throw new IllegalArgumentException(
                                    "Delimeter cannot be null or empty.");
            }
            if (strString.startsWith(strDelimiter)) {
                    strString = strString.substring(strDelimiter.length());
            }
            if (!strString.endsWith(strDelimiter)) {
                    strString += strDelimiter;
            }
            while ((iIndexOfDelimiter = strString.indexOf(strDelimiter,
                            iIndexOfInnerString)) != -1) {
                    iOccurrences += 1;
                    iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length();
            }
            strArray = new String[iOccurrences];
            iIndexOfInnerString = 0;
            iIndexOfDelimiter = 0;
            while ((iIndexOfDelimiter = strString.indexOf(strDelimiter,
                            iIndexOfInnerString)) != -1) {
                    strArray[iCounter] = strString.substring(iIndexOfInnerString,
                                    iIndexOfDelimiter);
                    iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length();
                    iCounter += 1;
            }

            return strArray;
    }

}

告诉我你是否还需要其他代码..