【问题标题】:Google Maps output=kml broken?谷歌地图输出=公里坏了?
【发布时间】:2012-07-25 17:20:55
【问题描述】:

全部

我在我的 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

【问题讨论】:

  • 我的 KML 地图也有同样的问题。我认为我们必须切换到 XML 或 JSON ......
  • 天哪,这是我大学的期末考试,现在kml不行了,截止日期是一周!! :((我该怎么做???
  • google这天刚改了设置,见页尾developers.google.com/maps/documentation/directions,天哪!
  • Issue 4321 已在 gmaps-api-issues 列表中打开,可能会在那里获得一些官方反馈(如果您有兴趣,请标记该问题)。
  • 试试这个,效果很好stackoverflow.com/questions/11323500/…

标签: iphone google-maps kml


【解决方案1】:

至于我现在使用的Android:

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

我认为 iOS 中应该有类似的东西。

【讨论】:

    【解决方案2】:

    -我刚刚编辑了我的答案-

    让我们面对现实吧,谷歌已经改变了他们的系统,我们必须关注他们

    让我们使用 JSON 或 XML

    :)

    --编辑第二部分--

    我刚刚找到了最好的解决方案,它使用 JSON 并解析成折线,所以我们可以做到!

    Google Maps API Version difference

    【讨论】:

      【解决方案3】:

      我希望 Google 没有在没有通知的情况下停止支持他们记录在案的 KML。

      我现在使用他们的 xml 输出将我的代码迁移到 Google Places API。

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

      【讨论】:

      • 有一个页面清楚地记录了它。 2011 年初是我最后一次看到它的时候。该页面不再可用。
      • 在 mapki.com 上吗?那不是官方文件。正是人们能够逆向工程的东西。
      • 我认为 Google Places 不再支持 KML(仅 XML 和 JSON),Google 更改了他们的文档,8 月 1 日。很高兴您选择了 XML。
      【解决方案4】:

      Google 改变了一些东西,现在是 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;
          }
      }
      }
      

      【讨论】:

      • 是的..它只显示主要转折..我正在寻找一些解决方案..并且alos通过这个邮寄了googel..code.google.com/p/gmaps-api-issues/issues/detail?id=4321
      • 好吧..我刚刚编辑了我的代码并现在使用 json 并且它的显示路径正确。
      • 什么是地理点?我得到了GeoPoint cannot be resolved to a type。我的项目不是安卓。 Java 谷歌地图网络应用程序。请帮帮我。以前它与kml一起工作。当我仅转换为 JSON 时,我面临同样的问题。请
      • 很抱歉,我还没有在网络应用程序上工作过。使用谷歌提供的 API 在 android 上工作。
      【解决方案5】:

      从 2012 年 7 月 27 日起,这种通过解析 KML 文件从 Google 中提取 Google 路线的方式不再可用(因为 Google 更改了检索 Google 路线的结构,现在您只能通过 JSON 或 XML 获取),它是时候将您的代码迁移到 JSON 而不是 KML。

      在我自己的问题here 中查看答案(仅适用于 Android,但也许 iPhone 可以理解并应用该算法)。

      【讨论】:

        【解决方案6】:

        我找到了获得KML 输出的方法,就像以前使用标准谷歌地图链接获取路线一样。

        谷歌似乎分析了此类链接的引用者,如果它是https://code.google.com,那么它将生成KML 附件而不是显示地图。

        所以,首先,您需要在https://code.google.com 上创建一个项目。 然后在评论中对您的路由链接提出问题。

        现在您可以点击链接并获取KML 附件。

        【讨论】:

          【解决方案7】:

          【讨论】:

          • aaa 又死了:(
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2018-12-30
          • 1970-01-01
          • 1970-01-01
          • 2017-05-19
          • 1970-01-01
          相关资源
          最近更新 更多