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

3
我有一个包含多边形的地理数据帧(geometry column),需要将其上传到Snowflake。我一直在尝试将此数据帧的geometry列导出为文件,尝试了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上运行

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)与对应表格(1)不匹配,使用文件格式选项error_on_column_count_mismatch=false来忽略此错误 文件'@~/polygons.csv.gz',第3行,第1个字符 第1行从第2行,第“DESIGN_POLYGONS_STAGING”[6]列开始 如果您希望在遇到错误时继续加载,请使用其他值(如‘SKIP_FILE’或‘CONTINUE’)作为ON_ERROR选项。有关加载选项的更多信息,请在SQL客户端中运行'info loading_data'。”
有人能够确定我做错了什么吗?

1
你能否贴出文件中的一行数据?如果您手动插入与该行数据相同形状的行,是否会被插入,或者需要进行转换处理? - Simeon Pilgrim
这是个好主意。我会尝试这个实验并回复你的。 - Keith
哎呀,我的多边形规范有语法错误。这个可以用:create or replace table DB.SCHEMA."DESIGN_POLYGONS_STAGING" ( geometry GEOGRAPHY ) AS SELECT TO_GEOGRAPHY('POLYGON((0.0 0.0, 1.0 0.0, 1.0 1.0, 0.0 1.0, 0.0 0.0))') - Keith
在之前的实验中,我上传了一个polygons.csv.gz文件。Snowflake可能非常愚蠢,并自动将此文件插入, treating it as uncompressed,然后抱怨它不是UTF-8编码。从stage中删除此文件解决了由此行为引起的几个问题。 - Keith
都解决了吗?还有当前的障碍吗? - Simeon Pilgrim
@SimeonPilgrim 非常感谢!你的评论让我找到了正确的方向。 - Keith
1个回答

2

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

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

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

我的多边形看起来更像是描述多边形的字符串而非实际的地理空间信息,所以我决定把它们视为字符串,然后调用 TO_GEOGRAPHY() 方法。

我很快发现,这些多边形需要明确地用单引号括起来,并将其复制到暂存表的 VARCHAR 列中。这可以通过修改 CSV 导出代码来完成:

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

暂存表现在看起来像这样:

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

我在将数据复制到暂存表时遇到了问题,这与之前上传的polygons.csv.gz文件有关。我使用以下命令删除了该文件:

remove @~/polygons.csv.gz

最后,将暂存表转换为地理数据类型。
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的表格,里面只有一个GEOGRAPHY列。成功了!!!


注意,您也可以将geoJSON作为字符串插入,而无需使用to_geograph()函数。 - Trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接