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

How to display polygons that are within a specific range (circle) using Leaflet

我正在尝试找到一种解决方案,以解决如何显示仅在特定范围内的多边形,即使用传单的半径圆。

Polygons screenshots

之前,我曾寻求有关特定范围内点的显示的帮助,但是这次,由于多边形有很多 nodes/coordinates,我不知道如何完成对于多边形; foreach 语句?

有什么解决办法吗?感谢您的帮助!

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

The following example queries grid coordinates and returns all documents within a 10 mile radius of longitude 88 W and latitude 30 N. The query converts the distance to radians by dividing by the approximate radius of the earth, 3959 miles:

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

2dsphere 参考:http://docs.mongodb.org/manual/core/2dsphere/

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

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

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

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

Tests if this geometry contains the other geometry (without boundaries touching).

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

编辑:这是评论中要求的纯 JS/Leaflet 解决方案,这是快速的 n-dirty,但它应该工作。当多边形的所有点都在圆内时,containsPolygon 方法 return 为真:

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

如果您希望 return 如果多边形的一个或多个点在圆内则为真,则必须将 return 语句更改为:

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