在地图上的多个点之间绘制路线

问题描述 投票:0回答:3

我是安卓新手。我想在多个标记之间绘制路线。我a,从服务器获取纬度、经度和日期时间。现在我想显示点之间的路线。我已将它们存储在数组列表中。这是我如何在异步任务 doInBackground() 中获取点。

  newLatt= new ArrayList<String>();
  newLongg= new ArrayList<String>();
  newdatTime= new ArrayList<String>();

  JSONArray arr = new JSONArray(strServerResponse);
  for (int i = 0; i < arr.length(); i++) {
        JSONObject jsonObj1 = arr.getJSONObject(i);
        String status = jsonObj1.optString("status");
        if (status!="false"){
          Pojo pojo = new Pojo();
          String latitude = jsonObj1.optString("Latitude");
          String longitude = jsonObj1.optString("Longitude");
          String date_time = jsonObj1.optString("date_time");
          newLatt.add(latitude);
          newLongg.add(longitude);
          newdatTime.add(date_time);
       }else {
              Handler handler = new Handler(Looper.getMainLooper());
              handler.post(new Runnable() {
              @Override
              public void run() {
                   AlertDialog alertDialog = new AlertDialog.Builder(
                   MapActivity.this).create();
                   alertDialog.setMessage("Locations Not Available");
                   alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int which) {
                   }
                   });
                    alertDialog.show();
                  }
               }
       );
     }

在 postExecute() 方法中我显示标记

        SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        map = supportMapFragment.getMap();
        map.setMyLocationEnabled(true);
        if (newLatt.size()>0){
            for (int i = 0; i < newLatt.size(); i++) {
                Double lati = Double.parseDouble(newLatt.get(i));
                Double longi = Double.parseDouble(newLongg.get(i));
                String dattme = newdatTime.get(i);
                dest = new LatLng(lati, longi);
                if (map != null) {
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(dest);
                    map.moveCamera(CameraUpdateFactory.newLatLng(dest));
                    map.animateCamera(CameraUpdateFactory.zoomTo(15));

                    markerOptions.icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_RED));
                    markerOptions.title("" + dattme);
                    map.addMarker(markerOptions);
                    map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                        @Override
                        public boolean onMarkerClick(Marker marker) {
                            marker.showInfoWindow();
                            return false;
                        }
                    });

更新

 PolylineOptions rectOptions = new PolylineOptions();
        //this is the color of route
        rectOptions.color(Color.argb(255, 85, 166, 27));
        LatLng startLatLng = null;
        LatLng endLatLng = null;
        SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        map = supportMapFragment.getMap();
        map.setMyLocationEnabled(true);
        if (newLatt.size()>0){
            for (int i = 0; i < newLatt.size(); i++) {
                Double lati = Double.parseDouble(newLatt.get(i));
                Double longi = Double.parseDouble(newLongg.get(i));
                String dattme = newdatTime.get(i);
                dest = new LatLng(lati, longi);
                if (map != null) {
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(dest);
                    map.moveCamera(CameraUpdateFactory.newLatLng(dest));
                    map.animateCamera(CameraUpdateFactory.zoomTo(15));

                    markerOptions.icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_RED));
                    markerOptions.title("" + dattme);
                    map.addMarker(markerOptions);
                    map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                        @Override
                        public boolean onMarkerClick(Marker marker) {
                            marker.showInfoWindow();
                            return false;
                        }
                    });

                        LatLng latlng = new LatLng(lati,
                                longi);
                        if (i == 0) {
                            startLatLng = latlng;
                        }
                        if (i == newLatt.size() - 1) {
                            endLatLng = latlng;
                        }
                        rectOptions.add(latlng);
                    String url = getDirectionsUrl(startLatLng, endLatLng);
                    DownloadTask downloadTask = new DownloadTask();
                    downloadTask.execute(url);
                }

            }
            map.addPolyline(rectOptions);

获取路线:

    private String getDirectionsUrl(LatLng origin, LatLng dest) {
    // Origin of route
    String str_origin = "origin=" + origin.latitude + ","
            + origin.longitude;

    // Destination of route
    String str_dest = "destination=" + dest.latitude + "," + dest.longitude;

    // Sensor enabled
    String sensor = "sensor=false";

    // Building the parameters to the web service
    String parameters = str_origin + "&" + str_dest + "&" + sensor;

    // Output format
    String output = "json";

    // Building the url to the web service
    String url = "https://maps.googleapis.com/maps/api/directions/"
            + output + "?" + parameters;

    return url;
}
android google-maps directions
3个回答
2
投票

在 postExecute 中添加以下代码以在地图上添加折线。

                PolylineOptions rectOptions = new PolylineOptions();
                //this is the color of route
                rectOptions.color(Color.argb(255, 85, 166, 27));

                LatLng startLatLng = null;
                LatLng endLatLng = null;
                for (int i = 0; i < newLatt.size(); i++) {
                Double lati = Double.parseDouble(newLatt.get(i));
                Double longi = Double.parseDouble(newLongg.get(i));
                    LatLng latlng = new LatLng(lati,
                            longi);
                    if (i == 0) {
                        startLatLng = latlng;
                    }
                    if (i == jArr.length() - 1) {
                        endLatLng = latlng;
                    }
                    rectOptions.add(latlng);
                }
                map.addPolyline(rectOptions);

快乐编码...


0
投票
Android does not provide embedded direction service in google map api. To draw route between points you must use google direction services REST API .
You can get complete code and description from http://wptrafficanalyzer.in/blog/drawing-driving-route-directions-between-two-locations-using-google-directions-in-google-map-android-api-v2/


ArrayList<LatLng> points = null;
            PolylineOptions lineOptions = null;
            MarkerOptions markerOptions = new MarkerOptions();

            // Traversing through all the routes
            for(int i=0;i<result.size();i++){
                points = new ArrayList<LatLng>();
                lineOptions = new PolylineOptions();

                // Fetching i-th route
                List<HashMap<String, String>> path = result.get(i);

                // Fetching all the points in i-th route
                for(int j=0;j<path.size();j++){
                    HashMap<String,String> point = path.get(j);

                    double lat = Double.parseDouble(point.get("lat"));
                    double lng = Double.parseDouble(point.get("lng"));
                    LatLng position = new LatLng(lat, lng);

                    points.add(position);
                }

                // Adding all the points in the route to LineOptions
                lineOptions.addAll(points);
                lineOptions.width(2);
                lineOptions.color(Color.RED);
            }

            // Drawing polyline in the Google Map for the i-th route
            map.addPolyline(lineOptions);

0
投票

如果有人像我一样登陆这里,事实证明您可以使用 Google 地图库,使用 PolyUtil 类方便地在地图上绘制路线。

简短版本

添加谷歌地图库 - 'com.google.maps:google-maps-services:0.1.20'

那么,

val directionResponse = apiInterface.getDirection(fromLatLng, toLatLng)
val decodedPaths = PolyUtil.decode(directionResponse.routes.overviewPolyline.points)
map?.addPolyline(PolylineOptions().addAll(decodedPaths))

长版

首先,在 build.gradle 文件中添加库

implementation 'com.google.maps:google-maps-services:0.1.20'

其次,对方向 url 端点进行 api 调用 - https://maps.googleapis.com/maps/api/directions/json?query

响应有一个属性routes->overview_polyline->points

第三,将点字段中的值从谷歌地图服务方法传递给实用程序方法,

val decodedPaths = PolyUtil.decode(points)

最后在你的地图上,像这样添加它

map?.addPolyline(PolylineOptions().addAll(decodedPaths))

这将在地图上绘制路径。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.