gpt4 book ai didi

使用 XML 解析在 MapView 上绘制长路径的 Android 问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:43 25 4
gpt4 key购买 nike

我的应用程序出现问题..使用 XML 文件我正在获取地理点来绘制两个位置之间的路径..但​​它只显示距离小于 300 公里的路线..否则它不会绘制完整路径..

将 xml 文件分成 block 的任何解决方案..或任何替代方案..因为它给出的方向即使对于长距离也是完美的...那么问题是什么?我无法理解..

请帮忙..

编辑:我发现 KML 文件有问题。 如果距离很长,它会提供两行字符串标签,每个字符串标签都有完整路径的坐标列表,分为多个部分。如下

<GeometryCollection>
<LineString>
<coordinates> 70.799640,22.283370,... </coordinates> </LineString>
<LineString>
<coordinates> 73.005940,21.536300,.... </coordinates> </LineString>
</GeometryCollection>

这就是为什么它将仅在字符串的后半部分的 map 上绘制路线。所以..任何人都知道如何解决这个问题..

已编辑:-

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("&#160;", " "));
}
}
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("&#160;", " "));
}
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);
}
}
}
}

最佳答案

我已经找到解决方案了..创建的节点列表 <GeometryCollection>....</GeometryCollection>它将提供两个位置之间的所有坐标..

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("&#160;", " "));
}
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;
}

关于使用 XML 解析在 MapView 上绘制长路径的 Android 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5298418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com