在MySQL中获取多点空间数据

问题描述 投票:0回答:1

我没有找到任何答案,如何在MySQL中选择multipoint数据类型中的每个点。我有包含许多点的多点,我想通过query选择每个点,但我不知道。有任何想法吗?

表结构:Image

示例数据:Image

在MySQL文档中,我仅找到了这个,但没有帮助:https://dev.mysql.com/doc/refman/8.0/en/fetching-spatial-data.html

mysql sql geospatial spatial spatial-query
1个回答
0
投票

如果使用的是MySQL> = 8.0.2,则可能是一个选项:

DELIMITER //

CREATE PROCEDURE `sp_test`(`p_id` BIGINT UNSIGNED)
BEGIN
  SET @`sql` := CONCAT('
    WITH RECURSIVE `sequence` AS (
      SELECT 1 `seq`
      UNION ALL
      SELECT `seq` + 1 `seq`
      FROM `sequence`
      WHERE `sequence`.`seq` < ?
    )
    SELECT
      `sequence`.`seq` `id`,
      ST_AsText(ST_GeometryN(`points`, `sequence`.`seq`)) `point`
    FROM `sequence`
      INNER JOIN `tb_test` ON
        `tb_test`.`id` = ', `p_id`);

  SET @`limit` := (
    SELECT
      ST_NumGeometries(`points`)
    FROM
      `tb_test`
    WHERE
      `id` = `p_id`
  );

  PREPARE `stmt` FROM @`sql`;
  EXECUTE `stmt` USING @`limit`;
  DEALLOCATE PREPARE `stmt`;
END//

DELIMITER ;

请参见db-fiddle

UPDATE

DELIMITER //

CREATE PROCEDURE `sp_test`(`p_id` BIGINT UNSIGNED)
BEGIN
  SET @`sql` := CONCAT('
    WITH RECURSIVE `sequence` AS (
      SELECT 1 `seq`
      UNION ALL
      SELECT `seq` + 1 `seq`
      FROM `sequence`
      WHERE `sequence`.`seq` < ?
    )
    SELECT
      `sequence`.`seq` `id`,
      ST_AsText(ST_GeometryN(`points`, `sequence`.`seq`)) `point`,
      ST_X(ST_GeometryN(`points`, `sequence`.`seq`)) `X`,
      ST_Y(ST_GeometryN(`points`, `sequence`.`seq`)) `Y`
    FROM `sequence`
      INNER JOIN `tb_test` ON
        `tb_test`.`id` = ', `p_id`);

  SET @`limit` := (
    SELECT
      ST_NumGeometries(`points`)
    FROM
      `tb_test`
    WHERE
      `id` = `p_id`
  );

  PREPARE `stmt` FROM @`sql`;
  EXECUTE `stmt` USING @`limit`;
  DEALLOCATE PREPARE `stmt`;
END//

DELIMITER ;

请参见db-fiddle

© www.soinside.com 2019 - 2024. All rights reserved.