Google地图输出= kml破了?
所有
我在iPhone应用程序中使用谷歌地图KML输出。 如果我在浏览器中键入以下内容,它会提供一个选项来保存kml文件:
http://maps.google.com/maps?q=restaurant&mrt=yp&num=10&sll=37.786945,-122.406013&radius=5&output=kml
但是今天突然间,它正在返回一个html文件。 发生了什么? 有任何想法吗? 我在我的iPhone应用程序中使用它,它是抛出错误,因为它不是一个有效的XML返回。 明显….
谢谢,姆布
这种通过parsingKML文件从Google提取Google路线的方式自2012年7月27日起不再可用(因为Google已经更改了检索Google Directions的结构,现在只能通过JSON或XML获取),现在是时候将您的代码迁移到JSON而不是KML。
看到答案(仅适用于Android,但也许iPhone可以理解algorithm并应用它)在我自己的问题在这里 。
谷歌改变了一些东西,现在只显示重大转折 。 但是,当使用JSON时,它正确地显示path:
public class DrivingDirectionActivity extends MapActivity { Point p1 = new Point(); Point p2 = new Point(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapView mapView = (MapView) findViewById(R.id.map); // setting a default value double src_lat = 18.5535; double src_long = 73.7966; double dest_lat = 18.5535; double dest_long = 73.7966; Geocoder coder = new Geocoder(getApplicationContext(), Locale.getDefault()); List<Address> address_src = null; List<Address> address_dest = null; try { address_src = coder .getFromLocationName( "Deepmala Housing Complex, Pimple Saudagar, Pimpri Chinchwad", 1); if (address_src.size() > 0) { Address loc = address_src.get(0); src_lat = loc.getLatitude(); src_long = loc.getLongitude(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { address_dest = coder.getFromLocationName( "Infosys Phase 2, Hinjewadi Phase II, Hinjewadi", 1); if (address_dest.size() > 0) { Address loc = address_dest.get(0); dest_lat = loc.getLatitude(); dest_long = loc.getLongitude(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mapView.setBuiltInZoomControls(true); GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6), (int) (src_long * 1E6)); GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6), (int) (dest_long * 1E6)); DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView); mapView.getController().animateTo(srcGeoPoint); mapView.getController().setZoom(13); } protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private void DrawPath(GeoPoint src, GeoPoint dest, int color, MapView mMapView) { // connect to map web service HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(makeUrl(src, dest)); HttpResponse response; try { response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputStream is = null; is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); sb.append(reader.readLine() + "\n"); String line = "0"; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); reader.close(); String result = sb.toString(); JSONObject jsonObject = new JSONObject(result); JSONArray routeArray = jsonObject.getJSONArray("routes"); JSONObject routes = routeArray.getJSONObject(0); JSONObject overviewPolylines = routes .getJSONObject("overview_polyline"); String encodedString = overviewPolylines.getString("points"); List<GeoPoint> pointToDraw = decodePoly(encodedString); mMapView.getOverlays().add(new MyOverLay(pointToDraw)); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } private List<GeoPoint> decodePoly(String encoded) { List<GeoPoint> poly = new ArrayList<GeoPoint>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.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 = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6)); poly.add(p); } return poly; } private String makeUrl(GeoPoint src, GeoPoint dest) { // TODO Auto-generated method stub StringBuilder urlString = new StringBuilder(); urlString.append("http://maps.googleapis.com/maps/api/directions/json"); urlString.append("?origin=");// from urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6)); urlString.append(","); urlString .append(Double.toString((double) src.getLongitudeE6() / 1.0E6)); urlString.append("&destination=");// to urlString .append(Double.toString((double) dest.getLatitudeE6() / 1.0E6)); urlString.append(","); urlString .append(Double.toString((double) dest.getLongitudeE6() / 1.0E6)); urlString.append("&sensor=false"); Log.d("xxx", "URL=" + urlString.toString()); return urlString.toString(); } class MyOverLay extends Overlay { private int pathColor; private final List<GeoPoint> points; private boolean drawStartEnd; public MyOverLay(List<GeoPoint> pointToDraw) { // TODO Auto-generated constructor stub this(pointToDraw, Color.GREEN, true); } public MyOverLay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) { this.points = points; this.pathColor = pathColor; this.drawStartEnd = drawStartEnd; } private void drawOval(Canvas canvas, Paint paint, Point point) { Paint ovalPaint = new Paint(paint); ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE); ovalPaint.setStrokeWidth(2); ovalPaint.setColor(Color.BLUE); int _radius = 6; RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius); canvas.drawOval(oval, ovalPaint); } public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { Projection projection = mapView.getProjection(); if (shadow == false && points != null) { Point startPoint = null, endPoint = null; Path path = new Path(); // We are creating the path for (int i = 0; i < points.size(); i++) { GeoPoint gPointA = points.get(i); Point pointA = new Point(); projection.toPixels(gPointA, pointA); if (i == 0) { // This is the start point startPoint = pointA; path.moveTo(pointA.x, pointA.y); } else { if (i == points.size() - 1)// This is the end point endPoint = pointA; path.lineTo(pointA.x, pointA.y); } } Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(pathColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setAlpha(90); if (getDrawStartEnd()) { if (startPoint != null) { drawOval(canvas, paint, startPoint); } if (endPoint != null) { drawOval(canvas, paint, endPoint); } } if (!path.isEmpty()) canvas.drawPath(path, paint); } return super.draw(canvas, mapView, shadow, when); } public boolean getDrawStartEnd() { return drawStartEnd; } public void setDrawStartEnd(boolean markStartEnd) { drawStartEnd = markStartEnd; } } }
我希望谷歌没有停止支持他们logging的KML,恕不另行通知。
我现在使用他们的xml输出将我的代码迁移到Google Places API。
– 我刚编辑我的答案 –
让我们面对它,谷歌已经改变了他们的系统,我们必须遵循他们
所以让我们使用JSON或XML
🙂
– 编辑第二部分 –
我刚刚find最好的解决scheme,它使用JSON和parsing成折线,所以我们可以做到!
Google Maps API版本的差异
我发现像以前一样使用标准的Google地图链接获取KML
输出。
看来,谷歌分析引用这样的链接,如果它是https://code.google.com
那么它将生成KML
附件,而不是显示地图。
所以,首先,您需要在https://code.google.com
上制作一个项目。 然后在你的路线中留下一个问题。
现在,您可以点击链接并获取KML
附件。
至于Android现在我正在使用:
Intent myIntent = new Intent( android.content.Intent.ACTION_VIEW, Uri.parse( "geo:0,0?q="+ lat +","+ lon ) ); startActivity(myIntent);
我觉得在iOS中应该有这样的东西。