Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 谷歌地图上的精确路径_Android_Google Maps - Fatal编程技术网

Android 谷歌地图上的精确路径

Android 谷歌地图上的精确路径,android,google-maps,Android,Google Maps,我对谷歌地图有一个复杂的问题。我使用android,我在两个特定点之间绘制了一条路径,但问题是路径不准确,因为它绘制的是可逆的街道,所以现在的路径不正确。有人知道如何忽略错误的街道吗???这是一个有效的示例。过来看。它有助于在地图上创建路线覆盖。这是解决这个问题的方法 编辑: 正如AlexAndro在下面提到的:“这种使用kml的方法似乎不再可用,这个问题在过去几天里已经在Stackoverflow上讨论过了。”这是一个有效的示例。过来看。它有助于在地图上创建路线覆盖。这是解决这个问题的方法 编

我对谷歌地图有一个复杂的问题。我使用android,我在两个特定点之间绘制了一条路径,但问题是路径不准确,因为它绘制的是可逆的街道,所以现在的路径不正确。有人知道如何忽略错误的街道吗???

这是一个有效的示例。过来看。它有助于在地图上创建路线覆盖。这是解决这个问题的方法

编辑: 正如AlexAndro在下面提到的:“这种使用kml的方法似乎不再可用,这个问题在过去几天里已经在Stackoverflow上讨论过了。”

这是一个有效的示例。过来看。它有助于在地图上创建路线覆盖。这是解决这个问题的方法

编辑:
正如AlexAndro在下面提到的:“这个使用kml的方法似乎不再可用,这个问题在过去几天里已经在Stackoverflow上讨论过了。”

使用下面的类代码::

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;



public class RoutePath extends MapActivity { 
    /** Called when the activity is first created. */ 

    MapView mapView;
    private RoutePath _activity;

    GeoPoint srcGeoPoint,destGeoPoint;
    private static List<Overlay> mOverlays;

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        _activity = this;

        MapView mapView = (MapView) findViewById(R.id.mapview); 


