【问题标题】:Find if given lat-long lies in any of the polygon in MongoDB查找给定的经纬度是否位于 MongoDB 中的任何多边形中
【发布时间】:2013-06-25 16:25:55
【问题描述】:

我想知道我是否得到了用户的经纬度,并想检查他是否位于存储在我的数据库 (MongoDB) 中的任何多边形中。如何使用 mongoDB 实现这一点。 例如,我的数据库将有 10 个多边形存储为 GeoJson 对象。我得到一个 lat-long 并想检查这个 lat-long 是否位于我的数据库中的 10 个多边形中的任何一个中。 这在MongoDB中可以实现吗?

【问题讨论】:

标签: mongodb geolocation latitude-longitude geojson


【解决方案1】:

我认为您的特殊情况无法在 MongoDB 中实现。 MongoDB 确实使用$polygon operator 进行多边形计算。但是,此运算符采用多边形并确认其中是否有任何文档,而不是相反。

【讨论】:

    【解决方案2】:

    我用 javascript 编写了这段代码,它对我来说很好用

    VAR polygonData = “43.64486433588385,-79.3791389465332; 43.64508171979899,-79.3930435180664; 43.63682057801007,-79.38437461853027; 43.63946054004705,-79.36819553375244; 43.652720712083266,-79.37201499938965; 43.65793702655821,-79.39111232757568; 43.64927396999741,-79.37222957611084”; P>

    var lat='43.64927396999741'; var lng='-79.37222957611084';

    polySearch(polygonData,lat,lng);

    函数 polySearch(polygonData,lat,lng){ var lat_long=lat+","+lng;

    var longitude_x = lng;  
    var latitude_y = lat;
    
    var is_in_polygon=false;
    
    
    
    var vertices_x=[];
    var vertices_y=[];
    
    var arr=polygonData.split(';');
    
    for(var j=0; j<arr.length; j++){
        var arr1=arr[j].split(',');
            vertices_x.push(arr1[1]);
            vertices_y.push(arr1[0]);
        }
    
    var points_polygon = vertices_x.length;
    
    var isIn=isInPolygon(points_polygon, vertices_x, vertices_y, longitude_x, latitude_y);
        if (isIn==1)
            console.log('Which is in polygon');
            else
            console.log('Which is not in polygon');
    
    function isInPolygon(points_polygon, vertices_x, vertices_y, longitude_x, latitude_y)
    {
        var i = 0;
        var j = 0;
        var c = 0;
        for (i = 0, j = points_polygon-1 ; i < points_polygon; j = i++) {
    
        var val="((("+vertices_y[i]+" > "+latitude_y+") != ("+vertices_y[j]+" > "+latitude_y+")) && ("+longitude_x+" < ("+vertices_x[j]+" - "+vertices_x[i]+") * ("+latitude_y+" - "+vertices_y[i]+") / ("+vertices_y[j]+" - "+vertices_y[i]+") + "+vertices_x[i]+"))";
    
        if(eval(val))c=!c;
    
      }
      return c;
    }       
    

    }

    【讨论】:

      【解决方案3】:

      很抱歉只提供了两个链接,但我认为这些解释了应该做的事情比我做得更好:

      A SO answer in the same subject

      An excellent tutorial how to use mongodb geospatial indexes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多