8

そうです、私は現在、アプリでGoogle Directions APIを使用して、2つの場所の間のルートを取得しています。

ルートルートのリクエストを送信すると、ルートに沿ったすべての道路の名前、対応する始点と終点の緯度経度座標、ポリライン値など、ルートに関する多くの詳細がJSONで取得されます。

例:リクエストhttp://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=falseを2つの道路間で送信すると、次のJSON応答(ルートに沿った1つの道路の出力)。

 {
                     "distance" : {
                        "text" : "0.2 km",
                        "value" : 203
                     },
                     "duration" : {
                        "text" : "1 min",
                        "value" : 18
                     },
                     "end_location" : {
                        "lat" : 53.435250,
                        "lng" : -6.132140000000001
                     },
                     "html_instructions" : "Head \u003cb\u003eeast\u003c/b\u003e on \u003cb\u003eRedfern Ave.\u003c/b\u003e toward \u003cb\u003eMartello Court\u003c/b\u003e",
                     **"polyline" : {
                        "points" : "woceIvgmd@O}DOkDQqF"**
                     },

これまでのところ、私のアプリケーションはこの情報を解析し、次のようなリストビューに道路と方向をリストします。

ここに画像の説明を入力してください

私がやりたいことは、地図上でAからBまでのルート全体を強調することですが、新しいGoogle MapsAPIv2でこれを行う方法についてオンラインで役立つものは何も見つかりませんでした。Google Maps v2で線を描くためにオーバーレイの代わりにポリラインが使用されているのがわかりますが、私が知る限り、ポリラインは直線しか描いていないので、私には役に立ちません。とにかく、私が自由に使える情報(道路名、始点と終点の緯度経度の座標、ポリラインポイント)を使用してルートを強調表示する方法はありますか?助けていただければ幸いです。

また、応答には有用な「ポリライン」値があることがわかりますが、このビットの情報を解析または使用する方法を理解できません。ポリラインをプロットするためにこの値を理解する方法を知っている人はいますか?

**"polyline" : {
             "points" : "woceIvgmd@O}DOkDQqF"**

編集:私のソリューションコードは、以下の私の答えに記載されています。

4

3 に答える 3

36

試行錯誤の末、ようやく動作するようになりました!これで、マップ上のAからBへの指定されたルートが完全に強調表示されます(下のスクリーンショットを参照)。また、将来必要になる可能性のある人のためにコードを投入しました。

ここに画像の説明を入力してください

public class PolyMap extends Activity {
        ProgressDialog pDialog;
        GoogleMap map;
        List<LatLng> polyz;
        JSONArray array;
        static final LatLng DUBLIN = new LatLng(53.344103999999990000,
                -6.267493699999932000);

        @SuppressLint("NewApi")
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.map_layout);
            map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(DUBLIN, 15));
            map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
            new GetDirection().execute();
        }

        class GetDirection extends AsyncTask<String, String, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(PolyMap.this);
                pDialog.setMessage("Loading route. Please wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }

            protected String doInBackground(String... args) {
                Intent i = getIntent();
                String startLocation = i.getStringExtra("startLoc");
                String endLocation = i.getStringExtra("endLoc");
                            startLocation = startLocation.replace(" ", "+");
                    endLocation = endLocation.replace(" ", "+");;
                String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + startLocation + ",+dublin&destination=" + endLocation + ",+dublin&sensor=false";
                StringBuilder response = new StringBuilder();
                try {
                    URL url = new URL(stringUrl);
                    HttpURLConnection httpconn = (HttpURLConnection) url
                            .openConnection();
                    if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        BufferedReader input = new BufferedReader(
                                new InputStreamReader(httpconn.getInputStream()),
                                8192);
                        String strLine = null;

                        while ((strLine = input.readLine()) != null) {
                            response.append(strLine);
                        }
                        input.close();
                    }

                    String jsonOutput = response.toString();

                    JSONObject jsonObject = new JSONObject(jsonOutput);

                    // routesArray contains ALL routes
                    JSONArray routesArray = jsonObject.getJSONArray("routes");
                    // Grab the first route
                    JSONObject route = routesArray.getJSONObject(0);

                    JSONObject poly = route.getJSONObject("overview_polyline");
                    String polyline = poly.getString("points");
                    polyz = decodePoly(polyline);

                } catch (Exception e) {

                }

                return null;

            }

            protected void onPostExecute(String file_url) {

                for (int i = 0; i < polyz.size() - 1; i++) {
                    LatLng src = polyz.get(i);
                    LatLng dest = polyz.get(i + 1);
                    Polyline line = map.addPolyline(new PolylineOptions()
                            .add(new LatLng(src.latitude, src.longitude),
                                    new LatLng(dest.latitude,                dest.longitude))
                            .width(2).color(Color.RED).geodesic(true));

                }
                pDialog.dismiss();

            }
        }

        /* Method to decode polyline points */
        private List<LatLng> decodePoly(String encoded) {

            List<LatLng> poly = new ArrayList<LatLng>();
            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;

                LatLng p = new LatLng((((double) lat / 1E5)),
                        (((double) lng / 1E5)));
                poly.add(p);
            }

            return poly;
        }
    }
于 2013-02-08T03:42:59.297 に答える
3

Androidマップapi2では、実際にPolylineクラスを使用してマップ上にルートを描画する必要があります(少なくともこれが最も簡単な方法です:))。あなたがする必要があること-あなたのルートに沿ったポイントのリストを提供することです。

Polylineアクティブなルートを強調表示することに関しては-クラスには便利なインターフェイスがあるsetColorので、アクティブなルート(アルファチャネルを含む)に好きな色を設定できます

Polyline line1 = map.addPolyline(new PolylineOptions()
 .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
 .width(5)
 .color(0xFFFF0000)); //non transparent red

Polyline line2 = map.addPolyline(new PolylineOptions()
 .add(new LatLng(51.5, -0.1), new LatLng(40.8, -74.2))
 .width(5)
 .color(0x7F0000FF)); //semi-transparent blue

ポリラインの色はいつでも自由に変更できることに注意してください(ユーザークリックのfiなど)

グーグルからのJSON応答に関しては-ルートポイントはエンコードされているので、この質問を参照してデコードする方法を理解することができます

于 2013-02-07T21:05:58.667 に答える
2

簡単な解決策があります

ライブラリを追加する

'com.google.maps.android:android-maps-utils:0.4+'をコンパイルします

https://developers.google.com/maps/documentation/android-api/utility/setupからの参照

//Getting the points String from response of NavigationAPI call
String polyz=routeSteps.get(0).getOverview_polyline().getPoints();
//Decoding the LatLng Points using PolyUtil Class used from above Library
List<LatLng> points=PolyUtil.decode(polyz);
polyline.addAll(points);
googleMap.addPolyline(polyline);
于 2016-07-05T07:07:53.103 に答える