楼主: 635479873
133 0

[其他] PostGIS查询多线串中心点经纬度 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0253
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-7-19
最后登录
2018-7-19

楼主
635479873 发表于 2025-12-3 17:44:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在 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即可高效满足大多数业务需求。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:post 经纬度 POS GIS 中心点

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 13:19