Drawing a line/path on Google Maps

后端 未结 13 821
执笔经年
执笔经年 2020-11-22 05:23

I\'ve been busy for a long time finding out how to draw a line between two (GPS) points on the map in HelloMapView but with no luck.

Could anyone please tell me how

相关标签:
13条回答
  • 2020-11-22 05:37

    Thank you for your help. At last I could draw a line on the map. This is how I done it:

    /** Called when the activity is first created. */
    private List<Overlay> mapOverlays;
    
    private Projection projection;  
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        linearLayout = (LinearLayout) findViewById(R.id.zoomview);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
    
        mapOverlays = mapView.getOverlays();        
        projection = mapView.getProjection();
        mapOverlays.add(new MyOverlay());        
    
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
    
    class MyOverlay extends Overlay{
    
        public MyOverlay(){
    
        }   
    
        public void draw(Canvas canvas, MapView mapv, boolean shadow){
            super.draw(canvas, mapv, shadow);
    
            Paint   mPaint = new Paint();
            mPaint.setDither(true);
            mPaint.setColor(Color.RED);
            mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            mPaint.setStrokeWidth(2);
    
            GeoPoint gP1 = new GeoPoint(19240000,-99120000);
            GeoPoint gP2 = new GeoPoint(37423157, -122085008);
    
            Point p1 = new Point();
            Point p2 = new Point();
            Path path = new Path();
    
            Projection projection=mapv.getProjection();
            projection.toPixels(gP1, p1);
            projection.toPixels(gP2, p2);
    
            path.moveTo(p2.x, p2.y);
            path.lineTo(p1.x,p1.y);
    
            canvas.drawPath(path, mPaint);
        }
    
    0 讨论(0)
  • 2020-11-22 05:38

    It is really easy with Google Maps Android API v2

    Just copy the example from Developer documentation

    (of course you have to init your map first)

    GoogleMap map;
     // ... get a map.
     // Add a thin red line from London to New York.
     Polyline line = map.addPolyline(new PolylineOptions()
         .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
         .width(5)
         .color(Color.RED));
    
    0 讨论(0)
  • 2020-11-22 05:39
    // This Activity will draw a line between two selected points on Map
    
    public class MainActivity extends MapActivity {
     MapView myMapView = null;
     MapController myMC = null;
     GeoPoint geoPoint = null;
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
    
    
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      myMapView = (MapView) findViewById(R.id.mapview);
      geoPoint = null;
      myMapView.setSatellite(false);
    
      String pairs[] = getDirectionData("ahmedabad", "vadodara");
      String[] lngLat = pairs[0].split(",");
    
      // STARTING POINT
      GeoPoint startGP = new GeoPoint(
        (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double
          .parseDouble(lngLat[0]) * 1E6));
    
      myMC = myMapView.getController();
      geoPoint = startGP;
      myMC.setCenter(geoPoint);
      myMC.setZoom(15);
      myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
    
      // NAVIGATE THE PATH
    
      GeoPoint gp1;
      GeoPoint gp2 = startGP;
    
      for (int i = 1; i < pairs.length; i++) {
       lngLat = pairs[i].split(",");
       gp1 = gp2;
       // watch out! For GeoPoint, first:latitude, second:longitude
    
       gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),
         (int) (Double.parseDouble(lngLat[0]) * 1E6));
       myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
       Log.d("xxx", "pair:" + pairs[i]);
      }
    
      // END POINT
      myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
    
      myMapView.getController().animateTo(startGP);
      myMapView.setBuiltInZoomControls(true);
      myMapView.displayZoomControls(true);
    
     }
    
     @Override
     protected boolean isRouteDisplayed() {
      // TODO Auto-generated method stub
      return false;
     }
    
     private String[] getDirectionData(String srcPlace, String destPlace) {
    
      String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr="
       + srcPlace + "&daddr=" + destPlace
       + "&ie=UTF8&0&om=0&output=kml";
    
      Log.d("URL", urlString);
      Document doc = null;
      HttpURLConnection urlConnection = null;
      URL url = null;
      String pathConent = "";
    
      try {
    
       url = new URL(urlString.toString());
       urlConnection = (HttpURLConnection) url.openConnection();
       urlConnection.setRequestMethod("GET");
       urlConnection.setDoOutput(true);
       urlConnection.setDoInput(true);
       urlConnection.connect();
       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
       DocumentBuilder db = dbf.newDocumentBuilder();
       doc = db.parse(urlConnection.getInputStream());
    
      } catch (Exception e) {
      }
    
      NodeList nl = doc.getElementsByTagName("LineString");
      for (int s = 0; s < nl.getLength(); s++) {
       Node rootNode = nl.item(s);
       NodeList configItems = rootNode.getChildNodes();
       for (int x = 0; x < configItems.getLength(); x++) {
        Node lineStringNode = configItems.item(x);
        NodeList path = lineStringNode.getChildNodes();
        pathConent = path.item(0).getNodeValue();
       }
      }
      String[] tempContent = pathConent.split(" ");
      return tempContent;
     }
    
    }
    
    
    //*****************************************************************************
    
    DirectionPathOverlay
    
    public class DirectionPathOverlay extends Overlay {
    
        private GeoPoint gp1;
        private GeoPoint gp2;
    
        public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
            this.gp1 = gp1;
            this.gp2 = gp2;
        }
    
        @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(gp1, point);
                paint.setColor(Color.BLUE);
                Point point2 = new Point();
                projection.toPixels(gp2, 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);
        }
    
        @Override
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {
            // TODO Auto-generated method stub
    
            super.draw(canvas, mapView, shadow);
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 05:39

    You can get the projection from the MapView object which is passed into the draw() method: mapv.getProjection().toPixels(gP1, p1);

    0 讨论(0)
  • 2020-11-22 05:43

    This is full source code to draw direction path from source latitude and longitude to destination latitude and longitude. I have changed the above code to fit for latitude and longitude rather than source and destination. So anyone who is accessing his latitude and longitude through his gps can get the direction from his gps device to the destination coordinates.

    Thanks to above answers we could make such a change and get path direction.

    public class DrawMapActivity extends MapActivity {
         MapView myMapView = null;
         MapController myMC = null;
         GeoPoint geoPoint = null;
         @Override
         public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          setContentView(R.layout.main);
          myMapView = (MapView) findViewById(R.id.mapview);
    
          geoPoint = null;
          myMapView.setSatellite(false);
          double fromLat = 12.303534;
          double fromLong = 76.64611;
          double toLat = 12.9715987;
          double toLong = 77.5945627;
    
          String sourceLat = Double.toString(fromLat);
          String sourceLong = Double.toString(fromLong);
          String destinationLat = Double.toString(toLat);
          String destinationLong = Double.toString(toLong);
    
          String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong );
          String[] lngLat = pairs[0].split(",");
    
          // STARTING POINT
          GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
    
          myMC = myMapView.getController();
          geoPoint = startGP;
          myMC.setCenter(geoPoint);
          myMC.setZoom(10);
          myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
    
          // NAVIGATE THE PATH
    
          GeoPoint gp1;
          GeoPoint gp2 = startGP;
    
          for (int i = 1; i < pairs.length; i++) {
           lngLat = pairs[i].split(",");
           gp1 = gp2;
           // watch out! For GeoPoint, first:latitude, second:longitude
    
           gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6));
           myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
           Log.d("xxx", "pair:" + pairs[i]);
          }
    
          // END POINT
          myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
    
          myMapView.getController().animateTo(startGP);
          myMapView.setBuiltInZoomControls(true);
          myMapView.displayZoomControls(true);
    
         }
    
         @Override
         protected boolean isRouteDisplayed() {
          // TODO Auto-generated method stub
          return false;
         }
    
         private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) {
    
    
          String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml";
          Log.d("URL", urlString);
          Document doc = null;
          HttpURLConnection urlConnection = null;
          URL url = null;
          String pathConent = "";
    
          try {
    
           url = new URL(urlString.toString());
           urlConnection = (HttpURLConnection) url.openConnection();
           urlConnection.setRequestMethod("GET");
           urlConnection.setDoOutput(true);
           urlConnection.setDoInput(true);
           urlConnection.connect();
           DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
           DocumentBuilder db = dbf.newDocumentBuilder();
           doc = db.parse(urlConnection.getInputStream());
    
          } catch (Exception e) {
          }
    
          NodeList nl = doc.getElementsByTagName("LineString");
          for (int s = 0; s < nl.getLength(); s++) {
           Node rootNode = nl.item(s);
           NodeList configItems = rootNode.getChildNodes();
           for (int x = 0; x < configItems.getLength(); x++) {
            Node lineStringNode = configItems.item(x);
            NodeList path = lineStringNode.getChildNodes();
            pathConent = path.item(0).getNodeValue();
           }
          }
          String[] tempContent = pathConent.split(" ");
          return tempContent;
         }
    
        }
    
    
        //*****************************************************************************
    
    
    
         class DirectionPathOverlay extends Overlay {
    
            private GeoPoint gp1;
            private GeoPoint gp2;
    
            public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
                this.gp1 = gp1;
                this.gp2 = gp2;
            }
    
            @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(gp1, point);
                    paint.setColor(Color.BLUE);
                    Point point2 = new Point();
                    projection.toPixels(gp2, 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);
            }
    
            @Override
            public void draw(Canvas canvas, MapView mapView, boolean shadow) {
                // TODO Auto-generated method stub
    
                super.draw(canvas, mapView, shadow);
            }
    
        }
    

    Hope it helps for other Stack Overflow users

    0 讨论(0)
  • 2020-11-22 05:48
    public class MainActivity extends FragmentActivity  {
    
    
      List<Overlay> mapOverlays;
      GeoPoint point1, point2;
      LocationManager locManager;
      Drawable drawable;
      Document document;
      GMapV2GetRouteDirection v2GetRouteDirection;
      LatLng fromPosition;
      LatLng toPosition;
      GoogleMap mGoogleMap;
      MarkerOptions markerOptions;
      Location location ;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            v2GetRouteDirection = new GMapV2GetRouteDirection();
          SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
            mGoogleMap = supportMapFragment.getMap();
    
            // Enabling MyLocation in Google Map
            mGoogleMap.setMyLocationEnabled(true);
            mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
            mGoogleMap.getUiSettings().setCompassEnabled(true);
            mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
            mGoogleMap.getUiSettings().setAllGesturesEnabled(true);
            mGoogleMap.setTrafficEnabled(true);
            mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12));
            markerOptions = new MarkerOptions();
            fromPosition = new LatLng(11.663837, 78.147297);
            toPosition = new LatLng(11.723512, 78.466287);
            GetRouteTask getRoute = new GetRouteTask();
            getRoute.execute();
      }
      /**
       *
       * @author VIJAYAKUMAR M
       * This class Get Route on the map
       *
       */
      private class GetRouteTask extends AsyncTask<String, Void, String> {
    
            private ProgressDialog Dialog;
            String response = "";
            @Override
            protected void onPreExecute() {
                  Dialog = new ProgressDialog(MainActivity.this);
                  Dialog.setMessage("Loading route...");
                  Dialog.show();
            }
    
            @Override
            protected String doInBackground(String... urls) {
                  //Get All Route values
                             document = v2GetRouteDirection.getDocument(fromPosition, toPosition,          GMapV2GetRouteDirection.MODE_DRIVING);
                        response = "Success";
                  return response;
    
            }
    
            @Override
            protected void onPostExecute(String result) {
                  mGoogleMap.clear();
                  if(response.equalsIgnoreCase("Success")){
                  ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document);
                  PolylineOptions rectLine = new PolylineOptions().width(10).color(
                              Color.RED);
    
                  for (int i = 0; i < directionPoint.size(); i++) {
                        rectLine.add(directionPoint.get(i));
                  }
                  // Adding route on the map
                  mGoogleMap.addPolyline(rectLine);
                  markerOptions.position(toPosition);
                  markerOptions.draggable(true);
                  mGoogleMap.addMarker(markerOptions);
    
                  }
    
                  Dialog.dismiss();
            }
      }
      @Override
      protected void onStop() {
            super.onStop();
            finish();
        }
     }
    

    Route Helper class

     public class GMapV2GetRouteDirection {
      public final static String MODE_DRIVING = "driving";
      public final static String MODE_WALKING = "walking";
    
      public GMapV2GetRouteDirection() { }
    
      public Document getDocument(LatLng start, LatLng end, String mode) {
        String url = "http://maps.googleapis.com/maps/api/directions/xml?"
                + "origin=" + start.latitude + "," + start.longitude 
                + "&destination=" + end.latitude + "," + end.longitude
                + "&sensor=false&units=metric&mode=driving";
    
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse response = httpClient.execute(httpPost, localContext);
            InputStream in = response.getEntity().getContent();
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(in);
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
      }
    
      public String getDurationText (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("duration");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "text"));
        Log.i("DurationText", node2.getTextContent());
        return node2.getTextContent();
     }
    
     public int getDurationValue (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("duration");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "value"));
        Log.i("DurationValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
      }
    
      public String getDistanceText (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "text"));
        Log.i("DistanceText", node2.getTextContent());
        return node2.getTextContent();
      }
    
      public int getDistanceValue (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("distance");
        Node node1 = nl1.item(0);
        NodeList nl2 = node1.getChildNodes();
        Node node2 = nl2.item(getNodeIndex(nl2, "value"));
        Log.i("DistanceValue", node2.getTextContent());
        return Integer.parseInt(node2.getTextContent());
      }
    
      public String getStartAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("start_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
      }
    
      public String getEndAddress (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("end_address");
        Node node1 = nl1.item(0);
        Log.i("StartAddress", node1.getTextContent());
        return node1.getTextContent();
      }
    
      public String getCopyRights (Document doc) {
        NodeList nl1 = doc.getElementsByTagName("copyrights");
        Node node1 = nl1.item(0);
        Log.i("CopyRights", node1.getTextContent());
        return node1.getTextContent();
      }
    
       public ArrayList<LatLng> getDirection (Document doc) {
        NodeList nl1, nl2, nl3;
        ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>();
        nl1 = doc.getElementsByTagName("step");
        if (nl1.getLength() > 0) {
            for (int i = 0; i < nl1.getLength(); i++) {
                Node node1 = nl1.item(i);
                nl2 = node1.getChildNodes();
    
                Node locationNode = nl2.item(getNodeIndex(nl2, "start_location"));
                nl3 = locationNode.getChildNodes();
                Node latNode = nl3.item(getNodeIndex(nl3, "lat"));
                double lat = Double.parseDouble(latNode.getTextContent());
                Node lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                double lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));
    
                locationNode = nl2.item(getNodeIndex(nl2, "polyline"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "points"));
                ArrayList<LatLng> arr = decodePoly(latNode.getTextContent());
                for(int j = 0 ; j < arr.size() ; j++) {
                    listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude));
                }
    
                locationNode = nl2.item(getNodeIndex(nl2, "end_location"));
                nl3 = locationNode.getChildNodes();
                latNode = nl3.item(getNodeIndex(nl3, "lat"));
                lat = Double.parseDouble(latNode.getTextContent());
                lngNode = nl3.item(getNodeIndex(nl3, "lng"));
                lng = Double.parseDouble(lngNode.getTextContent());
                listGeopoints.add(new LatLng(lat, lng));
            }
        }
    
        return listGeopoints;
     }
    
     private int getNodeIndex(NodeList nl, String nodename) {
        for(int i = 0 ; i < nl.getLength() ; i++) {
            if(nl.item(i).getNodeName().equals(nodename))
                return i;
        }
        return -1;
     }
    
     private ArrayList<LatLng> decodePoly(String encoded) {
        ArrayList<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 position = new LatLng((double) lat / 1E5, (double) lng / 1E5);
            poly.add(position);
        }
        return poly;
      }
     }
    
    0 讨论(0)
提交回复
热议问题