        double src_lat = SRCLAT;
        double src_long = SRCLNG;
        double dest_lat = DESTLAT;
        double dest_long = DESTLNG;
        srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),(int) (src_long * 1E6)); 
        destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),(int) (dest_long * 1E6)); 

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable srcdrawable = this.getResources().getDrawable(R.drawable.pin_green);
        CustomItemizedOverlay srcitemizedOverlay = new CustomItemizedOverlay(srcdrawable, this);
        OverlayItem srcoverlayitem = new OverlayItem(srcGeoPoint, "Hello!", "This is your Location.");

        Drawable destdrawable = this.getResources().getDrawable(R.drawable.pin_red);
        CustomItemizedOverlay destitemizedOverlay = new CustomItemizedOverlay(destdrawable, this);
        OverlayItem destoverlayitem = new OverlayItem(destGeoPoint, "Hello!", "This is dest Location.");

        srcitemizedOverlay.addOverlay(srcoverlayitem);
        destitemizedOverlay.addOverlay(destoverlayitem);

        mapOverlays.add(srcitemizedOverlay);
        mapOverlays.add(destitemizedOverlay);

        connectAsyncTask _connectAsyncTask = new connectAsyncTask();
        _connectAsyncTask.execute();         
        mapView.setBuiltInZoomControls(true);
        mapView.displayZoomControls(true);
        mOverlays = mapView.getOverlays();
        mapView.getController().animateTo(srcGeoPoint); 
        mapView.getController().setZoom(12); 
    } 


    @Override 
    protected boolean isRouteDisplayed() { 
        // TODO Auto-generated method stub 
        return false; 
    } 

    private class connectAsyncTask extends AsyncTask<Void, Void, Void>{
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            SHOW YOU PROGRESS BAR HERE
        }
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            fetchData();
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);            
            if(doc!=null){
                Overlay ol = new MyOverLay(_activity,srcGeoPoint,srcGeoPoint,1);
                mOverlays.add(ol);
                NodeList _nodelist = doc.getElementsByTagName("status");
                Node node1 = _nodelist.item(0);
                String _status1  = node1.getChildNodes().item(0).getNodeValue();
                if(_status1.equalsIgnoreCase("OK")){
                    NodeList _nodelist_path = doc.getElementsByTagName("overview_polyline");
                    Node node_path = _nodelist_path.item(0);
                    Element _status_path = (Element)node_path;
                    NodeList _nodelist_destination_path = _status_path.getElementsByTagName("points");
                    Node _nodelist_dest = _nodelist_destination_path.item(0);
                    String _path  = _nodelist_dest.getChildNodes().item(0).getNodeValue();
                    List<GeoPoint> _geopoints = decodePoly(_path);
                    GeoPoint gp1; 
                    GeoPoint gp2; 
                    gp2 = _geopoints.get(0);
                    for(int i=1;i<_geopoints.size();i++) // the last one would be crash 
                    { 

                        gp1 = gp2;
                        gp2 = _geopoints.get(i);
                        Overlay ol1 = new MyOverLay(gp1,gp2,2,Color.BLUE);
                        mOverlays.add(ol1);
                    } 
                    Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3);
                    mOverlays.add(ol2);

                    DISMISS PROGRESS BAR HERE

                }else{
                     showAlert AS "Unable to find the route"
                }

                Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3);
                mOverlays.add(ol2);
                DISMISS PROGRESS BAR HERE
            }else{
                showAlert AS "Unable to find the route"
            }

        }

    }
    Document doc = null;
    private void fetchData()
    {
        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps/api/directions/xml?origin=");
        urlString.append( Double.toString((double)srcGeoPoint.getLatitudeE6()/1.0E6 )); 
        urlString.append(","); 
        urlString.append( Double.toString((double)srcGeoPoint.getLongitudeE6()/1.0E6 )); 
        urlString.append("&destination=");//to 
        urlString.append( Double.toString((double)destGeoPoint.getLatitudeE6()/1.0E6 )); 
        urlString.append(","); 
        urlString.append( Double.toString((double)destGeoPoint.getLongitudeE6()/1.0E6 )); 
        urlString.append("&sensor=true&mode=driving"); 
        if(Constants.LOG)Log.d("xxx","URL="+urlString.toString());          
        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 = (Document) db.parse(urlConnection.getInputStream());//Util.XMLfromString(response);
        }catch (MalformedURLException e){ 
            e.printStackTrace(); 
        }catch (IOException e){ 
            e.printStackTrace(); 
        }catch (ParserConfigurationException e){ 
            e.printStackTrace(); 
        }
        catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private List<GeoPoint> decodePoly(String encoded) {

        List<GeoPoint> poly = new ArrayList<GeoPoint>();
        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;

            GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),
                    (int) (((double) lng / 1E5) * 1E6));
            poly.add(p);
        }

        return poly;
    }
}

使用以下类别代码::

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;



public class RoutePath extends MapActivity { 
    /** Called when the activity is first created. */ 

    MapView mapView;
    private RoutePath _activity;

    GeoPoint srcGeoPoint,destGeoPoint;
    private static List<Overlay> mOverlays;

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        _activity = this;

        MapView mapView = (MapView) findViewById(R.id.mapview); 


