当发生无效地理值错误时,有没有办法使 Shapely 多边形与 BigQuery 兼容

问题描述 投票:0回答:1

我有一个 geopandas 文件,其中一列是形状优美的 polgyon。这是它的样子。 enter image description here

我尝试使用

pandas_gbq.to_gbq(df,..., table_schema=[{'name': 'name', 'type': 'STRING'}, {'name': 'type', 'type': 'STRING'}, {'name': 'population', 'type': 'INTEGER'}, {'name': 'geometry', 'type': 'GEOGRAPHY'}

将其上传到 BiQuery

并出现以下错误

pandas_gbq.exceptions.GenericGBQException: Reason: 400 Error while reading data, error message: Invalid geography value, error: Polygon's first loop must be shell. It is nested in loop 2; in polygon 1032; in WKB geography; in column 'geometry'; reason: invalid, message: Error while reading data, error message: Invalid geography value, error: Polygon's first loop must be shell. It is nested in loop 2; in polygon 1032; in WKB geography; in column 'geometry'

我尝试检查几何文件是否有效,如果无效,则通过

df['geometry'] = df['geometry'].apply(lambda x: make_valid(x) if not explain_validity(x) == 'Valid Geometry' else x)
使其有效,但这似乎没有帮助。我还从这里https://cloud.google.com/bigquery/docs/geospatial-data读到,BigQuery 中的地理类型似乎有一个方向,但我不确定它是如何工作的。

我可以做什么来上传这个数据框?

python google-bigquery geopandas shapely
1个回答
0
投票

。我还从这里https://cloud.google.com/bigquery/docs/geospatial-data读到,BigQuery 中的地理类型似乎有一个方向,但我不确定它是如何工作的。

您是正确的,多边形方向可能是导致此错误的原因。多边形有一个壳(外环),并且可能有孔(内环)。孔应该位于外壳内部,但“内部”和“外部”取决于环的方向。形状

POLYGON((0 0, 20 0, 10 10, 0 0))
描述了一个“三角形”多边形,但
POLYGON((0 0, 10 10, 20 0, 0 0))
描述了该“三角形”之外的所有内容,如本文档中所述。这样

SELECT ST_GeogFromText(
     'POLYGON((0 0, 20 0, 10 10, 0 0), (9 4, 10 6, 11 4, 9 4))',
     oriented => TRUE) g

很好——一个带孔的三角形。但是

SELECT ST_GeogFromText(
     'POLYGON((0 0, 10 10, 20 0, 0 0), (9 4, 10 6, 11 4, 9 4))',
     oriented => TRUE) g

导致错误

ST_GeogFromText failed: Polygon should have only one shell, holes must be inside the shell. Polygon hole 1 is outside of the shell

请注意,我传递了 orient => TRUE 参数,该参数强制执行与从 Pandas 加载 Geography 时相同的行为。

要解决此问题,您可以:

  1. 修复 Python 中循环的方向。身材匀称应该可以做到。 https://shapely.readthedocs.io/en/stable/manual.html#shapely.geometry.polygon.orient

  2. 以字符串类型上传 Geography,然后使用不带

    ST_GeogFromText
    参数的
    oriented
    查询转换为 Geography。

© www.soinside.com 2019 - 2024. All rights reserved.