【发布时间】:2016-01-26 07:22:11
【问题描述】:
我有 250 个多边形,每个多边形有 100-300 个点。 如何检查视口中有哪些多边形?
逻辑上的做法是检查每个多边形的每个点是否在视口中,但这似乎非常昂贵和愚蠢。 我还有其他选择吗?如果有,有哪些选择?
我的其他想法:
- 使用边界框 - 缺点是它只有 4 个点,可能会给出假阴性
- 用更少的点制作不可见的简化多边形 - 过多的额外工作、数据和资源使用
以下代码遍历所有 250 个多边形和每个多边形的 100-300 个点,并检查它是否在视口中。我认为自己是编程的初学者,但这似乎不是一个好主意,特别是如果我需要在每次更改边界/拖动地图时都发生这种情况。
google.maps.event.addListener( map, 'bounds_changed', function( ) {
var viewport = map.getBounds();
var polygons = [array of polygons];
var polygonsCount = polygons.length;
// Polygons
for(a = 0; a < polygonsCount; a++) {
var polygonPoints = polygons[a].getPath(); // Array of points
var inBounds = false;
var pointsCount = polygonPoints.length;
// Points
for(b = 0; b < pointsCount; b++) {
if(viewport.contains(polygonPoints[b])) {
inBounds = true;
return false; // No need to continue loop if we found one
}
}
}
});
【问题讨论】:
-
您可以跟踪最接近边界边缘但不在地图每一侧边界内的多边形点,然后当边界发生变化时,您只需要更新地图内的多边形IFF 您跟踪的 4 个点中的任何一个现在都在里面,而不是每次边界更新时检查所有 250*n 个点。对内部最近的点执行相同操作,以防它们缩小边界。
-
您也可以只检查每个多边形上的 1 个点,看看它是否在边界边缘的“n”范围内,其中 n 是外接多边形的圆的直径,IFF 这是真的然后迭代所有点,否则继续下一个多边形
-
这两种策略应该会大大减少你的计算时间,比如原来的 1%。祝你好运!
-
对不起,我不知道 javascript 或 google maps API
标签: javascript google-maps google-maps-api-3