Java 将google地图航路点方向转换为via方向
我正在尝试将谷歌地图方向的URL从具有多个航路点的方向更改为删除这些中间航路点但路线保持不变的方向 具体来自: 致: 编辑:因为我必须在第二个URL中手动拖动路线,中间标记的坐标与第一个URL中的坐标不完全相同;这种差异可以忽略。 这些URL的开始部分看起来很明显,但数据参数对我来说仍然不清楚(没有它,路由就不正确)。我尝试了GoogleMapsAPI,但这些API返回一个XML或JSON文件,但我只需要相应的URL,我也可以使用GoogleMaps的webinterface获得相应的URL 如何将第一个URL转换为第二个???根据,在旧的URL方案中,应该有3种方式来添加通过点或路由,它们是: 但他们似乎放弃了对mrad和via的支持。对于使用to,它会显示地址,就像在新的url方案中显示一样 对于新的URL方案。。它似乎没有太多的文档,所以我不确定谷歌是否想让你玩它。但是这里是:如何用新方案做到这一点 根据:Java 将google地图航路点方向转换为via方向,java,google-maps,Java,Google Maps,我正在尝试将谷歌地图方向的URL从具有多个航路点的方向更改为删除这些中间航路点但路线保持不变的方向 具体来自: 致: 编辑:因为我必须在第二个URL中手动拖动路线,中间标记的坐标与第一个URL中的坐标不完全相同;这种差异可以忽略。 这些URL的开始部分看起来很明显,但数据参数对我来说仍然不清楚(没有它,路由就不正确)。我尝试了GoogleMapsAPI,但这些API返回一个XML或JSON文件,但我只需要相应的URL,我也可以使用GoogleMaps的webinterface获得相应的URL
!xx
,是一个分隔符。查看您的url:
data=
!4m9
!4m8
!1m5
!3m4
!1m2
!1d5.7971218
!2d51.8060231
!3s0x47c7061292e15b39:0x4d7bcd7484c71cf3
!1m0
!3e2
确实不清楚它在做什么,但至少我们在中看到了您的via lat和via lng!1d
和!2d
字段;
还有!3s
,十六进制格式,看起来像某种lat/lng,可能是搜索区域。这是在dec5172109373901724473:55832820633383403763
简言之,只需更改!1d
和!2d
字段,它似乎工作正常。这样地:
根据,在旧的url方案中,应该有3种方式来添加通过点或路由,它们是:
但他们似乎放弃了对mrad和via的支持。对于使用to,它会显示地址,就像在新的url方案中显示一样
对于新的URL方案。。它似乎没有太多的文档,所以我不确定谷歌是否想让你玩它。但是这里是:如何用新方案做到这一点
根据:
!xx
,是一个分隔符。查看您的url:
data=
!4m9
!4m8
!1m5
!3m4
!1m2
!1d5.7971218
!2d51.8060231
!3s0x47c7061292e15b39:0x4d7bcd7484c71cf3
!1m0
!3e2
确实不清楚它在做什么,但至少我们在中看到了您的via lat和via lng!1d
和!2d
字段;
还有!3s
,十六进制格式,看起来像某种lat/lng,可能是搜索区域。这是在dec5172109373901724473:55832820633383403763
简言之,只需更改!1d
和!2d
字段,它似乎工作正常。这样地:
因此,在花了很长时间试图弄清楚URL方案是如何工作的之后,我终于弄明白了它是如何工作的(对于方向界面) URL由以下步骤组成:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter URL: ");
String originalURL = br.readLine();
//get start of URL
String start = "https://www.google.nl/maps/dir/";
//get navigation type
String type = "!3e1";
Matcher t = getMatcher(originalURL, "!3e\\d");
if (t.find()) {
type = t.group();
}
//get viewbox parameter
Matcher v = getMatcher(originalURL, "@[-]?[\\d]+\\.[\\d]+,[-]?[\\d]+.[\\d]+,[-]?[\\d]+[[.]+[\\d]+]*z");
v.find();
String viewbox = v.group();
//get order of points when using VIA
String data = originalURL.substring(originalURL.indexOf("/data=") + 6);
ArrayList<String> order = new ArrayList<>();
Matcher o = getMatcher(data, "!1m[\\d]+");
while (o.find()) {
order.add(o.group());
}
if (order.size() > 0) {
//remove the last element which is always m0 as this should not be
//displayed in the VIA-list
order.remove(order.size() - 1);
}
//!1m2 does not represent the order but indicates that coordinates that are coming up
order.removeIf(a -> a.equals("!1m2"));
//get coordinates of via-points
ArrayList<String> originalViaPoints = new ArrayList<>();
Matcher c = getMatcher(data, "!1d[-]?[\\d]+.[\\d]+!2d[-]?[\\d]+.[\\d]+");
while (c.find()) {
String[] g = c.group().substring(3).split("!2d");
originalViaPoints.add(g[1] + "," + g[0]);
}
//get coordinates of start, end and intermediate points
originalURL = originalURL.substring(0, v.start());
ArrayList<String> waypoints = new ArrayList<>();
Matcher p = getMatcher(originalURL, "[-]?[\\d]+\\.[\\d]+,[-]?[\\d]+.[\\d]+");
while (p.find()) {
waypoints.add(p.group());
}
//start and end must be displayed seperately
String bound = waypoints.get(0) + "/" + waypoints.get(waypoints.size() - 1);
//add intermediate waypoints and via-points to a list of VIA points
ArrayList<String> viaPoints = new ArrayList<>();
//we have VIA points to process
if (!order.isEmpty()) {
int via_index = 0;
int wp_index = 1;
for (String step : order) {
int iter = Integer.valueOf(step.substring(3)) / 5;
for (int i = 0; i < iter; i++) {
viaPoints.add(originalViaPoints.get(via_index++));
}
viaPoints.add(waypoints.get(wp_index++));
}
} else //There are only waypoints in the URL
{
for (int i = 1; i < waypoints.size() - 1; i++) {
viaPoints.add(waypoints.get(i));
}
}
//calculate prefix according to the amount of nodes of the via points
int nodes = viaPoints.size();
String prefix = "!4m" + (5 * nodes + 4) + "!4m" + (5 * nodes + 3) + "!1m" + (5 * nodes);
//get nodes string
String viaString = "";
for (String node : viaPoints) {
viaString += "!3m4!1m2";
String[] pieces = node.split(",");
viaString += "!1d" + pieces[1]; //ALERT: the coordinates are flipped!
viaString += "!2d" + pieces[0];
viaString += "!3s0x0:0x0";
}
String url = start + bound + "/" + viewbox + "/data=" + prefix + viaString + "!1m0" + type;
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
System.out.print(“输入URL:”);
字符串originalURL=br.readLine();
//获取URL的开始
字符串开始=”https://www.google.nl/maps/dir/";
//获取导航类型
字符串类型=“!3e1”;
Matcher t=getMatcher(originalURL,“!3e\\d”);
if(t.find()){
type=t.group();
}
//获取viewbox参数
Matcher v=getMatcher(originalURL,“@[-]?[\\d]+\\.\.[\\d]+,[-]?[\\d]+.[\\d]+,[-]?[\\d]+[\\d]*z”