sql实现给定范围坐标,查询范围内的数据

1. 针对单纯的点坐标,例如:工井表,坐标字段:

geo_positon_siji(思极坐标,其他坐标也可以),给定一个矩形范围坐标[[[106.57371511320684,29.546465522275966],[106.57711394109282,29.546465522275966],[106.57711394109282,29.54481174632747],[106.57371511320684,29.54481174632747],[106.57371511320684,29.546465522275966]]],需求:查询这个框范围内的工井数据(包含边界值)

具体sql实现(postgresql):

select
            id,
            'LAYER_ELE_TJ_HOLE' as type
        from
            account_manhole
         where
        ST_Intersects(
                ST_MakePolygon(
                    ST_MakeLine(ARRAY[
                        ST_MakePoint(106.57371511320684,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.546465522275966)
                    ])
                ),
                ST_MakePoint(
                    CAST(SPLIT_PART(geo_positon_siji, ',', 1) AS numeric),
                    CAST(SPLIT_PART(geo_positon_siji, ',', 2) AS numeric)
                )
            )
        and
        geo_positon_siji is not null
        and
        task_approval_state = '0'
        and
        del_flag = 0

我解释一哈上面用到的函数:

  1. ST_Intersects(geometry1, geometry2): 这个函数用于判断两个几何对象是否相交或重叠。在这里,用于判断由多边形和点组成的几何对象是否相交。

  2. ST_MakeLine(array_of_points): 这个函数接受一个点数组,并将这些点连接成一条线。

  3. ST_MakePolygon(line): 这个函数接受一条线,并将其转换为一个多边形。在这里,先用ST_MakeLine创建了一个包含五个点的线,并将其转换为一个多边形。

  4. ST_MakePoint(x, y): 这个函数用于创建一个二维点,其中x是点的横坐标,y是点的纵坐标。

  5. CAST(value AS numeric): 这个函数用于将一个值转换为指定的数据类型。在这里,用于将提取出的经度和纬度值转换为数值类型。

  6. SPLIT_PART(geo_positon_siji, ',', 1): 这个函数用于从一个字符串中提取子字符串,第一个参数是原始字符串,第二个参数是分隔符,第三个参数是要提取的子字符串的索引。在这里,用于从geo_positon_siji字段中提取出经度值。

2. 针对一条线段,例如:通道段,它的坐标字段有起点坐标(

geo_position_start_siji

),终点坐标(

geo_position_end_siji

给定一个矩形范围坐标[[[106.57371511320684,29.546465522275966],[106.57711394109282,29.546465522275966],[106.57711394109282,29.54481174632747],[106.57371511320684,29.54481174632747],[106.57371511320684,29.546465522275966]]],需求:查询这个框范围内的通道段数据(包含边界值)

具体sql实现(postgresql):

select
            id,
            line_manhole_id1,
            line_manhole_id2,
            'LAYER_ELE_TJ_TD_PG' as function_type
        from
            account_passage
        where
        (
        ST_Intersects(
                ST_MakePolygon(
                    ST_MakeLine(ARRAY[
                        ST_MakePoint(106.57371511320684,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.546465522275966)
                    ])
                ),
                ST_MakePoint(
                    CAST(SPLIT_PART(geo_position_start_siji, ',', 1) AS numeric),
                    CAST(SPLIT_PART(geo_position_start_siji, ',', 2) AS numeric)
                )
            )
            OR
            ST_Intersects(
                ST_MakePolygon(
                    ST_MakeLine(ARRAY[
                        ST_MakePoint(106.57371511320684,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.54481174632747),
                        ST_MakePoint(106.57711394109282,29.546465522275966),
                        ST_MakePoint(106.57371511320684,29.546465522275966)
                    ])
                ),
                ST_MakePoint(
                    CAST(SPLIT_PART(geo_position_end_siji, ',', 1) AS numeric),
                    CAST(SPLIT_PART(geo_position_end_siji, ',', 2) AS numeric)
                )
            )
        )
        and
        geo_position_start_siji  is not null
        and
        geo_position_end_siji  is not null
        and
        task_approval_state = '0'
        and
        del_flag = 0

这个其实和单独的点一样,就多了一个or,只要任意一个坐标点,起点或者终点落在这个范围内就算这个通道段是在这个范围内的(当然也包含刚好在这个点上)

3. 针对多个线段,可以是一个路径,例如电缆段,在我们业务里面一条电缆包含多个电缆段,一条电缆段它不是一条直直的线段,因为在实际业务中电缆段可能为曲折,所以就有拐点这个概念,也就是说一条电缆段的坐标就是一系列路径点组合而成。

给定一个矩形范围坐标[[[106.57371511320684,29.546465522275966],[106.57711394109282,29.546465522275966],[106.57711394109282,29.54481174632747],[106.57371511320684,29.54481174632747],[106.57371511320684,29.546465522275966]]],需求:查询这个框范围内的电缆段数据(包含边界值)具体sql实现:

SELECT *
FROM account_cable_section
WHERE ST_Contains(
    ST_GeomFromText('POLYGON((106.57371511320684 29.546465522275966, 106.57371511320684 29.54481174632747, 106.57711394109282 29.54481174632747, 106.57711394109282 29.546465522275966, 106.57371511320684 29.546465522275966))'),
    geom
);

解释一哈用到的函数:

  1. ST_Contains(...): 这部分是查询的条件。ST_Contains函数用于判断一个几何对象是否完全包含另一个几何对象。在这里,它用于判断表中的geom字段(几何对象)是否完全包含指定的多边形。
  2. ST_GeomFromText('POLYGON(...)'): 这个函数将文本表示的几何对象转换为几何对象类型。在这里,它将表示一个多边形的文本转换为多边形几何对象。

  3. 'POLYGON((106.57371511320684 29.546465522275966, 106.57371511320684 29.54481174632747, 106.57711394109282 29.54481174632747, 106.57711394109282 29.546465522275966, 106.57371511320684 29.546465522275966))': 这是一个表示多边形的文本,包含了五个点的坐标,定义了一个特定的多边形区域。

  4. geom: 这是表account_cable_section中的一个字段,它的类型是geometry,存储了几何对象(例如线、多边形等)例如:LINESTRING (106.6767433515201 28.752896793910427, 106.67678902406121 28.75316239646519)。

最后注意:能够使用这些函数的前提是你的PostgreSQL是否安装了PostGIS插件

要确定您的 PostgreSQL 数据库是否安装了 PostGIS 扩展,您可以执行以下步骤:

  1. 登录到 PostgreSQL 数据库: 使用您的 PostgreSQL 客户端登录到数据库。

  2. 执行查询: 执行以下 SQL 查询来检查是否存在 PostGIS 扩展:

SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name LIKE 'postgis%';

这将列出所有以 "postgis" 开头的可用扩展及其默认版本和已安装版本。如果 PostGIS 已经安装,您应该会看到类似于以下内容的输出:

 name   | default_version | installed_version 
--------+-----------------+-------------------
 postgis| 3.1             | 3.1.X 
  1. 检查扩展列表: 您还可以检查当前数据库中已安装的扩展列表,以确保 PostGIS 已正确安装。执行以下 SQL 查询:
SELECT * 
FROM pg_extension;

在结果中查找名为 "postgis" 的行,如果存在,则表示 PostGIS 已经安装在您的 PostgreSQL 数据库中。

如果在执行上述查询时未找到 PostGIS 扩展或者您收到错误消息,可能是因为您尚未安装 PostGIS 或者安装不正确。您可以通过查阅相关文档来了解如何正确安装 PostGIS 扩展。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值