【问题标题】:bigrquery: Create a BigQuery table with geoJSON files doesn't workbigrquery:使用 geoJSON 文件创建 BigQuery 表不起作用
【发布时间】:2021-10-10 20:02:04
【问题描述】:

我想用geoJSON files 创建一个BigQuery 表,尽管geoJSON 是BQ (NEWLINE_DELIMITED_JSON) 和bq_fields specification, or something coercible to it (like a data frame) 中可接受的格式,而bigrquery 包的函数bq_table_create() 没有'不工作。在下面的示例中,输出错误是Erro: Unsupported type: list:

library(sf)
library(bigrquery)
library(DBI)
library(googleAuthR)
library(geojsonsf)
library(geojsonR)


# Convert shapefile to geoJSON 
stands_sel <- st_read(
  "D:/Dropbox/Stinkbug_Ml_detection_CMPC/dashboard/v_08_CMPC/sel_stands_CMPC.shp")

# Open as geoJSON
geo <- sf_geojson(stands_sel)

# Convert geoJSON to data frame 
geo_js_df <- as.data.frame(geojson_wkt(geo))
str(geo_js_df)
# 'data.frame': 2 obs. of  17 variables:
#  $ SISTEMA_PR: chr  "MACRO ESTACA - EUCALIPTO" "SEMENTE - EUCALIPTO"
#  $ ESPECIE   : chr  "SALIGNA" "DUNNI"
#  $ ID_UNIQUE : chr  "BARBANEGRA159A" "CAMPOSECO016A"
#  $ CICLO     : num  2 1
#  $ LOCALIDADE: chr  "BARRA DO RIBEIRO" "DOM FELICIANO"
#  $ ROTACAO   : num  1 1
#  $ CARACTER_1: chr  "Produtivo" "Produtivo"
#  $ VLR_AREA  : num  8.53 28.07
#  $ ID_REGIAO : num  11 11
#  $ CD_USO_SOL: num  2433 9053
#  $ DATA_PLANT: chr  "2008/04/15" "2010/04/15"
#  $ ID_PROJETO: chr  "002" "344"
#  $ CARACTERIS: chr  "Plantio Comercial" "Plantio Comercial"
#  $ PROJETO   : chr  "BARBA NEGRA" "CAMPO SECO"
#  $ ESPACAMENT: chr  "3.00 x 2.50" "3.5 x 2.14"
#  $ CD_TALHAO : chr  "159A" "016A"
#  $ geometry  :List of 2
#   ..$ : 'wkt' chr "MULTIPOLYGON (((-51.2142 -30.3517,-51.2143 -30.3518,-51.2143 -30.3518,-51.2143 -30.3519,-51.2143 -30.3519,-51.2"| __truncated__
#   ..$ : 'wkt' chr "MULTIPOLYGON (((-52.3214 -30.4271,-52.3214 -30.4272,-52.3214 -30.4272,-52.3215 -30.4272,-52.3215 -30.4272,-52.3"| __truncated__
#  - attr(*, "wkt_column")= chr "geometry"

# Insert information inside BQ
bq_conn <-  dbConnect(bigquery(),
                       project = "my-project",
                       use_legacy_sql = FALSE
)

# First create the table
players_table = bq_table(project = "my-project", dataset = "stands_ROI_2021", table = "CF_2021")
bq_table_create(x = players_table, fields = as_bq_fields(geo_js_df))
Erro: Unsupported type: list

【问题讨论】:

    标签: r google-bigquery bigrquery


    【解决方案1】:

    您可以使用bq_table_upload() 语法在 BigQuery 上上传具有列表类型列的数据框。在你的脚本上试试这个,而不是bq_table_create()

    bq_table_upload(players_table, geo_js_df)
    

    为了您的参考,我使用此示例数据和列表类型列进行了尝试:

    d <- data.frame(id = 1:2,
                       name = c("Jon", "Mark"),
                       children = I(list(c("Mary", "James"),
                                         c("Greta", "Sally")))
                    )
    

    R 控制台:

    已创建 BQ 表:

    编辑:

    根据此documentation,BigQuery 尚不支持FeatureCollection,但您可以找到here 的持续功能请求。解决方法是先将 GeoJson 文件转换为 BigQuery 换行分隔的 JSON,然后再将其转换为数据框。

    要将 GeoJson 文件转换为 BigQuery 换行分隔的 JSON,请遵循以下steps

    1. 安装 node.js。
    2. 添加包:
    npm install fs JSONStream line-input-stream yargs
    
    1. 克隆 github 存储库:
    git clone https://github.com/mentin/geoscripts.git
    
    1. 更改目录:
    cd geoscripts/geojson2bq/
    
    1. 将 GeoJson 文件转换为 BigQuery 换行分隔的 JSON:
    node geojson2bqjson.js sel_stands.geojson > out.json
    

    使用换行符分隔的 JSON 文件,在 R 控制台中将其转换为数据帧,然后使用 bq_table_upload() 将数据上传到 BigQuery。

    library(bigrquery)
    library(dplyr)
    library(tidyverse)
    library(jsonlite)
    
    out <- stream_in(file('out.json'))
    
    projectid<-"my-project"
    datasetid<-"my-dataset"
    
    bq_conn <-  dbConnect(bigquery(), 
                          project = projectid,
                          dataset = datasetid, 
                          use_legacy_sql = FALSE)
    
    players_table = bq_table(project = "my-project", dataset = "my-dataset", table = "CF_2021_test5")
    
    bq_table_upload(players_table, out)
    
    bq_table_download(players_table)
    

    R 控制台:

    BigQuery 表:

    【讨论】:

    • 嗨@Mabel A. 非常感谢你,还没有,因为如果我尝试:bq_table_upload(players_table, geo_js_df)Erro: No method asJSON S3 class: MULTIPOLYGON ideia 保存为 JSON/geoJSON 文件,如果我转换为表格,我不会' t 具有空间几何格式。
    • @Leprechault 你能提供一个示例 geoJSON 文件吗?
    • 谢谢,geoJSON 格式的同一个文件:[raw.githubusercontent.com/Leprechault/trash/main/…
    • 嗨@Leprechault,请检查我的答案,我用其他信息更新了它。
    • 你可以使用geojsonsf::sf_geojson(stands_sel, atomise = TRUE)给你行分隔的geojson
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2023-03-06
    相关资源
    最近更新 更多