我正在尝试找到一个解决方案,了解如何显示仅在特定范围内的多边形,使用小册子显示半径的圆。
之前,我已经就特定范围内的点的显示请求帮助,但这次,由于多边形有很多节点/坐标,我不知道如何对多边形进行处理;一个foreach声明?
任何解决方案?谢谢你的帮助!
Similar problem solved for displaying points within a specific range
答案 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);