目录
版本:
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)https://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;
查询结果: