【问题标题】:Access Fusion Table to show up in Map Using FusionTableMap API使用 FusionTableMap API 访问 Fusion Table 以显示在地图中
【发布时间】:2012-12-20 10:34:12
【问题描述】:

我已经在 google 中创建了服务帐户来访问和上传融合表中的数据。我能够使用 OAuth 进行身份验证并将数据推送到服务帐户的融合表中。但是当我尝试使用 tableid 访问同一个表时在地图中我无法访问相同的。创建的表未显示在我的主帐户中。我在 stackoverflow 中阅读了一些他们谈到给予 FT 许可的问题(我什至无法做到)

我的代码:

/

*
 * Copyright (c) 2012 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.fusiontables.cmdline;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.DateTime;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.Drive.Permissions;
import com.google.api.services.drive.model.Permission;
import com.google.api.services.fusiontables.Fusiontables;
import com.google.api.services.fusiontables.Fusiontables.Query.Sql;
import com.google.api.services.fusiontables.Fusiontables.Table.Delete;
import com.google.api.services.fusiontables.FusiontablesScopes;
import com.google.api.services.fusiontables.model.Column;
import com.google.api.services.fusiontables.model.Sqlresponse;
import com.google.api.services.fusiontables.model.Table;
import com.google.api.services.fusiontables.model.TableList;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;

/**
 * @author Christian Junk
 * 
 */
public class FusionTablesSample {

  /** E-mail address of the service account. */
  private static final String SERVICE_ACCOUNT_EMAIL = "XXXXXXXXXXXXXX@developer.gserviceaccount.com";




  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  private static Fusiontables fusiontables;

  /** Authorizes the installed application to access user's protected data. */
  private static Credential authorizeNew() throws Exception {

            // Build service account credential.
        GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)


        .setServiceAccountScopes(FusiontablesScopes.FUSIONTABLES)
        .setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
        .build();



       return credential;
  }

  /** Authorizes the installed application to access user's protected data. */
  private static Credential authorizeNewDrive() throws Exception {

      GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
      .setJsonFactory(JSON_FACTORY)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)


      .setServiceAccountScopes(DriveScopes.DRIVE)
      .setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
      .build();



     return credential;
  }






  /**
   * Insert a new permission.
   *
   * @param service Drive API service instance.
   * @param fileId ID of the file to insert permission for.
   * @param value User or group e-mail address, domain name or {@code null}
                  "default" type.
   * @param type The value "user", "group", "domain" or "default".
   * @param role The value "owner", "writer" or "reader".
   * @return The inserted permission if successful, {@code null} otherwise.
   */
  private static Permission insertPermission(Drive service, String fileId,
      String value, String type, String role) {
    Permission newPermission = new Permission();

    newPermission.setValue(value);
    newPermission.setType(type);
    newPermission.setRole(role);
   try {
       System.out.println("service"+service.permissions());
      return service.permissions().insert(fileId, newPermission).execute();
      } catch (IOException e) {
     System.out.println("An error occurred: " + e);
   }
    return null;
  }

  /** Global Drive API client. */
  private static Drive drive;

  public static void main(String[] args) {
    try {
      try {



//        System.out.println(System.getProperty("user.home"));
        // authorization
        Credential credential = authorizeNew();

        Credential credential1 = authorizeNewDrive();


        // set up global FusionTables instance
        fusiontables = new Fusiontables.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
            "FusionTable").build();


        // set up the global Drive instance
        drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential1).setApplicationName(
            "FusionTable").build();


        System.out.println(drive.files().list());
        Permissions perms=drive.permissions();
        System.out.println(perms);



        // run commands
//        listTables();
        ArrayList<String> list=listTables("");

//       String tableId = createTable();
//        insertData(tableId);
        for(String tableid:list)
        {
            insertPermission(drive, tableid, "XXXXXXXXX@gmail.com","anyone","owner");
//          System.out.print(" permission for table id is  " + perms.list(tableid));
        showRows(tableid);
//        deleteTable(tableid);
        }
        listTables();
   //     deleteTable(tableId);
        // success!
        return;
      } catch (IOException e) {
        System.err.println(e.getMessage());
      }
    } catch (Throwable t) {
      t.printStackTrace();
    }
    System.exit(1);
  }

  /**
   * @param tableId
   * @throws IOException
   */
  private static void showRows(String tableId) throws IOException {
    View.header("Start Showing Rows From Table");

    Sql sql = fusiontables.query().sql("SELECT Text,Number,Location,Address,Date FROM " + tableId);

    try {
     Sqlresponse response= sql.execute();
     System.out.println(  response.getColumns());
   System.out.println(  response.getRows());

    } catch (IllegalArgumentException e) {
      // For google-api-services-fusiontables-v1-rev1-1.7.2-beta this exception will always
      // been thrown.
      // Please see issue 545: JSON response could not be deserialized to Sqlresponse.class
      // http://code.google.com/p/google-api-java-client/issues/detail?id=545
    }
    View.header("End Showing Rows From Table");
  }

  /** List tables for the authenticated user. */
  private static void listTables() throws IOException {
    View.header("Listing My Tables");

    // Fetch the table list
    Fusiontables.Table.List listTables = fusiontables.table().list();
    TableList tablelist = listTables.execute();

    if (tablelist.getItems() == null || tablelist.getItems().isEmpty()) {
      System.out.println("No tables found!");
      return;
    }

    for (Table table : tablelist.getItems()) {
      View.show(table);
      View.separator();
    }
  }

  private static  ArrayList<String> listTables(String a) throws IOException {
    View.header("Listing My Tables");
    ArrayList<String> rt=new ArrayList<String>();
    // Fetch the table list
    Fusiontables.Table.List listTables = fusiontables.table().list();
    TableList tablelist = listTables.execute();

    if (tablelist.getItems() == null || tablelist.getItems().isEmpty()) {
      System.out.println("No tables found!");
      return rt;
    }

    for (Table table : tablelist.getItems()) {
      rt.add(table.getTableId());
      View.show(table);
      View.separator();
    }
    return rt;
  }

  /** Create a table for the authenticated user. */
  private static String createTable() throws IOException {
    View.header("Create Sample Table");

    // Create a new table
    Table table = new Table();
    table.setName(UUID.randomUUID().toString());
    table.setIsExportable(true);

    table.setDescription("Sample Table");

    // Set columns for new table
    table.setColumns(Arrays.asList(new Column().setName("Text").setType("STRING"),
        new Column().setName("Number").setType("NUMBER"),
        new Column().setName("Location").setType("LOCATION"),
        new Column().setName("Address").setType("STRING"),
        new Column().setName("Date").setType("DATETIME")));

    // Adds a new column to the table.
    Fusiontables.Table.Insert t = fusiontables.table().insert(table);
    Table r = t.execute();

    View.show(r);

    return r.getTableId();
  }

  /** Inserts a row in the newly created table for the authenticated user. */
  private static void insertData(String tableId) throws IOException {
    Sql sql = fusiontables.query().sql("INSERT INTO " + tableId + " (Text,Number,Location,Address,Date) "
        + "VALUES (" + "'Google Inc', " + "1, " + "'22.816694,70.850418',  " + "'1600 Amphitheatre Parkway Mountain View, "
        + "CA 94043, USA','" + new DateTime(new Date()) + "')");

    try {
      sql.execute();
    } catch (IllegalArgumentException e) {
      // For google-api-services-fusiontables-v1-rev1-1.7.2-beta this exception will always
      // been thrown.
      // Please see issue 545: JSON response could not be deserialized to Sqlresponse.class
      // http://code.google.com/p/google-api-java-client/issues/detail?id=545
      e.printStackTrace();
    }
  }

  /** Deletes a table for the authenticated user. */
  private static void deleteTable(String tableId) throws IOException {
    View.header("Delete Sample Table");
    // Deletes a table
    Delete delete = fusiontables.table().delete(tableId);
    delete.execute();
  }
}

