2011-09-28 114 views
6

我已经设置了一些多边形,把它们绘制在地图上就好了。点击时我也设法触发console.log。但是,如何确定哪个多边形实际被点击?如何获取点击多边形的引用? (谷歌地图api v3)

正如你可以在我的示例代码中看到的那样,我将每个对象存储在集合“lot”中,但是 - 单击它们只会给我点击的经纬度。我想我可能需要循环通过我的多边形,并检查点被点击是否相交,从而找出它是哪个多边形...有没有更简单的解决方案?

var lot = new google.maps.Polygon({ 
    paths: me.area, 
    strokeColor: 'black', 
    strokeOpacity: 0.35, 
    strokeWeight: 1, 
    fillColor: fillcol, 
    fillOpacity: 0.35 
}); 

lot.setMap(map); 
var obj = { 
    'id':me.id, 
    'rented':me.rented, 
    'area':lot 
}; 

google.maps.event.addListener(lot, 'click', function(event) { 
    console.log(event); 
}); 

lots.push(lot); 
+0

原来的getPath()的工作就像一个魅力。 我没有意识到我实际上已经获得了点击事件传递的多边形引用,为了将其与我存储的“批次”匹配,我只是通过存储的批次循环,并将this.getPath与other.getPath进行比较,如果它们匹配,我就知道哪个批次被点击,现在可以显示与这个特定对象有关的信息。 – Bisa

+0

您可能必须等待几个小时才能让网站允许您这样做,但如果可以的话,您应该将其作为答案发布。 – Trott

回答

13

为什么不分配给每个多边形一些id属性,当你创建它们,以后只需使用this.myID?实际上,您可以将所需的所有信息都挂在该多边形对象上。

var lot = new google.maps.Polygon({ 
     paths: me.area, 
     strokeColor: 'black', 
     strokeOpacity: 0.35, 
     strokeWeight: 1, 
     fillColor: fillcol, 
     fillOpacity: 0.35 
    }); 

    lot.setMap(map); 

    var obj = { 
     'id':me.id, 
     'rented':me.rented, 
     'area':lot 
    }; 
    lot.objInfo = obj; 

    google.maps.event.addListener(lot, 'click', function(event) { 
     console.log(this.objInfo); 
    }); 

    lots.push(lot); 

它会比循环中的路径比较更有效,或者我错过了什么? :)

+0

嗯,我不知道,事情是我从来没有真正想过将自己的属性添加到多边形对象,但我认为这是比较平滑,然后比较路径是=) – Bisa

+1

@比萨和JavaScript存储对对象和数组的引用,而不是copys,在这种情况下内存消耗保持不变。 – dmitry

+0

正确,这是一个坚实的论点,在我原来的解决方案中,我会复制值并比较它们,而不是比较引用 - 我会稍微修改一下代码来重写我的代码^^ thnx – Bisa

0

原来getPath()就像一个魅力一样。我没有意识到我实际上已经获得了在click事件上传递的多边形引用,为了将其与我存储的“lot”进行匹配,我只需循环访问我的存储区域,并将this.getPath与other.getPath进行比较,如果匹配,则知道哪个区域是点击,现在可以显示与此特定对象相关的信息。

下面是一个代码示例: (停车的地方是它本身具有含停车场的对象数组我的停车区对象的数组)

google.maps.event.addListener(lot, 'click', function(event) { 

    var myPath = this.getPath(); 

      for(var i = 0; i < parking.length; i++){ 
      for(var j = 0; j < parking[i].lots.length; j++){ 
       var lot = parking[i].lots[j]; 

       var otherPath = lot.poly.getPath(); 

       if(otherPath == myPath){ 
        console.log(lot); 
        break; 
       } 
      } 
      } 

     }); 
+0

根据Trotts建议我已经发布了我的评论上面作为答案以及提供一些示例代码 - 不会让我标记这是我的答案,直到明天tho;) – Bisa

8

如果我能用一种不同的解决方案稍微晚一点,我遇到了同样的问题,并发现可以在多边形上定义自定义属性。

我的例子(其地图美国的上创建的状态)

poly = new google.maps.Polygon({ 
    map_state_id: map_state_id, 
    paths: pts, 
    fillColor: colour, 
    fillOpacity: 0.66, 
    strokeWeight: 1, 
    clickable:true 
    }); 

在这种情况下“map_state_id”是自定义属性。我已经将它定义为状态的ID(1表示阿拉巴马州,2表示阿拉斯加州,等等)

然后,当稍后点击特定状态时,可以将此“map_state_id”传递到事件函数中。

google.maps.event.addListener(poly, 'click', function() 
    { 
    var map_state_id = this.map_state_id; //retrieve correct state_id 

    $.ajax(
     { 
     type: "POST", 
     url: "http://www...get_state_info.php", 
     data: {state_id : map_state_id}, 
     dataType: "html", 
     success: function(data) 
      { 
      $("#state_info").html(data); //display some info 
      }      
     }); 
    }); 

,我发现这个特定的概念在http://dominoc925.blogspot.com/2011/12/add-your-own-property-field-to-google.html

+0

感谢您指出使用'这个'。 - 这是消除多边形歧义的必要条件。 – sdailey