Android 创建谷歌地图

Android 创建谷歌地图,android,google-maps,Android,Google Maps,我正在尝试创建一个以先前选择的点为中心的地图视图。 我想在该点和设备的当前位置之间创建一条路线。 你能帮助我吗?也许发布教程或示例? 谢谢大家! 您可以使用以下代码下载路径位于两点之间的kml文件: public static Document getKml(GeoPoint src, GeoPoint dest) { // connect to map web service StringBuilder urlString = new StringBuilder

我正在尝试创建一个以先前选择的点为中心的地图视图。 我想在该点和设备的当前位置之间创建一条路线。 你能帮助我吗?也许发布教程或示例?
谢谢大家!

您可以使用以下代码下载路径位于两点之间的kml文件:

public static Document getKml(GeoPoint src, GeoPoint dest) {
        // 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());
        // get the kml (XML) doc. And parse it to get the coordinates(direction
        // route).

        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();
            return db.parse(urlConnection.getInputStream());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
然后ip由您来解析它并在地图上显示;-)

提示:

参考这个例子

        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;
            }
        }
MapOverlay.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);
        }
    }
    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();
      }

    }
公共类MapOverlay扩展了ItemizeOverlay{
private ArrayList mOverlays=new ArrayList();
公共地图覆盖(可绘制_defaultMarker){
超级(boundCenterBottom(_defaultMarker));
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
} 
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
@凌驾
公共整数大小(){
返回mOverlays.size();
}
}

很抱歉我的无知,我必须在扩展MapActivity的活动中添加此方法,对吗?正如您的问题所述,您正在使用mapView,是的。Eclipse告诉我,在应该显示地图的活动中,在-mapoverlay2.addOverlay(overlayitem)行;-有一个错误:“类型MapOverlay的方法addOverlay(OverlayItem)未定义”。。。我怎样才能解决它?
    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();
      }

    }