【问题讨论】:

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


    【解决方案1】:

    Java 对我来说是希腊语……发布通用 FT Java 模块有什么意义? 我在这里看不到任何 Google 地图代码,甚至看不到您尝试访问的表格 ID。 使用 UI 前往您的餐桌:

    https://www.google.com/fusiontables/DataSource?docid=[编码表ID]

    在“共享”设置中,选择“在网络上公开”或“知道链接的任何人”。现在应该可以通过 Google Maps javascript API 访问它了。

    【讨论】:

    • 这是代码的服务器端,用于聚合数据并放入 Fusion 表中。我们的问题是我们想通过程序来做到这一点,我们能够在表中插入数据,但无法在我的地图代码中访问同一个表。
    【解决方案2】:

    我在 stackoverflow 中读到了一些问题,他们谈到了给予 FT 的权限(我什至做不到)

    您的代码已包含该内容。看看你的 insertPermission() 方法。复制粘贴的奇迹... :)

    根据 Google 地图文档,您只能在地图上显示以“公开”或“未列出”形式共享的融合表。 来源:https://developers.google.com/maps/documentation/javascript/layers#FusionTablesSetup

    要实现这一点,请使用角色“reader”在您的表上设置权限并输入“anyone”。有关更多信息和 java 示例,请参阅:https://developers.google.com/drive/v2/reference/permissions/insert

    【讨论】:

    • 我的错,我无法明确我的问题,实际上我知道 insertPermission () 方法,问题是即使在那时我也没有得到授权错误,我无法访问在我的地图应用程序中创建的表。
    • 当我试图列出使用代码 drive.files.list() 创建的表时。它导致空但显示方法 listTables() 方法的表
    • 您可能已经使用服务帐户创建了融合表,并且您想使用您的个人帐户在 Fusion Tables 网站上对其进行检查。您需要通过用于创建融合表的同一帐户插入权限。之后,您(和其他所有人)将能够访问(阅读)它。
    • 是的,我已经尝试使用我的服务帐户凭据插入权限,即使它失败了,我还需要处理其他事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多