        double src_lat = SRCLAT;
        double src_long = SRCLNG;
        double dest_lat = DESTLAT;
        double dest_long = DESTLNG;
        srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),(int) (src_long * 1E6)); 
        destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),(int) (dest_long * 1E6)); 

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable srcdrawable = this.getResources().getDrawable(R.drawable.pin_green);
        CustomItemizedOverlay srcitemizedOverlay = new CustomItemizedOverlay(srcdrawable, this);
        OverlayItem srcoverlayitem = new OverlayItem(srcGeoPoint, "Hello!", "This is your Location.");

        Drawable destdrawable = this.getResources().getDrawable(R.drawable.pin_red);
        CustomItemizedOverlay destitemizedOverlay = new CustomItemizedOverlay(destdrawable, this);
        OverlayItem destoverlayitem = new OverlayItem(destGeoPoint, "Hello!", "This is dest Location.");

        srcitemizedOverlay.addOverlay(srcoverlayitem);
        destitemizedOverlay.addOverlay(destoverlayitem);

        mapOverlays.add(srcitemizedOverlay);
        mapOverlays.add(destitemizedOverlay);

        connectAsyncTask _connectAsyncTask = new connectAsyncTask();
        _connectAsyncTask.execute();         
        mapView.setBuiltInZoomControls(true);
        mapView.displayZoomControls(true);
        mOverlays = mapView.getOverlays();
        mapView.getController().animateTo(srcGeoPoint); 
        mapView.getController().setZoom(12); 
    } 


    @Override 
    protected boolean isRouteDisplayed() { 
        // TODO Auto-generated method stub 
        return false; 
    } 

    private class connectAsyncTask extends AsyncTask<Void, Void, Void>{
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            SHOW YOU PROGRESS BAR HERE
        }
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            fetchData();
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);            
            if(doc!=null){
                Overlay ol = new MyOverLay(_activity,srcGeoPoint,srcGeoPoint,1);
                mOverlays.add(ol);
                NodeList _nodelist = doc.getElementsByTagName("status");
                Node node1 = _nodelist.item(0);
                String _status1  = node1.getChildNodes().item(0).getNodeValue();
                if(_status1.equalsIgnoreCase("OK")){
                    NodeList _nodelist_path = doc.getElementsByTagName("overview_polyline");
                    Node node_path = _nodelist_path.item(0);
                    Element _status_path = (Element)node_path;
                    NodeList _nodelist_destination_path = _status_path.getElementsByTagName("points");
                    Node _nodelist_dest = _nodelist_destination_path.item(0);
                    String _path  = _nodelist_dest.getChildNodes().item(0).getNodeValue();
                    List<GeoPoint> _geopoints = decodePoly(_path);
                    GeoPoint gp1; 
                    GeoPoint gp2; 
                    gp2 = _geopoints.get(0);
                    for(int i=1;i<_geopoints.size();i++) // the last one would be crash 
                    { 

                        gp1 = gp2;
                        gp2 = _geopoints.get(i);
                        Overlay ol1 = new MyOverLay(gp1,gp2,2,Color.BLUE);
                        mOverlays.add(ol1);
                    } 
                    Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3);
                    mOverlays.add(ol2);

                    DISMISS PROGRESS BAR HERE

                }else{
                     showAlert AS "Unable to find the route"
                }

                Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3);
                mOverlays.add(ol2);
                DISMISS PROGRESS BAR HERE
            }else{
                showAlert AS "Unable to find the route"
            }

        }

    }
    Document doc = null;
    private void fetchData()
    {
        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps/api/directions/xml?origin=");
        urlString.append( Double.toString((double)srcGeoPoint.getLatitudeE6()/1.0E6 )); 
        urlString.append(","); 
        urlString.append( Double.toString((double)srcGeoPoint.getLongitudeE6()/1.0E6 )); 
        urlString.append("&destination=");//to 
        urlString.append( Double.toString((double)destGeoPoint.getLatitudeE6()/1.0E6 )); 
        urlString.append(","); 
        urlString.append( Double.toString((double)destGeoPoint.getLongitudeE6()/1.0E6 )); 
        urlString.append("&sensor=true&mode=driving"); 
        if(Constants.LOG)Log.d("xxx","URL="+urlString.toString());          
        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 = (Document) db.parse(urlConnection.getInputStream());//Util.XMLfromString(response);
        }catch (MalformedURLException e){ 
            e.printStackTrace(); 
        }catch (IOException e){ 
            e.printStackTrace(); 
        }catch (ParserConfigurationException e){ 
            e.printStackTrace(); 
        }
        catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private List<GeoPoint> decodePoly(String encoded) {

        List<GeoPoint> poly = new ArrayList<GeoPoint>();
        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;

            GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),
                    (int) (((double) lng / 1E5) * 1E6));
            poly.add(p);
        }

        return poly;
    }
}

