欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle spatial 空间数据学习

程序员文章站 2022-06-13 08:12:15
...

最近项目使用 空间数据库 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'