<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>北风技术专栏 &#187; taohuang100</title>
	<atom:link href="http://column.ibeifeng.com/wp-feed.php?author_name=taohuang100&#038;feed=feed" rel="self" type="application/rss+xml" />
	<link>http://column.ibeifeng.com</link>
	<description>用技术点亮生活中每个亮点</description>
	<pubDate>Tue, 07 Apr 2009 09:38:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>oracle spatial初探</title>
		<link>http://column.ibeifeng.com/taohuang100/20090222257.shtml</link>
		<comments>http://column.ibeifeng.com/taohuang100/20090222257.shtml#comments</comments>
		<pubDate>Sat, 21 Feb 2009 16:25:38 +0000</pubDate>
		<dc:creator>taohuang100</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://column.ibeifeng.com/?p=257</guid>
		<description><![CDATA[一、Oracle Spatial简介
Oracle 支持自定义的数据类型，可以用数组，结构体或者带有构造函数，功能函数的类来定义自己的对象类型。这样的对象类型可以用于属性列的数据类型，也可以用来创建对象表。而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统。
Spatial 的自定义数据类型有很多，全部在MDSYS方案下，经常使用到的是SDO_GEOMETRY类型。SDO_GEOMETRY表示一个几何对象，可以是点、线、面、多点、多线、多面或混合对象。

Spatial 在此数据类型的基础上，实现了R树空间索引和四叉树空间索引，还以SQL函数的形式实现了多种空间分析功能。
二、测试表的建立与应用（点类型）



&#8211; 创建测试用表
CREATE TABLE &#8220;SPATIALTEST&#8221; (
&#8220;ID&#8221; VARCHAR2(20) NOT NULL,
&#8220;NAME&#8221; VARCHAR2(100),
&#8220;ADDRESS&#8221; VARCHAR2(200),
&#8220;TELEPHONE&#8221; VARCHAR2(50),
&#8220;LOCATION&#8221; &#8220;MDSYS&#8221;.&#8221;SDO_GEOMETRY&#8221;
)LOGGING;






&#8211; 创建主键约束
ALTER TABLE &#8220;SPATIALTEST&#8221;
ADD CONSTRAINT &#8220;PK_SPATIAL&#8221; PRIMARY KEY(&#8221;ID&#8221;);






&#8211; 根据用户表填写空间元数据
INSERT INTO USER_SDO_GEOM_METADATA
VALUES(
&#8216;SPATIALTEST&#8217;,
&#8216;location&#8217;,
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT(&#8217;Longitude&#8217;,-180,180,10),
MDSYS.SDO_DIM_ELEMENT(&#8217;Latitude&#8217;,-90,90,10)
),
8307
);






&#8211; 建立空间索引
CREATE INDEX SPATIAL_IDX
ON SPATIALTEST(location)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;






&#8211; 导入测试数据
INSERT INTO &#8220;SPATIALTEST&#8221;
VALUES(
&#8216;dbeb7ea11eaf2b53a9b7&#8242;,
&#8216;小肥羊(天河店)&#8217;,
&#8216;广州市天河区天寿路25号&#8217;,
&#8216;020-38217746&#8242;,
MDSYS.SDO_GEOMETRY(
2001,
8307,
MDSYS.SDO_POINT_TYPE(113.3293658, 23.14338586, 0),
NULL,
NULL
)
);
INSERT INTO &#8220;SPATIALTEST&#8221;
VALUES(
&#8216;ef8393ef6273a72b2f70&#8242;,
&#8216;山东老家&#8217;,
&#8216;广州市越秀区合群一马路43号&#8217;,
&#8216;020-87778983&#8242;,
MDSYS.SDO_GEOMETRY(
2001,
8307,
MDSYS.SDO_POINT_TYPE(113.2932474, 23.11883515, 0),
NULL,
NULL
)
); &#8211;其他INSERT INTO cola_markets VALUES(
2,
&#8216;cola_b&#8217;,
MDSYS.SDO_GEOMETRY(
2003, &#8211; 2-dimensional polygon
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1), &#8212; one polygon (exterior polygon ring)
MDSYS.SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, [...]]]></description>
			<content:encoded><![CDATA[<p>一、Oracle Spatial简介</p>
<p>Oracle 支持自定义的数据类型，可以用数组，结构体或者带有构造函数，功能函数的类来定义自己的对象类型。这样的对象类型可以用于属性列的数据类型，也可以用来创建对象表。而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统。</p>
<p>Spatial 的自定义数据类型有很多，全部在MDSYS方案下，经常使用到的是SDO_GEOMETRY类型。SDO_GEOMETRY表示一个几何对象，可以是点、线、面、多点、多线、多面或混合对象。</p>
<p><span id="more-257"></span></p>
<p>Spatial 在此数据类型的基础上，实现了R树空间索引和四叉树空间索引，还以<a href=";" target="_self"><span style="underline;"><strong>SQL</strong></span></a>函数的形式实现了多种空间分析功能。<br />
二、<a href=";" target="_self"><span style="underline;"><strong>测试</strong></span></a>表的建立与应用（点类型）</p>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td><span style="#ffffff;">&#8211; 创建测试用表<br />
CREATE TABLE &#8220;SPATIALTEST&#8221; (<br />
&#8220;ID&#8221; VARCHAR2(20) NOT NULL,<br />
&#8220;NAME&#8221; VARCHAR2(100),<br />
&#8220;ADDRESS&#8221; VARCHAR2(200),<br />
&#8220;TELEPHONE&#8221; VARCHAR2(50),<br />
&#8220;LOCATION&#8221; &#8220;MDSYS&#8221;.&#8221;SDO_GEOMETRY&#8221;<br />
)LOGGING;</span></td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 创建主键约束<br />
ALTER TABLE &#8220;SPATIALTEST&#8221;<br />
ADD CONSTRAINT &#8220;PK_SPATIAL&#8221; PRIMARY KEY(&#8221;ID&#8221;);</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 根据用户表填写空间元数据<br />
INSERT INTO USER_SDO_GEOM_METADATA<br />
VALUES(<br />
&#8216;SPATIALTEST&#8217;,<br />
&#8216;location&#8217;,<br />
MDSYS.SDO_DIM_ARRAY(<br />
MDSYS.SDO_DIM_ELEMENT(&#8217;Longitude&#8217;,-180,180,10),<br />
MDSYS.SDO_DIM_ELEMENT(&#8217;Latitude&#8217;,-90,90,10)<br />
),<br />
8307<br />
);</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 建立空间索引<br />
CREATE INDEX SPATIAL_IDX<br />
ON SPATIALTEST(location)<br />
INDEXTYPE IS MDSYS.SPATIAL_INDEX;</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 导入测试数据<br />
INSERT INTO &#8220;SPATIALTEST&#8221;<br />
VALUES(<br />
&#8216;dbeb7ea11eaf2b53a9b7&#8242;,<br />
&#8216;小肥羊(天河店)&#8217;,<br />
&#8216;广州市天河区天寿路25号&#8217;,<br />
&#8216;020-38217746&#8242;,<br />
MDSYS.SDO_GEOMETRY(<br />
2001,<br />
8307,<br />
MDSYS.SDO_POINT_TYPE(113.3293658, 23.14338586, 0),<br />
NULL,<br />
NULL<br />
)<br />
);<br />
INSERT INTO &#8220;SPATIALTEST&#8221;<br />
VALUES(<br />
&#8216;ef8393ef6273a72b2f70&#8242;,<br />
&#8216;山东老家&#8217;,<br />
&#8216;广州市越秀区合群一马路43号&#8217;,<br />
&#8216;020-87778983&#8242;,<br />
MDSYS.SDO_GEOMETRY(<br />
2001,<br />
8307,<br />
MDSYS.SDO_POINT_TYPE(113.2932474, 23.11883515, 0),<br />
NULL,<br />
NULL<br />
)<br />
); &#8211;其他INSERT INTO cola_markets VALUES(<br />
2,<br />
&#8216;cola_b&#8217;,<br />
MDSYS.SDO_GEOMETRY(<br />
2003, &#8211; 2-dimensional polygon<br />
NULL,<br />
NULL,<br />
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1), &#8212; one polygon (exterior polygon ring)<br />
MDSYS.SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1)<br />
)<br />
);</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 属性信息查询<br />
SQL&gt; select location from spatialtest;LOCATION(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(113.329366, 23.1433859, 0), NULL, NULL)SQL&gt; select s.location.SDO_POINT.x langtitude from spatialtest s;LANGTITUDE<br />
&#8212;&#8212;&#8212;-<br />
113.329366</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 空间分析查询(113.2359818,23.16937253)周边十公里信息5条<br />
SELECT<br />
B.id id, B.name name, B.dist dist<br />
FROM (<br />
SELECT<br />
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<br />
FROM<br />
spatialtest A<br />
WHERE<br />
SDO_WITHIN_DISTANCE(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),NULL,NULL),&#8217;distance=10000&#8242;) = &#8216;TRUE&#8217;<br />
ORDER BY A.name<br />
) B<br />
WHERE<br />
ROWNUM &lt;= 5<br />
;</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; 空间分析查询(113.2359818,23.16937253)附近的5条信息<br />
SELECT<br />
A.id id, A.name name,A.location.SDO_POINT.x langtitude, A.location.SDO_POINT.y latitude,MDSYS.SDO_NN_DISTANCE(1) distance<br />
FROM<br />
spatialtest A<br />
WHERE<br />
SDO_NN(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),null,null),&#8217;SDO_NUM_RES=5&#8242;,1) = &#8216;TRUE&#8217;<br />
;</td>
</tr>
</tbody>
</table>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>&#8211; Return the topological difference of two geometries.<br />
SELECT SDO_GEOM.SDO_DIFFERENCE(c_a.shape, m.diminfo, c_c.shape, m.diminfo)<br />
FROM cola_markets c_a, cola_markets c_c, user_sdo_geom_metadata m<br />
WHERE m.table_name = &#8216;COLA_MARKETS&#8217; AND m.column_name = &#8216;SHAPE&#8217;<br />
AND c_a.name = &#8216;cola_a&#8217; AND c_c.name = &#8216;cola_c&#8217;;</td>
</tr>
</tbody>
</table>
<p>三、MDYSYS.SDO_GEOMETRY结构</p>
<table style="80%;" border="1" cellspacing="1" cellpadding="3">
<tbody>
<tr>
<td>CREATE TYPE SDO_GEOMETRY AS OBJECT(<br />
SDO_GTYPE NUMBER,       //表示几何实体的类型<br />
SDO_SRID NUMBER,       //用来表示坐标系(空间参考坐标系)，与几何实体关联<br />
SDO_POINT MDSYS.SDO_POINT_TYPE, //使用X,Y,Z属性值来定义对象类型                   //它们都是NUMBER类型，<br />
//如果SDO_GEOMETRY的SDO_ELEM_INFO及SDO_ORDINATES数组为<br />
//空则SDO_POINT为非空,X和Y值就是点几何实体的坐标值<br />
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, //使用变长NUMBER型数组来表示。<br />
//该属性将告知如何解释SDO_ORDINATES里边的坐标值;<br />
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY  //存储坐标值                  //形成空间对象的边界<br />
);</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://column.ibeifeng.com/taohuang100/20090222257.shtml/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
