BigQuery解析LineString地理对象时为何自动添加顶点?
BigQuery解析LineString自动添加顶点的原因与解决办法
问题背景
在使用BigQuery解析LineString地理对象时,系统会自动添加额外顶点,导致长线条的几何对象顶点数大幅增加。由于BigQuery通过顶点数量衡量几何类型大小,这一行为会带来使用困扰。
示例查询
WITH DB AS ( SELECT 'LINESTRING (-16.71188 28.05526, -16.71172 28.05575, -16.71189 28.05586, -16.71184 28.05528)' as str, ) SELECT str as original_text, ST_ASTEXT(ST_GEOGFROMTEXT(str)) AS geog_text, ST_NUMPOINTS(ST_GEOGFROMTEXT(str)) AS geog_n_points, FROM DB
输出结果
[{ "original_text": "LINESTRING (-16.71188 28.05526, -16.71172 28.05575, -16.71189 28.05586, -16.71184 28.05528)", "geog_text": "LINESTRING(-16.71188 28.05526, -16.7118469906226 28.0553610915993, -16.71172 28.05575, -16.71189 28.05586, -16.7118469906226 28.0553610915993, -16.71184 28.05528)", "geog_n_points": "6" }]
原LineString包含4个顶点,解析后变为6个,新增的两个顶点坐标完全相同:-16.7118469906226 28.0553610915993
原因分析
BigQuery的地理对象默认采用球面几何模型,而非平面几何。当解析LineString时,系统会自动将线段转换为球面上的测地线(最短路径),并在必要时添加顶点来精确表示这条测地线——即使原始线段在平面上看起来是直线,在球面上对应的测地线可能需要额外顶点拟合。
示例中的原始LineString存在非简单路径(交叉),BigQuery处理这类路径时,会插入顶点拆分路径,确保几何对象符合球面几何的表示规范,这就是额外顶点出现的核心原因。
解决办法
如果希望保留原始顶点数量、避免自动添加顶点,可以使用ST_GEOGFROMTEXT的第二个参数use_spherical_geography,将其设置为FALSE,强制使用平面几何解析:
WITH DB AS ( SELECT 'LINESTRING (-16.71188 28.05526, -16.71172 28.05575, -16.71189 28.05586, -16.71184 28.05528)' as str, ) SELECT str as original_text, ST_ASTEXT(ST_GEOGFROMTEXT(str, FALSE)) AS geog_text, ST_NUMPOINTS(ST_GEOGFROMTEXT(str, FALSE)) AS geog_n_points, FROM DB
执行该查询后,输出的顶点数将保持为4,与原始输入一致。但需注意,这种方式会将几何对象视为平面坐标,不适合涉及球面距离、面积计算的场景。
内容的提问来源于stack exchange,提问作者Quentin Sommer
相关产品推荐
相关产品推荐

