2013-09-28 32 views
0

我有一個顯示德國鐵路的FusionTablesLayer的Google Maps(融合表可以找到here)。 geometry列包含每個要素的LineString座標。FusionTablesLayer - 獲取位置欄點擊

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文件(here),並且geometry列不再在事件處理程序中返回。

我檢查了所有設置,發現在這兩個表中,geometry列的類型爲Location。但是:在第一個表中,這些行不是地理編碼的。 File > Geocode > Begin geocoding有效地啓動了對每行進行地理編碼的過程,而在第二個表中則顯示:「列已完全地理編碼」。

因爲一切都完全一樣,所以這可能是問題所在。我不知道如何對第二個表格中的行進行「非地理編碼」。自從第一次上傳一個月前,我猜測Google現在會自動對行進行地理編碼。

有什麼辦法讓點擊的功能的geometry列?

注意:即使在geometry列進行了地理編碼,這絕對是可能的。在第二個表格的「幾何圖形」選項卡中,可以選擇在單擊某個功能時顯示在infoWindow中的列。查看here進行工作演示。

回答

0

包含KML數據的行將不會包含在行中(我不確定這是否始終存在)。

我猜的KML的功能已經ommitted節省帶寬

你可以做什麼:

解析e.infoWindowHtml(因爲你已經注意到它可以打印幾何特徵的信息窗口,e.infoWindowHtml包含用作InfoWindow內容的字符串)。

但是,自動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沒有大小,YIT不會在InfoWindow中顯示。 幾何形狀放在方括號內,使用正則表達式來找到它:

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/

+0

這也是我的第一個想法,但如你所知,這是不是一個可靠的解決方它註定要在某個時間點中斷(如果Google更新了FusionTablesLayer InfoWindow)。這就是爲什麼我選擇添加一個額外的列,其中保留與'幾何'列完全相同的細節,除了它是'文本'類型。我知道這增加了總規模,但它似乎是一個更穩固的解決方案。 –

+0

我不會稱之爲添加更多實體的列副本。一個更可靠的解決方案是給列賦一個唯一的id並通過AJAX請求幾何。 –