在 Android google maps api v2 for 4.0 中,显示从当前位置到给定纬度的路线

Posted

技术标签:

【中文标题】在 Android google maps api v2 for 4.0 中,显示从当前位置到给定纬度的路线【英文标题】:in Android google maps api v2 for 4.0, show the routes from current location to given lat long 【发布时间】:2013-02-26 13:30:06 【问题描述】:

对于 google maps api v2 中的 android,它通过遵循此处 http://mobisys.in/blog/2012/12/google-rolls-out-android-maps-api-v2/ 的所有步骤来显示整个地球,我可以放大从当前位置到给定纬度和经度的路线,问题是我需要显示多条路线,如何实现??现在我没有在我的活动中做任何事情,但我认为我必须做一些编码来绘制路线。我怎样才能做到这一点?非常感谢您的回答,如果您知道,请提供任何教程。再次感谢。

【问题讨论】:

关注这个很棒的tutorial 谢谢你,我会调查的。似乎它有我正在寻找的确切答案。 :) 【参考方案1】:

最后我用这段代码解决了这个问题..:试试这个类:

import java.io.InputStream;
import java.util.ArrayList;

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

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.google.android.gms.maps.model.LatLng;

import android.content.Context;
import android.util.Log;

public class GMapV2Direction 
    public final static String MODE_DRIVING = "driving";
    public final static String MODE_WALKING = "walking";

    public GMapV2Direction()  

    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;
    

您可以在此处获取示例代码

LatLng fromPosition = new LatLng(13.687140112679154, 100.53525868803263);
LatLng toPosition = new LatLng(13.683660045847258, 100.53900808095932);

GoogleMap mMap = ((SupportMapFragment)getSupportFragmentManager()
        .findFragmentById(R.id.map)).getMap();
GMapV2Direction md = new GMapV2Direction();

Document doc = md.getDocument(fromPosition, toPosition, GMapV2Direction.MODE_DRIVING);
ArrayList<LatLng> directionPoint = md.getDirection(doc);
PolylineOptions rectLine = new PolylineOptions().width(3).color(Color.RED);

for(int i = 0 ; i < directionPoint.size() ; i++)           
rectLine.add(directionPoint.get(i));


mMap.addPolyline(rectLine);

:- https://docs.google.com/uc?export=download&id=0B0MdROeR0jbvWVVNUV9jbk1OeEE

【讨论】:

我们需要 xml 文档响应来绘制路线.. 这段代码就是这样。 最好添加内容而不是链接。目前链接不起作用。 下载链接失效了。请更新。【参考方案2】:

Android maps api V2 有 Polyline 类在地图上绘制路线。

Polyline line1 = map.addPolyline(new PolylineOptions()
 .add(new LatLng(50.5, 34.1), new LatLng(40.7, -74.0))
 .width(5)
 .color(0xFFFF0000));

【讨论】:

嘿 Mitesh,谢谢你的回答,我稍后会使用它,但我正在使用类似的教程,来自这个链接 wptrafficanalyzer.in/blog/…,但它仍然没有影响任何只显示完整谷歌地图的东西,现在当前位置,我从过去半小时开始尝试这个,没有错误出现,堆栈跟踪没有什么特别的发生, 您是否在地图上获取当前位置按钮? 在 xml 布局上没有定义按钮,这就是为什么我没有得到任何按钮,在这个链接中他们显示直接获取当前位置我认为。 需要设置googleMap.setMyLocationEnabled(true);显示当前位置 是的,它已经在那里了,我调试了代码,它没有调用 onLocationChanged() 方法,我认为在这个方法中只有他们在对焦相机,请纠正我。

以上是关于在 Android google maps api v2 for 4.0 中,显示从当前位置到给定纬度的路线的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 上使用 google map api 获取 google 驾驶指令?

如何在现有较旧的 android 项目中使用最新 API 添加 Google Map?

无法运行 Google Maps Android API Utility Demo

如何在 Google Map Api V2 Android 中搜索?

Android、Google Maps Android api、设置位置和地图类型

Android Manifest 未向 Google Maps 提供 API 密钥