1

このメソッドを使用して、アプリケーションでマップ上の 2 点間のルートを描画しています

 private void DrawPath(GeoPoint src, GeoPoint dest, int color,
          MapView mMapView01) {


        // connect to map web service
        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps?f=d&hl=en");
        urlString.append("&saddr=");//from
        urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
        urlString.append(",");
        urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
        urlString.append("&daddr=");//to
        urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
        urlString.append(",");
        urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
        urlString.append("&ie=UTF8&0&om=0&output=kml");
        Log.d("xxx","URL="+urlString.toString());


        try
        {
          URL url = new URL(urlString.toString());
          urlString = null;
          HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
          urlConnection.setRequestMethod("GET");
          urlConnection.setDoOutput(true);
          urlConnection.setDoInput(true);
          urlConnection.connect();

          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(urlConnection.getInputStream());

          if(doc.getElementsByTagName("GeometryCollection").getLength()>0)
          {

            String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ;
            Log.d("xxx","path="+ path);
            String [] pairs = path.split(" ");
            String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
            // src
            GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));

            GeoPoint gp1;
            GeoPoint gp2 = startGP;



            for(int i=1;i<pairs.length;i++) // the last one would be crash
            {
              lngLat = pairs[i].split(",");
              gp1 = gp2;
              // watch out! For GeoPoint, first:latitude, second:longitude
              gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));



              mapRouteOverlay = new MapRouteOverlay(gp1,gp2,2,color);

              mMapView01.getOverlays().add(mapRouteOverlay);
              Log.d("xxx","pair:" + pairs[i]);
              Log.e("Check  ","Draw  " + mapRouteOverlay);
            }

          }
        }
        catch (MalformedURLException e)
        {
          e.printStackTrace();
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
        catch (ParserConfigurationException e)
        {
          e.printStackTrace();
        }
        catch (SAXException e)
        {
          e.printStackTrace();
        }


      }

このメソッドはパスを描画するために (過去 3 か月から) 正常に機能していますが、約 15 日間で問題が発生し、パスが表示/描画されません。

私のlogcat出力は

 08-11 10:15:47.363: W/System.err(401): org.xml.sax.SAXParseException: unterminated entity ref (position:ENTITY_REF &@1:808 in java.io.InputStreamReader@44f9cde8) 
 08-11 10:15:47.373: W/System.err(401):     at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:153)
 08-11 10:15:47.373: W/System.err(401):     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:110)
 08-11 10:15:47.373: W/System.err(401):     at com.map.MapMainActivity.DrawPath(MapMainActivity.java:621)
 08-11 10:15:47.373: W/System.err(401):     at com.map.MapMainActivity.getDirection(MapMainActivity.java:582)
 08-11 10:15:47.373: W/System.err(401):     at com.map.MapMainActivity$DownloadWebPageTask.onPostExecute(MapMainActivity.java:1318)
 08-11 10:15:47.373: W/System.err(401):     at com.map.MapMainActivity$DownloadWebPageTask.onPostExecute(MapMainActivity.java:1)
 08-11 10:15:47.373: W/System.err(401):     at android.os.AsyncTask.finish(AsyncTask.java:417)
 08-11 10:15:47.373: W/System.err(401):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
 08-11 10:15:47.373: W/System.err(401):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
 08-11 10:15:47.373: W/System.err(401):     at android.os.Handler.dispatchMessage(Handler.java:99)
 08-11 10:15:47.373: W/System.err(401):     at android.os.Looper.loop(Looper.java:123)
 08-11 10:15:47.383: W/System.err(401):     at android.app.ActivityThread.main(ActivityThread.java:4627)
 08-11 10:15:47.383: W/System.err(401):     at java.lang.reflect.Method.invokeNative(Native Method)
 08-11 10:15:47.383: W/System.err(401):     at java.lang.reflect.Method.invoke(Method.java:521)
 08-11 10:15:47.383: W/System.err(401):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 08-11 10:15:47.383: W/System.err(401):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 08-11 10:15:47.383: W/System.err(401):     at dalvik.system.NativeStart.main(Native Method)

何が問題なのか理解できませんでしたか?助けはありますか?

前もって感謝します。

4

3 に答える 3

6

このリンクを参照してください。KML ファイルの解析による Google からの Google ルート案内は 2012 年 7 月 27 日以降利用できなくなったため (Google が Google ルート案内を取得する構造を変更したため、現在は JSON または XML でのみ取得できます)、コードを移行する時が来ました。 KML の代わりに JSON に。

于 2012-08-13T06:48:41.260 に答える
4

2つのジオポイント間のパスを描画することだけが目的の場合は、Androidの内部マップアクティビティを使用できます。簡単で、エラーが発生するオーバーヘッドはありません。

String uri = "http://maps.google.com/maps?saddr=" + currentLatitude+","+currentLongitude+"&daddr="+fixedLatitude+","+fixedLongitude;
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
于 2012-08-11T05:15:14.230 に答える
2

さて、例外によると、unterminated entity refあなたが読んでいるいくつかのXMLにエラー()があります。描画したいポイントはそのXMLから読み取られ、明らかにそのXMLにエラーがあると思います(おそらく約15日なので)。可能であれば、エディターでXMLを開き、<ref>一致するものがないものを探します</ref>

次に、2つのオプションがあります。

  1. XMLを生成するプログラムの問題を修正します
  2. アプリでSAXParserExceptionをキャッチし、エラーポイントをスキップしてみてください。
于 2012-08-13T06:33:22.733 に答える