Fire事件打开CartoDB / Leaflet标记

时间:2014-05-19 20:15:05

标签: javascript leaflet

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

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

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

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

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

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

我认为,由于Mapbox正在这样做,必须有一些钩子,但我找不到任何有价值的文件来指出我正确的方向。

有任何建议或指示吗?

1 个答案:

答案 0 :(得分:1)

对于任何偶然发现这种情况的人,我已经为我的具体案例找到了可行的解决方案。这个电话会为你做这件事:

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

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

  • event:这可以为null,因为没有事件
  • 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