【问题标题】:Android Google Maps directions and road path inside appAndroid Google Maps 方向和应用程序内的道路路径
【发布时间】:2012-06-13 10:08:23
【问题描述】:

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

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

提前考虑。

【问题讨论】:

    标签: android google-maps


    【解决方案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 开发者网站和 stack-overflow 上搜索。

    祝你发展顺利!

    【讨论】:

    • 我已经有了地图和标记...我只需要一种显示路径的方法。我也在stackoverflow上搜索过,唯一的答案是在点之间画一条线,不考虑道路等。你给的那个链接,我以前也看过。关于它的事情是它调用谷歌地图url..我想知道是否有一些“干净”的方法可以做到这一点,而不需要处理 XML 和请求......
    【解决方案2】:

    我已经完成了步行和驾车路线,并在地图上绘制了路径。 为此,我使用 2 个位置。 1)当前位置 lat 和 lon 2)用户单击标记以显示点 1 和 2 之间的路径。 为此,您只需要获得点击标记点的经纬度,我的代码就很有用。

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

    }

    如果您需要任何其他代码,请告诉我..

    【讨论】:

      【解决方案3】:

      KML 输出在谷歌地图上不再工作。 您必须使用路线 API 从谷歌获取路线。

      http://maps.googleapis.com/maps/api/directions/xml?origin={lat_lon_origin}&destination={lat_lon_dest}&ie=UTF8&oe=UTF8&0&om=0&sensor=false

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

      Google Maps API Version difference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 2012-10-19
        相关资源
        最近更新 更多