算法在由lat / long位置包围的多边形中找到某个lat长位置

时间:2014-04-23 10:20:22

标签: algorithm google-maps google-maps-api-3 geolocation geocode

我在谷歌地图上绘制了一组多边形,现在我想实现算法,该算法给出了某个纬度/长度的位置,其中包含多边形。

注意:使用google maps api

给出纬度/经度位置也会绘制多边形

那么它是否有任何api或如何将纬度/长位置转换为x-y平面,以便我可以使用区域公式检查给定点是否位于哪个区域?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

使用可帮助您解决问题的光线投射算法

google.maps.Polygon.prototype.Contains = function(point) {
        // ray casting alogrithm
        var crossings = 0,
            path = this.getPath();
        // for each edge
        for (var i = 0; i < path.getLength(); i++) {
            var a = path.getAt(i),
                j = i + 1;
            if (j >= path.getLength()) {
                j = 0;
            }
            var b = path.getAt(j);
            if (rayCrossesSegment(point, a, b)) {
                crossings++;
            }
        }

        // odd number of crossings?
        return (crossings % 2 == 1);

        function rayCrossesSegment(point, a, b) {
            var px = point.lng(),
                py = point.lat(),
                ax = a.lng(),
                ay = a.lat(),
                bx = b.lng(),
                by = b.lat();
            if (ay > by) {
                ax = b.lng();
                ay = b.lat();
                bx = a.lng();
                by = a.lat();
            }
            // alter longitude to cater for 180 degree crossings
            if (px < 0) { px += 360 };
            if (ax < 0) { ax += 360 };
            if (bx < 0) { bx += 360 };

            if (py == ay || py == by) py += 0.00000001;
            if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
            if (px < Math.min(ax, bx)) return true;

            var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
            var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
            return (blue >= red);
        }
    };