1、创建一个空间表;Oracle支持空间计算;设计器不支持SDO_GEOMETRY,所以用代码操作;
DROP TABLE JWDTABLE
CREATE TABLE DYZHJG.JWDTABLE
(
ID NUMBER(30,0) NOT NULL,
PRIPID VARCHAR2(100) NOT NULL,
LNG NUMBER(18,9),
LAT NUMBER(18,9),
CREATE_TIE DATE ,
ADDR VARCHAR2(2000),
GEOMETRY SDO_GEOMETRY,
PRIMARY KEY (ID)
);
2、检查表是否存在
SELECT * FROM JWDTABLE;
3、将原表数据写入新表;
INSERT INTO JWDTABLE(ID,PRIPID,LNG,LAT,CREATE_TIE,ADDR)
SELECT ID,PRIPID, TO_NUMBER(LNG) , TO_NUMBER(LAT) ,CREATE_TIME,ADDRESS FROM OADB.JC_SCZTJWD ;
4、填充这个集合对象;
update JWDTABLE set GEOMETRY = sdo_geometry(2001,8307,sdo_point_type(lng,lat,null),null,null);
5、检查数据是否写入质量完成;
SELECT * FROM JWDTABLE;
6、创建一个空间索引。这段代码报错了;
CREATE INDEX JWDTABLE_SPATIAL_IDX
ON JWDTABLE (GEOMETRY)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
PARAMETERS ('sdo_indx_dims=2 layer_gtype=POINT');
注意!!!!切记,千万用同一个账户下的同一命名空间;如创建空间索引报错。 删除刚才新建的索引
DROP INDEX JWDTABLE_SPATIAL_IDX;
注意!!!!检查表USER_SDO_GEOM_METADATA、MDSYS. SDO_GEOM_METADATA_TABLE 是否有元数据;如果没有就新增;
头两个参数,要对应到表名和列名 X,Y对应坐标点;Oracle计算的是几何空间; 给他一个正方形; 最后一个参数是SRID,几何投影坐标系;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME,DIMINFO, SRID)
VALUES ('JWDTABLE', 'GEOMETRY',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', 103.306616, 105.822446, 0.0000050),
MDSYS.SDO_DIM_ELEMENT('Y',30.675773, 31.510942, 0.0000050)
),8307
);
7、就可以执行查询了
/**
* 执行查询
SDO_NN( sdo_Geometry1, sdo_Geometry2, ‘sdo_num_res’, Tolerance ):用于返回几何体sdo_Geometry2周边附近有什么其他几何体集。
参数说明:
sdo_Geometry1,sdo_Geometry2为空间数据对应的几何对象。
Tolerance: 容许的精度范围;
sdo_num_res:[
DISTANCE:距离描述
UNIT:meter 单位描述(米)
]
SDO_GEOMETRY(SDO_GTYPE ,SDO_SRID ,SDO_POINT ,SDO_ELEM_INFO ,SDO_ORDINATES ) ;SDO_GEOMETRY 类型说明
详细参考:https://blog.csdn.net/alinshen/article/details/80007691
参数说明
SDO_GTYPE:表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的; 2001描述为单点
SDO_SRID :几何的空间参考坐标系,类型也为 NUMBER; 4490 为国标2000坐标系 ; 8307为WGS84坐标系;
如果要想查询精准,需要更换LAT,LNG的GCJ-02切换为WGS84OrGB2000;也可以自定义坐标系就太复杂了;
SDO_POINT :如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义的SDO_POINT_TYPE类型;
SDO_ELEM_INFO :定义要如何理解SDO_ORDINATES中的坐标串的;
SDO_ORDINATES :存储实际坐标的,以X、Y以及不同点之间都是逗号隔开;
sdo_nn_distance(number) 集合SDO_NN操作符,辅助操作符获取距离
参数说明
number :精确精度, 此精度必须与SDO_NN 函数的精度保持一致;
**/
SELECT id,pripid,lng,lat ,addr ,sdo_nn_distance(1) JL FROM JWDTABLE
WHERE SDO_NN(
GEOMETRY --空间数据对应的几何对象
,SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE( 104.407239,31.114863, NULL), NULL, NULL) --创建一个几何对象。因为你在元数据中创建的是个正方形,无所谓经纬度,需要对齐XY就OK
,'DISTANCE=500 UNIT=meter'
,1) ='TRUE'