【问题标题】:Select two map layers with 1 click一键选择两个地图图层
【发布时间】:2012-12-14 20:20:46
【问题描述】:

是否可以一键选择两个 Google 地图多边形图层。我可以添加两层:建筑物和地块。我可以单独访问每个图层,但如果我单击地块图层顶部建筑物所在的地图,则只会检索到建筑物图层。

添加图层的脚本:

 var otrParcel = new google.maps.FusionTablesLayer({
    query: {
      select: "'Geometry'",
      from: otrParcLayer 
    },
    suppressInfoWindows: true,
    map: map
  });

  var otrBuilding = new google.maps.FusionTablesLayer({
    query: {
      select: "'Geometry'",
      from: otrBldgLayer
    },
    suppressInfoWindows: true,
    map: map
  });

我正在尝试通过 1 次单击从两个图层中检索 infoWindoHtml。这适用于单独构建和包裹,但不适用于 1 在另一个之上。附件是我尝试执行此操作的最新尝试。当我单击带有包裹的建筑物时,第一个侦听器功能无法正常工作。第二个监听函数工作正常。

  google.maps.event.addListener(otrBuilding , 'click', function(e) {
    var  infoBubble = new InfoBubble({
      maxWidth: 300
    });
    infoBubble.addTab('Building', e.infoWindowHtml );

    var layer = new google.maps.FusionTablesLayer({
      query: {
        select: "'geometry'",
        from: otrParcLayer,
        where: "ST_INTERSECTS('geometry', CIRCLE(LATLNG(e.latLng), 0.001))",
        limit:1
      } 
    });

    infoBubble.addTab('Parcel', layer.infoWindowHtml);  

    infoBubble.addTab('Contact', contacInfo() );
    if (!infoBubble.isOpen()) {
      infoBubble.setPosition(e.latLng);
      infoBubble.open(map);
    };
  });

  google.maps.event.addListener(otrParcel , 'click', function(e) {
    var  infoBubble = new InfoBubble({
      maxWidth: 300
    });
    infoBubble.addTab('Parcel', e.infoWindowHtml);
    infoBubble.addTab('Contact', contacInfo() );
    if (!infoBubble.isOpen()) {
      infoBubble.setPosition(e.latLng);
      infoBubble.open(map);
    };
  });

这是我正在测试的页面的链接。加载地图时,我正在使用右下角的建筑物(金刚砂剧院)进行测试。它的中间有一个甜甜圈洞。单击外环应包括建筑物和地块信息(它没有)。点击中间只会显示包裹信息。

http://fitreks.com/bdcurc/bdcurcMUmockup11.html

【问题讨论】:

    标签: google-maps-api-3 google-fusion-tables


    【解决方案1】:

    一个选项是在两个图层上都设置 {clickable: false}。然后使用地图点击侦听器查询两个表的数据以填充 InfoBubble(而不是使用 FusionTablesLayer 点击侦听器中的可用数据)并使用来自两个查询的回调函数的数据(如果适用)填充 InfoBubble。您可能需要考虑使用单个 InfoBubble,而不是让多个 InfoBubble 保持打开状态。

    【讨论】:

    • 谢谢。尝试在初始化时为顶层(建筑物)设置 clickable:false。然后在 google.maps.event.addListener(otrParcel, 'click', function(e){ 期间设置 clickable:true。我的想法是下次我点击建筑物时它会运行 google.maps.event.addListener(otrBuilding , '点击',函数(e){。但这不起作用。它继续转到otrParcel。我想使用图层而不是回调函数,以便我可以访问infoWindowHtml。这允许其他人通过管理infoWindow样式融合表 UI。
    【解决方案2】:

    您可以在底层触发点击事件。

    不要忘记使用 e-argument 作为 trigger 的第三个参数,否则 event-argument 在回调中不可用。


    编辑:

    示例:当前图层 otrBuilding 位于顶部,因此您必须在此触发 onclick otrParcel-layer 的点击事件:

    google.maps.event.addListener(otrBuilding , 'click', function(e) {
       google.maps.event.trigger(otrParcel , 'click',e);
    
       //continue with your code
    });
    

    但是看起来会更好,当你把包裹层放在上面时,当包裹层被点击时触发建筑层的事件:

    google.maps.event.addListener(otrParcel , 'click', function(e) {
       google.maps.event.trigger(otrBuilding , 'click',e);
    
       //continue with your code
    });
    

    请注意:e-argument 包含顶层点击的事件对象。只访问事件的 lat 和 lng 是没问题的,但是你将无法使用事件访问像e.row 这样的图层相关的属性。

    【讨论】:

    • 这正是我想要做的,但我不确定如何为底层做这件事。我不断得到顶层。
    • 我正在尝试访问与层相关的属性,例如 e.row。我希望我可以为每一层使用 e.infoWindowHtml,并在 infoBubble 的不同选项卡中设置每一层。从你所说的和我所尝试的来看,这还不可能。
    • 这会创建递归,两个层都无限地相互触发。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2016-02-09
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多