Drawing a line/path on Google Maps

后端 未结 13 1013
执笔经年
执笔经年 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: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

提交回复
热议问题