在Google地图上绘制线条/路径

mni*_*ish 108 android google-maps overlay draw android-mapview

我已经忙了很长时间了解如何在HelloMapView中在地图上的两个(GPS)点之间画一条线,但没有运气.

有人可以告诉我该怎么做.

假设我使用扩展MapView的HelloMapView.我需要使用叠加层吗?如果是这样,我必须重写覆盖的onDraw()方法并在这里画一条线?我实际上尝试过这些东西,但没有结果.

先感谢您!

mni*_*ish 113

谢谢您的帮助.最后我可以在地图上画一条线.这就是我做的方式:

/** 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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 根据文档,draw()方法被调用两次 - 首先使用shadow = true,以允许Overlay绘制标记的阴影,然后再使用shadow = false.因此,如果你的叠加层没有阴影,那么当shadow == true时,你应该简单地返回并不绘制任何东西. (23认同)
  • 需要导入什么才能使用Overlay类? (5认同)
  • 如果添加更多点以形成闭合区域,则可以绘制填充Color.RED的多边形. (3认同)

Ris*_*nha 40

对于那些真正只想绘制简单线条的人来说 - 确实还有短版本.

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));
Run Code Online (Sandbox Code Playgroud)

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

  • 不要认为折线线需要在那里,谢谢,但效果很好 (2认同)

小智 21

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

}
Run Code Online (Sandbox Code Playgroud)


Muk*_*nda 12

这是完整的源代码,用于绘制从源纬度和经度到目的地纬度和经度的方向路径.我已经更改了上面的代码以适应纬度和经度,而不是源和目标.所以通过他的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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

希望它对其他Stack Overflow用户有所帮助


noo*_*oob 11

这也可以通过使用意图来完成:

  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);
Run Code Online (Sandbox Code Playgroud)

  • 纬度应该在url params中的longiturde之前出现 (2认同)

Tho*_*ues 5

使用 Google Maps Android API v2 真的很容易

只需从开发人员文档中复制示例

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

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));
Run Code Online (Sandbox Code Playgroud)