Android draw route on a Mapview with twoo POI-s

后端 未结 1 979
伪装坚强ぢ
伪装坚强ぢ 2020-11-29 06:03

How i can draw a route on a mapview between two poi-s?

相关标签:
1条回答
  • 2020-11-29 06:48

    go through this codes. Modify the code as per ur requirement

    MapDirection.java:

    public class MapDirection extends MapActivity{
    
      MapView mapview;
      MapRouteOverlay mapoverlay;
      Context _context;
      List<Overlay> maplistoverlay;
      Drawable drawable,drawable2;
      MapOverlay mapoverlay2,mapoverlay3;
      GeoPoint srcpoint,destpoint;
      Overlay overlayitem;
      public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.map_direction);
        RegisterActivities.registerActivity(this);
        mapview=(MapView)this.findViewById(R.id.mapview);
    
        callMap();
      }
      private void callMap() {
    
    
        srcpoint=new GeoPoint((int)(Data.src_lat_date*1E6),(int)(Data.src_long_data*1E6));
        maplistoverlay=mapview.getOverlays();
        drawable=this.getResources().getDrawable(R.drawable.green_a);
        mapoverlay2=new MapOverlay(drawable);
        OverlayItem overlayitem = new OverlayItem(srcpoint, "", "");
        mapoverlay2.addOverlay(overlayitem);
        maplistoverlay.add(mapoverlay2);
    
        destpoint=new GeoPoint((int)(Data.dest_lat_data*1E6),(int)(Data.dest_long_data*1E6));
        drawable2=this.getResources().getDrawable(R.drawable.green_b);
        mapoverlay3=new MapOverlay(drawable2);
        OverlayItem overlayitem3 = new OverlayItem(destpoint, "", "");
        mapoverlay3.addOverlay(overlayitem3);
        maplistoverlay.add(mapoverlay3);
    
    
        double dest_lat = Data.dest_lat_data;
        double dest_long = Data.dest_long_data;
    
        GeoPoint srcGeoPoint = new GeoPoint((int) (Data.src_lat_date* 1E6),
            (int) (Data.src_long_data * 1E6));
        GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
            (int) (dest_long * 1E6));
    
        DrawPath(srcGeoPoint, destGeoPoint, Color.BLUE, mapview);
    
        mapview.getController().animateTo(srcGeoPoint);
        mapview.getController().setZoom(13);
        //mapview.setStreetView(true);
        mapview.setBuiltInZoomControls(true);
        mapview.invalidate();
    
    
      }
      private void DrawPath(GeoPoint src, GeoPoint dest, int color,
          MapView mMapView01) {
    
    
    
        // connect to map web service
        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps?f=d&hl=en");
        urlString.append("&saddr=");//from
        urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
        urlString.append(",");
        urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
        urlString.append("&daddr=");//to
        urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
        urlString.append(",");
        urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
        urlString.append("&ie=UTF8&0&om=0&output=kml");
        Log.d("xxx","URL="+urlString.toString());
    
        //System.out.println(urlString);
        // get the kml (XML) doc. And parse it to get the coordinates(direction route).
        Document doc = null;
        HttpURLConnection urlConnection= null;
        URL url = null;
        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());
    
          if(doc.getElementsByTagName("GeometryCollection").getLength()>0)
          {
            //String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
            String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ;
            Log.d("xxx","path="+ path);
            String [] pairs = path.split(" ");
            String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
            // src
            GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
            //mMapView01.getOverlays().add(overlayitem);
            GeoPoint gp1;
            GeoPoint gp2 = startGP;
            for(int i=1;i<pairs.length;i++) // the last one would be crash
            {
              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));
              mMapView01.getOverlays().add(new MapRouteOverlay(gp1,gp2,2,color));
              Log.d("xxx","pair:" + pairs[i]);
            }
            //mMapView01.getOverlays().add(new MapRouteOverlay(dest,dest, 3)); // use the default color
          }
        }
        catch (MalformedURLException e)
        {
          e.printStackTrace();
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
        catch (ParserConfigurationException e)
        {
          e.printStackTrace();
        }
        catch (SAXException e)
        {
          e.printStackTrace();
        }
    
    
      }
      @Override
        protected boolean isRouteDisplayed() {
          // TODO Auto-generated method stub
          return false;
        }
    }
    

    MapRouteOverlay.java:

    public class MapRouteOverlay extends Overlay {
    
      private GeoPoint gp1;
      private GeoPoint gp2;
    
      private int mode=0;
      private int defaultColor;
    
    
    
    
      public MapRouteOverlay(GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E)
      {
        this.gp1 = gp1;
        this.gp2 = gp2;
        this.mode = mode;
        defaultColor = 999; // no defaultColor
    
      }
    
      public MapRouteOverlay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor)
      {
        this.gp1 = gp1;
        this.gp2 = gp2;
        this.mode = mode;
        this.defaultColor = defaultColor;
      }
    
      public int getMode()
      {
        return mode;
      }
    
      public boolean draw
        (Canvas canvas, MapView mapView, boolean shadow, long when)
        {
          Projection projection = mapView.getProjection();
          if (shadow == false)
          {
    
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            Point point = new Point();
            projection.toPixels(gp1, point);
    
            if(mode==2)
            {
              if(defaultColor==999)
                paint.setColor(Color.RED);
              else
                paint.setColor(defaultColor);
              Point point2 = new Point();
              projection.toPixels(gp2, point2);
              paint.setStrokeWidth(5);
              paint.setAlpha(120);
              canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
            }
    
          }
          return super.draw(canvas, mapView, shadow, when);
        }
    }
    

    MapOverlay.java:

    public class MapOverlay extends ItemizedOverlay {
      private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    
      public MapOverlay(Drawable _defaultMarker) {
    
        super(boundCenterBottom(_defaultMarker));
      }
    
      @Override
      protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
      } 
      public void addOverlay(OverlayItem overlay) {
          mOverlays.add(overlay);
          populate();
      }
    
      @Override
      public int size() {
        return mOverlays.size();
      }
    
    }
    
    0 讨论(0)
提交回复
热议问题