最近项目使用 空间数据库 oracle spatial
--创建测试用表
CREATE TABLE SPATIALTEST (
"ID" VARCHAR2(20) NOT NULL,
"NAME" VARCHAR2(100),
"ADDRESS" VARCHAR2(200),
"TELEPHONE" VARCHAR2(50),
"LOCATION" "MDSYS"."SDO_GEOMETRY"
)
--创建主键约束
ALTER TABLE "SPATIALTEST"
ADD CONSTRAINT "PK_SPATIAL" PRIMARY KEY("ID");
--根据用户表填写空间元数据,创建了点信息,与点信息经纬度最大值,与最小值,与误差范围
INSERT INTO USER_SDO_GEOM_METADATA
VALUES(
'SPATIALTEST',
'location',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('Longitude',-180,180,10),---Longitude维最小,最大值和容忍度。
MDSYS.SDO_DIM_ELEMENT('Latitude',-90,90,10)-----Latitude维最小,最大值和容忍度。
),
4326
);
--建立空间索引 关键 假如不创建空间索引,速度很慢
CREATE INDEX SPATIAL_IDX ON SPATIALTEST(location) INDEXTYPE IS MDSYS.SPATIAL_INDEX
--导入测试数据
--1
INSERT INTO SPATIALTEST
VALUES
('1',
'中油瑞飞',
'北京市歌华大厦',
'010-123456',
MDSYS.SDO_GEOMETRY(2001,--定义的点的代码
4326,--定义的坐标系统代码
MDSYS.SDO_POINT_TYPE(113.3293658, 23.14338586, 0),--定义了点的坐标值
NULL,
NULL));
--导入测试数据
--2
INSERT INTO SPATIALTEST
VALUES
('2',
'山东',
'山东省日照市东港区',
'010-123456',
MDSYS.SDO_GEOMETRY(2001,--定义的点的代码
4326,
MDSYS.SDO_POINT_TYPE(113.2932474, 23.11883515, 0),
NULL,
NULL));
-- 关系查询
select location from spatialtest;
select s.location.SDO_POINT.x langtitude from spatialtest s;
--空间分析查询(113.2359818,23.16937253)周边十公里信息5条
SELECT B.id id, B.name name, B.dist dist
FROM (SELECT A.id id,
A.name name,
SDO_GEOM.SDO_DISTANCE(A.location,
MDSYS.SDO_GEOMETRY(2001,
4326,
MDSYS.SDO_POINT_TYPE(113.2359818,
23.16937253,
0),
NULL,
NULL),
1) dist
FROM spatialtest A
WHERE SDO_WITHIN_DISTANCE(A.LOCATION,
MDSYS.SDO_GEOMETRY(2001,
4326,
MDSYS.SDO_POINT_TYPE(113.2359818,
23.16937253,
0),
NULL,
NULL),
'distance=10000') = 'TRUE'
ORDER BY A.name) B
WHERE ROWNUM <= 5;
-- 空间分析查询(113.2359818,23.16937253)附近的5条信息
SELECT A.id id,
A.name name,
A.location.SDO_POINT.x langtitude,
A.location.SDO_POINT.y latitude,
MDSYS.SDO_NN_DISTANCE(1) distance
FROM spatialtest A
WHERE SDO_NN(A.LOCATION,
MDSYS.SDO_GEOMETRY(2001,
4326,
MDSYS.SDO_POINT_TYPE(113.2359818,
23.16937253,
0),
null,
null),
'SDO_NUM_RES=5',
1) = 'TRUE'