转载:老鼠嘴里的大米http://blog.sina.com.cn/fatway
一、Oracle Spatial简介
Oracle 支持自定义的数据类型,可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型。这样的对象类型可以用于属性列的数据类型,也可以用来创建对象表。而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统。
Spatial 的自定义数据类型有很多,全部在MDSYS方案下,经常使用到的是SDO_GEOMETRY类型。SDO_GEOMETRY表示一个几何对象,可以是点、线、面、多点、多线、多面或混合对象。
Spatial 在此数据类型的基础上,实现了R树空间索引和四叉树空间索引,还以SQL函数的形式实现了多种空间分析功能。
二、测试表的建立与应用(点类型)
-- 创建测试用表 CREATE TABLE "SPATIALTEST" ( "ID" VARCHAR2(20) NOT NULL, "NAME" VARCHAR2(100), "ADDRESS" VARCHAR2(200), "TELEPHONE" VARCHAR2(50), "LOCATION" "MDSYS"."SDO_GEOMETRY" )LOGGING; |
-- 创建主键约束 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), MDSYS.SDO_DIM_ELEMENT('Latitude',-90,90,10) ), 8307 ); |
-- 建立空间索引 CREATE INDEX SPATIAL_IDX ON SPATIALTEST(location) INDEXTYPE IS MDSYS.SPATIAL_INDEX; |
-- 导入测试数据 INSERT INTO "SPATIALTEST" VALUES( 'dbeb7ea11eaf2b53a9b7', '小肥羊(天河店)', '广州市天河区天寿路25号', '020-38217746', MDSYS.SDO_GEOMETRY( 2001, 8307, MDSYS.SDO_POINT_TYPE(113.3293658, 23.14338586, 0), NULL, NULL ) );
INSERT INTO "SPATIALTEST" VALUES( 'ef8393ef6273a72b2f70', '山东老家', '广州市越秀区合群一马路43号', '020-87778983', MDSYS.SDO_GEOMETRY( 2001, 8307, MDSYS.SDO_POINT_TYPE(113.2932474, 23.11883515, 0), NULL, NULL ) );
--其他
INSERT INTO cola_markets VALUES( 2, 'cola_b', MDSYS.SDO_GEOMETRY( 2003, -- 2-dimensional polygon NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring) MDSYS.SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1) ) );
|
-- 属性信息查询 SQL> select location from spatialtest;
LOCATION(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES) -------------------------------------------------------------------------------- SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(113.329366, 23.1433859, 0), NULL, NULL)
SQL> select s.location.SDO_POINT.x langtitude from spatialtest s;
LANGTITUDE ---------- 113.329366
|
-- 空间分析查询(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,8307,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,8307,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,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),null,null),'SDO_NUM_RES=5',1) = 'TRUE' ; |
-- Return the topological difference of two geometries. SELECT SDO_GEOM.SDO_DIFFERENCE(c_a.shape, m.diminfo, c_c.shape, m.diminfo) FROM cola_markets c_a, cola_markets c_c, user_sdo_geom_metadata m WHERE m.table_name = 'COLA_MARKETS' AND m.column_name = 'SHAPE' AND c_a.name = 'cola_a' AND c_c.name = 'cola_c'; |
三、MDYSYS.SDO_GEOMETRY结构
CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_GTYPE NUMBER, //表示几何实体的类型 SDO_SRID NUMBER, //用来表示坐标系(空间参考坐标系),与几何实体关联 SDO_POINT MDSYS.SDO_POINT_TYPE, //使用X,Y,Z属性值来定义对象类型
//它们都是NUMBER类型, //如果SDO_GEOMETRY的SDO_ELEM_INFO及SDO_ORDINATES数组为 //空则SDO_POINT为非空,X和Y值就是点几何实体的坐标值 SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, //使用变长NUMBER型数组来表示。 //该属性将告知如何解释SDO_ORDINATES里边的坐标值; SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY //存储坐标值
//形成空间对象的边界 );
|
MDSYS.SDO_GEOMETRY <--> OCCI 对照模型:
四、Oracle Spatial 几个自定义函数(转帖)
--------------------------------------
--得到线对象的终止点X坐标 create or replace function GetEndNodeX(coords in SDO_ORDINATE_ARRAY) return varchar2 is Result varchar2(100); begin if coords.count > 0 then Result := to_char(coords(coords.count-1)); end if; return(Result); end GetEndNodeX;
|
--得到线对象的终止点的Y坐标 create or replace function GetEndNodeY(coords in SDO_ORDINATE_ARRAY ) return varchar2 is Result varchar2(100); begin if coords.count > 0 then Result := to_char(coords(coords.count)); end if; return(Result); end GetEndNodeY;
|
--得到线对象的终止点坐标 X,Y 形式 create or replace function GetEndNodeXY(coords in SDO_ORDINATE_ARRAY) return varchar2 is Result varchar2(200); begin if coords.count > 0 then Result := to_char(coords(coords.count-1)) || ',' || to_char(coords(coords.count)); end if; return(Result); end GetEndNodeXY;
|
--得到线对象的起始点X坐标 create or replace function GetStartNodeX(coords in SDO_ORDINATE_ARRAY) return varchar2 is Result varchar2(100); begin if coords.count > 0 then Result := to_char(coords(1)); end if; return(Result); end GetStartNodeX;
|
--得到线对象的起始点的Y坐标 create or replace function GetStartNodeY(coords in SDO_ORDINATE_ARRAY) return varchar2 is Result varchar2(100); begin if coords.count > 0 then Result := to_char(coords(2)); end if; return(Result); end GetStartNodeY;
|
--得到线对象的起始点XY坐标 create or replace function GetStartNodeXY(coords in SDO_ORDINATE_ARRAY) return varchar2 is Result varchar2(200); begin if coords.count > 0 then Result := to_char(coords(1))||','||to_char(coords(2)); end if; return(Result); end GetStartNodeXY;
|
--把X,Y坐标转换成MDSYS.SDO_GEOMETRY的点对象 create or replace function To_Geomerty_Point(x in number,y in number ) return MDSYS.SDO_GEOMETRY is Result MDSYS.SDO_GEOMETRY; begin
Result := MDSYS.SDO_GEOMETRY(2001, 8307, null, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 1), MDSYS.SDO_ORDINATE_ARRAY(x, y));
return(Result); end To_Geomerty_Point;
|
--------------------------------------------------------------------------
-------------------查询及测试语句---------------------------------------
--求线路的长度 select c.routename, sdo_geom.sdo_length(c.geoloc,m.DIMINFO,'unit=KM') from tgs_route c,user_sdo_geom_metadata m
select * from tg_routev2
select a.geoloc.SDO_ORDINATES from tgs_route a where routename = '宣武-6-1'
select GetStartNodeXY(a.geoloc.SDO_ORDINATES) from tgs_route a where routename = '宣武-6-1'
select GetEndNodeXY(a.geoloc.SDO_ORDINATES) from tgs_route a where routename = '宣武-6-1'
|
--计算线路的起始点和终止点坐标 create table routeNodeXY as select a.routename, GetStartNodeX(a.geoloc.SDO_ORDINATES) X1, GetStartNodeY(a.geoloc.SDO_ORDINATES) Y1, GetEndNodeX(a.geoloc.SDO_ORDINATES) X2, GetEndNodeY(a.geoloc.SDO_ORDINATES) Y2 from tgs_route a
|
--更新tg_routev2 中的线起始点 终止点坐标 alter table routeNodeXY add primary key(routename)
update (select a.*,b.* from tg_routev2 a,routeNodeXY b where a.routename = b.routename) set node1x = x1,node1y = Y1,node2x = X2,node2y = Y2 where node1x is null
|
select sdo_geom.sdo_distance( from dual --物流中心坐标 --116.635056 --39.869170
|
--node1距离物流中心的 “南北直角折线” 距离 select a.routename, (sdo_geom.sdo_distance(To_Geomerty_Point(a.node1x, a.node1y), To_Geomerty_Point(116.635056, a.node1y), 0.005, 'unit=KM') + sdo_geom.sdo_distance(To_Geomerty_Point(a.node1x, a.node1y), To_Geomerty_Point(a.node1x, 39.869170), 0.005, 'unit=KM')) dis1 from tg_routev2 a order by dis1
--node2距离物流中心的 “南北直角折线” 距离 select a.routename, (sdo_geom.sdo_distance(To_Geomerty_Point(a.node2x, a.node2y), To_Geomerty_Point(116.635056, a.node1y), 0.005, 'unit=KM') + sdo_geom.sdo_distance(To_Geomerty_Point(a.node2x, a.node2y), To_Geomerty_Point(a.node1x, 39.869170), 0.005, 'unit=KM')) dis2 from tg_routev2 a order by dis2
|
--更新node1Distance 和 node2Distance 即线路起始点、终止点距离物流中心的 “南北直角折线” 距离 update
tg_routev2 set
node1Distance = (sdo_geom.sdo_distance(To_Geomerty_Point(node1x, node1y), To_Geomerty_Point(116.635056, node1y), 0.005, 'unit=KM')
+ sdo_geom.sdo_distance(To_Geomerty_Point(node1x, node1y), To_Geomerty_Point(node1x, 39.869170), 0.005, 'unit=KM')), node2Distance = (sdo_geom.sdo_distance(To_Geomerty_Point(node2x, node2y), To_Geomerty_Point(116.635056, node2y), 0.005, 'unit=KM')
+ sdo_geom.sdo_distance(To_Geomerty_Point(node2x, node2y), To_Geomerty_Point(node2x, 39.869170), 0.005, 'unit=KM')) where
node1Distance is null;
|
分享到:
相关推荐
### Oracle Spatial与ArcGIS连接知识点解析 #### 一、引言 随着信息技术的发展,空间数据管理变得日益重要。许多组织正在转向使用Oracle Spatial作为其核心数据库系统,这主要是因为Oracle Spatial能够提供强大的...
Oracle Spatial 是 Oracle 数据库的一个组件,专门用于处理和分析地理空间数据。这个组件提供了丰富的功能,包括地理坐标系统的转换、空间查询、空间分析以及地图显示等。在Java开发环境中,Oracle Spatial 提供了...
[Packt Publishing] Oracle Spatial 应用扩展 (英文版) [Packt Publishing] Applying and Extending Oracle Spatial (E-Book) ☆ 图书概要:☆ Overview Understand how to develop Oracle Spatial data models ...
根据提供的文件信息,我们可以归纳出以下关于Oracle Spatial的相关知识点: ### 一、Oracle Spatial简介 - **Oracle Spatial** 是Oracle数据库系统中一个用于管理和处理地理空间数据的功能组件。 - 它能够帮助用户...
Oracle Spatial 是 Oracle 数据库的一个重要组件,专门用于处理地理空间数据和执行空间分析。这个官方文档是英文版,对于非英语母语者来说可能阅读起来有些困难,但它是理解 Oracle Spatial 功能和操作的关键资源。...
Oracle Spatial 是Oracle数据库的一个扩展模块,专门用于处理和分析地理空间数据。这个用户指南和参考文档是学习和掌握Oracle Spatial技术的重要资源,尽管它是英文版的。以下是对Oracle Spatial的一些核心知识点的...
### Oracle Spatial9i介绍 #### 一、Oracle Spatial9i概览 Oracle Spatial9i是Oracle数据库系统中的一项强大功能,专门用于处理地理信息系统(GIS)数据。它为GIS相关开发人员提供了一套完整的工具集,使他们能够...
"使用Oracle Spatial对ArcSDE中的SDO_GEOMETRY类型数据进行空间操作" Oracle Spatial 是 Oracle 数据库中的一个空间数据处理组件,用于存储、管理和操作空间数据。ArcSDE 是一个空间数据引擎,用于存储和管理大规模...
Oracle Spatial是Oracle数据库的一个扩展模块,专为处理地理空间数据而设计。它提供了对空间对象的存储、查询、分析和可视化的能力,使得开发者能够构建基于地理位置的应用程序。本用户指南详细介绍了如何有效地利用...
Oracle Spatial是Oracle数据库的一个扩展模块,专门用于处理地理空间数据,提供高级的空间查询、分析和可视化功能。在“Oracle Spatial学生指导”中,你将深入理解如何利用这个强大的工具进行地理信息系统(GIS)的...
《Oracle Spatial Developer's Guide》是Oracle公司为开发者提供的一份详尽指南,专注于其空间数据库解决方案——Oracle Spatial。Oracle Spatial是Oracle数据库的一个扩展模块,它提供了处理地理空间数据的能力,...
《Pro Oracle Spatial for Oracle Database 11g》是一本深入探讨Oracle Spatial特性的专业书籍,专为Oracle数据库11g用户设计。Oracle Spatial是Oracle数据库的一个扩展模块,它提供了强大的空间数据管理和分析功能...
Oracle Spatial 11g GeoRaster Oracle Spatial 11g GeoRaster Oracle Spatial 11g GeoRaster Oracle Spatial 11g GeoRaster
《Oracle Spatial空间信息管理:Oracle Database 11g》是世界级Oracle Spatial专家Ravi Kothuri、Albert Godfrind和Euro Beinat自力作,旨在向您提供空间信息管理方面的概念知识和实用技能,帮助您成为该领域的专家。...
"基于Oracle Spatial的矢量空间数据管理机制" Oracle Spatial是一种空间数据库管理系统,可以管理和存储矢量空间数据。该系统基于Oracle数据库管理系统,提供了一个对象关系模型来存储和管理空间几何实体。 ...
《Oracle Spatial空间信息管理:Oracle Database 11g》是世界级Oracle Spatial专家Ravi Kothuri、Albert Godfrind和Euro Beinat自力作,旨在向您提供空间信息管理方面的概念知识和实用技能,帮助您成为该领域的专家...
Oracle Spatial 是 Oracle 数据库的一个组件,它提供了对地理空间数据的支持和处理能力。这个组件使得在 Oracle 数据库中存储、查询、分析和可视化地理信息变得可能。Java API for Oracle Spatial(通常简称为 JSDO ...
Oracle Spatial是Oracle数据库的一个扩展模块,专门用于处理和分析地理空间数据。这个模块使得Oracle数据库能够支持复杂的地理信息系统的功能,比如地图制作、空间查询、地理编码和空间分析。在本教学讲义中,我们将...
【Oracle和Oracle Spatial简介】 Oracle是一家全球知名的信息管理软件提供商,自1977年成立以来,已成为全球最大的关系型数据库管理系统供应商。Oracle是第一个商业化的关系型数据库系统,并且是最早在其所有产品中...
Oracle Spatial是甲骨文公司推出的空间数据管理解决方案,其核心是一组专门针对Oracle数据库中空间元素的SQL模式、函数集以及空间索引机制。Oracle Spatial允许对空间数据进行存储、检索、更新和查询操作,是处理...