当前位置:网站首页>Oracle LiveLabs实验:Introduction to Oracle Spatial

Oracle LiveLabs实验:Introduction to Oracle Spatial

2022-06-12 21:30:00 dingdingfish

本实验介绍了适用于 Oracle Spatial功能。

此实验申请地址在这里,时间为60分钟。

此实验的帮助见这里

Oracle Spatial以前是单独收费的数据库选件,目前已包含在数据库企业版中。

Introduction

关于 Oracle Spatial

Oracle 的使命是帮助人们以新的方式查看数据、发现洞察并释放无限可能。 空间分析是关于理解基于地理关系的复杂交互——根据人员、资产和资源的位置来回答问题。 空间洞察力使您能够提供更好的客户服务、优化员工队伍、定位零售和配送中心、评估销售和营销活动等。 借助 Oracle 的空间产品,开发人员、数据库专业人员和分析师可以使用一整套空间数据管理、分析和可视化工具,将空间分析和映射集成到企业级数据管理基础架构(Oracle 数据库和 Oracle Exadata)上的应用程序中。

如下图所示,Oracle 数据库的空间特性为基本和高级空间数据类型提供了可扩展的高性能存储、处理和分析。 还提供了一系列可部署的 Java EE 组件来支持常见的中间层服务。
在这里插入图片描述

更多信息,请访问 https://oracle.com/goto/spatial

研讨会概述

在本次研讨会中,您将创建和配置空间数据并执行一些基本的空间查询。 该方案涉及WAREHOUSES, BRANCHES,和 COASTAL_ZONE。 WAREHOUSES 和 BRANCHES 是点,COASTAL_ZONE 是多边形。 您将创建和配置这些空间表,然后执行空间查询以识别邻近和包含的项目。

先决条件

  • 本次研讨会需要访问 Oracle 数据库和 SQL 客户端(即 SQL Developer、SQL Developer Web、SQL*Plus),以创建示例数据。
  • 不需要以前使用过 Oracle Spatial 的经验。

致谢

本实验的作者为David Lapp, 数据库产品经理,以及Marion Smith。

实验 1:配置自治数据库

在OCI中创建,ATP或ADW都可以。很快,几分钟就好。

其实此实验有一个Oracle普通的数据库也是可以的

实验 2:连接到 ADB 并运行您的第一个查询

介绍

在本实验中,您将使用 SQL 工作表探索数据库实例随附的示例数据集。约5分钟。

本实验使用 SQL 工作表,它是 Oracle 自治数据库的数据库操作基于 Web 的界面的功能之一。

本实验将演示对 ADW 开箱即用提供的示例数据集的查询。 ADW 提供 Oracle 销售历史示例模式和星型模式基准 (SSB) 数据集。 这些数据集分别位于 SH 和 SSB 模式中。但实际上这两个模式都不会在实验中使用到。

您将对 SSB 数据集运行基本查询,该数据集是一个 1 TB 的数据集,其中包含一个包含大约 60 亿行的事实表和多个维度表。

目标

  • 了解如何使用 SQL Worksheet 连接到新的自治数据库
  • 了解 Star Schema Benchmark (SSB) 和 Sales History (SH) 样本数据集
  • 对 ADW 示例数据集运行查询

任务 1:连接 SQL Worksheet

其实SQL Worksheet既可以用本地版的SQL Developer,也可以用云端Database Action中的SQL Developer Web版(Database Action>Development>SQL)。使用后者,可以免除配置接口的工作。

任务 2:在 SQL Worksheet 中运行脚本

运行以下SQL

select /* low */ c_city,c_region,count(*)
from ssb.customer c_low
group by c_region, c_city
order by count(*);

UNITED KI1	EUROPE      	119082
UNITED ST4	AMERICA     	119245
MOZAMBIQU2	AFRICA      	119283
INDIA    2	ASIA        	119380
ETHIOPIA 5	AFRICA      	119393
...

如果可能,ADW 还会为您缓存查询结果。 如果您多次运行相同的查询,您会注意到缓存结果后的响应时间要短得多。

实验 3:创建示例空间数据

本实验将引导您完成在 Oracle 数据库中创建示例空间数据的步骤。约10分钟。

Oracle 数据库原生数据类型 SDO_GEOMETRY存储空间数据(点、线、多边形)。 Oracle 数据库还为高性能空间操作提供原生空间索引。 此空间索引依赖于为存储空间数据的每个表和几何列输入的空间元数据。 一旦空间数据被发布和索引,强大的 API 就可以用于执行空间分析、计算和处理。

SDO_GEOMETRY 类型具有以下格式:

SDO_GEOMETRY( 
 [geometry type],           --ID for point/line/polygon
 [coordinate system],       --ID of coordinate system
 [point coordinate],        --for points only
 [line/polygon info],       --for lines/polygons only
 [line/polygon coordinates] --for lines/polygons only
  )

最常见的几何类型是二维的:

ID类型
2001Point
2002Line
2003Polygon

最常见的坐标系是:

ID坐标系
4326Latitude/Longitude (经纬度)
3857World Mercator(世界墨卡托)

使用纬度/经度时,请注意纬度是 Y 坐标,经度是 X 坐标。 由于坐标被列为 X,Y 对,因此这些值实际上按经度、纬度的顺序排列。

以下是使用纬度/经度坐标的示例几何点形状:

SDO_GEOMETRY( 
 2001,               --2D point
 4326,               --latitude/longitude
 SDO_POINT_TYPE(     
    -100.123, 20.456 --coordinate
    ),         
 NULL,               --for lines/polygons only
 NULL                --for lines/polygons only
  )

以下是使用纬度/经度坐标的示例几何多边形:

