Android- Google Maps V2:跟踪从当前位置到另一个目的地的路线
Posted
技术标签:
【中文标题】Android- Google Maps V2:跟踪从当前位置到另一个目的地的路线【英文标题】:Android- Google Maps V2 : Trace route from current position to an other destination 【发布时间】:2013-12-18 09:37:09 【问题描述】:我从这个例子开始,在 2 个地址之间绘制一条路线,由用户输入。这是工作。 http://blog.rolandl.fr/1357-android-des-itineraires-dans-vos-applications-grace-a-lapi-google-direction
但现在我想绘制一条从我当前位置到另一个目的地的路线,由用户输入。 我的问题是我不知道如何检索当前位置,在这种情况下。 我已经尝试过:
LocationManager locationmanager=(LocationManager)this.getSystemService(LOCATION_SERVICE);
final double longitude=locationmanager.getLongitude();
final double latitude=locationmanager.getLatitude();
但它不起作用......我想我正在混合我找到的每个例子,它一点都不好。
你能帮帮我吗?
这是我的 MapActivity : 接收用户在我的 MainActivity 中键入的 2 个地址 公共类 MapActivity 扩展 Activity 实现 LocationListener 私人谷歌地图 googlemap;
protected void onCreate(final Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
// Recuperation des composants graphiques
googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
//Recuperations des adresses depart-arrivee
// RETRIEVE DEPARTURE AND DESTINATION ADDRESS
/*
* For editDepart, I would like to replace it by my Current location
*/
final String editDepart = getIntent().getStringExtra("DEPART");
final String editArrivee = getIntent().getStringExtra("ARRIVEE");
/* Appel de la méthode asynchrone // ASYNCHRONOUS METHOD
* ATTENTION : Il faut que ItineraireTask soit extends AsyncTask<Void, Integer, Boolean>
* Sinon, on ne pourra pas utilise la methode execute() */
new ItineraireTask(this, googlemap, editDepart, editArrivee).execute();
这是我的ItineraireTask:
public class ItineraireTask extends AsyncTask<Void, Integer, Boolean>
private static final String TOAST_MSG = "Calcul de l'itinéraire en cours";
private static final String TOAST_ERR_MAJ = "Impossible de trouver un itinéraire";
private Context context;
private GoogleMap gMap;
private String editDepart;
private String editArrivee;
private final ArrayList<LatLng> lstLatLng = new ArrayList<LatLng>();
/** CONSTRUCTEUR **/
public ItineraireTask(final Context context, final GoogleMap gMap, final String editDepart, final String editArrivee)
this.context = context;
this.gMap= gMap;
this.editDepart = editDepart;
this.editArrivee = editArrivee;
protected void onPreExecute()
Toast.makeText(context, TOAST_MSG, Toast.LENGTH_LONG).show();
protected Boolean doInBackground(Void... params)
try
//Construction de l'url à appeler
final StringBuilder url = new StringBuilder("http://maps.googleapis.com/maps/api/directions/xml?sensor=false&language=fr");
url.append("&origin=");
url.append(editDepart.replace(' ', '+'));
url.append("&destination=");
url.append(editArrivee.replace(' ', '+'));
//Appel du web service
final InputStream stream = new URL(url.toString()).openStream();
//Traitement des données
final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setIgnoringComments(true);
final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
final Document document = documentBuilder.parse(stream);
document.getDocumentElement().normalize();
//On récupère d'abord le status de la requête
final String status = document.getElementsByTagName("status").item(0).getTextContent();
if(!"OK".equals(status))
return false;
//On récupère les steps
final Element elementLeg = (Element) document.getElementsByTagName("leg").item(0);
final NodeList nodeListStep = elementLeg.getElementsByTagName("step");
final int length = nodeListStep.getLength();
for(int i=0; i<length; i++)
final Node nodeStep = nodeListStep.item(i);
if(nodeStep.getNodeType() == Node.ELEMENT_NODE)
final Element elementStep = (Element) nodeStep;
//On décode les points du XML
decodePolylines(elementStep.getElementsByTagName("points").item(0).getTextContent());
return true;
catch(final Exception e)
return false;
/** METHODE QUI DECODE LES POINTS EN LAT-LONG**/
private void decodePolylines(final String encodedPoints)
int index = 0;
int lat = 0, lng = 0;
while (index < encodedPoints.length())
int b, shift = 0, result = 0;
do
b = encodedPoints.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 = encodedPoints.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
lstLatLng.add(new LatLng((double)lat/1E5, (double)lng/1E5));
protected void onPostExecute(final Boolean result)
if(!result)
Toast.makeText(context, TOAST_ERR_MAJ, Toast.LENGTH_SHORT).show();
else
//On déclare le polyline, c'est-à-dire le trait (ici bleu) que l'on ajoute sur la carte pour tracer l'itinéraire
final PolylineOptions polylines = new PolylineOptions();
polylines.color(Color.BLUE);
//On construit le polyline
for(final LatLng latLng : lstLatLng)
polylines.add(latLng);
//On déclare un marker vert que l'on placera sur le départ
final MarkerOptions markerA = new MarkerOptions();
markerA.position(lstLatLng.get(0));
markerA.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
//On déclare un marker rouge que l'on mettra sur l'arrivée
final MarkerOptions markerB = new MarkerOptions();
markerB.position(lstLatLng.get(lstLatLng.size()-1));
markerB.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
//On met à jour la carte
gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lstLatLng.get(0), 10));
gMap.addMarker(markerA);
gMap.addPolyline(polylines);
gMap.addMarker(markerB);
提前感谢您!
最好的问候,
豆腐
【问题讨论】:
您可能应该阅读有关如何获取当前位置的信息developer.android.com/training/location/index.html 【参考方案1】:这是我写的关于这个主题的一篇博文,可以帮助你解决这个问题:
Google Maps API V2 Draw Directions
有一个示例项目,您可以下载使用。
【讨论】:
或者你可以使用我根据@EminAdz 博客帖子github.com/tyczj/MapNavigator 制作的库,尽管我猜这并不能真正回答他的问题,因为他不知道如何获得他当前的位置 您好@Emil Adz,我刚刚尝试了您的应用程序,它可以工作:) 但我必须将<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
放入清单中,否则它会崩溃。但这并不是我真正要寻找的。还是谢谢你!
是的,你应该这样做,这在我的另一篇文章中有所提及。
嗨@tyczj!谢谢你的帮助。我一点一点地尝试不同的方法。现在,我会试试你的。所以要使用你的库,我只需要用 OnPathSetListner 实现我的片段,并实例化GoogleMap map = getMap(); Navigator nav = new Navigator(map,start,end); nav.findDirections(true, false);
就像我的英语不流利,我想确保你确认一下。先谢谢了!
@Tofuw 是的,这将为您提供从一个点到另一个点的路线并将它们绘制在地图上,但如果您需要游览当前位置,它不会帮助您,您需要查看热点正确实施位置管理器以上是关于Android- Google Maps V2:跟踪从当前位置到另一个目的地的路线的主要内容,如果未能解决你的问题,请参考以下文章
Google Maps Android API V2 检查 Google Maps 应用程序是不是被禁用
在 Google Maps Android SDK (v2) 中更改建筑物颜色