Как сделать направление из вашего текущего местоположения маркером в Картах Google с помощью Android Studio [duplicate]

Теперь это 2012 год, и у jQuery есть функции добавления и добавления, которые делают именно это, добавляют контент, не влияя на текущий контент. Очень полезно.

0
задан Daniel Nugent 5 July 2016 в 19:00
поделиться

1 ответ

Вы можете сделать это, используя API Google Maps v2 для Android и API веб-сервисов Google Maps Directions

. Для начала работы с Google Maps API, есть еще много хороших ответов. См. здесь для полного рабочего примера простой операции отображения. Обратите внимание, что вам также понадобится получить ключ API, настроенный для работы с вашим проектом.

Что касается использования API веб-сервисов Google Maps Directions, вы должны сначала прочитать документацию. Вы можете использовать ключ API и включить API в своей консоли разработчика, но он по-прежнему работает в настоящее время без использования ключа API.

Вот базовый код, который вам понадобится для использования API Карт Google. чтобы нарисовать полилинию между двумя точками, обратите внимание, что точки, возвращаемые из API, кодируются в кодированной базовой строкой String, которая должна быть расшифрована.

Сначала убедитесь, что ваш проект включает в себя библиотеку Google Maps Utility, который будет использоваться для декодирования полилинии с кодировкой base64:

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.5+'
    //.......
}

Вот AsyncTask, что вы должны дать две точки LatLng при вызове.

Вы бы назвали AsyncTask с двумя объектами LatLng, например между двумя маркерами:

new GetDirectionsAsync().execute(markerOne.getPosition(), markerTwo.getPosition());

Вот код AsyncTask:

class GetDirectionsAsync extends AsyncTask<LatLng, Void, List<LatLng>> {

    JSONParser jsonParser;
    String DIRECTIONS_URL = "https://maps.googleapis.com/maps/api/directions/json";


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected List<LatLng> doInBackground(LatLng... params) {
        LatLng start = params[0];
        LatLng end = params[1];

        HashMap<String, String> points = new HashMap<>();
        points.put("origin", start.latitude + "," + start.longitude);
        points.put("destination", end.latitude + "," + end.longitude);

        jsonParser = new JSONParser();

        JSONObject obj = jsonParser.makeHttpRequest(DIRECTIONS_URL, "GET", points, true);

        if (obj == null) return null;

        try {
            List<LatLng> list = null;

            JSONArray routeArray = obj.getJSONArray("routes");
            JSONObject routes = routeArray.getJSONObject(0);
            JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
            String encodedString = overviewPolylines.getString("points");
            list = PolyUtil.decode(encodedString);

            return list;

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(List<LatLng> pointsList) {

        if (pointsList == null) return;

        if (line != null){
            line.remove();
        }

        PolylineOptions options = new PolylineOptions().width(5).color(Color.MAGENTA).geodesic(true);
        for (int i = 0; i < pointsList.size(); i++) {
            LatLng point = pointsList.get(i);
            options.add(point);
        }
        line = mMap.addPolyline(options);

    }
}

AsyncTask ссылается на некоторые переменные-члены Activity, а именно на Polyline и GoogleMap, определение Activity будет выглядеть так:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback{

    GoogleMap mMap;
    Polyline line;
    //.....

Вот класс JSONParser, используемый в этом примере, обратите внимание, что это модифицированная версия обновлено для android-23, что я написал сообщение в блоге о :

public class JSONParser {

    String charset = "UTF-8";
    HttpURLConnection conn;
    DataOutputStream wr;
    StringBuilder result;
    URL urlObj;
    JSONObject jObj = null;
    StringBuilder sbParams;
    String paramsString;

    public JSONObject makeHttpRequest(String url, String method,
                                      HashMap<String, String> params, boolean encode) {

        sbParams = new StringBuilder();
        int i = 0;
        for (String key : params.keySet()) {
            try {
                if (i != 0){
                    sbParams.append("&");
                }
                if (encode) {
                    sbParams.append(key).append("=")
                            .append(URLEncoder.encode(params.get(key), charset));
                }
                else{
                    sbParams.append(key).append("=")
                            .append(params.get(key));
                }

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            i++;
        }

        if (method.equals("POST")) {
            // request method is POST
            try {
                urlObj = new URL(url);

                conn = (HttpURLConnection) urlObj.openConnection();

                conn.setDoOutput(true);

                conn.setRequestMethod("POST");

                conn.setRequestProperty("Accept-Charset", charset);

                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);

                conn.connect();

                paramsString = sbParams.toString();

                wr = new DataOutputStream(conn.getOutputStream());
                wr.writeBytes(paramsString);
                wr.flush();
                wr.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else if(method.equals("GET")){
            // request method is GET

            if (sbParams.length() != 0) {
                url += "?" + sbParams.toString();
            }

            Log.d("JSONParser", "full GET url: " + url);

            try {
                urlObj = new URL(url);

                conn = (HttpURLConnection) urlObj.openConnection();

                conn.setDoOutput(false);

                conn.setRequestMethod("GET");

                conn.setRequestProperty("Accept-Charset", charset);

                conn.setConnectTimeout(15000);

                conn.connect();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        try {
            //Receive the response from the server
            InputStream in = new BufferedInputStream(conn.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String line;
            result = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

            Log.d("JSON Parser", "result: " + result.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

        conn.disconnect();

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(result.toString());
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON Object
        return jObj;
    }
}

Результат рисования маршрута между двумя маркерами:

2
ответ дан Daniel Nugent 19 August 2018 в 18:41
поделиться
  • 1
    Как добавить третий маркер и продолжить маршрут до третьего маркера? – Andrew Jerome Bernard 18 September 2017 в 07:25
  • 2
    @AndrewJeromeBernard Вы просто добавили бы третий маркер, а затем нарисовали маршрут: new GetDirectionsAsync().execute(markerTwo.getPosition(), markerThree.getPosition()); – Daniel Nugent 18 September 2017 в 17:41
Другие вопросы по тегам:

Похожие вопросы: