我有一个非常具体的问题,我并不是真的希望直接回答,但任何指导都会有所帮助。
简单明了,我想以编程方式在位于Leaflet地图上的标记上触发click事件,该标记由CartoDB提供支持。我在地图上有一个包含标记的图层,每个标记都有与之关联的点击事件。所以,基本上,我只需要找到标记并在其上触发click事件。
对于上下文,Mapbox实际上就是这样做的,但不幸的是我不能将Mapbox用于这个特定的实现: https://www.mapbox.com/mapbox.js/example/v1.0.0/open-popup-externally/
我愿意接受建议,但最好是,我想做与上面链接中的代码类似的事情 - 通过javascript查询Leaflet或CartoDB,通过自定义属性查找和访问标记/纬度和经度/ ??。我认为从那里开始就很简单了。
另一种方法可能是在创建标记时挂钩事件,将它们存储在哈希中,然后在我需要手动点击时访问该存储。但是,我不知道存在任何此类事件,而且我无法找到列出支持事件的文档。
由于我没有自己创建标记,并且不能(出于原因),因此我将它们添加到地图时存储它们不是一个选项。
我认为,由于Mapbox正在这样做,必须有一些钩子,但我找不到任何有价值的文件来指出我正确的方向。
有任何建议或指示吗?
答案 0 :(得分:1)
对于任何偶然发现这种情况的人,我已经为我的具体案例找到了可行的解决方案。这个电话会为你做这件事:
layer.trigger 'featureClick', event, latlng, pos, data, layer_count
基本上,您将要抓取相关图层并触发点击,并传递相应的数据:
{ cartodb_id: 123 }
这样的对象。需要cartodb_id。要在这里抓住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