DrivingDirections
Android API 1.0以降は削除されているようです
Android 1.6 で 2 つのポイント (そのうちの 1 つは現在の場所である可能性がありますが、他の場所でもかまいません) とある場所から別の場所への方向を含むマップを表示する方法は何ですか?
DrivingDirections
Android API 1.0以降は削除されているようです
Android 1.6 で 2 つのポイント (そのうちの 1 つは現在の場所である可能性がありますが、他の場所でもかまいません) とある場所から別の場所への方向を含むマップを表示する方法は何ですか?
線で接続されたポイントだけが必要な場合は、完全な 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 に描画することです。そのためには、GeoPoint の 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 へのオーバーレイの取得方法やルーター クラスの設定方法など、中間の手順が不明な場合はお知らせください。完全なコードをお送りします。
少し遅すぎるかもしれませんが、それでも他の人にとっては役に立ちます。Android 用の MapView で運転ルートを取得して表示するための簡単なクラスをいくつか作成しました。
http://home.ameliemedia.com/android-app-aroundme/#tips
それが役に立てば幸い!
アンドレア。
その答えは、TeleNav か誰かから数百万ドルのライセンスにサインアップすることだと思います。
API が削除された理由は、Google が TeleNav や他の企業からこのデータのライセンスを取得しているため、Google 自体が運転ルートでできることに制限がある (たとえば、リアルタイムのターンバイターン方式を実行できない) ためです。一方、Google は開発者にこれらの制限された作業を許可することはできず、この場合、オープン API を適切に保護することはできません。
Open Street Map には FWIW という運転ルートがあると書かれているのを見た気がしました。
Google の現在の解決策は、Google Maps API Web サービスを使用することです。制限付きで無料。(成功した)商用利用には料金を支払う必要があります。