【问题标题】:How can I parse out points and draw a route on a Google Map in Android?如何在 Android 的 Google 地图上解析点并绘制路线?
【发布时间】:2011-08-02 06:57:53
【问题描述】:

如何在 Android 操作系统的 Google 地图上获取积分并绘制路线?

【问题讨论】:

    标签: android google-maps drawing routes


    【解决方案1】:

    您要解析的示例 URL 是...

    http://maps.googleapis.com/maps/api/directions/xml?origin=52.31,16.71&destination=51.27,6.75&sensor=false

    根据您的目的更改起点 [lat,long] 和目的地 [lat, long]

    --

    积分获取

    import java.io.StringReader;
    import java.util.ArrayList;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserFactory;
    import net.gynsoft.citydusseldorf.lib.HttpClient;
    import android.os.Handler;
    import com.google.android.maps.GeoPoint;
    
    
    public class MapRoute 
    {
    private GeoPoint gpSrc = null;
    private GeoPoint gpDest = null;
    private ArrayList<GeoPoint> alRoute = new ArrayList<GeoPoint>();
    private Handler haRoute = new Handler();
    
    public interface RouteListener
    {
        public void onDetermined(ArrayList<GeoPoint> alPoint);
        public void onError();
    }
    
    private RouteListener oRoute = null;
    
    
    public MapRoute(GeoPoint gpSrc,GeoPoint gpDest)
    {
        this.gpSrc = gpSrc;
        this.gpDest = gpDest;
    }
    
    public void getPoints(RouteListener oRoute)
    {
        this.oRoute = oRoute;
        new Thread(ruFetch).start();
    }
    
    private Runnable ruFetchOk = new Runnable()
    {
        public void run()
        {
            oRoute.onDetermined(alRoute);
        }
    };
    
    private Runnable ruFetchError = new Runnable()
    {
        public void run()
        {
            oRoute.onDetermined(alRoute);
        }
    };
    
    private Runnable ruFetch = new Runnable()
    {
        public void run()
        {
            String szUrl = "http://maps.googleapis.com/maps/api/directions/xml";
            szUrl += "?origin=" + (gpSrc.getLatitudeE6()/1e6) + "," + (gpSrc.getLongitudeE6()/1e6);
            szUrl += "&destination=" + (gpDest.getLatitudeE6()/1e6) + "," + (gpDest.getLongitudeE6()/1e6);
            szUrl += "&sensor=true";
    
            HttpClient oHttp = HttpClient.getInstance();
            String szXml = oHttp.doGet(szUrl,"");
    
            try
            {
                XmlPullParserFactory xppfFactory = XmlPullParserFactory.newInstance();
                xppfFactory.setNamespaceAware(true);
                XmlPullParser xppParses = xppfFactory.newPullParser();
    
                xppParses.setInput(new StringReader(szXml));
                int iEventType = xppParses.getEventType();
                String szTag = "";
                String szText = "";
                boolean bStep = false;
                int iLat = 0;
                int iLong = 0;
    
                while(iEventType != XmlPullParser.END_DOCUMENT) 
                {     
                     iEventType = xppParses.next();
    
                     if(iEventType == XmlPullParser.START_TAG) 
                     {
                         szTag = xppParses.getName();
    
                         if(szTag.equals("step"))
                             bStep = true;
                     }
                     else if(iEventType == XmlPullParser.TEXT)      
                     {  
                         if(szTag.equals("points"))
                             szText = "";
                         else
                             szText = xppParses.getText().trim();
                     }          
                     else if(iEventType == XmlPullParser.END_TAG) 
                     {
                         if(xppParses.getName().equals("step"))
                         {
                             bStep = false;
                         }
                        else if(bStep && xppParses.getName().equals("start_location") || xppParses.getName().equals("end_location"))
                         {
                             GeoPoint gpPoint = new GeoPoint(iLat,iLong);
                             alRoute.add(gpPoint);
                         }
                         else if(bStep && xppParses.getName().equals("lat"))
                         {
                             iLat = (int)(Double.parseDouble(szText) * 1e6);
                         }
                         else if(bStep && xppParses.getName().equals("lng"))
                         {
                             iLong = (int)(Double.parseDouble(szText) * 1e6);
                         }
                     }
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
                haRoute.post(ruFetchError);
            }
    
    
            if(alRoute.size() == 0)
                haRoute.post(ruFetchError);
            else
                haRoute.post(ruFetchOk);
        }
    };
    }
    

    --

    地图叠加

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

    --

    如何使用它...在我的活动中某处

    dEmpty = new BitmapDrawable(Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888));
    dPin = getResources().getDrawable(R.drawable.pin_map);
    
    private void doDrawPath(GeoPoint gpSrc,GeoPoint gpDest) 
    {
        MapRoute oRoute = new MapRoute(gpSrc,gpDest);
        oRoute.getPoints(new RouteListener()
        {
            @Override
            public void onDetermined(ArrayList<GeoPoint> alPoint) 
            {
                GeoPoint oPointA = null;
                GeoPoint oPointB = null;
    
                mvMap.getOverlays().clear();
    
                for(int i=1; i<alPoint.size()-1; i++)
                {
                    oPointA = alPoint.get(i-1);
                    oPointB =  alPoint.get(i);
    
                    mvMap.getOverlays().add(new MapRouteOverlay(oPointA,oPointB,2,Color.RED));
                }
    
    
                mvMap.getOverlays().add(new MapRoutePinOverlay(alPoint.get(0),dPin));
                mvMap.getOverlays().add(new MapRoutePinOverlay(alPoint.get(alPoint.size()-1),dPin));
    
                mvMap.invalidate();
            }
    
            @Override
            public void onError() 
            {
            }           
        });
    }
    

    【讨论】:

    • 显然人们仍然觉得这个答案很有用——所以我把你的答案变成了……答案。希望你不介意...
    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多