ホームページ >Java >&#&チュートリアル >Google Directions の KML データ取得が Android アプリで機能しなくなったのはなぜですか?

Google Directions の KML データ取得が Android アプリで機能しなくなったのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-11 19:55:12643ブラウズ

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 はこの目的には使用できなくなりました。

解決策

この問題に対処するには 2 つの解決策があります:

  1. に移行しますJSON

    • 以下のコード スニペットに示すように、JSON データを解析する Java クラスを作成します。
    • これらのクラスを使用して、JSON の指示を取得および解析しますdata.
  2. 代替手段

    • KML データを提供する他のマッピング サービスの使用を検討してください。
    • 探索するGoogle の Places API または Directions API を使用する

JSON 解析のコード スニペット

Java を使用して JSON ルート データを解析するためのコード スニペットを次に示します。クラス:

Parser.java

public interface Parser {
  public Route parse();
}

XMLParser.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();
  }
}

Seg ment.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;
  }
}

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

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

以上がGoogle Directions の KML データ取得が Android アプリで機能しなくなったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。