【问题标题】:Drawing a line/path on Google Maps在谷歌地图上画一条线/路径
【发布时间】:2011-01-11 16:40:33
【问题描述】:

我一直忙于寻找如何在 HelloMapView 中的地图上的两个 (GPS) 点之间画一条线,但没有运气。

谁能告诉我怎么做。

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

提前谢谢你!

【问题讨论】:

  • 您可以覆盖 MapView 的 onDraw 方法(并且不要忘记调用基类 onDraw),但使用叠加层更简洁。也许您可以向我们展示您的覆盖类的 onDraw 代码,以便我们看看会发生什么?

标签: android google-maps overlay android-mapview draw


【解决方案1】:

是的,您需要使用叠加层。

您需要获取 MapView 的叠加层并将您的新叠加层添加到它上面。

您的类扩展了 Overlay,这是一个透明的画布,您可以像在任何其他画布上一样在其中进行绘制。

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

...

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

【讨论】:

  • 我正在尝试您在此处解释的相同代码。但是我在这一行出现错误 String pairs[] = getDirectionData("ahmedab​​ad", "vadodara");并且应用程序将强制关闭。请您帮忙解决这个问题。
【解决方案2】:

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

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

【讨论】:

  • 根据文档,draw() 方法被调用了两次——第一次使用 shadow = true,例如允许 Overlay 绘制标记的阴影,然后再次使用 shadow = false。因此,如果您的叠加层没有阴影,则当 shadow == true 时,您应该简单地返回并不绘制任何内容。
  • 如果你添加更多的点来形成一个封闭的区域,那么你可以绘制一个用 Color.RED 填充的多边形。
  • 我自己遇到了 Inflate 异常。可能是什么原因?
  • @Satheesh 这与您扩充 xml 布局文件有关。可能在您尝试检索地图视图时。也许你的身份证有问题?
  • 使用 Overlay 类需要导入什么?
【解决方案3】:

您可以从传递给 draw() 方法的 MapView 对象中获取投影: mapv.getProjection().toPixels(gP1, p1);

【讨论】:

    【解决方案4】:
    // 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);
        }
    
    }
    

    【讨论】:

    • 我一直在做类似的事情,因为我扩展了 Overlay,但使用 draw 在点之间画了一条线。不同之处在于我使用 GPS 来跟踪我的运动,每次找到新位置时,都会将其添加到 ArrayList 中,然后从 ArrayList 中的 2 个最新位置创建新的 DirectionPathOverlay。我的问题是,除非我与地图交互,否则这些线条不会出现在地图上,例如,如果我触摸屏幕并移动以平移地图,那么大约会出现最后 10 秒的线条绘制,任何想法为什么会出现我只有在互动时才四处走动而不是实时绘图?
    • @Infiniti:你应该把它作为一个新问题发布,而不是作为评论。
    • @richa123 我正在尝试您在此处解释的相同代码。但是我在这一行出现错误 String pairs[] = getDirectionData("ahmedab​​ad", "vadodara");并且应用程序将强制关闭。请您帮忙解决这个问题。
    【解决方案5】:

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

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

    【讨论】:

    • 我正在尝试您在此处解释的相同代码。但是我在这一行出现错误 String pairs[] = getDirectionData("ahmedab​​ad", "vadodara");并且应用程序将强制关闭。请您帮忙解决这个问题。
    • @KAREEMMAHAMMED 如果您可以正确地看到我上面的代码,我正在传递该来源和目的地的纬度和经度,我没有传递城市名称。 richa123 正在传递城市名称以获取两个城市之间的方向。谢谢。
    • 我也按照您的代码进行了尝试。我得到了同样的错误。字符串对[] = getDirectionData(sourceLat,sourceLong,destinationLat,destinationLong);我在这条线上越来越近了。请给我一个示例代码
    • @KAREEMMAHAMMED 发布您的代码以及布局和 logcat 详细信息。
    • 感谢您的回复。我已经发布了代码和 logcat 详细信息stackoverflow.com/questions/11895184/…
    【解决方案6】:

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

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

    【讨论】:

    • 在 url 参数中纬度应该在经度之前
    【解决方案7】:

    只是我会在mapview 中找到带有一些矩形的绘图,只是我们想随心所欲地更改油漆​​p>

    EmptyOverlay.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;
    }
    }
    

    MapOverlay.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/

    【讨论】:

      【解决方案8】:
      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;
          }
      }
      

      【讨论】:

        【解决方案9】:

        使用 Google Maps 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));
        

        【讨论】:

        • 当你创建你的地图Activity(简单的android studio tamplate)时,你可以在地图Activity的onMapReady方法中添加这段代码。
        【解决方案10】:
        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;
          }
         }
        

        【讨论】:

          【解决方案11】:

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

          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

          【讨论】:

          • 不要认为折线需要在那里,谢谢,完美的工作
          • 需要在那里并且知道这一点很有用,因为如果您只想同时拥有一个,则需要删除以前创建的一个。
          • 这对我有用。但是如果我们需要设置最短路径怎么实现呢?
          【解决方案12】:

          这对我有用。使用此处提到的方法,我能够在 Google Maps V2 上绘制折线。每当用户位置发生变化时,我都会画一条新线,因此折线看起来像用户在地图上所遵循的路径。

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

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

          【讨论】:

          • 仅链接的答案不是 SO 的方式。链接可能有一天会过时。请编辑您的答案以包含基本信息!
          • 您好 jogo,感谢您的反馈,但很抱歉我没听懂。你能详细说明一下这个问题吗? :)
          • 最好在 Stack Overflow 上包含相关代码,因为到 Github 的链接有朝一日可能会失效。
          【解决方案13】:

          只需从这个 url 获取路由并执行下一步...

          原点--->起点经纬度

          目的地--->终点经纬度

          在这里,我将起点设为德里的经纬度,将目的地设为昌迪加尔的纬度经度

          https://maps.googleapis.com/maps/api/directions/json?origin=28.704060,77.102493&destination=30.733315,76.779419&sensor=false&key="输入您的地图 API 密钥"

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-08
            • 2011-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多