2013-03-10 4 views
2

Я знаю, что по этому вопросу есть много тем, но моя проблема более конкретна. Я вызываю API-интерфейс Google Directions http, чтобы получить маршрутизацию между двумя местоположениями. Отвечающий JSON имеет всю информацию о том, как перемещаться из пункта A в B. Но как я могу рассчитать расстояние самостоятельно, например, между моим фактическим местоположением и следующим конечным местоположением шага во время движения? Мне нужна «дорожная линия», а не «воздушная линия».Получите расстояние между двумя местоположениями, например, в HTTP-запросе в Google Directions

Что я сделал - это получить lat, lng моего фактического местоположения с помощью LocationManager. С этим и lat, lng конечного местоположения я вызываю метод Location.distanceBetween. Но это дает нечеткое расстояние назад. Неопределенный означает, что результат метода distancebetween отличается от расстояния, выходящего за пределы API. Для длинных путей, как для коротких путей.

Одним из решений было бы назвать API Directions несколько раз ... Но для получения фактического расстояния по дороге должно быть приятнее работать. Есть ли инструмент, чтобы получить то, что я хочу?

редакцией, чтобы сделать его более понятным

ответ

1

сделать вызов к Directions API:

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; 
} 

После этого вы можете работать на всех JSON объектов, которые вы получили в документе, а также для проверки distnace между каждой парой точек:

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 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; 
} 

На самом деле я использовал этот код для рисования Polyline направления на карте, но функция расстояния также должна работать.

+0

В вашем коде описано, как получить информацию о маршрутизации из ответа API Directions. Но мне нужно создать значение расстояния до шага/полилинии, от API, от моего фактического местоположения во время движения. –

 Смежные вопросы

  • Нет связанных вопросов^_^