我的应用程序中出现问题..
使用 XML文件我得到了地理位置来绘制两个位置之间的路径..但它只显示了距离小于300公里的路线.
否则它没有绘制完整的路径..
使用 XML文件我得到了地理位置来绘制两个位置之间的路径..但它只显示了距离小于300公里的路线.
否则它没有绘制完整的路径..
任何解决方案,用于将xml文件分成块或任何替代方案.因为它给出的方向即使对于长距离也是完美的……那么问题是什么?我不明白..
请帮忙..
编辑:
我发现KML文件中存在问题.
如果有一个很长的距离,它提供两个线串标签,每个都有坐标列表,全路径分为几个部分.如下
<&的GeometryCollection GT;
<线段形式>
<坐标> 70.799640,22.283370,…< /坐标>
< /线段形式>
<线段形式>
<坐标> 73.005940,21.536300,….< /坐标>
< /线段形式>
< /&的GeometryCollection GT;
这就是为什么它只会在字符串的后半部分在地图上绘制一条路线.
所以..任何人都知道如何解决这个问题..
编辑: –
public class DrivingDirectionsGoogleKML extends DrivingDirections { @Override protected void startDrivingTo (GeoPoint startPoint,GeoPoint endPoint,Mode mode,IDirectionsListener listener) { new LoadDirectionsTask(startPoint,endPoint).execute(mode); } private class LoadDirectionsTask extends AsyncTask<Mode,Void,RouteImpl> { private static final String BASE_URL = "http://maps.google.com/maps?f=d&hl=en"; private static final String ELEMENT_PLACEMARK = "Placemark"; private static final String ELEMENT_NAME = "name"; private static final String ELEMENT_DESC = "description"; private static final String ELEMENT_POINT = "Point"; private static final String ELEMENT_ROUTE = "Route"; private static final String ELEMENT_GEOM = "GeometryCollection"; private GeoPoint startPoint; private GeoPoint endPoint; public LoadDirectionsTask (GeoPoint startPoint,GeoPoint endPoint) { this.startPoint = startPoint; this.endPoint = endPoint; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected RouteImpl doInBackground(Mode... params) { // Connect to the Google Maps web service that will return a KML string // containing the directions from one point to another. // StringBuilder urlString = new StringBuilder(); urlString .append(BASE_URL) .append("&saddr=") .append(startPoint.getLatitudeE6() / 1E6) .append(",") .append(startPoint.getLongitudeE6() / 1E6) .append("&daddr=") .append(endPoint.getLatitudeE6() / 1E6) .append(",") .append(endPoint.getLongitudeE6() / 1E6) .append("&ie=UTF8&0&om=0&output=kml"); if (params[0] == Mode.WALKING) { urlString.append("&dirflg=w"); } RouteImpl route = null; try { URL url = new URL (urlString.toString()); Log.i("-------- Url",url.toString()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.setDoInput(true); connection.connect(); route = parseResponse (connection.getInputStream()); } catch (Exception e) { route = null; } return route; } private RouteImpl parseResponse(InputStream inputStream) throws Exception { // Parse the KML file returned by the Google Maps web service // using the default XML DOM parser. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); NodeList placemarkList = document.getElementsByTagName(ELEMENT_PLACEMARK); // Get the list of placemarks to plot along the route. List<Placemark> placemarks = new ArrayList<Placemark>(); for (int i = 0; i < placemarkList.getLength(); i++) { PlacemarkImpl placemark = parsePlacemark (placemarkList.item(i)); if (placemark != null) { placemarks.add(placemark); } } // Get the route defining the driving directions. RouteImpl route = parseRoute (placemarkList); route.setPlacemarks(placemarks); return route; } private PlacemarkImpl parsePlacemark(Node item) { PlacemarkImpl placemark = new PlacemarkImpl (); boolean isRouteElement = false; NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_NAME)) { String name = node.getFirstChild().getNodeValue(); if (name.equals(ELEMENT_ROUTE)) { isRouteElement = true; } else { isRouteElement = false; placemark.setInstructions(name); } } else if (node.getNodeName().equals(ELEMENT_DESC)) { if (!isRouteElement) { String distance = node.getFirstChild().getNodeValue(); placemark.setDistance(distance.substring(3).replace(" "," ")); } } else if (node.getNodeName().equals(ELEMENT_POINT)) { if (!isRouteElement) { String coords = node.getFirstChild().getFirstChild().getNodeValue(); String[] latlon = coords.split(","); placemark.setLocation(new GeoPoint ((int) (Double.parseDouble(latlon[1]) * 1E6),(int) (Double.parseDouble(latlon[0]) * 1E6))); } } } return isRouteElement ? null : placemark; } private RouteImpl parseRoute(NodeList placemarkList) { RouteImpl route = null; for (int i = 0; i < placemarkList.getLength(); i++) { // Iterate through all the <Placemark> KML tags to find the one // whose child <name> tag is "Route". // Node item = placemarkList.item(i); NodeList children = item.getChildNodes(); for (int j = 0; j < children.getLength(); j++) { Node node = children.item(j); if (node.getNodeName().equals(ELEMENT_NAME)) { String name = node.getFirstChild().getNodeValue(); if (name.equals(ELEMENT_ROUTE)) { route = parseRoute (item); break; } } } } return route; } private RouteImpl parseRoute(Node item) { RouteImpl route = new RouteImpl (); NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_DESC)) { // Get the value of the <description> KML tag. String distance = node.getFirstChild().getNodeValue(); route.setTotalDistance(distance.split("<br/>")[0].substring(10).replace(" "," ")); } else if (node.getNodeName().equals(ELEMENT_GEOM)) //Here Reading Co-Ordinates../// { String path = node.getFirstChild().getFirstChild().getFirstChild().getNodeValue(); String[] pairs = path.split(" "); // For each coordinate,get its {latitude,longitude} values and add the corresponding geographical point to the route. List<GeoPoint> geoPoints = new ArrayList<GeoPoint>(); for (int p = 0; p < pairs.length; p++) { String[] coords = pairs[p].split(","); GeoPoint geoPoint = new GeoPoint ((int) (Double.parseDouble(coords[1]) * 1E6),(int) (Double.parseDouble(coords[0]) * 1E6)); geoPoints.add (geoPoint); } route.setGeoPoints(geoPoints); } } return route; } protected void onPostExecute (RouteImpl route) { if (route == null) { DrivingDirectionsGoogleKML.this.onDirectionsNotAvailable(); } else { DrivingDirectionsGoogleKML.this.onDirectionsAvailable(route); } } } }
解决方法
我找到了解决方案..
创建的NodeList
<&的GeometryCollection GT; ….< /&的GeometryCollection GT;
它将提供两个地点之间的所有坐标..
创建的NodeList
<&的GeometryCollection GT; ….< /&的GeometryCollection GT;
它将提供两个地点之间的所有坐标..
private RouteImpl parseRoute(Node item) { RouteImpl route = new RouteImpl (); NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_DESC)) { // Get the value of the <description> KML tag. // String distance = node.getFirstChild().getNodeValue(); route.setTotalDistance(distance.split("<br/>")[0].substring(10).replace(" "," ")); } else if (node.getNodeName().equals(ELEMENT_GEOM)) { // Get the space-separated coordinates of the geographical points defining the route. // List<GeoPoint> geoPoints = new ArrayList<GeoPoint>(); // Create a NodeList here .. NodeList geoMetryChildren = node.getChildNodes(); for(int k=0;k<geoMetryChildren.getLength();k++) { Node geoMetryChildrenNode = geoMetryChildren.item(k); String path = geoMetryChildrenNode.getFirstChild().getFirstChild().getNodeValue(); String[] pairs = path.split(" "); for (int p = 0; p < pairs.length; p++) { String[] coords = pairs[p].split(","); GeoPoint geoPoint = new GeoPoint ((int) (Double.parseDouble(coords[1]) * 1E6),(int) (Double.parseDouble(coords[0]) * 1E6)); geoPoints.add (geoPoint); } } route.setGeoPoints(geoPoints); } } return route; }