如何使用Leaflet显示特定范围(圆圈)内的多边形

时间:2015-03-12 16:41:49

标签: mongodb leaflet polygon openstreetmap geometry

我正在尝试找到一个解决方案,了解如何显示仅在特定范围内的多边形,使用小册子显示半径的圆。

Polygons screenshots

之前,我已经就特定范围内的点的显示请求帮助,但这次,由于多边形有很多节点/坐标,我不知道如何对多边形进行处理;一个foreach声明?

任何解决方案?谢谢你的帮助!

Similar problem solved for displaying points within a specific range

1 个答案:

答案 0 :(得分:3)

由于你使用的是MongoDB,这里最好的解决方案是(如果可能的话),在数据库中处理这个问题。将2dsphere索引放在文档的loc字段中,并将$geoWithin查询与$centerSphere结合使用:

  

以下示例查询网格坐标并返回经度为88 W,纬度为30 N的10英里范围内的所有文档。查询将距离转换为弧度,除以地球的近似半径3959英里:

db.places.find( {
    loc: { $geoWithin: { $centerSphere: [ [ -88, 30 ], 10/3959 ] } }
} )

2dsphere reference:http://docs.mongodb.org/manual/core/2dsphere/

$ geoWithin参考:http://docs.mongodb.org/manual/reference/operator/query/geoWithin/

$ centerSphere reference:http://docs.mongodb.org/manual/reference/operator/query/centerSphere/

如果你真的想做这个客户端(我绝对不推荐)并且你不想构建你的解决方案(这是可能的)你可以看看GeoScript。

GeoScript的geom.Geometry()类有一个contains方法:

  

测试此几何体是否包含其他几何体(没有边界接触)。

Geom.geometry参考:http://geoscript.org/js/api/geom/geometry.html

编辑:这是评论中要求的纯JS / Leaflet解决方案,这很快,但它应该有效。当所有多边形的点都在圆圈内时,containsPolygon方法返回true:

L.Circle.include({
    'containsPoint': function (latLng) {
        return this.getLatLng().distanceTo(latLng) < this.getRadius();
    },
    'containsPolygon': function (polygon) {
        var results = [];
        polygon.getLatLngs().forEach(function (latLng) {
            results.push(this.containsPoint(latLng));
        }, this);
        return (results.indexOf(false) === -1);
     }
});

以下是一个有效的例子:http://plnkr.co/edit/JlFToy?p=preview

如果要在圆圈内有一个或多个多边形点时返回true,则必须将return语句更改为:

return (results.indexOf(true) !== -1);