- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序出现问题..使用 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(" ", " "));
}
}
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);
}
}
}
}
最佳答案
我已经找到解决方案了..创建的节点列表 <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(" ", " "));
}
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/
我有一个如下所示的数据框: import pandas as pd d = {'decil': ['1. decil','1. decil','2. decil','2. decil','3. dec
我有一些数据想要添加到我的应用中...大约 650 个类别(包括名称 + ID 号),每个类别平均有 85 个项目(每个都有一个名称/ID 号)。 iPhone会支持这么大的plist吗?我想首先在
我目前正在使用 Python 从头开始实现决策树算法。我在实现树的分支时遇到了麻烦。在当前的实现中,我没有使用深度参数。 发生的情况是,要么分支结束得太快(如果我使用标志来防止无限递归),要么如果
我在 Stack 上发现了这个问题 - Measuring the distance between two coordinates in PHP 这个答案在很多方面似乎对我来说都是完美的,但我遇到了
我目前正在清理一个具有 2 个索引和 2.5 亿个事件行以及大约同样多(或更多)的死行的表。我从我的客户端计算机(笔记本电脑)向我的服务器发出命令 VACCUM FULL ANALYZE。在过去的 3
这一切都有点模糊,因为该计划是相当深入的,但坚持我,因为我会尽量解释它。我编写了一个程序,它接受一个.csv文件,并将其转换为MySQL数据库的INSERT INTO语句。例如: ID Numbe
我有一个地址示例:0x003533,它是一个字符串,但要使用它,我需要它是一个 LONG,但我不知道该怎么做:有人有解决方案吗? s 字符串:“0x003533”到长 0x003533 ?? 最佳答案
请保持友善 - 这是我的第一个问题。 =P 基本上作为一个暑期项目,我一直在研究 wikipedia page 上的数据结构列表。并尝试实现它们。上学期我参加了 C++ 类(class),发现它非常有
简单的问题。想知道长 IN 子句是否是一种代码味道?我真的不知道如何证明它。除了我认为的那样,我不知道为什么它会闻起来。 select name, code, capital, pop
我正在尝试基于 C# 中的种子生成一个数字。唯一的问题是种子太大而不能成为 int32。有什么方法可以像种子一样使用 long 吗? 是的,种子必须很长。 最佳答案 这是我移植的 Java.Util.
我一直想知道这个问题有一段时间了。在 CouchDB 中,我们有一些相当的日志 ID……例如: “000ab56cb24aef9b817ac98d55695c6a” 现在,如果我们正在搜索此项目并浏览
列的虚拟列 c和一个给定的值 x等于 1如果 c==x和 0 其他。通常,通过为列创建虚拟对象 c , 一排除一个值 x选择,因为最后一个虚拟列不添加任何信息 w.r.t.已经存在的虚拟列。 这是我如
使用 tarantool,为什么我要记录这些奇怪的消息: 2016-03-24 16:19:58.987 [5803] main/493623/http/XXX.XXX.XXX.XXX:57295 t
我显然是 GitHub 的新手,想确保在开始之前我做的事情是正确的。 我想创建一个新的存储库,它使用来自 2 个现有项目的复刻/克隆。现有项目不是我的。 假设我想使用的 repo 被称为来自开发人员“
我的应用程序名称长度为 17 个字符。当安装在设备上时,它看起来像应用程序...名称。有没有办法在多行上显示应用程序名称?请帮忙。 最佳答案 不,你不能。我认为 iPad 支持 15 个字符来完整显示
我必须编写一个程序来读取文件中的所有单词,并确定每个单词使用了多少次。我的任务是使用多线程来加快运行时间,但是单线程程序的运行速度比多线程程序快。我曾尝试研究此问题的解决方案,但很多解释只会让我更加困
假设我在给定的范围内有一个位置pos,这样: 0 = newRange*newRange : "Case not supported yet"; // Never happens in my code
我试图在 Java 中将 unix 时间四舍五入到该月的第一天,但没有成功。示例: 1314057600 (Tue, 23 Aug 2011 00:00:00 GMT) 至 1312156800
我们的项目有在 CVS 中从现有分支创建新分支的历史。几年后,这导致了每次发布时更改的文件上的这种情况: 新版本:1.145.4.11.2.20.2.6.2.20.2.1.2.11.2.3.2.4.4
我有以下数据框: DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday') DAYS
我是一名优秀的程序员,十分优秀!