我有一个 geopandas 文件,其中一列是形状优美的 polgyon。这是它的样子。
我尝试使用
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 中的地理类型似乎有一个方向,但我不确定它是如何工作的。
我可以做什么来上传这个数据框?
。我还从这里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 时相同的行为。
要解决此问题,您可以:
修复 Python 中循环的方向。身材匀称应该可以做到。 https://shapely.readthedocs.io/en/stable/manual.html#shapely.geometry.polygon.orient
以字符串类型上传 Geography,然后使用不带
ST_GeogFromText
参数的 oriented
查询转换为 Geography。