ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

StarRocks 空间函数 ST_Y:Point 类型 Y 坐标提取的用法与实现解析

2026/9/18 16:21:28 拓冰建站 浏览量
StarRocks 空间函数 ST_Y:Point 类型 Y 坐标提取的用法与实现解析 StarRocks 空间函数 ST_YPoint 类型 Y 坐标提取的用法与实现解析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksST_Y是 StarRocks 提供的空间Spatial函数之一用于从合法的POINT类型中提取 Y 坐标值即纬度 lat。本文以其官方文档为核心结合 FE 函数注册与 BE 向量化执行实现geo_functions.cpp完整讲解语法、返回值、NULL 传播语义、典型使用场景与底层原理帮助你正确地把地理坐标提取与后续空间计算串联起来。函数概述ST_Y属于 StarRocks 的空间函数族spatial-functions与ST_Point、ST_X配套使用ST_Point负责将经纬度坐标构造成POINT对象ST_X/ST_Y分别负责从该对象中取回 X经度 lng与 Y纬度 lat坐标。函数名采用全大写ST_Y关键字为ST_Y、ST、Y。在 FE 的 FunctionSet.java 中以st_x/st_y注册大小写不敏感。语法DOUBLE ST_Y(POINT point)参数类型说明pointPOINT一个合法的 Point 类型值通常由 ST_Point 构造产生返回值类型为DOUBLE即该 Point 的 Y 坐标值。示例以下示例来自官方文档 st_y.mdMySQL SELECT ST_Y(ST_Point(24.7, 56.7)); ---------------------------- | st_y(st_point(24.7, 56.7)) | ---------------------------- | 56.7 | ----------------------------可以看到ST_Point(24.7, 56.7)构造出坐标为 (24.7, 56.7) 的 PointST_Y返回其中的 Y 值 56.7。更多用法示例与 ST_X 联用同时取回经纬度SELECT ST_X(ST_Point(116.404, 39.915)) AS lng, -- 116.404 ST_Y(ST_Point(116.404, 39.915)) AS lat; -- 39.915从表中存储的 Point 列提取 Y 坐标-- 建表 CREATE TABLE geo_table ( id INT, location POINT ) ENGINEOLAP DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 3; -- 写入与查询 INSERT INTO geo_table VALUES (1, ST_Point(116.404, 39.915)); SELECT id, ST_X(location) AS lng, ST_Y(location) AS lat FROM geo_table;配合 ST_Distance_Sphere 计算两点球面距离SELECT ST_Distance_Sphere( ST_X(ST_Point(116.404, 39.915)), ST_Y(ST_Point(116.404, 39.915)), ST_X(ST_Point(121.4737, 31.2304)), ST_Y(ST_Point(121.4737, 31.2304)) ) AS distance_meters;源码级实现解析向量化执行入口BEST_Y在 BE 端由 geo_functions.cpp 中的GeoFunctions::st_y实现采用向量化执行模型用ColumnViewerTYPE_VARCHAR读取输入列——Point 在内部以编码后的二进制形式TYPE_VARCHAR存储而非明文坐标对每一行若输入为 NULL 则直接追加 NULL即输入为 NULL 时结果也为 NULL否则通过GeoPoint::decode_from从编码数据中反序列化出GeoPoint对象解码失败时同样返回 NULL解码成功后调用point.y()取出 Y 坐标写入ColumnBuilderTYPE_DOUBLE结果列。在 geo_functions.h 中通过DEFINE_VECTORIZED_FN(st_y)注册与st_point、st_x一起成为向量化空间函数。Point 的编码与 Y 坐标来源Point 对象在 geo_types.h 中定义为GeoPoint其内部以 Google S2 的S2Point单位球面上的三维向量保存GeoPoint::encodegeo_types.cpp直接将S2Point的内存镜像sizeof(*_point)字节序列化GeoPoint::decodegeo_types.cpp要求输入长度严格等于sizeof(*_point)否则返回 false——这保证了ST_Y只接受由ST_Point等合法途径编码的 PointGeoPoint::y()geo_types.cpp将S2Point转换为S2LatLng返回其纬度lat的度数double GeoPoint::y() const { return S2LatLng(*_point).lat().degrees(); }从源码结构可以推断ST_Point构造点时会做坐标合法性校验如 wkt_yacc.y 中调用from_coord解析而ST_Y的职责纯粹是解码并取回 Y 值。FE 侧函数注册FE 在 FunctionSet.java 中声明了st_x/st_y的函数名常量用于 SQL 解析与元数据注册与 BE 端的向量化实现一一对应。边界与注意事项输入必须是合法的 Point 类型直接对非 Point 值或未编码的字符串调用ST_Y解码会失败并返回 NULLNULL 语义输入为 NULL 时输出 NULL参见GeoFunctions::st_y中encode.is_null(row)分支坐标顺序ST_Point(x, y)中第一个参数是经度X第二个是纬度YST_Y返回的正是纬度值务必与ST_X的返回值区分清楚底层依赖 S2 库坐标最终通过S2LatLng表示y()返回的是经纬度度数degrees。相关函数ST_Point由 X经度、Y纬度构造 PointST_X提取 Point 的 X 坐标经度ST_Distance_Sphere计算球面两点间距离实现见 geo_types.cpp。参考官方文档st_y.mdBE 实现geo_functions.cpp、geo_functions.h空间类型定义geo_types.h、geo_types.cppFE 注册FunctionSet.java【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考