我尝试了这段代码,但得到了一个异常04-22 14:36:31.349:E/AndroidRuntime(335):致命异常:main 04-22 14:36:31.349:E/AndroidRuntime(335):java.lang.RuntimeException:无法实例化活动组件信息{ee.xx.ss/ee.xx.ss.RoadProvider}:java.lang.ClassCastException:ee.xx.ss.RoadProvider 04-22 14:36:31.349:E/AndroidRuntime(335):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)上。我想它在xml解析器中。我还有一个问题,我是否需要为类RoadProvider设置布局???。我尝试了Pavan给我的代码。。在这个类中,公共静态字符串getUrl(double-fromLat、double-fromLon、double-toLat、double-toLon)…哪些值需要传递给它?@Agarwal是的,你能分享一下吗,因为我在其他项目中遇到了问题。我创建了一个jar文件来drawroute?我尝试了这段代码,但得到了一个异常04-22 14:36:31.349:E/AndroidRuntime(335):致命异常:main 04-22 14:36:31.349:E/AndroidRuntime(335):java.lang.RuntimeException:无法实例化活动组件信息{ee.xx.ss/ee.xx.ss.RoadProvider}:java.lang.ClassCastException:ee.xx.ss.RoadProvider 04-22 14:36:31.349:E/AndroidRuntime(335):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)上。我想它在xml解析器中。我还有一个问题,我是否需要为类RoadProvider设置布局???。我尝试了Pavan给我的代码。。在这个类中,公共静态字符串getUrl(double-fromLat,double-fromLon,double-toLat,double-toLon)…我需要传递给它哪些值?@Agarwal是的,你能分享一下吗,因为我和其他项目有问题。我已经为drawroute创建了一个jar文件?请不要使用注释来更新状态。答案就是按原样回答问题。如果你需要更多的讨论,可以在聊天室里进行。@BoltClock是独角兽,请不要用评论来更新状态。答案就是按原样回答问题。如果您需要更多的讨论,请在聊天室中进行。@BoltClock是独角兽Sure此方法使用
kml
似乎不再可用,最近几天在Stackoverflow上讨论了此问题<代码>http://stackoverflow.com/questions/11680872/google-maps-output-kml-broken@AlexAndro感谢您让我们知道。我将在你的帖子中编辑答案。这种使用
kml
的方法似乎不再可用,这个问题在最近几天的Stackoverflow上已经讨论过了<代码>http://stackoverflow.com/questions/11680872/google-maps-output-kml-broken@AlexAndro感谢您让我们知道。我将用你的帖子编辑答案。
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class MyOverLay extends Overlay 
{ 
    private GeoPoint gp1; 
    private GeoPoint gp2; 
    //private int mRadius=6; 
    private int mode=0; 
    private int defaultColor; 
    private String text=""; 
    private Bitmap img = null; 
    Context mContext;

    public MyOverLay(Context context,GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E) 
    { 
        this.gp1 = gp1; 
        this.gp2 = gp2; 
        this.mode = mode; 
        this.mContext = context;
        defaultColor = 999; // no defaultColor 

    } 

    public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor) 
    { 
        this.gp1 = gp1; 
        this.gp2 = gp2; 
        this.mode = mode; 
        this.defaultColor = defaultColor; 
    } 
    public void setText(String t) 
    { 
        this.text = t; 
    } 
    public void setBitmap(Bitmap bitmap) 
    { 
        this.img = bitmap; 
    } 
    public int getMode() 
    { 
        return mode; 
    } 

    @Override 
    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); 
            // mode=1&#65306;start 
            if(mode==1) 
            { 
                if(defaultColor==999) 
                    paint.setColor(Color.BLUE); 
                else 
                    paint.setColor(defaultColor);                
                // start point
            } 
            // mode=2&#65306;path 
            else 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); 

            } 
            /* mode=3&#65306;end */ 
            else if(mode==3) 
            { 
                /* the last path */ 

                if(defaultColor==999) 
                    paint.setColor(Color.GREEN); 
                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); 
                /* end point */

            } 
        } 
        return super.draw(canvas, mapView, shadow, when); 
    } 

}