Frage

Es scheint, dass DrivingDirections seit Android API 1.0 wurde entfernt

Was ist der Weg nun eine Karte mit zwei Punkten angezeigt werden (einer von ihnen könnte die aktuelle Lage sein, kann aber auch an jedem anderen Ort sein) und die Richtung von einem zum anderen in Android 1.6?

War es hilfreich?

Lösung

Ich vermute, dass die Antwort für eine Multi-Millionen-Dollar-Lizenz von TeleNav oder jemanden um sich zu registrieren ist.

Der Grund für die API gezogen wurde, weil Google selbst Einschränkungen auf, was es mit Wegbeschreibungen tun kann (zum Beispiel kann in Echtzeit nicht Turn-by-Turn-Material), da Google Lizenzen diese Daten von TeleNav oder anderen Firmen. Google, das wiederum kann nicht zulassen, Entwickler diese beschränkte Dinge zu tun, und eine offene API nicht ausreichend für diesen Fall geschützt werden.

Ich dachte, ich sah schon erwähnt, dass Open Street Map Anfahrts hat, FWIW.

Andere Tipps

Wenn Sie nur den Punkt müssen mit einer Leitung verbunden, brauchen Sie nicht die volle kml. Ein viel schneller Weg, es zu tun ist, um nur die JSON API von Google Maps mit Ausgabe zurückgegeben verwenden = 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();
}

Dieses urlString verwendet werden, um eine JSON-Datei zu erhalten, die Sie leicht die Informationen mit String gespaltene extrahieren können ()

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

Die zurückgegebene Zeichenkette wird eine Polylinie, die in eine Liste der Geopoints decodiert werden können, unter Verwendung des Verfahrens.

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

Der letzte Schritt ist, diese Punkte zu einem mapView zu ziehen, für die wir ein Overlay-Element benötigen, die eine Arraylist von GeoPoints behandelt.

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

Wenn Sie nicht sicher sind, über einige der Zwischenschritte, wie zum Beispiel, wie das Overlay auf den MapView erhalten oder wie ein Router-Klasse lassen Sie mich einzurichten wissen, und ich kann Ihnen den vollständigen Code senden.

Es ist vielleicht ein wenig zu spät, aber für andere noch hilfreich. Ich habe ein paar einfache Klassen geschrieben zu erhalten und anzuzeigen Richtungen in MapView für Android Fährt:

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

Hoffe, es hilft!

Andrea.

Die aktuelle Lösung von Google ist zu Google Maps API-Webdienste verwenden . Kostenlos für den begrenzten Einsatz; Sie benötigen für die (erfolgreiche) kommerzielle Nutzung zu zahlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top