SQL 的 OGIS 标准定义的一些操作(OGIS,1999):
基本函数 | SpatialReference() | 返回几何体的基础坐标系统 |
---|---|---|
Envelope() | 返回包含几何体的最小外接矩形 | |
Export() | 返回以其他形式表示的几何体 | |
IsEmpty() | 如果几何体是空集则返回真 | |
IsSimple() | 如果几何体是简单的(即不相交)则返回真 | |
Boundary() | 返回几何体的边界 | |
拓扑/集合运算符 | Equal | 如果两个几何体的内部和边界在空间上相等,则返回真 |
Disjoint | 如果内部和边界都不相交,则返回真 | |
Intersect | 如果几何体相交,则返回真 | |
Touch | 如果两个面仅仅是边界相交但是内部不相交,则返回真 | |
Cross | 如果一条线和面的内部相交,则返回真 | |
Within | 如果给定几何体的内部不和另一个几何体的内部相交,则返回真 | |
Contains | 判断给定的几何体是否包含另一个给定的几何体 | |
Overlap | 如果两个几何体的内部有非空交集,则返回真 | |
空间分析 | Distance | 返回两个几何体之间的最短距离 |
Buffer | 返回给定几何体的距离小于或等于指定值的几何体的点的集合 | |
ConvexHull | 返回几何体的最小闭包 | |
Intersection | 返回由两个几何体的交集构成的几何体 | |
Union | 返回由两个几何体的并集构成的几何体 | |
Difference | 返回几何体与给定几何体不相交的部分 | |
SymmDiff | 返回两个几何体与对方互不相交的部分 |
下面采用 OGIS 的数据类型和操作对 World 数据库进行 SQL 查询,这些查询强调 Country、City、River 之间的空间关系。首先来重新定义关系模式,假设在 SQL 中可以使用 OGIS 的数据类型和操作,修订后的关系模式如下所示。
CREAT TABLE Country(
Name varchar(30), /*varchar表示可变长度的字符型*/
Cont varchar(30),
Pop Integer,
GDP Number,
Life-Exp float(2),
Shape Polygon); /*Country的几何类型是面(Polygon)*/
CREAT TABLE River(
Name varchar(30),
Origin varchar(30),
Length Number,
Shape LineString); /*River的几何类型是线(LineString)*/
CREAT TABLE City(
Name varchar(30),
Country varchar(30),
Pop Integer,
Capital varchar(1),
Shape Point); /*City的几何类型是点(Point)*/
(1)查询:列出 Country 表中所有与美国(USA)相邻的国家名字。
/*AS的作用是给C1.Name起一个别名为Neighbors of USA*/
SELECT C1.Name AS "Neighbors of USA"
/*C1,C2分别表示基本表Country的两个别名,
只是名字不一样,表的内容与基本表Country的内容是一样的*/
FROM Country C1,Country C2
/*谓词Touch检测两个集合对象是否彼此相邻而又不交叠,
Touch函数的两个参数分别为C1.Shape和C2.Shape,
其中.Shape表示表中对象的几何类型,这里是面类型*/
WHERE Touch(C1.Shape,C2.Shape)=1 AND C2.Name='USA';
(2)查询:找出 River 表中所列出的河流流经的国家 。
SELECT R.Name,C.Name
/*R和C分别是基本表River和Country的别名*/
FROM River R,Country C
/*Cross是一个拓扑谓词,常常用于判断LineString与Polygon之间
(如本例情况)或一对LineString之间是否相交,
Cross函数的两个参数是R.Shape和C.Shape,
其中.Shape表示表中对象的几何类型*/
WHERE Cross(R.Shape,C.Shape)=1;
(3)查询:对于 River 表中列出的河流,在 City 表中找到距离其最近的城市。
SELECT C1.Name,R1.Name
FROM City C1,River R1
/*Distance是一个返回实数值的二元运算,它可作用于任何几何对象的组合上,
功能是返回两个几何体之间的最短距离*/
WHERE Distance (C1.Shape,R1.Shape)<
ALL (SELECT Distance(C2.Shape,R1.Shape)
FROM City C2
WHERE C1.Name<>C2.Name);
(4)查询:圣劳伦斯河能为方圆 300 公里以内的城市供水,列出能从该河流获得供水的城市。
SELECT Ci.Name
FROM City Ci,River R
/*Overlap函数的功能是如果两个几何体的内部有非空交集,则返回真,
Buffer函数的功能是返回给定几何体的距离小于或等于指定值的几何体的点的集合,即缓冲区分析,
本例题中的缓冲距离是300公里*/
WHERE Overlap(Ci.Shape,Buffer(R.Shape,300))=1 AND
R.Name='圣劳伦斯河';
(5)查询:列出 Country 表中每个国家的名字、人口和国土面积。
/*AS的作用是给选择的属性列Area(C.Shape)起一个别名为Area*/
SELECT C.Name,C.Pop,Area(C.Shape) AS "Area"
/*C是基本表Country的别名*/
FROM Country C;
(6)查询:求出河流在流经的各国境内的长度。
/*AS的作用是给Length(Intersection(R.Shape,C.Shape))起一个别名为Length*/
SELECT R.Name,C.Name,Length(Intersection(R.Shape,C.Shape)) AS "Length"
/*R和C分别是基本表River和Country的别名*/
FROM River R,Country C
/*Cross的功能是“如果一条线和面的内部相交,则返回真”*/
WHERE Cross(R.Shape,C.Shape)=1;
(7)查询:列出每个国家的 GDP 及其首都到赤道的距离。
/*AS的作用是给Distance(Point(0,Ci.Shape.y),Ci.Shape)起一个别名为Distance,
Point(0,Ci.Shape.y)表示一个位于赤道上的点,在测量坐标系中横轴为y轴,纵轴为x轴,
点Point(0,Ci.Shape.y)的x坐标是0,y坐标是与城市点的纵坐标相同的值Ci.Shape.y,
所以点Point(0,Ci.Shape.y)是一个位于赤道上的且与城市点具有相同经度的点,
Ci.Shape表示点类型的城市点,利用Distance函数即可求得两点之间的距离,
Distance函数的参数就是上述的两个点*/
SELECT Co.GDP,Distance(Point(0,Ci.Shape.y),Ci.Shape) AS "Distance"
/*Co和Ci分别是基本表Country和City的别名*/
FROM Country Co,City Ci
WHERE Co.Name=Ci.Country
AND Ci.Capital='Y';
/*Ci.Capital='Y'的意思是该城市是其所在国家的首都,
其中Capital是表Ci的一个字段,用来存储该城市是否为国家的首都,
当Capital字段的值为Y(YES/是)时表示该城市是首都,
当Capital字段的值为N(NO/不是)时表示该城市不是首都*/
(8)查询:按其邻国数目的多少列出所有国家。
SELECT Co.Name,COUNT(Co1.Name)
/*Co和Co1分别是基本表Country的两个别名*/
FROM Country Co,Country Co1
/*Touch的功能是“如果两个面仅仅是边界相交但是内部不相交,则返回真”*/
WHERE Touch(Co.Shape,Co1.Shape)
/*因为需要查询出每一个国家的邻国数目,所以需要按照国名分组*/
GROUP BY Co.Name
/*按照邻国数目进行升序排列,因为没有指定升降序的关键字,所以是默认的情况,即为升序排列*/
ORDER BY COUNT(Co1.Name);