AndroidアプリでのGoogleマップのルート

少し前まで、指定された2つのポイント間のルートを地図上に表示するアプリケーションを作成する必要がありました。 ツールとして、Googleのマップが選択されました。 短い検索の後、アプリケーションへのマップの統合ピンのフィルタリング 、およびルートに関する記事が見つかりました。 ただし、Androidアプリケーションでそのようなルートを作成する方法を説明する記事はありませんでした。この省略を修正することにしました(新しく開発されたAndroid開発者にとって便利です)。 habrakatへようこそ。



すでに統合に関する記事を読み、APIキーを取得し、2つのポイントがマークされたマップを使用してアプリケーションを作成したとします。 したがって、これら2つのポイント間のルートを取得するだけです。



ルートを取得する





まず、リクエストを送信し、ルートに関するデータを含むファイルを取得する必要があります。 これを行うには、指定されたリンクで接続を開き(リンクの緯度と経度がコンマで区切られている)、XMLでデータを取得する必要があります。 Documentオブジェクトを作成するために、DOMパーサーによってファイルからウェイポイントを抽出します。



String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr=" + startGeoPoint + "&daddr=" + stopGeoPoint + "&ie=UTF8&0&om=0&output=kml";

Document document = null;

HttpURLConnection urlConnection = null;

URL url = null;

try {

url = new URL(urlString);

urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.connect();

DocumentBuilderFactory documentBuildFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder documentBuilder = documentBuildFactory.newDocumentBuilder();

document = documentBuilder.parse(urlConnection.getInputStream());

} catch (Exception e) { }









KMLのドキュメントに従って、ルートはより小さいセグメントで構成されているため、ルートが通過するポイントの配列を作成する必要があります。 XMLファイルの解析の詳細については、 この記事をご覧ください。 ポイントが「座標」タグの本体にあり、そのタグが「ラインストリング」内にあることは注目に値します。



String points = null;

NodeList nodeList = document.getElementsByTagName("LineString");

points = nodeList.item(0).getFirstChild().getFirstChild().getNodeValue();

String[] finalArray = points.split(" ");









これで、ルートを構築する座標の取得が完了します。 線自体を描くことにします。



オーバーレイルートライン





このクラスはオーバーレイを継承し、(大まかに言って)マップに表示されるグラフィックレベルです。 このクラスでは、線の開始点と終了点を設定するコンストラクターを作成し、この線を描画するdrawメソッドを追加します。



private GeoPoint start;

private GeoPoint stop;

public MapOverlay(GeoPoint start, GeoPoint stop) {

this.start = start;

this.stop = stop;

}



@Override

public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {

// TODO Auto-generated method stub

Projection projection = mapView.getProjection();

if (shadow == false) {

Paint paint = new Paint();

paint.setAntiAlias(true);

Point point = new Point();

projection.toPixels(start, point);

paint.setColor(Color.BLUE);

Point point2 = new Point();

projection.toPixels(stop, point2);

paint.setStrokeWidth(2);

canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, (float) point2.y, paint);

}

return super.draw(canvas, mapView, shadow, when);

}









そして、このレベルにポイントを追加してルートを作成するメソッドを作成する必要があります。



ルート作成





このポイントに到達すると、おそらく、GeoPointでまず緯度を、次に経度を示していることがわかります。



String coords = finalArray[0].split(",");

GeoPoint start = new GeoPoint((int) (Double.parseDouble(coords[1]) * 1E6), (int) (Double.parseDouble(coords[0]) * 1E6));

// , , ,

mapView.getOverlays().add(new MapOverlay(start, start));

GeoPoint geoPoint1;

GeoPoint geoPoint2 = start;

for (int i = 1; i < finalArray.length; i++) {

coords = finalArray[i].split(",");

geoPoint1 = geoPoint2;

geoPoint2 = new GeoPoint((int) (Double.parseDouble(coords[1]) * 1E6), (int) (Double.parseDouble(coords[0]) * 1E6));

mapView.getOverlays().add(new MapOverlay(geoPoint1, geoPoint2));

}

mapView.getOverlays().add(new MapOverlay(geoPoint2, geoPoint2));









これでルートの作成が完了しました。 ご清聴ありがとうございました。 例として、私に起こったことのスクリーンショットを提供します。







PSこれは私の最初の記事です。記事を書く経験はあまりないため、厳密に判断しないでください。コードは言葉と指だけで説明しました。



All Articles