2012-07-27 131 views
16

全部谷歌地圖輸出= 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返回。顯然....

感謝, MBH

+0

與我的KML地圖同樣的問題。我認爲,我們已經改用XML或JSON .. – iosfanboy9 2012-07-27 09:02:13

+0

哦,我的上帝,在大學的我的最終測試,現在KML不工作,截止日期是一個周!! :(( 如何,我該做的??? – sephtian 2012-07-27 10:48:24

+2

谷歌剛剛更改設置這一天,看到https://developers.google.com/maps/documentation/directions/在頁面的最後,天哪! – sephtian 2012-07-27 11:43:31

回答

3

我希望谷歌並沒有停止他們的支持KML文件,恕不另行通知。

我現在使用他們的xml輸出將我的代碼遷移到google位置API。

https://developers.google.com/places/documentation/

+0

在哪裏的KML輸出記錄?我從來沒有見過它記錄... – barryhunter 2012-07-27 22:36:07

+0

有它被清楚地記錄的頁面。2011年初是當我看到它最後,該網頁已不存在。 – mbh 2012-07-27 23:23:07

+0

是它在mapki.com?這不是官方的文件。人們擁有什麼能夠逆向工程。 – barryhunter 2012-07-28 14:35:04

0

至於Android現在我使用:

Intent myIntent = 
new Intent(android.content.Intent.ACTION_VIEW, 
Uri.parse("geo:0,0?q="+ lat +","+ lon));     
startActivity(myIntent); 

我覺得應該有類似的東西在的iOS。

1

-Well我剛編輯我的答案 -

讓我們面對它,谷歌已經改變自己的SISTEM,我們要跟着他們

因此讓使用JSON或XML

:)

- 已編輯的第二部分 -

我剛剛找到最佳解決方案,它使用JSON並解析爲折線,因此我們可以做到!

Google Maps API Version difference

7

谷歌改變了一些東西,現在shows major turns only。但是,使用JSON的時候,它的顯示正確的路徑:

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

肯定的,但XML協調不完整的XML – sephtian 2012-08-01 06:48:01

+0

ya..it纔剛剛表示主要匝..我尋找一些解決方案..和阿洛斯郵寄過這GOOGEL .. http://code.google.com/p/ gmaps-api-issues/issues/detail?id = 4321 – 2012-08-02 07:31:27

+0

好吧,我剛剛編輯了我的代碼並正確使用了json及其顯示路徑。 – 2012-08-06 09:11:45

8

通過解析KML文件中提取來自谷歌的谷歌地圖的這種方法不再可用自2012年7月27日(因爲谷歌已經改變檢索谷歌的結構方向,現在只能通過JSON或XML獲取),現在可以將代碼遷移到JSON而不是KML。

在我自己的問題here中查看答案(僅適用於Android,但也許iPhone可以理解算法並應用它)。

0

我發現像以前一樣使用標準谷歌地圖鏈接獲取KML輸出。

看來,谷歌分析引用這種鏈接,如果它是https://code.google.com那麼它將生成KML附件,而不是顯示地圖。

因此,首先,您需要在https://code.google.com上製作一個項目。 然後在評論中提出路由問題。

現在,您可以點擊鏈接,並得到KML附件。

enter image description here