bigrquery:使用 geoJSON 文件创建 BigQuery 表不起作用

Posted

技术标签:

【中文标题】bigrquery:使用 geoJSON 文件创建 BigQuery 表不起作用【英文标题】:bigrquery: Create a BigQuery table with geoJSON files doesn't work 【发布时间】: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

【问题讨论】:

【参考方案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:

    安装 node.js。 添加包:
npm install fs JSONStream line-input-stream yargs
    克隆 github 存储库:
git clone https://github.com/mentin/geoscripts.git
    更改目录:
cd geoscripts/geojson2bq/
    将 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

以上是关于bigrquery:使用 geoJSON 文件创建 BigQuery 表不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在闪亮的应用程序中使用 bigrquery auth

如何从图像叠加层创建 geojson 文件?

如何从 GeoJson 创建 utfgrid 瓦片?

R 的 bigrquery 的身份验证问题

如何在创建 geojson 时处理 NaN 值

如何使用 react-leaflet 从 geojson 数据创建图例