代码之家  ›  专栏  ›  技术社区  ›  mnish

在谷歌地图上绘制线条/路径

  •  102
  • mnish  · 技术社区  · 16 年前

    我已经忙了很长时间,想知道如何在HellomapView的地图上的两个(GPS)点之间画一条线,但运气不好。

    有人能告诉我怎么做吗?

    假设我使用扩展mapview的hellomapview。我需要使用套印格式吗?如果需要,是否必须重写覆盖的ondraw()方法并在此处绘制一条线?我确实试过这些东西,但没有结果。

    提前谢谢!

    12 回复  |  直到 10 年前
        1
  •  111
  •   beckah Mina Fawzy    11 年前

    谢谢你的帮助。我终于在地图上画了一条线。 我就是这样做的:

    /** 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);
        }
    
        2
  •  30
  •   Risadinha    12 年前

    为那些 真的只有 想画一条简单的线-确实还有短版。

    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));
    

    https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polyline

        3
  •  20
  •   Jonas    15 年前
    // 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);
        }
    
    }
    
        4
  •  11
  •   Mukunda    14 年前

    这是完整的源代码,用于绘制从源纬度和经度到目标纬度和经度的方向路径。我修改了上面的代码以适应纬度和经度,而不是源和目的地。 因此,任何通过GPS访问其经纬度的人都可以从他的GPS设备获得到目的地坐标的方向。

    多亏了以上的答案,我们可以做出这样的改变,并获得路径方向。

    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);
            }
    
        }
    

    希望对其他堆栈溢出用户有所帮助

        5
  •  9
  •   0xC0DED00D    14 年前

    这也可以通过使用意图来实现:

      final Intent intent = new Intent(Intent.ACTION_VIEW,
        Uri.parse(
                "http://maps.google.com/maps?" +
                "saddr="+YOUR_START_LONGITUDE+","+YOUR_START_LATITUDE+"&daddr="YOUR_END_LONGITUDE+","+YOUR_END_LATITUDE));
             intent.setClassName(
              "com.google.android.apps.maps",
              "com.google.android.maps.MapsActivity");
       startActivity(intent);
    
        6
  •  3
  •   ddcruver    16 年前

    是的,你需要使用套印格式。

    您需要获取MapView的覆盖并将新的覆盖添加到其中。

    您的类扩展了覆盖,这是一个透明的画布,您可以像在其他画布上一样在其上绘制。

    您可以使用mapView.getProjection()获取地图视图的投影。

    此处找到更多信息: http://blogoscoped.com/archive/2008-12-15-n14.html

        7
  •  3
  •   Thorsten Niehues    12 年前

    使用谷歌地图Android API v2非常简单

    复制示例 Developer documentation

    (当然你必须先初始化地图)

    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));
    
        8
  •  1
  •   John J Smith    15 年前

    可以从传递到draw()方法的mapview对象中获取投影: mapv.getprojection().topixels(gp1,p1);

        9
  •  1
  •   Jigar Pandya    12 年前
    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();
        }
     }
    

    路由帮助程序类

     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;
      }
     }
    
        10
  •  0
  •   NagarjunaReddy    13 年前

    我会找到一张画有矩形的 mapview 只是我们想换我们喜欢的油漆

    空overlay.java

    public class EmptyOverlay extends Overlay {
    private float x1,y1;
    private MapExampleActivity mv = null;
    private Overlay overlay = null;
    
    public EmptyOverlay(MapExampleActivity mapV){
        mv = mapV;
    }
    
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
        // TODO Auto-generated method stub
        return super.draw(canvas, mapView, shadow, when);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
        if(mv.isEditMode()){
            if(e.getAction() == MotionEvent.ACTION_DOWN){
                //when user presses the map add a new overlay to the map
                //move events will be catched by newly created overlay
                x1 = y1 = 0;
                x1 = e.getX();
                y1 = e.getY();
    
                overlay = new MapOverlay(mv, x1, y1);
                mapView.getOverlays().add(overlay);
    
            }
            if(e.getAction() == MotionEvent.ACTION_MOVE){
            }
            //---when user lifts his finger---
            if (e.getAction() == MotionEvent.ACTION_UP) {                
    
            }    
            return true;
        }
        return false;
    }
    }
    

    mapexampleactivity.java

     public class MapExampleActivity extends MapActivity {
    private MapView mapView;
    private boolean isEditMode = false;
    private Button toogle;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        toogle = (Button)findViewById(R.id.toogleMap);        
        toogle.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                toogleEditMode();
    
            }
        });
    
        mapView = (MapView)findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true); //display zoom controls
        //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays
        mapView.getOverlays().add(new EmptyOverlay(this));
        mapView.postInvalidate();
    }
    //toogle edit mode for drawing or navigating the map
    private void toogleEditMode(){
        isEditMode = !isEditMode;
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    protected boolean isLocationDisplayed() {
        return false;
    }
    
    public boolean isEditMode(){
        return this.isEditMode;
    }
    
    public MapView getMapView(){
        return this.mapView;
    }
    }
    

    MavopRay.java

     public class MapOverlay extends Overlay {
    
    private float x1,y1,x2,y2;
    private GeoPoint p1=null,p2=null;
    private MapExampleActivity mv = null;
    private Paint paint = new Paint();
    private boolean isUp = false;
    
    //constructor receiving the initial point
    public MapOverlay(MapExampleActivity mapV,float x,float y){
        paint.setStrokeWidth(2.0f);
        x1 = x;
        y1 = y;
        mv = mapV;
        p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1);
    }
    //override draw method to add our custom drawings
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
    
        if(p1 != null && p2 != null){
            //get the 2 geopoints defining the area and transform them to pixels
            //this way if we move or zoom the map rectangle will follow accordingly
            Point screenPts1 = new Point();
            mapView.getProjection().toPixels(p1, screenPts1);
            Point screenPts2 = new Point();
            mapView.getProjection().toPixels(p2, screenPts2);
    
            //draw inner rectangle
            paint.setColor(0x4435EF56);
            paint.setStyle(Style.FILL);
            canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
            //draw outline rectangle
            paint.setColor(0x88158923);
            paint.setStyle(Style.STROKE);
            canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
        }
        return true;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
        if(mv.isEditMode() && !isUp){
            if(e.getAction() == MotionEvent.ACTION_DOWN){
                x1 = y1 = 0;
                x1 = e.getX();
                y1 = e.getY();
                p1 = mapView.getProjection().fromPixels((int)x1,(int)y1);
    
            }
            //here we constantly change geopoint p2 as we move out finger
            if(e.getAction() == MotionEvent.ACTION_MOVE){
                x2 = e.getX();
                y2 = e.getY();
                p2 = mapView.getProjection().fromPixels((int)x2,(int)y2);
    
            }
            //---when user lifts his finger---
            if (e.getAction() == MotionEvent.ACTION_UP) {                
                isUp = true;
            }    
            return true;
        }
        return false;
    }
     }
    

    看到这个 http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/

        11
  •  0
  •   Hiren Patel    13 年前
    Try this one:
    Add itemizedOverlay class:
    
    public class AndroidGoogleMapsActivity extends MapActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Displaying Zooming controls
            MapView mapView = (MapView) findViewById(R.id.mapview);
            mapView.setBuiltInZoomControls(true);
    
    
            MapController mc = mapView.getController();
            double lat = Double.parseDouble("48.85827758964043");
            double lon = Double.parseDouble("2.294543981552124");
            GeoPoint geoPoint = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6));
            mc.animateTo(geoPoint);
            mc.setZoom(15);
            mapView.invalidate(); 
    
    
            /**
             * Placing Marker
             * */
            List<Overlay> mapOverlays = mapView.getOverlays();
            Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red);
            AddItemizedOverlay itemizedOverlay = 
                 new AddItemizedOverlay(drawable, this);
    
    
            OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay item");
    
            itemizedOverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedOverlay);
    
        }
    
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
    }
    
        12
  •  -2
  •   prasang7    10 年前

    这对我有用。使用这里提到的方法,我可以在GoogleMapsV2上绘制多段线。每当用户位置发生变化时,我都会画一条新线,因此多段线看起来就像是用户在地图上跟随的路径。

    源代码在。 Github: prasang7/eTaxi-Meter

    如果您不感兴趣,请忽略本项目中与距离计算和用户界面相关的其他模块。