谷歌地图中两个近点之间的曲线

zes*_*sk8 13 javascript google-maps

可以在谷歌地图中的两个近点之间绘制曲线(如测地线),例如使用这些坐标:

p1 =(23.634501,-102.552783)

p2 =(17.987557,-92.929147)

有没有一个JavaScript库可以做到这一点?并且可以控制线的曲率?

谢谢.

小智 27

我最近想出了另一种解决方案,它不需要折线,而是使用可以即时计算的标记图标的路径值.

简而言之:您只需为从0到p2-p1的二次贝塞尔曲线创建一个SVG路径字符串,并将其作为标记图标附加到p1.

长版:可以调用容器中的像素坐标google.maps.Projection.fromLatLngToContainerPixel().二次贝塞尔曲线的字符串如下所示:

M [startX] [startY] q [controlX] [controlY] [endX] [endY]
Run Code Online (Sandbox Code Playgroud)

我们将选择(0,0)起点,因为标记稍后将放置在该点.的相对位置p2是现在e = (p2.x - p1.x, p2.y - p1.y),和他们之间的点半路上的相对位置m = (e.x/2, e.y/2).正交向量eo = s * norm(-e.x / e.y, 1),其中s一些比例因子具有s = |e|/4良好的起点.我们现在有控制点,c = (m.x + o.x, m.y + o.y)路径是:

path = „M 0 0 q c.x c.y e.x e.y“
Run Code Online (Sandbox Code Playgroud)

现在我们有了这条路,我们可以简单地声明一个图标:

var icon = {
    path : path,
    fillOpacity : 0,//important
    scale : 1,
    strokeOpacity: //yours,
    strokeColor : //yours,
    strokeWeight : //yours,
    clickable : false //important
};
Run Code Online (Sandbox Code Playgroud)

设置clickable为false是必不可少的,因为否则曲线所包围的区域将变为可点击,并且基础地图将不会接收鼠标事件.现在我们可以使用路径图标作为参数和p1的位置向地图添加标记:

var marker = new google.maps.Marker({
    position : p1,
    icon : icon,
    map : map,
    clickable : false,
    zIndex : -100 //make the line appear behind ‚real’ markers
});
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • 正交o的比例因子的符号确定弧的"方向"("上方"或"下方"e)
  • 如果缩放级别发生变化,则必须调整图标的缩放比例,如下所示:marker.icon.scale = 1 / 2^(initialZoom - currentZoom)无需重新计算路径.

样品:

谷歌地图上的贝塞尔曲线样本

jsfiddle与使用原始问题点的硬编码示例

相关代码:

var p1 = new google.maps.LatLng(23.634501, -102.552783);
var p2 = new google.maps.LatLng(17.987557, -92.929147);

var markerP1 = new google.maps.Marker({
    position: p1,
    map: map
});
var markerP2 = new google.maps.Marker({
    position: p2,
    map: map
});
google.maps.event.addListener(map, 'projection_changed', function () {
    var p1 = map.getProjection().fromLatLngToPoint(markerP1.getPosition());
    var p2 = map.getProjection().fromLatLngToPoint(markerP2.getPosition());
    var e = new google.maps.Point(p1.x - p2.x, p1.y - p2.y);
    var m = new google.maps.Point(e.x / 2, e.y / 2);
    var o = new google.maps.Point(0, 7);
    var c = new google.maps.Point(m.x + o.x, m.y + o.y);
    var curveMarker2 = new google.maps.Marker({
        position: markerP1.getPosition(),
        icon: {
            path: "M 0 0 q " + c.x + " " + c.y + " " + e.x + " " + e.y,
            scale: 24,
            strokeWeight: 2,
            fillColor: '#009933',
            fillOpacity: 0,
            rotation: 180,
            anchor: new google.maps.Point(0, 0)
        }
    });
    curveMarker2.setMap(map);
    google.maps.event.addListener(map, 'zoom_changed', function () {
        var zoom = map.getZoom();
        var scale = 1 / (Math.pow(2, -zoom));
        var icon = {
            path: "M 0 0 q " + c.x + " " + c.y + " " + e.x + " " + e.y,
            scale: scale,
            strokeWeight: 2,
            fillColor: '#009933',
            fillOpacity: 0,
            rotation: 180,
            anchor: new google.maps.Point(0, 0)
        };
        curveMarker2.setIcon(icon);
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这是一个[更新小提琴](http://jsfiddle.net/medmunds/sd10up9t/),它计算正交(在当前示例中它是硬编码的).它还具有可拖动的标记,因此您可以使用不同的点和缩放进行测试. (7认同)
  • 将相关代码添加到此答案中,并添加指向具有原始点的工作jsfiddle的链接. (2认同)

nil*_*ing 5

这是我发现的图书馆

http://curved_lines.overfx.net/ 无效链接

http://www.geocodezip.com/v3_polyline_example_rhumb.html

http://www.geocodezip.com/v3_polyline_example_arc.html

实际上,我刚刚发现Google地图Polyline包含要构建的点的列表。因此,您可以传递多个点以使线看起来弯曲。

PS:您可以在下面的2个链接中使用绘制弧线功能来获取绘制点的列表