Oracle:范围内半径坐标查询

目录

版本:

校验Spatial拓展是否已安装

SDO_GEOMETRY类型

建表

坐标获取

添加数据

 查询

varchar类型 

建表

添加数据

查询


版本:

        oracle:21c

        Spatial拓展

                Oracle Spatial 组件是从 Oracle 数据库 9i 版本开始成为默认的数据库组件

校验Spatial拓展是否已安装

一般普通账号执行不了,需要授权,或者管理员账号(SYS账号)

SELECT comp_name, version, status
FROM dba_registry
WHERE comp_id = 'SDO';

数据库字段两种类型:

        一种数据库字段是SDO_GEOMETRY类型

        一种是varchar类型

SDO_GEOMETRY类型

建表

CREATE TABLE locations
(
    id       NUMBER PRIMARY KEY,
    name     VARCHAR2(100),
    location SDO_GEOMETRY
);

坐标获取

                 这些是根据高德地图随便找的真实经纬度坐标

                如果要精细的经纬度需要绑定身份信息
坐标拾取器 | 高德地图API (amap.com)icon-default.png?t=N7T8https://lbs.amap.com/tools/picker

添加数据

这里使用的datagrip,oracle没开启自动提交事务,需要手动提交(也可以用sql)

INSERT INTO locations (id, name, location)
VALUES (1,
        '泰山风景名胜区',
        SDO_GEOMETRY(
                2001, -- 代表2d 点  还有几何图形
                4326, -- WGS 84 SRID
                SDO_POINT_TYPE(117.10884, 36.257434, NULL),-- 2d 点只有x、y坐标  这里z坐标为null
                NULL, -- SDO_ELEM_INFO_ARRAY,对于点来说是 NULL
                NULL -- SDO_ORDINATE_ARRAY,对于点来说是 NULL
            ));

INSERT INTO locations (id, name, location)
VALUES (2,
        '天安门',
        SDO_GEOMETRY(
                2001,
                4326,
                SDO_POINT_TYPE(116.397455, 39.909187, NULL),
                NULL,
                NULL
            ));
INSERT INTO locations (id, name, location)
VALUES (3,
        '北京大兴国际机场',
        SDO_GEOMETRY(
                2001,
                4326,
                SDO_POINT_TYPE(116.428937, 39.513655, NULL), -- 另一个点的坐标
                NULL,
                NULL
            ));
INSERT INTO locations (id, name, location)
VALUES (4,
        '青岛大学',
        SDO_GEOMETRY(
                2001,
                4326,
                SDO_POINT_TYPE(120.422859, 36.071915, NULL), -- 另一个点的坐标
                NULL,
                NULL
            ));
INSERT INTO locations (id, name, location)
VALUES (5,
        '华山风景名胜区',
        SDO_GEOMETRY(
                2001,
                4326,
                SDO_POINT_TYPE(110.070978, 34.493336, NULL), -- 另一个点的坐标
                NULL,
                NULL
            ));
INSERT INTO locations (id, name, location)
VALUES (6,
        '故宫',
        SDO_GEOMETRY(
                2001,
                4326,
                SDO_POINT_TYPE(116.397029, 39.917839, NULL), -- 另一个点的坐标
                NULL,
                NULL
            ));

 查询

查询当前坐标半径小于2000m的坐标

 坐标是故宫附近随便找的

unit=meter :米

unit=kilometer:公里

TRUE:2000m范围内

FALSE:2000m范围外

SELECT *
FROM locations
WHERE SDO_WITHIN_DISTANCE(location,
                          SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(116.400635,39.908077, NULL), NULL, NULL),
                          'distance=2000 unit=meter') = 'TRUE';

查询结果:

varchar类型 

这里我把上边建的表删了,所以表名依然是locations,可自行修改

建表

CREATE TABLE locations
(
    id       NUMBER PRIMARY KEY,
    name     varchar(100),
    location varchar2(200)
);

添加数据

INSERT INTO locations (id, name, location)
VALUES (1, '泰山风景名胜区', '117.10884,36.257434');
INSERT INTO locations (id, name, location)
VALUES (2, '天安门', '116.397455,39.909187');
INSERT INTO locations (id, name, location)
VALUES (3, '北京大兴国际机场', '116.428937,39.513655');
INSERT INTO locations (id, name, location)
VALUES (4, '青岛大学', '120.422859,36.071915');
INSERT INTO locations (id, name, location)
VALUES (5, '华山风景名胜区', '110.070978,34.493336');
INSERT INTO locations (id, name, location)
VALUES (6, '故宫', '116.397029,39.917839');

查询

查询某一坐标半径内600公里内所有坐标

注意:

1:

        两个600要保持一致

        第一个是距离参数,表示以单位为公里的范围内进行搜索

        第二个表示距离给定点的距离应该小于 600公里

2:

        SDO_GEOMETRY函数内参数需要根据存入规则来进行修改,在这里我按照我的存入格式进行截取,这里按照实际修改

SELECT *
FROM locations
WHERE SDO_GEOM.SDO_DISTANCE(
          SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE('116.400635', '39.908077', NULL), NULL, NULL),
          SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(SUBSTR(location, 1, INSTR(location, ',') - 1),
                                                    SUBSTR(location, INSTR(location, ',') + 1), NULL), NULL, NULL),
          600,--单位:公里
          'unit=kilometer') < 600;

查询结果:

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Artij

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值