【问题标题】:Fire Event to Open CartoDB/Leaflet Marker触发事件以打开 CartoDB/Leaflet Marker
【发布时间】:2014-07-07 22:15:33
【问题描述】:

我有一个非常具体的问题,我并不真正期待直接回答,但任何指导都会有所帮助。

简单明了,我想以编程方式在由 CartoDB 提供支持的 Leaflet 地图上的标记上触发点击事件。我在地图上有一个包含标记的图层,每个标记都有与之关联的点击事件。所以,本质上,我只需要找到标记并在其上触发点击事件。

对于上下文,Mapbox 实际上就是这样做的,但不幸的是,我不能将 Mapbox 用于这个特定的实现: https://www.mapbox.com/mapbox.js/example/v1.0.0/open-popup-externally/

我愿意接受建议,但最好是,我想做与上面链接中的代码类似的事情——通过 javascript 询问 Leaflet 或 CartoDB 以通过自定义属性/lat-lng 查找和访问标记/??。我认为从那里开始会很简单。

另一种方法是在创建标记时挂钩事件,将它们存储在哈希中,然后在需要手动单击时访问该存储。但是,我不知道存在任何此类事件,也找不到列出受支持事件的文档。

由于我不是自己创建标记,也不能(出于某种原因),因此在我将它们添加到地图时存储它们不是一个选项。

我认为既然 Mapbox 正在这样做,肯定有一些钩子,但我找不到任何有价值的文档来为我指明正确的方向。

有什么建议或指点吗?

【问题讨论】:

    标签: javascript leaflet


    【解决方案1】:

    对于任何偶然发现这一点的人,我已经为我的特定案例找到了一个可行的解决方案。此调用将为您完成:

    layer.trigger 'featureClick', event, latlng, pos, data, layer_count
    

    基本上,您需要抓取相关图层并触发点击,传递适当的数据:

    • 事件:这可以为空,因为没有事件
    • latlng:经纬度位置
    • 数据:像{ cartodb_id: 123 } 这样的对象。 cartodb_id 是必需的。
    • layer_count:你所在层的索引(可能是0)

    要在此处获取 latlng 和 cartodb_id,您可能需要执行我所做的 - 查询它:

    function openMarker(layer, my_object_id) {
      vars = { database_id: my_object_id };
      opts = { format: 'geojson' };
      query = "SELECT * FROM my_table WHERE my_object_id = {{ my_object_id }}"
      sql = new cartodb.SQL({user: my_user_id});
      sql.execute(query, vars, opts).done(function(data) {
        if (data.features != undefined && data.features.length == 1)
          row = data.features[0];
          latlng = [ row.geometry.coordinates[1], row.geometry.coordinates[0] ];
          layer.trigger('featureClick', null, latlng, null, { cartodb_id: row.properties.cartodb_id }, 0);
      });
    }
    

    然后,您可以调用 open_marker,传递您希望在其上打开标记的图层和您的对象标识符。只要它在您的 cartodb 数据库中,您就可以获取它。当然,可以根据您的方式调整查询。

    对于我的特定实现,我必须使用 setTimeout 调用来获得正确的控制流,就像我在页面加载时调用一样。但是如果你在页面加载后调用,应该没问题。

    因此,在给定本地标识符的情况下,打开标记的方法足够简单。希望这对其他人有帮助!

    此解决方案的灵感来源: https://gist.github.com/javisantana/7b817fda1e7511c451c7#file-index-html-L39

    【讨论】:

    猜你喜欢
    • 2020-01-10
    • 2021-03-02
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多