0

我有一个带有 FusionTablesLayer 的谷歌地图,显示德国的铁路(融合表可以在这里找到)。该geometry列包含每个要素的 LineString 坐标。

var railwaysLayer = new google.maps.FusionTablesLayer({
    map: map,
    query: {
        select: 'geometry',
        from: '1cVaJLbbxgBErP8PzYkHP-lpWMN8wUmINbdAJS1Y'
    }
});

当用户点击铁路时,我需要知道点击了哪一行(或实际功能)。这可以在click事件处理程序中完成,如下所示:

google.maps.event.addListener(existingRailwaysLayer, 'click', function(e) {
    console.log(e.row.geometry.value);
});

这可以按预期工作,但问题是:该表是一个月前从 KML 文件上传的,作为测试。我今天在不同的帐户上导入了完全相同的 KML 文件(此处),并且该geometry列不再在事件处理程序中返回。

我检查了所有设置,发现在两个表中,geometry列的类型都是Location. 但是:在第一个表中,行未进行地理编码。File > Geocode > Begin geocoding有效地开始对每一行进行地理编码的过程,而在第二个表中它说:“列已完全地理编码”。

由于其他一切都完全相同,这很可能是问题所在。我不知道如何对第二个表中的行进行“取消地理编码”。自从一个月前第一个上传以来,我的猜测是谷歌现在自动对行进行地理编码。

有什么方法可以获取geometry被点击的功能列?

注意:这绝对是可能的,即使geometry列是地理编码的。在第二个表的“几何图”选项卡中,您可以选择单击要素时信息窗口中显示的列。有关工作演示,请参见此处。

4

1 回答 1

0

具有 KML 数据的行不会包含在行中(我不确定是否一直如此)。

我猜 KML 功能已被省略以节省带宽

你可以做什么:

解析e.infoWindowHtml(您已经注意到可以在 InfoWindow 中打印几何特征,e.infoWindowHtml包含用作 InfoWindow 内容的字符串)。

但是自动信息窗口模板只显示坐标,使用动态模板,例如

{template .contents}
<div class='googft-info-window'>
<b>description:</b> {$data.formatted.description}<br>
<b>name:</b> {$data.formatted.name}<br>
<div style="width:0;height:0;overflow:hidden;">[[{$data.value.geometry}]]</div>
</div>
{/template}

(您可以将此模板与您的表格一起使用,我已经创建了它,它具有templateId:6

如您所见,几何图形嵌入在没有大小的 div 中,不会显示在 InfoWindow 中。几何图形用方括号括起来,使用 RegExp 找到它:

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

  var str = e.infoWindowHtml, geo;

  if(geo=str.match(/\[\[([^\]]+)]]/)){
      geo=geo[1].replace(/(&gt;|&lt;)/g,function(x){
            return((x==='&gt;')?'>':'<');
          });
      console.log(geo);
  }
});

演示:(使用您的表格和我的模板)http://jsfiddle.net/doktormolle/9YdKW/

于 2013-09-29T02:31:12.707 回答