0

通过在折线上处理右键单击方法,将这两个标记都放置在 Google 地图上,即:

google.maps.event.addListener(polyline, 'rightclick', myMethodThatHandlesIt);

问题是我试图通过 C# 空间 Geography.Intersects() 定位该点(顶部的第一个),而且,它不相交。

它完全取决于它看起来的缩放。顶部是通过右键单击(缩小的)折线再次创建的,距离实际折线超过 1 公里。

有什么方法可以确保将标记放置在线上,例如在两条线末端之间?

我很伤心谷歌

4

2 回答 2

1

因为它提供了更好的用户体验,标记、线条和形状的命中框比实际项目要大一些。因此,如果您单击关闭,它很重要。这对精确度没有帮助。

对于折线,您需要实现对齐线功能以找到实际折线上的闭合点。这个答案提供了一些指导:Find a point in a polyline which is most to a latlng

于 2013-10-04T11:08:23.350 回答
0

对于遇到此问题的其他任何人,我无法找到一种干净的 Javascript 方法,最终我不需要这样做。制造商可能有点偏离,但我需要将其坚持为与线相交的点。因此,在我存储之前,可以使用以下方法来更改标记位置。

我选择使用具有以下方法的 Microsoft.SqlServer.Types.SqlGeography

Geography.ShortestLineTo(OtherGeography)

这给出了一条带有两个点的新线,一个在用户的标记位置,另一个在距离路线/折线/线串最近的交叉点。

新线的末端是路径上最接近用户右键单击折线的点。

        public static System.Data.Spatial.DbGeography GetClosestPointOnRoute(System.Data.Spatial.DbGeography line, System.Data.Spatial.DbGeography point)
    {
        SqlGeography sqlLine = SqlGeography.Parse(line.AsText()).MakeValid(); //the linestring
        SqlGeography sqlPoint = SqlGeography.Parse(point.AsText()).MakeValid(); //the point i want on the line

        SqlGeography shortestLine = sqlPoint.ShortestLineTo(sqlLine); //find the shortest line from the linestring to point

        //lines have a start, and an end
        SqlGeography start = shortestLine.STStartPoint();
        SqlGeography end = shortestLine.STEndPoint();

        DbGeography newGeography = DbGeography.FromText(end.ToString(), 4326);

        var distance = newGeography.Distance(line);

        return newGeography;
    }

此外,问题 5887是在 Googleland 中创建的,希望能够解决。

于 2013-10-05T18:02:44.380 回答