[英]Error when drawing route between two GeoPoints on Android MapView?
我正在使用此方法在應用程序中的地圖上的兩個點之間繪制路線
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();
}
}
此方法可以正常工作(從最近三個月開始)以繪制路徑,但是大約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)
我不明白是什么問題? 有什么幫助嗎?
提前致謝。
看到此鏈接絕對可以幫助您。 因為自2012年7月27日起,通過解析KML文件提供的來自Google的Google Directions不再可用(由於Google更改了Google Directions的檢索結構,現在您只能通過JSON或XML來獲取它),現在該遷移代碼了JSON而不是KML。
如果您的目的僅是繪制兩個地理位置之間的路徑,則可以使用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);
好吧,根據“異常”,您正在讀取的某些XML中存在錯誤( unterminated entity ref
)。 我想您要繪制的點是從該XML中讀取的,並且顯然該XML中存在錯誤(因為可能大約15天)。 如果可能的話,請在編輯器中打開XML,然后查找<ref>
沒有匹配的</ref>
。
然后,您有兩個選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.