右键单击谷歌地图折线实际上不是“在”折线上

时间:2013-10-04 02:56:10

标签: c# javascript google-maps google-maps-api-3

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

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

问题在于我试图通过C#spatial Geography.Intersects()来定位点(第一个位于顶部),而且它不相交。

它完全取决于它看起来的变焦。再次通过右键单击(缩小的)折线创建的顶部距离实际折线超过1千米。

有没有办法确保将标记放在线上,就像在两个线端之间一样?

I'm sad google

2 个答案:

答案 0 :(得分:1)

因为它提供了更好的用户体验,所以标记,线条和形状的命中框略大于实际项目。因此,如果您单击关闭,则计数。这对精确度没有帮助。

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

答案 1 :(得分: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;
    }

另外{4}}是在Googleland创建的,希望可以解决。