Fire事件打开CartoDB / Leaflet标记

我有一个非常具体的问题,我真的不希望直接回答,但任何指导都会有所帮助 .

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

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

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

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

由于我不是自己创建标记,并且不能(出于原因),因此我将它们添加到 Map 时存储它们不是一个选项 .

我假设,因为Mapbox正在这样做,必须有一些钩子,但我找不到任何有 Value 的文件来指出我正确的方向 .

有什么建议或指示?

回答(1)

2 years ago

对于任何偶然发现这一点的人,我已经为我的具体案例找到了可行的解决方案 . 这个电话会为你做:

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

从本质上讲,您需要抓取相关图层并触发点击,并传递相应的数据:

  • event:这可以为null,因为没有事件

  • latlng:纬度/经度位置

  • data:像 { 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数据库中,您就可以 grab 它 . 当然,可以调整查询以适合您的方式 .

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

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

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