使用Leafletjs在当前地图视图中查找图层

时间:2013-04-02 02:44:37

标签: maps gis leaflet

我有一个应用程序,可以使用Leafletjs在地图上显示最近的作业。

使用Leafletjs时,如果要缩放到用户检测到的位置,可以调用以下内容:

map.locate({'setView' : true, 'timeout' : 10000, maxZoom: 10});

但是,对于某些位置,缩放级别10不包含任何作业点,因此我想动态设置缩放,以便至少在作业上对用户可见。

我知道我可以听取locate函数的成功,然后查看类似的内容:

map.on('locationfound', function() { 
  //for marker in markers{
  //is point within currently visible bounds
  //break on first positive
  //else, 
  //zoom up a level, repeat previous checks
  } 
}

但效率很低,特别是如果我有很多分数。

Leaflet是否有任何内置函数/方法来提供有关当前地图视图中图层的信息?

1 个答案:

答案 0 :(得分:0)

如果您在服务器端执行某些操作,则可以足够快地进行计算。

  1. 以某种方式放大缩放级别(我使用缩放级别23)将位置存储在数据库的像素坐标中。我称这个坐标系为“Vast Coordinate System”。然后,为了获得特定位置处的点的平铺坐标是IIRC一个按位移位 - 非常快,并且您可以在SQL中执行某些操作。
  2. 以这种方式将用户的位置转换为像素坐标 - 缩放级别。
  3. 迭代缩放级别。获取该缩放级别的用户位置的tile坐标,然后执行SQL查询,该查询计算该tile上的点数。如果> 0,停止。
  4. 你的SQL会是这样的(对不起,我是懒惰的,从记忆/思考中做而不是实际尝试它)

    SELECT count(*) WHERE (vcsX>>(zoom+8)==userX>>(zoom+8)) AND (vcsY>>(zoom+8)==userY>>(zoom+8));
    

    其中vcsX和vcsY是Vast Coordinate System中的像素坐标。