如何使用传单显示特定范围(圆)内的多边形
How to display polygons that are within a specific range (circle) using Leaflet
我正在尝试找到一种解决方案,以解决如何显示仅在特定范围内的多边形,即使用传单的半径圆。
之前,我曾寻求有关特定范围内点的显示的帮助,但是这次,由于多边形有很多 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);
我正在尝试找到一种解决方案,以解决如何显示仅在特定范围内的多边形,即使用传单的半径圆。
之前,我曾寻求有关特定范围内点的显示的帮助,但是这次,由于多边形有很多 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);