在 PostgreSQL 中,若已知几何字段 geom 的值为 MULTILINESTRING((114.190126203262 35.9002294344409,114.193947798552 35.8983996234439,114.199661951438 35.8985923463597,114.202550243799 35.8961796190942,114.20248154099 35.8889796611825,114.20774035993 35.88585353861,114.205438122471 35.8807723132917,114.20789194156 35.8799636357133)),可通过 SQL 查询其对应的中心点坐标。PostgreSQL 提供了多种空间函数来实现该功能,以下是几种常用方式:
方案一:使用 ST_Centroid 直接计算几何中心
通过 ST_Centroid 获取几何对象的质心,并结合 ST_X 和 ST_Y 提取经度和纬度。
SELECT
b.engr_id,
b.rvcd,
b.unitcd,
st_astext(a.geom) AS geom,
ST_X(ST_Centroid(a.geom)) AS centerx, -- 中心点经度
ST_Y(ST_Centroid(a.geom)) AS centery -- 中心点纬度
FROM
model_engineering_spatial_rivl a
INNER JOIN
model_engineering_rel_unit_rivl_map b
ON a.engr_id = b.engr_id AND a.rvcd = b.rvcd
WHERE
a.rvcd = 'ACF11504IJ000000'
AND a.engr_id = 137;
方案二:保留更高精度的小数位数
若需对结果进行更精确控制,可使用 ROUND 函数将经纬度保留至指定位数(如六位小数)。
SELECT
b.engr_id,
b.rvcd,
b.unitcd,
st_astext(a.geom) AS geom,
ROUND(ST_X(ST_Centroid(a.geom))::numeric, 6) AS centerx, -- 经度保留6位小数
ROUND(ST_Y(ST_Centroid(a.geom))::numeric, 6) AS centery -- 纬度保留6位小数
FROM
model_engineering_spatial_rivl a
INNER JOIN
model_engineering_rel_unit_rivl_map b
ON a.engr_id = b.engr_id AND a.rvcd = b.rvcd
WHERE
a.rvcd = 'ACF11504IJ000000'
AND a.engr_id = 137;
方案三:增加空值判断以提高健壮性
为避免因 geom 字段为空导致计算异常,可添加条件判断逻辑,确保数据安全性。
SELECT
b.engr_id,
b.rvcd,
b.unitcd,
st_astext(a.geom) AS geom,
CASE
WHEN a.geom IS NOT NULL THEN ST_X(ST_Centroid(a.geom))
ELSE NULL
END AS centerx,
CASE
WHEN a.geom IS NOT NULL THEN ST_Y(ST_Centroid(a.geom))
ELSE NULL
END AS centery
FROM
model_engineering_spatial_rivl a
INNER JOIN
model_engineering_rel_unit_rivl_map b
ON a.engr_id = b.engr_id AND a.rvcd = b.rvcd
WHERE
a.rvcd = 'ACF11504IJ000000'
AND a.engr_id = 137;
方案四:针对 MULTILINESTRING 类型获取线上实际中点
当 geom 为 MULTILINESTRING 时,若希望获取的是线段路径上的中心点而非外包矩形质心,应先合并线段并插值取中点。
SELECT
b.engr_id,
b.rvcd,
b.unitcd,
st_astext(a.geom) AS geom,
ST_X(ST_LineInterpolatePoint(ST_LineMerge(a.geom), 0.5)) AS centerx, -- 线上中心点经度
ST_Y(ST_LineInterpolatePoint(ST_LineMerge(a.geom), 0.5)) AS centery -- 线上中心点纬度
FROM
model_engineering_spatial_rivl a
INNER JOIN
model_engineering_rel_unit_rivl_map b
ON a.engr_id = b.engr_id AND a.rvcd = b.rvcd
WHERE
a.rvcd = 'ACF11504IJ000000'
AND a.engr_id = 137;
[此处为图片1]在处理空间数据时,获取几何图形的中心点是一项常见需求。以下提供一种基于WKT格式返回中心点的方法,适用于需要同时获取坐标与文本表示的应用场景。
SQL查询示例如下:
SELECT
b.engr_id,
b.rvcd,
b.unitcd,
st_astext(a.geom) as geom,
ST_X(ST_Centroid(a.geom)) as centerx,
ST_Y(ST_Centroid(a.geom)) as centery,
ST_AsText(ST_Centroid(a.geom)) as center_point_wkt -- 中心点的WKT表示
FROM
model_engineering_spatial_rivl a
INNER JOIN
model_engineering_rel_unit_rivl_map b
ON a.engr_id = b.engr_id AND a.rvcd = b.rvcd
WHERE
a.rvcd = 'ACF11504IJ000000'
AND a.engr_id = 137;
[此处为图片1]
该方法通过调用PostGIS的空间函数实现核心功能:
- ST_Centroid():用于计算几何对象的质心,即通常意义上的“中心点”。
- ST_X() 和 ST_Y():分别提取质心点的X(经度)和Y(纬度)坐标值。
- ST_AsText():将几何对象转换为WKT(Well-Known Text)格式,便于查看或传输。
值得注意的是,若源数据中的geom字段为空或包含无效几何体,则上述函数可能返回NULL或引发错误。因此,在实际应用中建议结合COALESCE或CASE语句进行空值判断与处理,以增强查询的健壮性。
综合来看,虽然存在多种获取中心点的方式,但推荐优先使用最简洁直接的方法1。只要确保数据表中存在非空的geom字段,方法1即可高效满足大多数业务需求。


雷达卡


京公网安备 11010802022788号







