Java 将google地图航路点方向转换为via方向

Java 将google地图航路点方向转换为via方向,java,google-maps,Java,Google Maps,我正在尝试将谷歌地图方向的URL从具有多个航路点的方向更改为删除这些中间航路点但路线保持不变的方向 具体来自: 致: 编辑:因为我必须在第二个URL中手动拖动路线,中间标记的坐标与第一个URL中的坐标不完全相同;这种差异可以忽略。 这些URL的开始部分看起来很明显,但数据参数对我来说仍然不清楚(没有它,路由就不正确)。我尝试了GoogleMapsAPI,但这些API返回一个XML或JSON文件,但我只需要相应的URL,我也可以使用GoogleMaps的webinterface获得相应的URL

我正在尝试将谷歌地图方向的URL从具有多个航路点的方向更改为删除这些中间航路点但路线保持不变的方向

具体来自:

致:

编辑:因为我必须在第二个URL中手动拖动路线,中间标记的坐标与第一个URL中的坐标不完全相同;这种差异可以忽略。

这些URL的开始部分看起来很明显,但数据参数对我来说仍然不清楚(没有它,路由就不正确)。我尝试了GoogleMapsAPI,但这些API返回一个XML或JSON文件,但我只需要相应的URL,我也可以使用GoogleMaps的webinterface获得相应的URL

如何将第一个URL转换为第二个???

根据,在旧的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,可能是搜索区域。这是在dec
5172109373901724473: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,可能是搜索区域。这是在dec
5172109373901724473:55832820633383403763

简言之,只需更改
!1d
!2d
字段,它似乎工作正常。这样地:

因此,在花了很长时间试图弄清楚URL方案是如何工作的之后,我终于弄明白了它是如何工作的(对于方向界面)

URL由以下步骤组成:

  • 您从“”开始
  • 然后是格式为“[LAT]、[LONG]”的起始坐标、相同格式的中间航路点坐标,然后是终点坐标。所有这些坐标用“/”字符分隔
  • 然后是“@[LAT]、[LONG]、[ZOOM]/”,其中LAT LONG是视图框的坐标,ZOOM是缩放级别(越低意味着越缩小)
  • 然后是“data=”和“!4m[(5x+4+y)]!4m[(5x+3+y)]!”,其中x是通过点的数量,y是路线中中间航路点的数量。因此,如果你有一条从a到D的路线,中间有目的地B和C,通过点Q,W和R,你有x=3和y=2,所以你得到字符串“!4m21!4m20”
  • 下一步,我们通过积分获得所有信息。这在以下方案中完成:附加“!1m[(5x)],其中x是当前航路点和下一个航路点之间的通过点数量。因此“!1m5…[数据]…!1m0”表示起点和第一个航路点之间有一个通过点,而第一个航路点和终点之间没有通过点。每个“!1m[(5x)]”后面都有x个“!1d[LONG]!2d[LAT]!3s[COORDINATE]”实例。我不完全确定坐标是什么,但它必须是“0x[HEX]:0x[HEX]”格式,其中HEX是十六进制数;我只是用数字0来表示。这似乎在我所有的测试用例中都有效,并且似乎不会影响任何事情
  • 这之后是“!1m0”。我认为这是必要的,以表明在最后一个航路点(终点)之后,没有更多的通过点,这是无用的信息,但仍然需要
  • 最后,我们得到最后一个参数,看起来像“!3e[n]”,其中n是一个离散变量,用于指示导航类型:n=0表示汽车驾驶,n=1表示骑自行车,n=2表示步行,n=3表示公共交通
  • 这主要是因为我通过不懈的测试发现了URL方案。您可以添加更多的参数,但这需要更多的测试工作

    最后,我介绍了将包含0个或多个航路点和0个或多个通过点的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”