為什麼使用 KML 資料來擷取 Android 版 Google 路線不再有效?
簡介
以前,可以使用 Android 應用程式的 KML 資料檢索 Google 路線。不過,此方法不再受支援。
停止原因
Google 更改了其 Directions API 的結構,因此有必要遷移到 JSON 或 XML資料檢索。 KML 不再可用於此目的。
解決方案
有兩種解決方案可以解決此問題:
遷移到JSON
JSON 解析的程式碼片段
JSON 解析的程式碼片段
public interface Parser { public Route parse(); }
這裡是用Java 解析JSON方向資料的程式碼片段類別:
Parser.javapublic 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
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; } }
以上是為什麼 Google Directions KML 資料檢索不再適用於 Android 應用程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!