我编写了一个应用程序来帮助人们找到合适的位置并显示目标的方向。以前,此功能运行良好,但现在绘制路线功能不起作用。我得到的例外是应用程序无法下载然后解析与路由对应的kml(代码:xmlreader.parse(is);),尽管生成的获取KML的URL是正确的(我在浏览器中测试它) - 对于示例:https ://maps.google.com/maps?f=d&hl=en&saddr=21.04664,105.852203&daddr=21.040527,105.849783&ie=UTF8&om=0&output=kml
我问自己 Google 的 MapView 方向 API 是否无法正常工作,或者我错过了一些东西。
这是我获取路线然后生成 URL 的代码 - 获取 KML 然后绘制路线。
public void drawPath(GeoPoint from,GeoPoint to, int color, MapView mMapView01) {
NavigationDataSet navSet= new NavigationDataSet();
StringBuilder urlString = new StringBuilder();
urlString.append("http://maps.google.com/maps?f=d&hl=en");
urlString.append("&saddr=");//from
urlString.append( Double.toString((double)from.getLatitudeE6()/1.0E6 ));
urlString.append(",");
urlString.append( Double.toString((double)from.getLongitudeE6()/1.0E6 ));
urlString.append("&daddr=");//to
urlString.append( Double.toString((double)to.getLatitudeE6()/1.0E6 ));
urlString.append(",");
urlString.append( Double.toString((double)to.getLongitudeE6()/1.0E6 ));
urlString.append("&ie=UTF8&0&om=0&output=kml");
Log.v("TEST", urlString.toString());
try{
// setup the url
URL url = new URL(urlString.toString());
// get our data via the url class
InputSource is = new InputSource(url.openConnection().getInputStream());
// DocumentBuilderFactory dbfAdd = DocumentBuilderFactory.newInstance();
// DocumentBuilder dbAdd = dbfAdd.newDocumentBuilder();
// dbAdd.parse(url.toString());
// create the factory
SAXParserFactory factory = SAXParserFactory.newInstance();
// create a parser
SAXParser parser = factory.newSAXParser();
// create the reader (scanner)
XMLReader xmlreader = parser.getXMLReader();
// instantiate our handler
NavigationSaxHandler navSaxHandler = new NavigationSaxHandler();
// assign our handler
xmlreader.setContentHandler(navSaxHandler);
// perform the synchronous parse
xmlreader.parse(is);
// get the results - should be a fully populated RSSFeed instance, or null on error
navSet= navSaxHandler.getParsedData();
Log.v("MAP", "input source: " + (is == null));
} catch(Exception e) {
// Log.d("DirectionMap","Exception parsing kml.");
Log.v("DRAW", "Die here");
e.printStackTrace();
}
try {
String distance = navSet.getRoutePlacemark().getDistance();
placeLabelTextView.setText(placeLabel + distance);
} catch (Exception e) {
// TODO: handle exception
}
//hien thi duong di
Log.v("MAP",(navSet.getCurrentPlacemark() != null) + "-des: ");
String path = navSet.getRoutePlacemark().getCoordinates();
String[] pairs = path.trim().split(" ");
String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
try {
GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
mMapView01.getOverlays().add(new MyOverLay(startGP, startGP, 1));
GeoPoint gp1;
GeoPoint gp2 = startGP;
int w = (int) (5 * ShowPlaceOnMapsActivity.this.getResources().getDisplayMetrics().density);
for (int i = 1; i < pairs.length; i++) // the last one would be crash
{
lngLat = pairs[i].split(",");
gp1 = gp2;
gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
mMapView01.getOverlays().add(new MyOverLay(gp1, gp2, 2, color,w));
}
mMapView01.getOverlays().add(new MyOverLay(gp2, gp2, 3));
//hien thi cac chi dan
List<Overlay> mapOverlays;
mapOverlays=mMapView01.getOverlays();
String s=new String();
String description=new String();
String name=new String();
Placemark p=new Placemark();
Drawable drawable1=mMapView01.getResources().getDrawable(R.drawable.way_turn_mark);
MyItemizedOverlay itemizedOverlay1 = new MyItemizedOverlay(drawable1, mMapView01);
for (Iterator<Placemark> iter=navSet.getPlacemarks().iterator();iter.hasNext();) {
p = (Placemark)iter.next();
if(!p.getTitle().equals("Route")){
s=p.getCoordinates();
description=p.getDescription();
// Log.v("TEST", "URL: " + p.getAddress());
name=p.getTitle();
lngLat =s.split(",");
gp2= new GeoPoint((int) (Double.parseDouble(lngLat[1])* 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
if(description != null)
itemizedOverlay1.addOverlay(new OverlayItem(gp2,name+"\n"+description,""));
else
itemizedOverlay1.addOverlay(new OverlayItem(gp2, name, ""));
}
}
mapOverlays.add(itemizedOverlay1);
mapController.animateTo(new GeoPoint( (startGP.getLatitudeE6() + gp2.getLatitudeE6())/2, (startGP.getLongitudeE6() + gp2.getLongitudeE6())/2 ));
} catch (NumberFormatException e) {
}
}
我得到的代码例外是:
xmlreader.parse(is);
org.apache.harmony.xml.ExpatParser$ParseException:....... not well-formed
你遇到过这个问题吗?非常感谢任何帮助和评论。
这是异常堆栈跟踪
07-30 22:06:03.510: VERBOSE/TEST(234): http://maps.google.com/maps?f=d&hl=en&saddr=21.059457,105.843963&daddr=21.052597,105.840636&ie=UTF8&0&om=0&output=kml
07-30 22:06:04.190: VERBOSE/DRAW(234): Die here
07-30 22:06:04.190: WARN/System.err(234): org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 805: not well-formed (invalid token)
07-30 22:06:04.210: WARN/System.err(234): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:508)
07-30 22:06:04.210: WARN/System.err(234): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
07-30 22:06:04.210: WARN/System.err(234): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
07-30 22:06:04.210: WARN/System.err(234): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:302)
07-30 22:06:04.210: WARN/System.err(234): at hust.se.vtio.icompanion.ShowPlaceOnMapsActivity.drawPath(ShowPlaceOnMapsActivity.java:301)
07-30 22:06:04.210: WARN/System.err(234): at hust.se.vtio.icompanion.ShowPlaceOnMapsActivity.onOptionsItemSelected(ShowPlaceOnMapsActivity.java:245)
07-30 22:06:04.210: WARN/System.err(234): at android.app.Activity.onMenuItemSelected(Activity.java:2170)
07-30 22:06:04.210: WARN/System.err(234): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730)
07-30 22:06:04.210: WARN/System.err(234): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
07-30 22:06:04.210: WARN/System.err(234): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
07-30 22:06:04.210: WARN/System.err(234): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:525)
07-30 22:06:04.220: WARN/System.err(234): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
07-30 22:06:04.220: WARN/System.err(234): at android.view.View.onTouchEvent(View.java:4179)
07-30 22:06:04.220: WARN/System.err(234): at android.widget.TextView.onTouchEvent(TextView.java:6540)
07-30 22:06:04.220: WARN/System.err(234): at android.view.View.dispatchTouchEvent(View.java:3709)
07-30 22:06:04.220: WARN/System.err(234): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
07-30 22:06:04.220: WARN/System.err(234): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
07-30 22:06:04.220: WARN/System.err(234): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
07-30 22:06:04.220: WARN/System.err(234): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
07-30 22:06:04.220: WARN/System.err(234): at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 22:06:04.220: WARN/System.err(234): at android.os.Looper.loop(Looper.java:123)
07-30 22:06:04.220: WARN/System.err(234): at android.app.ActivityThread.main(ActivityThread.java:4363)
07-30 22:06:04.220: WARN/System.err(234): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 22:06:04.220: WARN/System.err(234): at java.lang.reflect.Method.invoke(Method.java:521)
07-30 22:06:04.220: WARN/System.err(234): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-30 22:06:04.220: WARN/System.err(234): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-30 22:06:04.220: WARN/System.err(234): at dalvik.system.NativeStart.main(Native Method)
这是我在浏览器中打开 URL 时得到的 KML 内容
这是我从浏览器获得的 KML 文件的内容:
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<name>Driving directions to 21.052597,105.840636</name>
<description><![CDATA[]]></description>
<Style id="style3">
<IconStyle>
<Icon>
<href></href>
</Icon>
</IconStyle>
</Style>
<Style id="style2">
<LineStyle>
<color>73FF0000</color>
<width>5</width>
</LineStyle>
</Style>
<Style id="style1">
<IconStyle>
<Icon>
<href></href>
</Icon>
</IconStyle>
</Style>
<Placemark>
<name>From: 21.059457,105.843963</name>
<styleUrl>#style3</styleUrl>
<Point>
<coordinates>105.842567,21.058840,0.000000</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Driving directions to 21.052597,105.840636</name>
<styleUrl>#style2</styleUrl>
<ExtendedData>
<Data name="_SnapToRoads">
<value>true</value>
</Data>
</ExtendedData>
<LineString>
<tessellate>1</tessellate>
<coordinates>
105.842567,21.058840,0.000000
105.842346,21.059200,0.000000
105.841080,21.060551,0.000000
105.840530,21.061300,0.000000
105.840393,21.061399,0.000000
105.839653,21.061701,0.000000
105.839653,21.061701,0.000000
105.838860,21.061159,0.000000
105.838860,21.061159,0.000000
105.838852,21.061050,0.000000
105.838409,21.060699,0.000000
105.838409,21.060699,0.000000
105.838692,21.059879,0.000000
105.840950,21.055691,0.000000
105.840950,21.055691,0.000000
105.840477,21.055571,0.000000
105.839493,21.054930,0.000000
105.839493,21.054930,0.000000
105.839981,21.054060,0.000000
105.840553,21.052561,0.000000
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>To: 21.052597,105.840636</name>
<styleUrl>#style1</styleUrl>
<Point>
<coordinates>105.840546,21.052563,0.000000</coordinates>
</Point>
</Placemark>
</Document>
</kml>