使用谷歌地图检查纬度/经度是否在一组多边形内


9

我知道如何使用Esri(shapefile上的查询任务)完成上述操作,但是也可以使用Google Maps完成吗?我必须查询每个多边形还是有一种方法可以查询一组多边形?

Answers:


9

Google Maps API尚未提供检查多边形中点的方法。经过研究,我偶然发现了射线投射算法,该算法将确定XY坐标是否在绘制的形状内。这将转换为纬度和经度。以下内容扩展了google.maps.polygon.prototype以使用此算法。只需在google.maps加载后的代码中的一点添加以下代码:

google.maps.Polygon.prototype.Contains = function (point) {
    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);

    }

};

在这里,我们通过定义名称为“包含”的函数来扩展了google.maps.Polygon的功能,该函数可用于确定函数参数中提供的纬度经度是否在多边形内。在这里,我们使用射线投射算法并使用该算法开发了功能。现在进行了很多练习之后,我们可以检查以下几点:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

有关完整的代码和演示,请访问:http : //counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html


是的,我认为应该采用射线投射。我实际上是通过python脚本自己使用了该算法。我的实现可以在这里找到:gramky.blogspot.com/2012/12/…–
ngramsky

我不得不删除,围绕经度0加到360负坐标,这对正常工作的位
user1431317

4

我去打开图层插件;提取它,然后甚至可以将任何动态图层添加到地图中并导出。

*在执行此操作之前,请确保将项目CRS(EPSG)设置为WGS84,并且在“项目属性”设置下启用了“即时” CRS转换。

希望这可以帮助。


0

如果您将第三方程序用作geodjango,则可以检查点是否在一组多边形内。更多信息在这里

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

我希望它可以帮助您...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.