3

我尝试这样做 3 个月 - 我需要按路线方向创建一个多边形,如下所示:

http://i.imgur.com/olGmuN6.png

所以我写了这个:

directionService.route(request, function(result, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      directionsRenderer.setDirections(result);
        var r = [];
        var z = 0.5;
        var bla = result.routes[0].overview_path;
        for(var i=0 in result.routes[0].overview_path) {
            r.push(new google.maps.LatLng(bla[i].lat()+z, bla[i].lng()-z));
        }
        bla.reverse();
        for(var x=0 in bla) {
            r.push(new google.maps.LatLng(bla[x].lat()-z, bla[x].lng()+z));
        }

        var prva = new google.maps.Polyline({
            path: result.routes[0].overview_path,
            strokeColor: "#00000",
            strokeOpacity: 1.0,
            strokeWeight: 2
        });

        prva.setMap(map);

        druga = new google.maps.Polygon({
            paths: r,
            strokeColor: "#FF0000",
            strokeOpacity: 0.8,
            strokeWeight: 2,
            fillColor: "#FF0000",
            fillOpacity: 0.35
        });

        druga.setMap(map);

    } else {
      alert("Directions query failed: " + status);
    }
  });

但在某些情况下是好的,在某些情况下不是,所以我的代码产生了这个:

坏情况

http://i.stack.imgur.com/w5lqL.png

好案例:

http://i.stack.imgur.com/DH88N.jpg

那么我如何解决这个问题以通过路线方向获得漂亮的多边形???有人有想法吗?

我如何在我的代码中实现这一点:

卷积算法

http://i.imm.io/1gMu5.png

我的问题有什么解决办法吗?

还有其他方法可以创建我需要的东西吗?

4

1 回答 1

3

生成第二张图像的算法在几何上非常简单。我会给你写一些伪代码,假设你有一个 x,y 数组:

coordinates = [[x1,y1],[x2,y2] ... [xn,yn]]
leftcoords = []
rightcoords = []

projectionwidth = 1        # How wide the path is

for each coordinate in coordinates:
    pathvector = coordinate(index + 1) - coordinate(index - 1)
    normpathvector = pathvector/(length(pathvector))
    perpvector = projectionwidth*[-normpathvector[1],normpathvector[0]]
    leftcoords.append(coordinate + perpvector)
    rightcoords.append(coordinate - perpvector)

你必须小心在路径的尽头只选择前面或后面的坐标,但你明白了。你最终得到三组坐标轨迹。如果您想平滑路径,可以将其设置为平均几个点。

好的,所以这是有效的代码,但是您必须做一些工作来平滑它以解决路径中的抖动。我的建议是平均之前的几个点,或者只是抢回几个点。

http://jsbin.com/uTATePe/2/

于 2013-10-03T20:18:48.317 回答