Oracle Spatial实现实时经纬度计算

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'


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值