首頁 >Java >java教程 >為什麼 Google Directions KML 資料檢索不再適用於 Android 應用程式?

為什麼 Google Directions KML 資料檢索不再適用於 Android 應用程式?

Linda Hamilton
Linda Hamilton原創
2024-12-11 19:55:12645瀏覽

Why is Google Directions KML data retrieval no longer working for Android apps?

為什麼使用 KML 資料來擷取 Android 版 Google 路線不再有效?

簡介

以前,可以使用 Android 應用程式的 KML 資料檢索 Google 路線。不過,此方法不再受支援。

停止原因

Google 更改了其 Directions API 的結構,因此有必要遷移到 JSON 或 XML資料檢索。 KML 不再可用於此目的。

解決方案

有兩種解決方案可以解決此問題:

  1. 遷移到JSON

    • 遷移到JSON
    建立Java 類別來解析JSON數據,如下面的程式碼片段所示。
  2. 使用這些類別來檢索和解析 JSON 方向資料。

    • 替代方案
    考慮使用其他提供 KML 資料的地圖服務。
探索使用Google 的Places API 或Directions API

JSON 解析的程式碼片段

JSON 解析的程式碼片段

public interface Parser {
  public Route parse();
}

這裡是用Java 解析JSON方向資料的程式碼片段類別:

Parser.java
public abstract class XMLParser implements Parser {
  protected URL feedUrl;

  protected XMLParser(String feedUrl) throws MalformedURLException {
    this.feedUrl = new URL(feedUrl);
  }

  protected InputStream getInputStream() throws IOException {
    return feedUrl.openConnection().getInputStream();
  }
}

XMLParser.java
public class Segment {
  private GeoPoint start;
  private String instruction;
  private int length;
  private double distance;

  public Segment() {}

  public void setInstruction(String instruction) {
    this.instruction = instruction;
  }

  public String getInstruction() {
    return instruction;
  }

  public void setPoint(GeoPoint point) {
    start = point;
  }

  public GeoPoint startPoint() {
    return start;
  }
}

XMLParser.java

Seg ment.java
public class Route {
  private String name;
  private List<GeoPoint> points = new ArrayList<>();
  private List<Segment> segments = new ArrayList<>();
  private String copyright;
  private String warning;
  private String country;
  private int length;
  private String polyline;

  public void addPoint(GeoPoint p) {
    points.add(p);
  }

  public List<GeoPoint> getPoints() {
    return points;
  }

  public void addSegment(Segment s) {
    segments.add(s);
  }

  public List<Segment> getSegments() {
    return segments;
  }
}

Route.java
public class GoogleParser extends XMLParser {
  private int distance;

  public GoogleParser(String feedUrl) throws MalformedURLException {
    super(feedUrl);
  }

  public Route parse() {
    // Convert stream to string
    String result = convertStreamToString(getInputStream());

    // Create route object
    Route route = new Route();
    Segment segment = new Segment();

    // Parse JSON object
    try {
      JSONObject json = new JSONObject(result);
      JSONObject jsonRoute = json.getJSONArray("routes").getJSONObject(0);
      JSONObject leg = jsonRoute.getJSONArray("legs").getJSONObject(0);
      JSONArray steps = leg.getJSONArray("steps");
      int numSteps = steps.length();

      route.setName(leg.getString("start_address") + " to " + leg.getString("end_address"));
      route.setCopyright(jsonRoute.getString("copyrights"));
      route.setLength(leg.getJSONObject("distance").getInt("value"));
      if (!jsonRoute.getJSONArray("warnings").isNull(0)) {
        route.setWarning(jsonRoute.getJSONArray("warnings").getString(0));
      }

      // Parse steps
      for (int i = 0; i < numSteps; i++) {
        JSONObject step = steps.getJSONObject(i);
        JSONObject start = step.getJSONObject("start_location");
        GeoPoint position = new GeoPoint((int) (start.getDouble("lat") * 1E6), (int) (start.getDouble("lng") * 1E6));
        segment.setPoint(position);
        int stepLength = step.getJSONObject("distance").getInt("value");
        distance += stepLength;
        segment.setLength(stepLength);
        segment.setDistance(distance / 1000);
        segment.setInstruction(step.getString("html_instructions").replaceAll("<(.*?)>", ""));
        route.addPoints(decodePolyLine(step.getJSONObject("polyline").getString("points")));
        route.addSegment(segment.copy());
      }
    } catch (JSONException e) {
      Log.e(e.getMessage(), "Google JSON Parser - " + feedUrl);
    }
    return route;
  }
}
GoogleParser.javaGoogleParser.javaGoogleParser.java

以上是為什麼 Google Directions KML 資料檢索不再適用於 Android 應用程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn