1

似乎DrivingDirections自 Android API 1.0 以来已被删除

现在在 Android 1.6 中显示包含两个点的地图(其中一个可能是当前位置,但也可以是任何其他位置)以及从一个点到另一个点的方向的方式是什么?

4

5 回答 5

4

如果您只需要与线连接的点,则不需要完整的 kml。一种更快的方法是使用从 Google Maps API 返回的 JSON 和 output=dragdir

private String getUrl(String start, String end) {
    //If params GeoPoint convert to lat,long string here
    StringBuffer urlString = new StringBuffer();
    urlString.append("http://maps.google.com/maps?f=d&hl=en");
    urlString.append("&saddr=");// from
    urlString.append(start);
    urlString.append("&daddr=");// to
    urlString.append(end);
    urlString.append("&ie=UTF8&0&om=0&output=dragdir"); //DRAGDIR RETURNS JSON
    Log.i("URLString", urlString.toString());
    return urlString.toString();
}

这个 urlString 可以用来获取一个 JSON 文件,你可以使用 String 的 split() 轻松提取信息

private String getConnection(String url) {
    URL inUrl = new URL(url);
    URLConnection yc = inUrl.openConnection();
    BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream()));
    String inputLine;
    String encoded = "";
    while ((inputLine = in.readLine()) != null)
        encoded = encoded.concat(inputLine);
    in.close();
    String polyline = encoded.split("points:")[1].split(",")[0];
    polyline = polyline.replace("\"", "");
    polyline = polyline.replace("\\\\", "\\");
    return polyline;
}

返回的字符串是一条折线,可以使用以下方法将其解码为地理点列表。

private static ArrayList<GeoPoint> decodePolyline(String encoded) {
    ArrayList<GeoPoint> geopoints = new ArrayList<GeoPoint>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;
    while (index < len) {
        int b, shift = 0, result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
        geopoints.add(p);
    }
 return geopoints;
}

最后一步是将这些点绘制到 mapView,因为我们需要一个覆盖项来处理 GeoPoints 的 ArrayList。

public class PathOverlay extends Overlay {

    private ArrayList<GeoPoint> pointList;

    public PathOverlay(ArrayList<GeoPoint> pointList) {
            this.pointList = pointList;     
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        Point current = new Point();
        Path path = new Path();
        Projection projection = mapView.getProjection();
        Iterator<GeoPoint> iterator = pointList.iterator();
        if (iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.moveTo((float) current.x, (float) current.y);
        } else return;
        while(iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.lineTo((float) current.x, (float) current.y);
        }

        Paint pathPaint = new Paint();
        pathPaint.setAntiAlias(true);
        pathPaint.setStrokeWidth(3.0f);
        pathPaint.setColor(Color.GREEN);
        pathPaint.setStyle(Style.STROKE);
        canvas.drawPath(path, pathPaint);
    }
}

如果您不确定某些中间步骤,例如如何将叠加层放到 MapView 上或如何设置路由器类,请告诉我,我可以将完整代码发送给您。

于 2011-11-10T19:03:05.190 回答
2

我怀疑答案是从 TeleNav 或其他人那里注册价值数百万美元的许可证。

API 被撤下的原因是因为谷歌本身对它可以做的驾驶方向有限制(例如,不能做实时的转弯的东西),因为谷歌从 TeleNav 或其他公司获得了这些数据的许可。反过来,谷歌不能让开发人员做那些受限制的事情,而且在这种情况下,开放的 API 也不能得到充分的保护。

我想我看到提到 Open Street Map 有行车路线,FWIW。

于 2009-10-23T15:14:52.333 回答
2

这可能有点太晚了,但仍然对其他人有帮助。我已经编写了一些简单的类来在 MapView for Android 中获取和显示行车路线:

http://home.ameliemedia.com/android-app-aroundme/#tips

希望能帮助到你!

安德里亚。

于 2009-12-02T17:21:21.930 回答
0

另请参阅J2ME/Android/BlackBerry - 行车路线、两个地点之间的路线

于 2010-01-09T08:17:05.843 回答
0

Google 目前的解决方案是使用Google Maps API Web Services。有限使用免费;您需要为(成功的)商业用途付费。

于 2011-09-16T18:18:54.287 回答