【问题标题】:Google Fusion Table Query using FusionTablesLayerOptions' query parameter not working使用 FusionTablesLayerOptions 的查询参数的 Google Fusion Table Query 不起作用
【发布时间】:2016-07-28 17:49:41
【问题描述】:

我的目标是根据 Fusion Table 的查询结果创建 google.maps.FusionTablesLayer。我有一个公开的Google Fusion Table,它已“启用下载”。我能够使用 Google Fusion Tables REST API 成功查询表,如下所示(我会提供指向该 API 的链接,但没有足够的声誉)。以下查询在浏览器中有效:

https://www.googleapis.com/fusiontables/v2/query?sql=SELECT+start_lat+,+dir+FROM+1JUAkUL5H7IhU4QrmLuVQ65Tg2SNyI5Xqm3A7Nk1g+WHERE+dir=%27Northbound%27&key=AIzaSyBCjde_rx_Fe0v4G_vD-uI33M1o9toMF2A

我真正想要的是能够使用查询结果创建一个 Google Fusion Tables Layer Object。似乎最简单的方法是在 Google Fusion Tables Layer Object 初始化期间提供上述查询作为参数(如 JavaScript FusionTablesLayer API 中所示)。但是在初始化的时候查询FusionTablesLayer却没有显示出来,如下:

northbound_hikers_start_layer = new google.maps.FusionTablesLayer({
  query: {
    select: 'start_lat',
    from: '1JUAkUL5H7IhU4QrmLuVQ65Tg2SNyI5Xqm3A7Nk1g',
    where: "dir = 'Northbound'"
  },
  heatmap: {
    enabled: true
  },
  suppressInfoWindows: false
});
在将查询作为参数传递给 FusionTablesLayer 对象时,我无法理解为什么“where”子句失败,但 Fusion Tables REST API 查询在浏览器中运行良好。我已经阅读了 API,但是关于这个特定主题的页面令人惊讶地不完整。有任何想法吗?我希望我可以包含更多指向我正在使用的特定 API 的链接,但我的 StackOverflow 声誉不足以发布超过 2 个 URL。最终目标是一个仅包含查询获得的数据的 FusionTablesLayer。

编辑:当我删除“where”子句时知道地图正确显示可能会有所帮助(这让我相信查询是问题所在)。我忘了提到我确实为图层分配了如下地图:

 $("button").click(function() {
   console.log(this.id + " button was pressed.");
   if (this.id == "toggle-at-centerline-button") {
     //Toggle AT Centerline Layer
     if (!toggle_at_centerline_button_pressed) {
       centerline_layer.setMap(map);
       toggle_at_centerline_button_pressed = true;
     } else {
       centerline_layer.setMap(null);
       toggle_at_centerline_button_pressed = false;
     }
   } else if (this.id == "toggle-at-shelter-button") {
     //Toggle AT Shelters Layer
     if (!toggle_at_shelter_button_pressed) {
       shelterLayer.setMap(map);
       toggle_at_shelter_button_pressed = true;
     } else {
       shelterLayer.setMap(null);
       toggle_at_shelter_button_pressed = false;
     } etc...
});

【问题讨论】:

    标签: javascript sql google-maps google-fusion-tables


    【解决方案1】:

    您需要设置FusionTablesLayerOptionsmap 属性(或至少在某个时候设置):

    var northbound_hikers_start_layer = new google.maps.FusionTablesLayer({
      query: {
        select: 'start_lat',
        from: '1JUAkUL5H7IhU4QrmLuVQ65Tg2SNyI5Xqm3A7Nk1g',
        where: "dir = 'Northbound'"
      },
      heatmap: {
        enabled: true
      },
      suppressInfoWindows: false,
      map: map
    });
    

    proof of concept fiddle

    代码 sn-p:

    function initialize() {
      var map = new google.maps.Map(
        document.getElementById("map_canvas"), {
          center: new google.maps.LatLng(39.232253, -76.640625),
          zoom: 4,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      var northbound_hikers_start_layer = new google.maps.FusionTablesLayer({
        query: {
          select: 'start_lat',
          from: '1JUAkUL5H7IhU4QrmLuVQ65Tg2SNyI5Xqm3A7Nk1g',
          where: "dir = 'Northbound'"
        },
        heatmap: {
          enabled: true
        },
        suppressInfoWindows: false,
        map: map
      });
    }
    google.maps.event.addDomListener(window, "load", initialize);
    html,
    body,
    #map_canvas {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <div id="map_canvas"></div>

    【讨论】:

    • 对不起,我忘了提到我确实在稍后按下显示按钮时设置了地图属性。当我删除“where”子句时,上面的代码可以正常工作。只有存在“where”子句时才会出现任何内容。我将编辑原始问题以反映此信息。
    • 感谢您的“概念证明小提琴”,我发现了错误。查询正在运行(如您的小提琴所示),我正在使用 'where:"dir = 'Southbound'"'' 测试显示。我的表太大,因此数据没有作为查询可访问的 100,000 个条目的一部分返回。因此,“Northbound”查询成功,“Southbound”查询似乎失败。我已将问题标记为已回答,因为您的小提琴显示了一个工作查询的示例,让我意识到我的错误。我希望其他人觉得这很有用;感谢您的工作示例!
    • 这就是为什么在问题中提供minimal reproducible example 很重要。
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2013-10-05
    相关资源
    最近更新 更多