如何将多边形从 GeoPandas 上传到 Snowflake?

How to upload Polygons from GeoPandas to Snowflake?

我有一个填充了多边形的地理数据框的几何列,我需要将它们上传到 Snowflake。

我一直在将 geodataframe 的几何列导出到文件,并尝试了 CSV 和 GeoJSON 格式,但到目前为止,我要么总是遇到错误,staging table 总是空着。

这是我的代码:

design_gdf['geometry'].to_csv('polygons.csv', index=False, header=False, sep='|', compression=None)

import sqlalchemy
from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL

engine = create_engine(
    URL(<Snowflake Credentials Here>)
)

with engine.connect() as con:
    con.execute("PUT file://<path to polygons.csv> @~ AUTO_COMPRESS=FALSE")

然后在 Snowflake I 运行

create or replace table DB.SCHEMA.DESIGN_POLYGONS_STAGING (geometry GEOGRAPHY);

copy into DB.SCHEMA."DESIGN_POLYGONS_STAGING"
from @~/polygons.csv
FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = '|' SKIP_HEADER = 1 compression = None encoding = 'iso-8859-1');

生成以下错误:

"文件 (6) 中的列数与对应的 table (1) 中的列数不匹配,使用文件格式选项 error_on_column_count_mismatch=false 忽略此错误 File '@~/ polygons.csv.gz', line 3, character 1 Row 1 starts at line 2, column "DESIGN_POLYGONS_STAGING"[6] 如果你想在遇到错误时继续加载,使用其他值,例如 'SKIP_FILE' 或 'CONTINUE' 用于 ON_ERROR 选项。有关加载选项的更多信息,请在 SQL 客户端中 运行 'info loading_data'。"

谁能指出我做错了什么?

受到@Simeon_Pilgrim 评论的启发,我回到了 Snowflake 的文档。在那里我找到了一个将字符串文字转换为 GEOGRAPHY 的示例。

https://docs.snowflake.com/en/sql-reference/functions/to_geography.html#examples

select to_geography('POINT(-122.35 37.55)');

我的多边形看起来更像是描述多边形的字符串,而不是实际的 GEOGRAPHY,因此我决定需要将它们视为字符串,然后对它们调用 TO_GEOGRAPHY()。

我很快发现它们需要用单引号显式括起来并复制到暂存中的 VARCHAR 列中 table。这是通过修改 CSV 导出代码完成的:

import csv
design_gdf['geometry'].to_csv(<path to polygons.csv>, 
                          index=False, header=False, sep='|', compression=None, quoting=csv.QUOTE_ALL, quotechar="'")

分期 table 现在看起来像:

create or replace table DB.SCHEMA."DESIGN_POLYGONS_STAGING" (geometry VARCHAR);

我 运行 在复制到暂存区 table 时遇到了进一步的问题,这与我必须在之前的实验中上传的 polygons.csv.gz 文件的存在有关。我使用以下方法删除了这个文件:

remove @~/polygons.csv.gz

最后,将暂存 table 转换为 GEOGRAPHY

create or replace table DB.SCHEMA."DESIGN_GEOGRAPHY_STAGING" (geometry GEOGRAPHY);

insert into DB.SCHEMA."DESIGN_GEOGRAPHY"
select to_geography(geometry)
from DB.SCHEMA."DESIGN_POLYGONS_STAGING"

最后我得到了一个 DESIGN_GEOGRAPHY table,其中有一列 GEOGRAPHY。成功!!!