SDO_GEOMETRY( 
 2003,                  --2D polygon
 4326,                  --latitude/longitude
 NULL,                  --for points only 
 SDO_ELEM_INFO_ARRAY(
      1, 1003, 1        --indicates simple exterior polygon
        ), 
 SDO_ORDINATE_ARRAY(   
    -98.789065,39.90973, -- coordinates
    -101.2522,39.639537,
    -99.84374,37.160316,
    -96.67987,35.460699,
    -94.21875,39.639537,
    -98.789025,39.90973
      )
    )
);

SDO_ELEM_INFO_ARRAY中的数值(1, 1003, 1)是固定搭配,表示一个多边形(外部多边形环)。

在本实验中,您将:

  • 创建带有几何列的表
  • 填充几何图形
  • 创建空间元数据和索引

任务 1:创建带坐标的表

我们首先创建带有纬度、经度坐标的表格。 这是创建空间数据的常见起始任务,例如来自 GPS 的坐标,或来自地理编码街道地址或 IP 地址的坐标。

运行以下脚本:

CREATE TABLE WAREHOUSES (WAREHOUSE_NAME VARCHAR2(30), LAT NUMBER, LON NUMBER);
CREATE TABLE BRANCHES (BRANCH_NAME VARCHAR2(30),ZIPCODE VARCHAR2(5), LAT NUMBER, LON NUMBER, BRANCH_TYPE VARCHAR2(30));
INSERT INTO WAREHOUSES VALUES ('Amarillo Warehouse',35.532226,-101.557617);
INSERT INTO WAREHOUSES VALUES ('Odessa Warehouse',31.334871,-102.062988);
INSERT INTO WAREHOUSES VALUES ('San Antonio Warehouse',29.496987,-98.833007);
INSERT INTO WAREHOUSES VALUES ('Dallas Warehouse',33.027087,-97.316894);
INSERT INTO WAREHOUSES VALUES ('Houston Warehouse',30.069093,-95.317382);
INSERT INTO WAREHOUSES VALUES ('Abelene Warehouse',32.583849,-99.667968);
INSERT INTO WAREHOUSES VALUES ('Waco Warehouse',31.27855,-97.097167);
INSERT INTO BRANCHES VALUES('Marshall Branch','75672',32.50555,-94.35579,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Austin Branch-2','78745',30.20538,-97.75902,'RETAIL');
INSERT INTO BRANCHES VALUES('Grand Prairie Branch','75050',32.76199,-96.99732,'RETAIL');
INSERT INTO BRANCHES VALUES('Pasadena Branch','77505',29.64587,-95.15763,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Sulphur Springs Branch','75482',33.12357,-95.5972,'RETAIL');
INSERT INTO BRANCHES VALUES('San Angelo Branch-1','76901',31.44721,-100.49426,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-6','77025',29.67853,-95.43044,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Mount Pleasant Branch','75455',33.17527,-94.98048,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Palestine Branch','75802',31.77344,-95.63011,'RETAIL');
INSERT INTO BRANCHES VALUES('Amarillo Branch-3','79119',35.11141,-101.91082,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Weatherford Branch','76086',32.75696,-97.70715,'RETAIL');
INSERT INTO BRANCHES VALUES('Port Lavaca Branch','77979',28.66005,-96.422,'RETAIL');
INSERT INTO BRANCHES VALUES('Tomball Branch','77375',30.015,-95.5912,'RETAIL');
INSERT INTO BRANCHES VALUES('Hebbronville Branch','78361',27.30652,-98.67612,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Beaumont Branch-1','77706',30.11087,-94.13984,'RETAIL');
INSERT INTO BRANCHES VALUES('Mabank Branch','75147',32.36565,-96.10197,'RETAIL');
INSERT INTO BRANCHES VALUES('Quitman Branch','75783',32.79578,-95.44701,'RETAIL');
INSERT INTO BRANCHES VALUES('Kerrvile Branch','78028',30.04845,-99.13948,'RETAIL');
INSERT INTO BRANCHES VALUES('Goldthwaite Branch','76844',31.44557,-98.5275,'RETAIL');
INSERT INTO BRANCHES VALUES('Katy Branch','77450',29.7848,-95.7326,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Bowie Branch-1','76230',33.53709,-97.87829,'RETAIL');
INSERT INTO BRANCHES VALUES('Weslaco Branch','78596',26.17235,-97.98209,'RETAIL');
INSERT INTO BRANCHES VALUES('Eagle Pass Branch','78852',28.6865,-100.47394,'RETAIL');
INSERT INTO BRANCHES VALUES('Tyler Branch','75711',32.32208,-95.30069,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Uvalde Branch','78801',29.23102,-99.75492,'RETAIL');
INSERT INTO BRANCHES VALUES('Odessa Branch','79760',31.8467,-102.36689,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-1','77025',29.67853,-95.43044,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Decatur Branch','76234',33.24962,-97.54674,'RETAIL');
INSERT INTO BRANCHES VALUES('Lewisville Branch','75067',33.05725,-97.01165,'RETAIL');
INSERT INTO BRANCHES VALUES('Brenham Branch','77833',30.15595,-96.41905,'RETAIL');
INSERT INTO BRANCHES VALUES('Austin Branch-1','78751',30.32012,-97.71481,'RETAIL');
INSERT INTO BRANCHES VALUES('Rockdale Branch','76567',30.6503,-97.01023,'RETAIL');
INSERT INTO BRANCHES VALUES('San Antonio Branch-3','78216',29.55217,-98.48661,'RETAIL');
INSERT INTO BRANCHES VALUES('Abilene Branch-2','79605',32.4517,-99.77579,'RETAIL');
INSERT INTO BRANCHES VALUES('Cleburne Branch','76033',32.42166,-97.38356,'WHOLESALE');
INSERT INTO BRANCHES VALUES('College Station Branch','77845',30.6355,-96.30516,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Denton Branch','76210',33.14925,-97.09016,'RETAIL');
INSERT INTO BRANCHES VALUES('Alvin Branch-1','77512',29.41878,-95.24026,'RETAIL');
INSERT INTO BRANCHES VALUES('Amarillo Branch-1','79120',35.18857,-101.81719,'RETAIL');
INSERT INTO BRANCHES VALUES('Henderson Branch','75654',32.10862,-94.82693,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Paris Branch','75460',33.66771,-95.5678,'RETAIL');
INSERT INTO BRANCHES VALUES('Waxahachie Branch','75167',32.42936,-96.86103,'RETAIL');
INSERT INTO BRANCHES VALUES('Slaton Branch','79364',33.45031,-101.6518,'RETAIL');
INSERT INTO BRANCHES VALUES('Brady Branch','76825',31.13424,-99.3349,'RETAIL');
INSERT INTO BRANCHES VALUES('Fordt Worth Branch','76119',32.66555,-97.2406,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Carrollton Branch','75006',32.94441,-96.90386,'RETAIL');
INSERT INTO BRANCHES VALUES('Itasca Branch','76055',32.15944,-97.15097,'RETAIL');
INSERT INTO BRANCHES VALUES('Winnie Branch','77665',29.81749,-94.37706,'RETAIL');
INSERT INTO BRANCHES VALUES('Burkburnett Branch','73654',34.08013,-98.55913,'RETAIL');
INSERT INTO BRANCHES VALUES('Boerne Branch','78006',29.80671,-98.70248,'RETAIL');
INSERT INTO BRANCHES VALUES('Mesquite Branch','75150',32.80576,-96.62761,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Baytown Branch','77521',29.80219,-94.9955,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Orange Branch','77630',30.09311,-93.74627,'RETAIL');
INSERT INTO BRANCHES VALUES('Kaufman Branch','75142',32.58899,-96.30101,'RETAIL');
INSERT INTO BRANCHES VALUES('Frisco Branch','75034',33.08329,-96.8487,'RETAIL');
INSERT INTO BRANCHES VALUES('Portland Branch','78374',27.8892,-97.31627,'RETAIL');
INSERT INTO BRANCHES VALUES('Fort Stockton Branch','79735',30.86708,-102.84237,'RETAIL');
INSERT INTO BRANCHES VALUES('San Antonio Branch-1','78220',29.41375,-98.4102,'WHOLESALE');
INSERT INTO BRANCHES VALUES('San Angelo Branch-3','76901',31.44748,-100.494,'RETAIL');
INSERT INTO BRANCHES VALUES('Crosby Branch','77532',29.88909,-95.06142,'RETAIL');
INSERT INTO BRANCHES VALUES('Jacksonville Branch','75766',31.96639,-95.2485,'RETAIL');
INSERT INTO BRANCHES VALUES('La Grange Branch','78945',29.92131,-96.88931,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Corpus Christi Branch-2','78410',27.84873,-97.63101,'RETAIL');
INSERT INTO BRANCHES VALUES('Graham Branch','76450',33.10964,-98.56536,'RETAIL');
INSERT INTO BRANCHES VALUES('Corsicana Branch','75110',32.0986,-96.44383,'WHOLESALE');
INSERT INTO BRANCHES VALUES('San Antonio Branch-2','78238',29.40633,-98.51827,'RETAIL');
INSERT INTO BRANCHES VALUES('Kenedy Branch-1','78119',28.79531,-97.85081,'RETAIL');
INSERT INTO BRANCHES VALUES('Comanche Branch','76442',31.90838,-98.59057,'RETAIL');
INSERT INTO BRANCHES VALUES('Hutto Branch','78634',30.53991,-97.56444,'RETAIL');
INSERT INTO BRANCHES VALUES('Plainview Branch','79072',34.19627,-101.72565,'WHOLESALE');
INSERT INTO BRANCHES VALUES('El Paso Branch-1','79925',31.78992,-106.39392,'RETAIL');
INSERT INTO BRANCHES VALUES('Temple Branch','76503',31.10109,-97.33947,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Edna Branch-1','77957',28.96753,-96.6678,'RETAIL');
INSERT INTO BRANCHES VALUES('Dallas Branch-2','75228',32.79436,-96.69455,'RETAIL');
INSERT INTO BRANCHES VALUES('El Paso Branch-3','79925',31.78385,-106.41769,'RETAIL');
INSERT INTO BRANCHES VALUES('Whitesboro Branch','76273',33.67134,-96.90732,'RETAIL');
INSERT INTO BRANCHES VALUES('Galvston Branch','77554',29.28626,-94.85884,'WHOLESALE');
INSERT INTO BRANCHES VALUES('New Boston Branch','75570',33.45857,-94.42665,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Wharton Branch','77488',29.31394,-96.10216,'RETAIL');
INSERT INTO BRANCHES VALUES('Tulia Branch','79088',34.54383,-101.77545,'RETAIL');
INSERT INTO BRANCHES VALUES('Alvin Branch-2','77512',29.45094,-95.23649,'RETAIL');
INSERT INTO BRANCHES VALUES('Marble Falls Branch','78654',30.50005,-98.26728,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-7','77074',29.71841,-95.49676,'RETAIL');
INSERT INTO BRANCHES VALUES('Arlington Branch-2','76004',32.73479,-97.10408,'RETAIL');
INSERT INTO BRANCHES VALUES('Wichita Falls Branch','76310',33.87128,-98.57951,'RETAIL');
INSERT INTO BRANCHES VALUES('Floresville Branch','78114',29.16354,-98.19341,'RETAIL');
INSERT INTO BRANCHES VALUES('El Paso Branch-2','79936',31.73947,-106.32398,'RETAIL');
INSERT INTO BRANCHES VALUES('Terrell Branch','75616',32.73366,-96.25685,'RETAIL');
INSERT INTO BRANCHES VALUES('Texas City Branch','77590',29.39525,-94.9323,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Humble Branch','77338',29.99421,-95.27188,'RETAIL');
INSERT INTO BRANCHES VALUES('Richwood Branch','77531',29.03962,-95.40011,'RETAIL');
INSERT INTO BRANCHES VALUES('Coleman Branch','76834',31.85603,-99.44611,'RETAIL');
INSERT INTO BRANCHES VALUES('Seguin Branch','78155',29.56276,-97.96538,'RETAIL');
INSERT INTO BRANCHES VALUES('Georgetown Branch','78627',30.62275,-97.68708,'RETAIL');
INSERT INTO BRANCHES VALUES('Mckinney Branch','75070',33.1688,-96.68446,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-5','77034',29.62228,-95.2223,'RETAIL');
INSERT INTO BRANCHES VALUES('Muenster Branch','76252',33.66937,-97.37965,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Abilene Branch-1','79605',32.45175,-99.77668,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Big Spring Branch-1','79720',32.24941,-101.48127,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Corpus Christi Branch-3','78412',27.70189,-97.35781,'RETAIL');
INSERT INTO BRANCHES VALUES('Hondo Branch','78861',29.3483,-99.12811,'RETAIL');
INSERT INTO BRANCHES VALUES(' Corpus Christi Branch-1','78412',27.70189,-97.35781,'RETAIL');
INSERT INTO BRANCHES VALUES('Lufkin Branch-1','75901',31.34264,-94.69127,'RETAIL');
INSERT INTO BRANCHES VALUES('Port Arthur Branch','77642',29.93701,-93.9351,'RETAIL');
INSERT INTO BRANCHES VALUES('Arlington Branch-1','76017',32.67551,-97.1301,'RETAIL');
INSERT INTO BRANCHES VALUES('Copperas Cove Branch','76522',31.10028,-97.89377,'RETAIL');
INSERT INTO BRANCHES VALUES('Burleson Branch','76028',32.55993,-97.31844,'RETAIL');
INSERT INTO BRANCHES VALUES('Silsbee Branch','77625',30.38197,-94.34406,'RETAIL');
INSERT INTO BRANCHES VALUES('Kenedy Branch-2','78119',28.79531,-97.85081,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Raymondville Branch','78580',26.48079,-97.77893,'RETAIL');
INSERT INTO BRANCHES VALUES('Livingston Branch','77351',30.70821,-94.91611,'RETAIL');
INSERT INTO BRANCHES VALUES('Beeville Branch','78102',28.40093,-97.74818,'RETAIL');
INSERT INTO BRANCHES VALUES('Liberty Branch','77575',30.05823,-94.77322,'RETAIL');
INSERT INTO BRANCHES VALUES('Victoria Branch-1','77904',28.83684,-97.00175,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Kingsville Branch-1','78364',27.51574,-97.85543,'RETAIL');
INSERT INTO BRANCHES VALUES('Carthage Branch','75633',32.14415,-94.33211,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Dalhart Branch-2','79022',36.10865,-102.55245,'RETAIL');
INSERT INTO BRANCHES VALUES('Bay City Branch','77414',28.99702,-95.9164,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Mexia Branch','76667',31.68292,-96.48395,'RETAIL');
INSERT INTO BRANCHES VALUES('San Antonio Branch-5','78233',29.29499,-98.63473,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Amarillo Branch-2','79120',35.18857,-101.81719,'RETAIL');
INSERT INTO BRANCHES VALUES('Beaumont Branch-2','77706',30.11087,-94.13984,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-2','77054',29.67793,-95.42368,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-3','77040',29.88204,-95.57178,'RETAIL');
INSERT INTO BRANCHES VALUES('Sour Lake Branch','77659',30.14708,-94.38847,'RETAIL');
INSERT INTO BRANCHES VALUES('Nixon Branch','78140',29.29947,-97.76736,'RETAIL');
INSERT INTO BRANCHES VALUES('Alice Branch','78332',27.75495,-98.05881,'RETAIL');
INSERT INTO BRANCHES VALUES('Anson Branch','79601',32.74837,-99.89681,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Manvel Branch','77578',29.54028,-95.38673,'RETAIL');
INSERT INTO BRANCHES VALUES('Marlin Branch','76661',31.30914,-96.87926,'RETAIL');
INSERT INTO BRANCHES VALUES('Levelland Branch','79336',33.58844,-102.38274,'RETAIL');
INSERT INTO BRANCHES VALUES('Buda Branch','78610',30.08571,-97.82003,'RETAIL');
INSERT INTO BRANCHES VALUES('Stafford Branch','77477',29.64631,-95.57441,'RETAIL');
INSERT INTO BRANCHES VALUES('Madisonville Branch','77864',30.96249,-95.87933,'RETAIL');
INSERT INTO BRANCHES VALUES('Schulenburg Branch','78956',29.69367,-96.90506,'RETAIL');
INSERT INTO BRANCHES VALUES('Lufkin Branch-2','75901',31.34264,-94.69127,'RETAIL');
INSERT INTO BRANCHES VALUES('Edna Branch-2','77957',28.96753,-96.6678,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Gordon Branch','76453',32.54932,-98.37008,'RETAIL');
INSERT INTO BRANCHES VALUES('Houston Branch-4','77024',29.78386,-95.55237,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Nacogdoches Branch','75964',31.61312,-94.65307,'RETAIL');
INSERT INTO BRANCHES VALUES('San Antonio Branch-4','78224',29.34856,-98.53987,'RETAIL');
INSERT INTO BRANCHES VALUES('North Richland Hills Branch','76180',32.84109,-97.22351,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Plano Branch-2','75093',33.01631,-96.77654,'RETAIL');
INSERT INTO BRANCHES VALUES('Bowie Branch-2','76230',33.53709,-97.87829,'RETAIL');
INSERT INTO BRANCHES VALUES('Perryton Branch','79070',36.39554,-100.80268,'RETAIL');
INSERT INTO BRANCHES VALUES('Gilmer Branch','75644',32.75561,-94.98716,'RETAIL');
INSERT INTO BRANCHES VALUES('Kingsville Branch-2','78364',27.51574,-97.85543,'RETAIL');
INSERT INTO BRANCHES VALUES('Jasper Branch','75951',30.94009,-93.99693,'RETAIL');
INSERT INTO BRANCHES VALUES('Dallas Branch-1','75247',32.80804,-96.88519,'RETAIL');
INSERT INTO BRANCHES VALUES('Plano Branch-1','75093',33.01631,-96.77654,'RETAIL');
INSERT INTO BRANCHES VALUES('Angleton Branch','77515',29.16828,-95.4472,'RETAIL');
INSERT INTO BRANCHES VALUES('Gruver Branch','79040',36.30556,-101.49286,'RETAIL');
INSERT INTO BRANCHES VALUES('Pleasanton Branch','78064',28.95839,-98.48412,'RETAIL');
INSERT INTO BRANCHES VALUES('El Campo Branch','77437',29.21313,-96.28317,'RETAIL');
INSERT INTO BRANCHES VALUES('Frankston Branch','75763',32.05138,-95.50602,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Ennis Branch','75120',32.32955,-96.6237,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Clifton Branch','76634',31.82186,-97.50742,'RETAIL');
INSERT INTO BRANCHES VALUES('Edinburg Branch','78539',26.30616,-98.19573,'RETAIL');
INSERT INTO BRANCHES VALUES('Austin Branch-3','78759',30.41233,-97.74605,'RETAIL');
INSERT INTO BRANCHES VALUES('Devine Branch','78016',29.14836,-98.87534,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Andrews Branch','79714',32.3428,-102.5541,'RETAIL');
INSERT INTO BRANCHES VALUES('Hillsboro Branch','76645',31.97179,-97.12218,'RETAIL');
INSERT INTO BRANCHES VALUES('Galveston Branch','77554',29.28684,-94.85711,'RETAIL');
INSERT INTO BRANCHES VALUES('Manor Branch','78653',30.22456,-97.95029,'RETAIL');
INSERT INTO BRANCHES VALUES('Sherman Branch-2','75091',33.66046,-96.60687,'RETAIL');
INSERT INTO BRANCHES VALUES('Dalhart Branch-1','79022',36.10865,-102.55245,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Farmersville Branch','75442',33.1661,-96.35521,'RETAIL');
INSERT INTO BRANCHES VALUES('Caldwell Branch','77836',30.52876,-96.67828,'RETAIL');
INSERT INTO BRANCHES VALUES('Big Spring Branch-2','79720',32.24941,-101.48127,'RETAIL');
INSERT INTO BRANCHES VALUES('Stephenville Branch','76401',32.20144,-98.24628,'RETAIL');
INSERT INTO BRANCHES VALUES('San Angelo Branch-2','76902',31.46196,-100.44465,'RETAIL');
INSERT INTO BRANCHES VALUES('Dickinson Branch','77539',29.46108,-95.05394,'RETAIL');
INSERT INTO BRANCHES VALUES('Midland Branch','79704',31.97118,-102.12296,'RETAIL');
INSERT INTO BRANCHES VALUES('Sherman Branch-1','75090',33.62946,-96.58004,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Victoria Branch-2','77904',28.83684,-97.00175,'RETAIL');
INSERT INTO BRANCHES VALUES('Gonzales Branch','78629',29.50051,-97.46726,'WHOLESALE');
INSERT INTO BRANCHES VALUES('Kilgore Branch','75662',32.39171,-94.87641,'WHOLESALE');
INSERT INTO BRANCHES VALUES('West Branch','76691',31.79749,-97.10157,'RETAIL');
INSERT INTO BRANCHES VALUES('Del Rio Branch','78840',29.37022,-100.86395,'RETAIL');

任务 2:从坐标创建几何形状

可以使用 SQL 填充几何,例如,本例通过基于纬度和经度列指定点几何的坐标。

添加几何形状列:

ALTER TABLE WAREHOUSES ADD (
 GEOMETRY SDO_GEOMETRY
);

ALTER TABLE BRANCHES ADD (
   GEOMETRY SDO_GEOMETRY
);

发布几何形状列:

UPDATE WAREHOUSES
SET
    GEOMETRY = SDO_GEOMETRY(
        2001, 4326, SDO_POINT_TYPE(
            LON, LAT, NULL
        ), NULL, NULL
    );
 UPDATE BRANCHES
 SET
    GEOMETRY = SDO_GEOMETRY(
        2001, 4326, SDO_POINT_TYPE(
            LON, LAT, NULL
        ), NULL, NULL
    );

任务 3:创建带多边形的表

可以以相同的方式创建线和多边形。 虽然点几何需要一个坐标,但线和多边形需要定义几何形状的所有坐标。 在这种情况下,我们创建一个表来存储一个多边形。

CREATE TABLE COASTAL_ZONE (
    ZONE_ID   NUMBER,
    GEOMETRY  SDO_GEOMETRY
);       

INSERT INTO COASTAL_ZONE VALUES (
    1,
    SDO_GEOMETRY(
        2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(
            1, 1003, 1
        ), SDO_ORDINATE_ARRAY(
            -93.719934, 30.210638,
            -95.422592, 29.773714, 
            -95.059698, 29.322204, 
            -96.013892, 28.787021, 
            -96.660964, 28.925638, 
            -97.528688, 28.042050, 
            -97.858501, 27.447461, 
            -97.497364, 25.880056, 
            -96.977826, 25.969716, 
            -97.211445, 27.054605, 
            -96.870226, 27.816077, 
            -93.794290, 29.535729, 
            -93.719934, 30.210638
        )
    )
);

任务 4:添加空间元数据和索引

Oracle 数据库为高性能空间操作提供原生空间索引。 我们的样本数据非常小,实际上可能不需要空间索引。 但是,我们仍执行以下步骤,因为它们对于典型的生产数据量很重要。 空间索引需要一行用于被索引的几何的元数据。 我们创建此元数据,然后创建空间索引。

-- 添加元数据
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
   'WAREHOUSES',
   'GEOMETRY',
   SDO_DIM_ARRAY(
       SDO_DIM_ELEMENT(
           'x', -180, 180, 0.05
       ), SDO_DIM_ELEMENT(
           'y', -90, 90, 0.05
       )
   ),
   4326
   );

   INSERT INTO USER_SDO_GEOM_METADATA VALUES (
   'BRANCHES',
   'GEOMETRY',
   SDO_DIM_ARRAY(
       SDO_DIM_ELEMENT(
           'x', -180, 180, 0.05
       ), SDO_DIM_ELEMENT(
           'y', -90, 90, 0.05
       )
   ),
   4326
   );

   INSERT INTO USER_SDO_GEOM_METADATA VALUES (
   'COASTAL_ZONE',
   'GEOMETRY',
   SDO_DIM_ARRAY(
       SDO_DIM_ELEMENT(
           'x', -180, 180, 0.05
       ), SDO_DIM_ELEMENT(
           'y', -90, 90, 0.05
       )
   ),
   4326
   );
-- 创建索引
CREATE INDEX WAREHOUSES_SIDX ON
    WAREHOUSES (
        GEOMETRY
    )
        INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX BRANCHES_SIDX ON
    BRANCHES (
        GEOMETRY
    )
        INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX COASTAL_ZONE_SIDX ON
    COASTAL_ZONE (
        GEOMETRY
    )
        INDEXTYPE IS MDSYS.SPATIAL_INDEX;

创建索引后,刷新表列表。 您将看到 3 个名称以 MDRT_ 开头的表。 这些是空间索引的产物,由 Oracle 数据库自动管理。 您不要手动操作这些表。

我们的示例数据现在已准备好,可以开始进行空间查询。

如果您需要还原此实验室并删除创建的项目,请运行以下命令:

DROP TABLE BRANCHES;   
DROP TABLE WAREHOUSES;
DROP TABLE COASTAL_ZONE;
DELETE FROM USER_SDO_GEOM_METADATA;
COMMIT;

学到更多

实验 4:运行空间查询

本实验将引导您完成 Oracle 数据库中的基本空间查询。 您将使用在上一个实验室中创建的示例数据来根据接近度和包含来识别项目。约15分钟。

Oracle 数据库包括用于空间分析的强大的函数和运算符库。 这包括空间关系、测量、聚合、转换等等。 这些操作可通过本机 SQL、PL/SQL、Java API 以及与 Oracle 数据库通信的任何其他语言进行访问。

在本实验中,您将:

  • 识别与 WAREHOUSE 具有邻近关系的 BRANCHES
  • 识别与 COASTAL_ZONE 具有包含和邻近关系的 BRANCHES

空间查询

Oracle 数据库中的空间查询与您习惯的任何其他传统查询一样。 唯一的区别是一组对您来说可能是新的空间函数和运算符。

确定离达拉斯仓库最近的 5 个分店:

SELECT
    BRANCH_NAME,
    BRANCH_TYPE
FROM
    BRANCHES    B,
    WAREHOUSES  W
WHERE
    W.WAREHOUSE_NAME = 'Dallas Warehouse'
    AND SDO_NN(
        B.GEOMETRY, W.GEOMETRY, 'sdo_num_res=5'
    ) = 'TRUE';

BRANCH_NAME                 BRANCH_TYPE 
--------------------------- ----------- 
Decatur Branch              RETAIL      
Lewisville Branch           RETAIL      
Denton Branch               RETAIL      
Arlington Branch-2          RETAIL      
North Richland Hills Branch WHOLESALE   

说明:

  • SDO_NN 使用空间索引来识别几何形状的最近邻居(NN表示Nearest Neighbour),第一个参数(上例中的 B.GEOMETRY)是要搜索的列,即搜索结果。第二个参数(上例中的 W.GEOMETRY)是您想要找到最近的邻居的位置,即中心位置。第三个参数表示行为,sdo_num_res=5表示返回的结果数量(number of results)为5。不应假设返回结果的顺序。例如,不能保证返回的第一行是最接近的。如果两个或更多分支与仓库的距离相等,则任何一个都可能在随后调用 SDO_NN 时返回。
  • 使用 SDO_NUM_RES 参数时,WHERE 子句中不使用其他条件。 SDO_NUM_RES 只考虑接近度。例如,如果您向 WHERE 子句添加了一个条件,因为您希望五个最近的分支具有特定的邮政编码,并且五个最近的分支中有四个具有不同的邮政编码,那么上面的查询将返回一行。此行为特定于 SDO_NUM_RES 参数。在下面的查询中,您将为附加查询条件的场景使用替代参数。

确定距离达拉斯仓库最近的 5 个分店,并显示距离:

SELECT
    BRANCH_NAME,
    BRANCH_TYPE,
    ROUND(
        SDO_NN_DISTANCE(
            1
        ), 2
    ) DISTANCE_KM
FROM
    BRANCHES    B,
    WAREHOUSES  W
WHERE
    W.WAREHOUSE_NAME = 'Dallas Warehouse'
    AND SDO_NN(
        B.GEOMETRY, W.GEOMETRY, 'sdo_num_res=5 unit=km', 1
    ) = 'TRUE'
ORDER BY
    DISTANCE_KM;

BRANCH_NAME                 BRANCH_TYPE DISTANCE_KM 
--------------------------- ----------- ----------- 
North Richland Hills Branch WHOLESALE          22.4 
Denton Branch               RETAIL            25.13 
Lewisville Branch           RETAIL            28.71 
Decatur Branch              RETAIL             32.7 
Arlington Branch-2          RETAIL            38.05 

说明:

  • SDO_NN_DISTANCE 算子是 SDO_NN 算子的辅助算子; 它只能在 SDO_NN 运算符中使用。 此运算符的参数是一个与指定为 SDO_NN 的最后一个参数的数字匹配的数字; 在这个例子中它是 1。这个参数没有隐藏的含义,它只是一个标签。 如果指定了 SDO_NN_DISTANCE(),您可以按距离对结果进行排序,并保证返回的第一行是最近的。 如果您要查询的数据存储为经度和纬度,则 SDO_NN_DISTANCE 的默认单位是米。
  • SDO_NN 运算符还有一个 UNIT 参数,用于确定 SDO_NN_DISTANCE 返回的测量单位。
  • ORDER BY DISTANCE 子句确保按顺序返回距离,最短距离在前。

确定距离达拉斯仓库最近的 5 个批发分店:

SELECT
    BRANCH_NAME,
    BRANCH_TYPE,
    ROUND(
        SDO_NN_DISTANCE(
            1
        ), 2
    ) DISTANCE_KM
FROM
    BRANCHES    B,
    WAREHOUSES  W
WHERE
    W.WAREHOUSE_NAME = 'Dallas Warehouse'
    AND B.BRANCH_TYPE = 'WHOLESALE'
    AND SDO_NN(
        B.GEOMETRY, W.GEOMETRY, 'sdo_batch_size=5 unit=km', 1
    ) = 'TRUE'
    AND ROWNUM <= 5
ORDER BY
    DISTANCE_KM;

BRANCH_NAME                 BRANCH_TYPE DISTANCE_KM 
--------------------------- ----------- ----------- 
North Richland Hills Branch WHOLESALE          22.4 
Fordt Worth Branch          WHOLESALE         40.73 
Cleburne Branch             WHOLESALE         67.43 
Mesquite Branch             WHOLESALE         68.99 
Muenster Branch             WHOLESALE         71.48 

说明:

  • SDO_BATCH_SIZE 是一个可调参数,它可能会影响查询的性能。 SDO_NN 在内部一次计算该距离数。 返回的初始批次的行可能不满足 WHERE 子句中的约束,因此会不断返回 SDO_BATCH_SIZE 指定的行数,直到满足 WHERE 子句中的所有约束。 您应该选择一个 SDO_BATCH_SIZE,它最初返回可能满足 WHERE 子句中的约束的行数。
  • B.BRANCH_TYPE = ‘WHOLESALE’ AND ROWNUM <= 5 是 WHERE 子句中的附加约束。 rownum 子句对于将返回的结果数限制为 5 是必要的。

识别休斯顿仓库 50 公里范围内的分支机构

SELECT
    B.BRANCH_NAME,
    B.BRANCH_TYPE
FROM
    BRANCHES    B,
    WAREHOUSES  W
WHERE
    W.WAREHOUSE_NAME = 'Houston Warehouse'
    AND SDO_WITHIN_DISTANCE(
        B.GEOMETRY, W.GEOMETRY, 'distance=50 unit=km'
    ) = 'TRUE';

BRANCH_NAME      BRANCH_TYPE 
---------------- ----------- 
Houston Branch-2 RETAIL      
Houston Branch-1 WHOLESALE   
Houston Branch-6 WHOLESALE   
Houston Branch-7 RETAIL      
Houston Branch-4 WHOLESALE   
Baytown Branch   WHOLESALE   
Houston Branch-3 RETAIL      
Crosby Branch    RETAIL      
Humble Branch    RETAIL      
Tomball Branch   RETAIL      
Pasadena Branch  WHOLESALE   
11 rows selected.

说明:

  • SDO_WITHIN_DISTANCE 的第一个参数是要搜索的列。 第二个参数是您要确定距离的位置。 不应假设返回结果的顺序。 例如,返回的第一行不保证是离仓库 3 最近的客户。
  • SDO_WITHIN_DISTANCE 运算符中使用的 DISTANCE 参数指定距离值; 在本例中为 50。
  • SDO_WITHIN_DISTANCE 运算符中使用的 UNIT 参数指定 DISTANCE 参数的测量单位。 默认单位是与数据关联的度量单位。 对于经纬度数据,默认为米; 在这个例子中,它是英里。

识别距离休斯顿仓库 50 公里范围内的分支机构,并显示距离

SELECT
    B.BRANCH_NAME,
    B.BRANCH_TYPE,
    ROUND(
        SDO_GEOM.SDO_DISTANCE(
            B.GEOMETRY, W.GEOMETRY, 0.05, 'unit=km'
        ), 2
    ) AS DISTANCE_KM
FROM
    BRANCHES    B,
    WAREHOUSES  W
WHERE
    W.WAREHOUSE_NAME = 'Houston Warehouse'
    AND SDO_WITHIN_DISTANCE(
        B.GEOMETRY, W.GEOMETRY, 'distance=50 unit=km'
    ) = 'TRUE'
ORDER BY
    DISTANCE_KM;

BRANCH_NAME      BRANCH_TYPE DISTANCE_KM 
---------------- ----------- ----------- 
Humble Branch    RETAIL             9.39 
Tomball Branch   RETAIL            27.08 
Crosby Branch    RETAIL            31.75 
Houston Branch-3 RETAIL            32.14 
Houston Branch-4 WHOLESALE         38.92 
Houston Branch-7 RETAIL            42.56 
Baytown Branch   WHOLESALE         42.91 
Houston Branch-2 RETAIL            44.56 
Houston Branch-6 WHOLESALE         44.65 
Houston Branch-1 WHOLESALE         44.65 
Pasadena Branch  WHOLESALE         49.39 

11 rows selected.

说明:

  • SDO_GEOM.SDO_DISTANCE 函数计算分支位置和休斯顿仓库之间的距离。
  • SDO_GEOM.SDO_DISTANCE 的前 2 个参数是用于计算距离的 BRANCH 和 WAREHOUSE 位置。
  • SDO_GEOM.SDO_DISTANCE 的第三个参数是公差值。 容差是 Oracle Spatial 使用的舍入误差值。 经度和纬度数据的容差以米为单位。 在本例中,公差为 50 毫米(0.05米)。
  • SDO_GEOM.SDO_DISTANCE 参数中使用的 UNIT 参数指定由 SDO_GEOM.SDO_DISTANCE 函数计算的距离的测量单位。 默认单位是与数据关联的度量单位。 对于经度和纬度数据,默认值为米。 在此示例中,它是英里。
  • ORDER BY DISTANCE_IN_MILES 子句确保按顺序返回距离,最短距离在前,距离以英里为单位。

确定沿海地区的分支机构

SELECT
    B.BRANCH_NAME,
    B.BRANCH_TYPE
FROM
    BRANCHES      B,
    COASTAL_ZONE  C
WHERE
    SDO_ANYINTERACT(
        B.GEOMETRY, C.GEOMETRY
    ) = 'TRUE';

BRANCH_NAME              BRANCH_TYPE 
------------------------ ----------- 
Baytown Branch           WHOLESALE   
Winnie Branch            RETAIL      
Port Arthur Branch       RETAIL      
Orange Branch            RETAIL      
 Corpus Christi Branch-1 RETAIL      
Corpus Christi Branch-3  RETAIL      
Corpus Christi Branch-2  RETAIL      
Portland Branch          RETAIL      
Port Lavaca Branch       RETAIL      
Richwood Branch          RETAIL      
Galvston Branch          WHOLESALE   
Galveston Branch         RETAIL      
Texas City Branch        WHOLESALE   
Dickinson Branch         RETAIL      
Houston Branch-5         RETAIL      
Pasadena Branch          WHOLESALE   

16 rows selected.

说明:

  • SDO_ANYINTERACT 运算符接受 2 个参数,geometry1 和 geometry2。 对于geometry1 在geometry2 内部或边界上的行,运算符返回TRUE。
  • 在此示例中,geometry1 是 B.GEOMETRY,即分支机构的几何形状,geometry2 是 C.GEOMETRY,即海岸带的几何形状。 COASTAL_ZONE 表只有 1 行,因此不需要其他条件。

确定沿海地区外 10 公里内的分支机构

( SELECT
    B.BRANCH_NAME,
    B.BRANCH_TYPE
FROM
    BRANCHES      B,
    COASTAL_ZONE  C
WHERE
    SDO_WITHIN_DISTANCE(
        B.GEOMETRY, C.GEOMETRY, 'distance=10 unit=km'
    ) = 'TRUE'
)
MINUS
( SELECT
    B.BRANCH_NAME,
    B.BRANCH_TYPE
FROM
    BRANCHES      B,
    COASTAL_ZONE  C
WHERE
    SDO_ANYINTERACT(
        B.GEOMETRY, C.GEOMETRY
    ) = 'TRUE'
);

BRANCH_NAME         BRANCH_TYPE 
------------------- ----------- 
Alvin Branch-1      RETAIL      
Alvin Branch-2      RETAIL      
Angleton Branch     RETAIL      
Beaumont Branch-1   RETAIL      
Beaumont Branch-2   RETAIL      
Crosby Branch       RETAIL      
Edna Branch-1       RETAIL      
Edna Branch-2       WHOLESALE   
Houston Branch-1    WHOLESALE   
Houston Branch-2    RETAIL      
Houston Branch-6    WHOLESALE   
Houston Branch-7    RETAIL      
Kingsville Branch-1 RETAIL      
Kingsville Branch-2 RETAIL      

14 rows selected.

说明:

  • 在此查询的第一部分,SDO_WITHIN_DISTANCE 运算符识别 COASTAL_ZONE 10 公里内的分支机构。 这包括 COASTAL_ZONE 内的分支机构。
  • 该查询使用 MINUS 删除 COASTAL_ZONE 内的分支机构,只留下 10 公里内和 COASTAL_ZONE 外的 分支机构。

学到更多

原网站

版权声明
本文为[dingdingfish]所创,转载请带上原文链接,感谢
https://xiaoyu.blog.csdn.net/article/details/125052009