PK  ;Aoa,mimetypeapplication/epub+zipPK ;AiTunesMetadata.plistg artistName Oracle Corporation book-info cover-image-hash 967903605 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 629017321 publisher-unique-id E11831-04 unique-id 457951296 genre Oracle Documentation itemName Oracle® Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2) releaseDate 2011-07-29T23:03:51Z year 2011 PK2lgPK ;AMETA-INF/container.xml PKYuPK ;AOEBPS/cover.htmO Cover

Oracle Corporation

PK[pTOPK ;AOEBPS/title.htm, Oracle Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2)

Oracle® Spatial

Topology and Network Data Models Developer's Guide

11g Release 2 (11.2)

E11831-04

August 2011

Provides usage and reference information about the topology data model and network data model capabilities of Oracle Spatial.


Oracle Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2)

E11831-04

Copyright © 2003, 2011, Oracle and/or its affiliates. All rights reserved.

Primary Author:  Chuck Murray

Contributors:  Ning An, Betsy George, Huiling Gong, Siva Ravada, Jack Wang

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

PKPK ;AOEBPS/sdo_net_ref.htm SDO_NET Package Subprograms

6 SDO_NET Package Subprograms

The MDSYS.SDO_NET package contains subprograms (functions and procedures) for managing networks. To use the subprograms in this chapter, you must understand the conceptual information in Chapter 5.

For a listing of the subprograms grouped in logical categories, see Section 5.11.1. The rest of this chapter provides reference information about the subprograms, listed in alphabetical order.


SDO_NET.COMPUTE_PATH_GEOMETRY

Format

SDO_NET.COMPUTE_PATH_GEOMETRY(

     network IN VARCHAR2,

     path_id IN NUMBER,

     tolerance IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the spatial geometry for a path.

Parameters

network

Network name.

path_id

Path ID number.

tolerance

Tolerance value associated with geometries in the network. (Tolerance is explained in Chapter 1 of Oracle Spatial Developer's Guide.) This value should be consistent with the tolerance values of the geometries in the link table and node table for the network.

Usage Notes

This function computes and returns the SDO_GEOMETRY object for the specified path.

This function and the SDO_NET_MEM.PATH.COMPUTE_GEOMETRY procedure (documented in Chapter 6) both compute a path geometry, but they have the following differences:

Examples

The following example computes and returns the spatial geometry of the path with path ID 1 in the network named SDO_NET1, using a tolerance value of 0.005. The returned path geometry is a straight line from (1,1) to (15,1) because this path consists of a single link.

SELECT SDO_NET.COMPUTE_PATH_GEOMETRY('SDO_NET1', 1, 0.005) FROM DUAL;
 
SDO_NET.COMPUTE_PATH_GEOMETRY('SDO_NET1',1,0.005)(SDO_GTYPE, SDO_SRID, SDO_POINT
--------------------------------------------------------------------------------
SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
1, 1, 15, 1))

SDO_NET.COPY_NETWORK

Format

SDO_NET.COPY_NETWORK(

     source_network IN VARCHAR2,

     target_network IN VARCHAR2,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a copy of a network, including its metadata tables.

Parameters

source_network

Name of the network to be copied.

target_network

Name of the network to be created as a copy of source_network.

storage_parameters

Physical storage parameters used internally to create network tables. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure creates an entry in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1) for target_network that has the same information as for source_network, except for the new network name.

This procedure also creates a new node table, link table, and path table (if a path table exists for source_network) for target_network based on the metadata and data in these tables for source_network. These tables have names in the form <target-network>_NODE$, <target-network>_LINK$, and <target-network>_PATH$. For example, if target_network has the value ROADS_NETWORK2 and if source_network has a path table, the names of the created metadata tables are ROADS_NETWORK2_NODE$, ROADS_NETWORK2_LINK$, and ROADS_NETWORK2_PATH$.

Examples

The following example creates a new network named ROADS_NETWORK2 that is a copy of the network named ROADS_NETWORK.

EXECUTE SDO_NET.COPY_NETWORK('ROADS_NETWORK', 'ROADS_NETWORK2');

SDO_NET.CREATE_LINK_TABLE

Format

SDO_NET.CREATE_LINK_TABLE(

     table_name IN VARCHAR2,

     geom_type IN VARCHAR2,

     geom_column IN VARCHAR2,

     cost_column IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     add_bidirected_column IN BOOLEAN DEFALT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a link table for a network.

Parameters

table_name

Name of the link table.

geom_type

For a spatial network, specify a value indicating the geometry type of links: SDO_GEOMETRY for non-LRS SDO_GEOMETRY objects, LRS_GEOMETRY for LRS SDO_GEOMETRY objects, or TOPO_GEOMETRY for SDO_TOPO_GEOMETRY objects.

geom_column

For a spatial network, the name of the column containing the geometry objects associated with the links.

cost_column

Name of the column containing the cost values to be associated with the links.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

add_bidirected_column

TRUE adds a column named BIDIRECTED to the link table; FALSE (the default) does not add a column named BIDIRECTED to the link table.

storage_parameters

Physical storage parameters used internally to create the link table. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

The link table is described in Section 5.9.2.

Examples

The following example creates a link table named ROADS_LINKS, with a geometry column named LINK_GEOMETRY that will contain LRS geometries, a cost column named COST, and a single hierarchy level.

EXECUTE SDO_NET.CREATE_LINK_TABLE('ROADS_LINKS', 'LRS_GEOMETRY', 'LINK_GEOMETRY', 'COST', 1);

SDO_NET.CREATE_LOGICAL_NETWORK

Format

SDO_NET.CREATE_LOGICAL_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_with_cost IN BOOLEAN DEFAULT FALSE,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_LOGICAL_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_table_name IN VARCHAR2,

     node_cost_column IN VARCHAR2,

     link_table_name IN VARCHAR2,

     link_cost_column IN VARCHAR2,

     path_table_name IN VARCHAR2,

     path_link_table_name IN VARCHAR2,

     subpath_table_name IN VARCHAR2,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a logical network, creates all necessary tables, and updates the network metadata.

Parameters

network

Network name.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A Boolean value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

node_with_cost

A Boolean value. TRUE causes a column named COST to be included in the <network-name>_NODE$ table; FALSE (the default) causes a column named COST not to be included in the <network-name>_NODE$ table.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, a node table named <network-name>_NODE$ is created.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, the geometry column is named COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, a link table named <network-name>_LINK$ is created.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, the geometry column is named COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, a path table named <network-name>_PATH$ is created.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If you use the format that does not specify this parameter, a path-link table named <network-name>_PLINK$ is created.

subpath_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.)

is_complex

Reserved for future use. Ignored for the current release.

storage_parameters

Physical storage parameters used internally to create network tables. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure provides a convenient way to create a logical network when the node, link, and optional related tables do not already exist. The procedure creates the network; creates the node, link, path, and path-link tables for the network; and inserts the appropriate information in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

An exception is generated if any of the tables to be created already exists.

The procedure has two formats. The simpler format creates the tables using default values for the table name and the cost column name. The other format lets you specify names for the tables and the cost column.

As an alternative to using this procedure, you can create the network using the SDO_NET.CREATE_LOGICAL_NETWORK procedure; create the tables using the SDO_NET.CREATE_NODE_TABLE, SDO_NET.CREATE_LINK_TABLE, SDO_NET.CREATE_PATH_TABLE, and SDO_NET.CREATE_PATH_LINK_TABLE procedures; and insert the appropriate row in the USER_SDO_NETWORK_METADATA view.

Examples

The following example creates a directed logical network named LOG_NET1. The example creates the LOG_NET1_NODE$, LOG_NET1_LINK$,LOG_NET1_PATH$, and LOG_NET1_PLINK$ tables, and updates the xxx_SDO_NETWORK_METADATA views. Both the node and link tables contain a cost column named COST.

EXECUTE SDO_NET.CREATE_LOGICAL_NETWORK('LOG_NET1', 1, TRUE, TRUE);

SDO_NET.CREATE_LRS_NETWORK

Format

SDO_NET.CREATE_LRS_NETWORK(

     network IN VARCHAR2,

     lrs_table_name IN VARCHAR2,

     lrs_geom_column IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_with_cost IN BOOLEAN DEFAULT FALSE,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_LRS_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_table_name IN VARCHAR2,

     node_cost_column IN VARCHAR2,

     link_table_name IN VARCHAR2,

     link_cost_column IN VARCHAR2,

     lrs_table_name IN VARCHAR2,

     lrs_geom_column IN VARCHAR2,

     path_table_name IN VARCHAR2,

     path_geom_column IN VARCHAR2,

     path_link_table_name IN VARCHAR2,

     subpath_table_name IN VARCHAR2,

     subpath_geom_column IN VARCHAR2,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a spatial network containing LRS SDO_GEOMETRY objects, creates all necessary tables, and updates the network metadata.

Parameters

network

Network name.

lrs_table_name

Name of the table containing the LRS geometry column.

lrs_geom_column

Name of the column in lrs_table_name that contains LRS geometries (that is, SDO_GEOMETRY objects that include measure information for linear referencing).

is_directed

A Boolean value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

node_with_cost

A Boolean value. TRUE causes a column named COST to be included in the <network-name>_NODE$ table; FALSE (the default) causes a column named COST not to be included in the <network-name>_NODE$ table.

is_complex

Reserved for future use. Ignored for the current release.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, a node table named <network-name>_NODE$ is created.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, the geometry column is named COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, a link table named <network-name>_LINK$ is created.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, the geometry column is named COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, a path table named <network-name>_PATH$ is created.

path_geom_column

Name of the geometry column in the path table. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, the geometry column is named GEOMETRY.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If you use the format that does not specify this parameter, a path-link table named <network-name>_PLINK$ is created.

subpath_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.).

subpath_geom_column

Name of the geometry column in the subpath table. (The subpath table is explained in Section 5.9.5.)

storage_parameters

Physical storage parameters used internally to create network tables. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure provides a convenient way to create a spatial network of LRS geometries when the node, link, and optional related tables do not already exist. The procedure creates the network; creates the node, link, path, and path-link tables for the network; and inserts the appropriate information in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

An exception is generated if any of the tables to be created already exists.

The procedure has two formats. The simpler format creates the tables using default values for the table name and the geometry and cost column names. The other format lets you specify names for the tables and the geometry and cost columns.

As an alternative to using this procedure, you can create the network using the SDO_NET.CREATE_LRS_NETWORK procedure; create the tables using the SDO_NET.CREATE_NODE_TABLE, SDO_NET.CREATE_LINK_TABLE, SDO_NET.CREATE_PATH_TABLE, and SDO_NET.CREATE_PATH_LINK_TABLE procedures; and insert the appropriate row in the USER_SDO_NETWORK_METADATA view.

Examples

The following example creates a directed spatial network named LRS_NET1. The LRS geometries are in the column named LRS_GEOM in the table named LRS_TAB. The example creates the LRS_NET1_NODE$, LRS_NET1_LINK$, LRS_NET1_PATH$, and LRS_NET1_PLINK$ tables, and updates the xxx_SDO_NETWORK_METADATA views. All geometry columns are named GEOMETRY. Both the node and link tables contain a cost column named COST.

EXECUTE SDO_NET.CREATE_LRS_NETWORK('LRS_NET1', 'LRS_TAB', 'LRS_GEOM', 1, TRUE, TRUE);

SDO_NET.CREATE_LRS_TABLE

Format

SDO_NET.CREATE_LRS_TABLE(

     table_name IN VARCHAR2,

     geom_column IN VARCHAR2,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a table for storing Oracle Spatial linear referencing system (LRS) geometries.

Parameters

table_name

Name of the table containing the geometry column specified in geom_column.

geom_column

Name of the column (of type SDO_GEOMETRY) to contain geometry objects.

storage_parameters

Physical storage parameters used internally to create the LRS table. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure creates a table named table_name with two columns: GEOM_ID of type NUMBER and geom_column of type SDO_GEOMETRY.

Although the created table does not need to be used to store LRS geometries, the procedure is intended as a convenient method for creating a table to store such geometries. You will probably want to modify the table to add other columns before you store data in the table.

Examples

The following example creates a table named HIGHWAYS with a geometry column named GEOM.

EXECUTE SDO_NET.CREATE_LRS_TABLE('HIGHWAYS', 'GEOM');
 
PL/SQL procedure successfully completed.
 
DESCRIBE highways
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GEOM_ID                                   NOT NULL NUMBER
 GEOM                                               MDSYS.SDO_GEOMETRY

SDO_NET.CREATE_NODE_TABLE

Format

SDO_NET.CREATE_NODE_TABLE(

     table_name IN VARCHAR2,

     geom_type IN VARCHAR2,

     geom_column IN VARCHAR2,

     cost_column IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_NODE_TABLE(

     table_name IN VARCHAR2,

     geom_type IN VARCHAR2,

     geom_column IN VARCHAR2,

     cost_column IN VARCHAR2,

     partition_column IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a node table.

Parameters

table_name

Name of the node table.

geom_type

For a spatial network, specify a value indicating the geometry type of nodes: SDO_GEOMETRY for non-LRS SDO_GEOMETRY objects, LRS_GEOMETRY for LRS SDO_GEOMETRY objects, or TOPO_GEOMETRY for SDO_TOPO_GEOMETRY objects.

geom_column

For a spatial network, the name of the column containing the geometry objects associated with the nodes.

cost_column

Name of the column containing the cost values to be associated with the nodes.

partition_column

Name of the column containing the partition ID values to be associated with the nodes.

no_of_hierarchy_levels

Number of hierarchy levels for nodes in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_complex

Reserved for future use. Ignored for the current release.

storage_parameters

Physical storage parameters used internally to create the <network-name>_NODE$ table (described in Section 5.9.1). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure has two formats, one without the partition_column parameter and one with the partition_column parameter.

The node table is described in Section 5.9.1.

Examples

The following example creates a node table named ROADS_NODES with a geometry column named NODE_GEOMETRY that will contain LRS geometries, no cost column, and a single hierarchy level.

EXECUTE SDO_NET.CREATE_NODE_TABLE('ROADS_NODES', 'LRS_GEOMETRY', 'NODE_GEOMETRY', NULL, 1);

SDO_NET.CREATE_PARTITION_TABLE

Format

SDO_NET.CREATE_PARTITION_TABLE(

     table_name IN VARCHAR2);

Description

Creates a partition table.

Parameters

table_name

Name of the partition table.

Usage Notes

The partition table is described in Section 5.9.6.

For information about using partitioned networks to perform analysis using the load on demand approach, see Section 5.7.

Examples

The following example creates a partition table named MY_PART_TAB.

EXECUTE SDO_NET.CREATE_PARTITION_TABLE('MY_PART_TAB');

SDO_NET.CREATE_PATH_LINK_TABLE

Format

SDO_NET.CREATE_PATH_LINK_TABLE(

     table_name IN VARCHAR2,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a path-link table, that is, a table with a row for each link in each path in the path table.

Parameters

table_name

Name of the path-link table.

storage_parameters

Physical storage parameters used internally to create the path-link table. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

The path-link table is described in Section 5.9.4.

To use paths with a network, you must populate the path-link table.

Examples

The following example creates a path-link table named ROADS_PATHS_LINKS.

EXECUTE SDO_NET.CREATE_PATH_LINK_TABLE('ROADS_PATHS_LINKS');

SDO_NET.CREATE_PATH_TABLE

Format

SDO_NET.CREATE_PATH_TABLE(

     table_name IN VARCHAR2,

     geom_column IN VARCHAR2,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a path table.

Parameters

table_name

Name of the path table.

geom_column

For a spatial network, name of the column containing the geometry objects associated with the paths.

storage_parameters

Physical storage parameters used internally to create the path table. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

The path table is described in Section 5.9.3.

To use paths with a network, after you create the path table, you must create the path-link table using the SDO_NET.CREATE_PATH_LINK_TABLE procedure, and populate the path-link table.

Examples

The following example creates a path table named ROADS_PATHS that contains a geometry column named PATH_GEOMETRY.

EXECUTE SDO_NET.CREATE_PATH_TABLE('ROADS_PATHS', 'PATH_GEOMETRY');

SDO_NET.CREATE_SDO_NETWORK

Format

SDO_NET.CREATE_SDO_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_with_cost IN BOOLEAN DEFAULT FALSE,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_SDO_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_table_name IN VARCHAR2,

     node_geom_column IN VARCHAR2,

     node_cost_column IN VARCHAR2,

     link_table_name IN VARCHAR2,

     link_geom_column IN VARCHAR2,

     link_cost_column IN VARCHAR2,

     path_table_name IN VARCHAR2,

     path_geom_column IN VARCHAR2,

     path_link_table_name IN VARCHAR2,

     subpath_table_name IN VARCHAR2,

     subpath_geom_column IN VARCHAR2,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a spatial network containing non-LRS SDO_GEOMETRY objects, creates all necessary tables, and updates the network metadata.

Parameters

network

Network name.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A Boolean value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

node_with_cost

A Boolean value. TRUE causes a column named COST to be included in the <network-name>_NODE$ table; FALSE (the default) causes a column named COST not to be included in the <network-name>_NODE$ table.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, a node table named <network-name>_NODE$ is created.

node_geom_column

Name of the geometry column in the node table. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, the geometry column is named GEOMETRY.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, the geometry column is named COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, a link table named <network-name>_LINK$ is created.

link_geom_column

Name of the geometry column in the link table. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, the geometry column is named GEOMETRY.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, the geometry column is named COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, a path table named <network-name>_PATH$ is created.

path_geom_column

Name of the geometry column in the path table. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, the geometry column is named GEOMETRY.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If you use the format that does not specify this parameter, a path-link table named <network-name>_PLINK$ is created.

subpath_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.)

subpath_geom_column

Name of the geometry column in the subpath table. (The subpath table is explained in Section 5.9.5.).

is_complex

Reserved for future use. Ignored for the current release.

storage_parameters

Physical storage parameters used internally to create network tables. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure provides a convenient way to create a spatial network when the node, link, and optional related tables do not already exist. The procedure creates the network; creates the node, link, path, and path-link tables for the network; and inserts the appropriate information in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

An exception is generated if any of the tables to be created already exists.

The procedure has two formats. The simpler format creates the tables using default values for the table name and the geometry and cost column names. The other format lets you specify names for the tables and the geometry and cost columns.

As an alternative to using this procedure, you can create the network using the SDO_NET.CREATE_SDO_NETWORK procedure; create the tables using the SDO_NET.CREATE_NODE_TABLE, SDO_NET.CREATE_LINK_TABLE, SDO_NET.CREATE_PATH_TABLE, and SDO_NET.CREATE_PATH_LINK_TABLE procedures; and insert the appropriate row in the USER_SDO_NETWORK_METADATA view.

Examples

The following example creates a directed spatial network named SDO_NET1. The example creates the SDO_NET1_NODE$, SDO_NET1_LINK$, SDO_NET1_PATH$, and SDO_NET1_PLINK$ tables, and updates the xxx_SDO_NETWORK_METADATA views. All geometry columns are named GEOMETRY. Both the node and link tables contain a cost column named COST.

EXECUTE SDO_NET.CREATE_SDO_NETWORK('SDO_NET1', 1, TRUE, TRUE);

SDO_NET.CREATE_SUBPATH_TABLE

Format

SDO_NET.CREATE_PATH_TABLE(

     table_name IN VARCHAR2,

     geom_column IN VARCHAR2,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a subpath table.

Parameters

table_name

Name of the subpath table.

geom_column

For a spatial network, name of the column containing the geometry objects associated with the subpaths.

storage_parameters

Physical storage parameters used internally to create the subpath table (described in Section 5.9.1). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

The subpath table is described in Section 5.9.5.

To use subpaths with a network, you must create one or more path tables and their associated path-link tables.

Examples

The following example creates a subpath table named ROADS_SUBPATHS that contains a geometry column named SUBPATH_GEOMETRY.

EXECUTE SDO_NET.CREATE_SUBPATH_TABLE('ROADS_SUBPATHS', 'SUBPATH_GEOMETRY');

SDO_NET.CREATE_TOPO_NETWORK

Format

SDO_NET.CREATE_TOPO_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_with_cost IN BOOLEAN DEFAULT FALSE,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_TOPO_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_table_name IN VARCHAR2,

     node_cost_column IN VARCHAR2,

     link_table_name IN VARCHAR2,

     link_cost_column IN VARCHAR2,

     path_table_name IN VARCHAR2,

     path_geom_column IN VARCHAR2,

     path_link_table_name IN VARCHAR2,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

or

SDO_NET.CREATE_TOPO_NETWORK(

     network IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN BOOLEAN,

     node_table_name IN VARCHAR2,

     node_geom_column IN VARCHAR2,

     node_cost_column IN VARCHAR2,

     link_table_name IN VARCHAR2,

     link_cost_column IN VARCHAR2,

     path_table_name IN VARCHAR2,

     path_geom_column IN VARCHAR2,

     path_link_table_name IN VARCHAR2,

     subpath_table_name IN VARCHAR2,

     subpath_geom_column IN VARCHAR2,

     is_complex IN BOOLEAN DEFAULT FALSE,

     storage_parameters IN VARCHAR2 DEFAULT NULL);

Description

Creates a spatial topology network containing SDO_TOPO_GEOMETRY objects, creates all necessary tables, and updates the network metadata.

Parameters

network

Network name.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A Boolean value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

node_with_cost

A Boolean value. TRUE causes a column named COST to be included in the <network-name>_NODE$ table; FALSE (the default) causes a column named COST not to be included in the <network-name>_NODE$ table.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, a node table named <network-name>_NODE$ is created.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If you use the format that does not specify this parameter, the geometry column is named COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, a link table named <network-name>_LINK$ is created.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If you use the format that does not specify this parameter, the geometry column is named COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, a path table named <network-name>_PATH$ is created.

path_geom_column

Name of the geometry column in the path table. (The path table is explained in Section 5.9.3.) If you use the format that does not specify this parameter, the geometry column is named GEOMETRY.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If you use the format that does not specify this parameter, a path-link table named <network-name>_PLINK$ is created.

subpath_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.).

subpath_geom_column

Name of the geometry column in the subpath table. (The subpath table is explained in Section 5.9.5.)

is_complex

Reserved for future use. Ignored for the current release.

storage_parameters

Physical storage parameters used internally to create network tables. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

Usage Notes

This procedure provides a convenient way to create a spatial network when the node, link, and optional related tables do not already exist. The procedure creates the network; creates the node, link, path, and path-link tables for the network; and inserts the appropriate information in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1). The node and link tables contain a topology geometry column named TOPO_GEOMETRY of type SDO_TOPO_GEOMETRY.

An exception is generated if any of the tables to be created already exists.

The procedure has two formats. The simpler format creates the tables using default values for the table name and the geometry and cost column names. The other format lets you specify names for the tables and the geometry and cost columns.

As an alternative to using this procedure, you can create the network using the SDO_NET.CREATE_TOPO_NETWORK procedure; create the tables using the SDO_NET.CREATE_NODE_TABLE, SDO_NET.CREATE_LINK_TABLE, SDO_NET.CREATE_PATH_TABLE, and SDO_NET.CREATE_PATH_LINK_TABLE procedures; and insert the appropriate row in the USER_SDO_NETWORK_METADATA view.

Examples

The following example creates a directed spatial topology geometry network named TOPO_NET1. The example creates the TOPO_NET1_NODE$, TOPO_NET1_LINK$, TOPO_NET1_PATH$, and TOPO_NET1_PLINK$ tables, and updates the xxx_SDO_NETWORK_METADATA views. The topology geometry columns are named TOPO_GEOMETRY. Both the node and link tables contain a cost column named COST.

EXECUTE SDO_NET.CREATE_TOPO_NETWORK('TOPO_NET1', 1, TRUE, TRUE);

SDO_NET.DELETE_LINK

Format

SDO_NET.DELETE_LINK(

     network IN VARCHAR2,

     link_id IN NUMBER);

Description

Deletes a link and all dependent network elements.

Parameters

network

Network name.

link_id

ID of the link to delete.

Usage Notes

This procedure deletes the specified link from the link table (described in Section 5.9.2), and it deletes any other network elements that depend on this link. For example, if the specified link is included in any paths and subpaths, those paths and subpaths are deleted also.

Examples

The following example deletes the link in the SDO_NET2 network whose link ID is 1.

SELECT SDO_NET.DELETE_LINK('SDO_NET2', 1);

SDO_NET.DELETE_NODE

Format

SDO_NET.DELETE_NODE(

     network IN VARCHAR2,

     node_id IN NUMBER);

Description

Deletes a node and all dependent network elements.

Parameters

network

Network name.

node_id

ID of the node to delete.

Usage Notes

This procedure deletes the specified node from the node table (described in Section 5.9.1), and it deletes any other network elements that depend on this node. For example, if the specified node is included in any link definitions, those links are deleted; and if any of the deleted links are included in any paths and subpaths, those paths and subpaths are deleted also.

Examples

The following example deletes the node in the SDO_NET2 network whose node ID is 1.

SELECT SDO_NET.DELETE_NODE('SDO_NET2', 1);

SDO_NET.DELETE_PATH

Format

SDO_NET.DELETE_PATH(

     network IN VARCHAR2,

     path_id IN NUMBER);

Description

Deletes a path and all dependent network elements.

Parameters

network

Network name.

path_id

ID of the path to delete.

Usage Notes

This procedure deletes the specified path from the path table (described in Section 5.9.3), and it deletes any other network elements that depend on this path. For example, if the specified path has any subpaths, those subpaths are deleted also.

Examples

The following example deletes the path in the SDO_NET2 network whose path ID is 1.

SELECT SDO_NET.DELETE_PATH('SDO_NET2', 1);

SDO_NET.DELETE_SUBPATH

Format

SDO_NET.DELETE_SUBPATH(

     network IN VARCHAR2,

     subpath_id IN NUMBER);

Description

Deletes a subpath.

Parameters

network

Network name.

subpath_id

ID of the subpath to delete.

Usage Notes

This procedure deletes the specified subpath from the path table (described in Section 5.9.3). It does not delete any other network elements, because no other elements depend on a subpath definition.

Examples

The following example deletes the subpath in the SDO_NET2 network whose subpath ID is 17.

SELECT SDO_NET.DELETE_SUBPATH('SDO_NET2', 17);

SDO_NET.DEREGISTER_CONSTRAINT

Format

SDO_NET.DEREGISTER_CONSTRAINT(

     constraint_name IN VARCHAR2);

Description

Unloads (removes) the class for the specified network constraint from the Java repository in the database, and deletes the row for that constraint from the USER_SDO_NETWORK_CONSTRAINTS view (described in Section 5.10.2).

Parameters

constraint_name

Name of the network constraint. Must match a value in the CONSTRAINT column of the USER_SDO_NETWORK_CONSTRAINTS view.

Usage Notes

Use this procedure if you want to disable a network constraint that you had previously enabled, such as by using the SDO_NET.REGISTER_CONSTRAINTprocedure. For more information about network constraints, see Section 5.6.

Examples

The following example deregisters (disables) a network constraint named GivenProhibitedTurn.

EXECUTE SDO_NET.DEREGISTER_CONSTRAINT('GivenProhibitedTurn');

SDO_NET.DROP_NETWORK

Format

SDO_NET.DROP_NETWORK(

     network IN VARCHAR2);

Description

Drops (deletes) a network.

Parameters

network

Name of the network to be dropped.

Usage Notes

This procedure also deletes the node, link, and path tables associated with the network, and the network metadata for the network.

Examples

The following example drops the network named ROADS_NETWORK.

EXECUTE SDO_NET.DROP_NETWORK('ROADS_NETWORK');

SDO_NET.FIND_CONNECTED_COMPONENTS

Format

SDO_NET.FIND_CONNECTED_COMPONENTS(

     network IN VARCHAR2,

     link_level IN NUMBER DEFAULT 1,

     component_table_name IN VARCHAR2,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A');

Description

Finds all connected components for a specified link level in a network, and stores the information in the connected component table.

Parameters

network

Network name.

link_level

Link level for which to find connected components (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

component_table_name

Name of the connected component table, which is created by this procedure. (If an existing table with the specified name already exists, it is updated with information for the specified link level.) The connected component table is described in Section 5.9.8.

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about Spatial network operations, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

Usage Notes

This procedure finds, for each node in the specified network, information about all other nodes that are reachable from that node, and it stores the information in the specified connected component table. Having this information in the table enables better performance for many network analysis operations.

Examples

The following example finds the connected components for link level 1 in the SDO_PARTITIONED network, and creates or updates the SDO_PARTITIONED_CONN_COMP_TAB table. Information about the operation is added (open_mode => 'a') to the sdo_partitioned.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.FIND_CONNECTED_COMPONENTS(-
  network => 'SDO_PARTITIONED', -
  link_level => 1,-
  component_table_name => 'sdo_partitioned_conn_comp_tab',-
  log_loc => 'LOG_DIR', log_file=> 'sdo_partitioned.log',-
  open_mode => 'a');

SDO_NET.GENERATE_NODE_LEVELS

Format

SDO_NET.GENERATE_NODE_LEVELS(

     network IN VARCHAR2,

     node_level_table_name IN VARCHAR2,

     overwrite IN BOOLEAN DEFAULT FALSE,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A');

Description

Generates node levels for a specified hierarchical (multilevel) network, and stores the information in a table.

Parameters

network

Network name.

node_level_table_name

Table in which to store node level information. This table must have the following definition: (node_id NUMBER PRIMARY KEY, link_level NUMBER)

overwrite

Controls the behavior if the table specified in node_level_table_name already exists: TRUE replaces the contents of that table with new data; FALSE (the default) generates an error. (This parameter has no effect if the table specified in node_level_table_name does not exist.)

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about Spatial network operations, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

Usage Notes

If network is not a hierarchical network (one with multiple link levels), this procedure does not perform any operation. For information about hierarchical networks, see Section 5.5.

The node level table name is stored in the NODE_LEVEL_TABLE_NAME column of the USER_SDO_NETWORK_METADATA view, which is described in Section 5.10.1.

Examples

The following example generates the node level information for the MY_MULTILEVEL_NET network, and stores the information in the MY_NET_NODE_LEVELS table. Information about the operation is added (open_mode => 'a') to the my_multilevel_net.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.GENERATE_NODE_LEVELS(-
  network => 'MY_MULTILEVEL_NET', -
  node_level_table_name => 'MY_NET_NODE_LEVELS',-
  overwrite => FALSE,-
  log_loc => 'LOG_DIR', log_file=> 'my_multilevel_net.log',-
  open_mode => 'a');

SDO_NET.GENERATE_PARTITION_BLOB

Format

SDO_NET.GENERATE_PARTITION_BLOB(

     network IN VARCHAR2,

     link_level IN NUMBER DEFAULT 1,

     partition_id IN VARCHAR2,

     include_user_data IN BOOLEAN,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A',

     preform_delta_update IN BOOLEAN DEFAULT FALSE);

Description

Generates a single binary large object (BLOB) representation for a specified partition associated with a specified link level in the network, and stores the information in the existing partition BLOB table.

Parameters

network

Network name.

link_level

Link level for links to be included in the BLOB (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

partition_id

Partition ID number. Network elements associated with the specified combination of link level and partition ID are included in the generated BLOB.

include_user_data

TRUE if the BLOB should include any user data associated with the network elements represented in each BLOB, or FALSE if the BLOB should not include any user data.

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about Spatial network operations, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

perform_delta_update

(Reserved for future use. The only permitted value is FALSE, the default.)

Usage Notes

This procedure adds a single new BLOB or replaces a single existing BLOB in the partition BLOB table, which must have been previously created using the SDO_NET.GENERATE_PARTITION_BLOBS procedure.

One use for this procedure is to perform a relatively quick update of the BLOB for a desired partition in a network that contains multiple large partitions, as opposed to than updating the BLOBs for all partitions using the SDO_NET.GENERATE_PARTITION_BLOBS procedure.

Examples

The following example generates the partition BLOB for the partition associated with partition ID 1 and link level 1 in the SDO_PARTITIONED network, and adds or replaces the appropriate BLOB in the SDO_PARTITIONED_PART_BLOB_TAB table. Any user data associated with the network elements is also included. Information about the operation is added (open_mode => 'a') to the sdo_partitioned.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.GENERATE_PARTITION_BLOB(-
  network => 'SDO_PARTITIONED', -
  link_level => 1,-
  partition_id => 1,-
  include_user_data => true,-
  log_loc => 'LOG_DIR', log_file=> 'sdo_partitioned.log',-
  open_mode => 'a');

SDO_NET.GENERATE_PARTITION_BLOBS

Format

SDO_NET.GENERATE_PARTITION_BLOBS(

     network IN VARCHAR2,

     link_level IN NUMBER DEFAULT 1,

     partition_blob_table_name IN VARCHAR2,

     include_user_data IN BOOLEAN,

     commit_for_each_blob IN BOOLEAN DEFAULT TRUE,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A',

     preform_delta_update IN BOOLEAN DEFAULT FALSE,

     regenerate_node_levels IN BOOLEAN DEFAULT FALSE);

Description

Generates a binary large object (BLOB) representation for partitions associated with a specified link level in the network, and stores the information in the partition BLOB table.

Parameters

network

Network name.

link_level

Link level for links to be included in each BLOB (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

partition_blob_table_name

Name of the partition BLOB table, which is created by this procedure. (If an existing table with the specified name already exists, it is updated with information for the specified link level.) The partition BLOB table is described in Section 5.9.7.

include_user_data

TRUE if each BLOB should include any user data associated with the network elements represented in each BLOB, or FALSE if each BLOB should not include any user data.

commit_for_each_blob

TRUE (the default) if each partition BLOB should be committed to the database after it is generated, or FALSE if each BLOB should not be committed (in which case you must perform one or more explicit commit operations).

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about Spatial network operations, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

perform_delta_update

(Reserved for future use. The only permitted value is FALSE, the default.)

regenerate_node_levels

TRUE to regenerate the node level table for multilevel networks, or FALSE (the default) not to regenerate the node level table for multilevel networks. You should set this parameter to TRUE if higher-level (second level or above) nodes are added or deleted from the network, or if the level of a node is changed. The level of a node is defined as the maximum link level coming into or out of the node.

Usage Notes

Generating partition BLOBs enables better performance for many network analysis operations, especially with large networks.

If the network is not partitioned, this procedure generates a single BLOB representing the entire network.

Do not confuse this procedure with SDO_NET.GENERATE_PARTITION_BLOB, which regenerates a single BLOB for a specified combination of link level and partition ID, and adds that information to the existing partition BLOB table.

Examples

The following example generates partition BLOBs for link level 1 in the SDO_PARTITIONED network, and creates or updates the SDO_PARTITIONED_PART_BLOB_TAB table. Any user data associated with the network elements is also included. Information about the operation is added (open_mode => 'a') to the sdo_partitioned.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.GENERATE_PARTITION_BLOBS(-
  network => 'SDO_PARTITIONED', -
  link_level => 1,-
  partition_blob_table_name => 'sdo_partitioned_part_blob_tab',-
  include_user_data => true,-
  log_loc => 'LOG_DIR', log_file=> 'sdo_partitioned.log',-
  open_mode => 'a');

SDO_NET.GET_CHILD_LINKS

Format

SDO_NET.GET_CHILD_LINKS(

     network IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the child links of a link.

Parameters

network

Network name.

link_id

ID of the link for which to return the child links.

Usage Notes

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the child links of the link in the XYZ_NETWORK network whose link ID is 1001.

SELECT SDO_NET.GET_CHILD_LINKS('XYZ_NETWORK', 1001) FROM DUAL;
 
SDO_NET.GET_CHILD_LINKS('XYZ_NETWORK',1001)                                     
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(1108, 1109) 

SDO_NET.GET_CHILD_NODES

Format

SDO_NET.GET_CHILD_NODES(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the child nodes of a node.

Parameters

network

Network name.

node_id

ID of the node for which to return the child nodes.

Usage Notes

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the child nodes of the node in the XYZ_NETWORK network whose node ID is 1.

SELECT SDO_NET.GET_CHILD_NODES('XYZ_NETWORK', 1) FROM DUAL;
 
SDO_NET.GET_CHILD_NODES('XYZ_NETWORK',1)                                        
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(101, 102, 103, 104, 105, 106)

SDO_NET.GET_GEOMETRY_TYPE

Format

SDO_NET.GET_GEOMETRY_TYPE(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the geometry type for a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the GEOMETRY_TYPE column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the geometry type for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_GEOMETRY_TYPE('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_GEOMETRY_TYPE('ROADS_NETWORK')                                      
--------------------------------------------------------------------------------
LRS_GEOMETRY 

SDO_NET.GET_IN_LINKS

Format

SDO_NET.GET_IN_LINKS(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of link ID numbers of the inbound links to a node.

Parameters

network

Network name.

node_id

ID of the node for which to return the array of inbound links.

Usage Notes

For information about inbound links and related network data model concepts, see Section 5.3.

Examples

The following example returns an array of link ID numbers of the inbound links into the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_IN_LINKS('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_IN_LINKS('ROADS_NETWORK',3)                                         
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(102)

SDO_NET.GET_INVALID_LINKS

Format

SDO_NET.GET_INVALID_LINKS(

     network IN VARCHAR2

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the invalid links in a network.

Parameters

network

Network name.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with a comma-delimited list of node ID numbers of invalid links in the specified network. If there are no invalid links, this function returns a null value.

Examples

The following example returns the invalid links in the SDO_PARTITIONED network.

SELECT SDO_NET.GET_INVALID_LINKS('SDO_PARTITIONED') FROM DUAL;

SDO_NET.GET_INVALID_NODES

Format

SDO_NET.GET_INVALID_NODES(

     network IN VARCHAR2

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the invalid nodes in a network.

Parameters

network

Network name.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with a comma-delimited list of node ID numbers of invalid nodes in the specified network. If there are no invalid nodes, this function returns a null value.

Examples

The following example returns the invalid nodes in the SDO_PARTITIONED network.

SELECT SDO_NET.GET_INVALID_NODES('SDO_PARTITIONED') FROM DUAL;

SDO_NET.GET_INVALID_PATHS

Format

SDO_NET.GET_INVALID_PATHS(

     network IN VARCHAR2

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the invalid paths in a network.

Parameters

network

Network name.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with a comma-delimited list of node ID numbers of invalid paths in the specified network. If there are no invalid paths, this function returns a null value.

Examples

The following example returns the invalid paths in the SDO_PARTITIONED network.

SELECT SDO_NET.GET_INVALID_PATHS('SDO_PARTITIONED') FROM DUAL;

SDO_NET.GET_ISOLATED_NODES

Format

SDO_NET.GET_ISOLATED_NODES(

     network IN VARCHAR2

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the isolated nodes in a network.

Parameters

network

Network name.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with a comma-delimited list of node ID numbers of isolated nodes in the specified network. If there are no isolated nodes, this function returns a null value.

For a brief explanation of isolated nodes in a network, see Section 5.3.

Examples

The following example returns the isolated nodes in the SDO_PARTITIONED network.

SELECT SDO_NET.GET_ISOLATED_NODES('SDO_PARTITIONED') FROM DUAL;

SDO_NET.GET_LINK_COST_COLUMN

Format

SDO_NET.GET_LINK_COST_COLUMN(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the link cost column for a network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LINK_COST_COLUMN column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the link cost column for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LINK_COST_COLUMN('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LINK_COST_COLUMN('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
COST

SDO_NET.GET_LINK_DIRECTION

Format

SDO_NET.GET_LINK_DIRECTION(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the link direction for a network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LINK_DIRECTION column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the link direction for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LINK_DIRECTION('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LINK_DIRECTION('ROADS_NETWORK')                                     
--------------------------------------------------------------------------------
DIRECTED 

SDO_NET.GET_LINK_GEOM_COLUMN

Format

SDO_NET.GET_LINK_GEOM_COLUMN(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the link geometry column for a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LINK_GEOM_COLUMN column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the link geometry column for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LINK_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LINK_GEOM_COLUMN('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
LINK_GEOMETRY

SDO_NET.GET_LINK_GEOMETRY

Format

SDO_NET.GET_LINK_GEOMETRY(

     network IN VARCHAR2,

     link_id IN NUMBER,

     start_percentage IN NUMBER DEFAULT 0,

     end_percentage IN NUMBER DEFAULT 1.0

     ) RETURN SDO_GEOMETRY;

Description

Returns the entire geometry or a portion of the geometry associated with a link in a spatial network.

Parameters

network

Network name.

link_id

ID number of the link for which to return the geometry.

start_percentage

Percentage of the distance along the link to be used for the start point of the returned geometry. Expressed as a number between 0 and 1.0; for example, 0.5 is 50 percent. The default value is 0; that is, the start of the returned geometry is associated with the start point of the link.

end_percentage

Percentage of the distance along the link to be used for the end point of the returned geometry. Expressed as a number between 0 and 1.0; for example, 0.5 is 50 percent. The default value is 1.0; that is, the end of returned geometry is associated with the end point of the link.

Usage Notes

None.

Examples

The following example returns the geometry associated with the link whose link ID is 103 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL;
 
SDO_NET.GET_LINK_GEOMETRY('ROADS_NETWORK',103)(SDO_GTYPE, SDO_SRID, SDO_POINT(X,
--------------------------------------------------------------------------------
SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
8, 4, 12, 4)) 

SDO_NET.GET_LINK_TABLE_NAME

Format

SDO_NET.GET_LINK_TABLE_NAME(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the link table for a network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LINK_TABLE_NAME column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the link table for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LINK_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LINK_TABLE_NAME('ROADS_NETWORK')                                    
--------------------------------------------------------------------------------
ROADS_LINKS  

SDO_NET.GET_LINKS_IN_PATH

Format

SDO_NET.GET_LINKS_IN_PATH(

     network IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the links in a path.

Parameters

network

Network name.

path_id

ID of the path for which to return the links.

Usage Notes

For an explanation of links and paths, see Section 5.3.

Examples

The following example returns the link ID values of links in the path in the XYZ_NETWORK network whose path ID is 1.

SELECT SDO_NET.GET_LINKS_IN_PATH('XYZ_NETWORK', 1) FROM DUAL;
 
SDO_NET.GET_LINKS_IN_PATH('XYZ_NETWORK',1)
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(1102, 1104, 1105)

SDO_NET.GET_LRS_GEOM_COLUMN

Format

SDO_NET.GET_LRS_GEOM_COLUMN(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the LRS geometry column for a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LRS_GEOM_COLUMN column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the LRS geometry column for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LRS_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LRS_GEOM_COLUMN('ROADS_NETWORK')                                    
--------------------------------------------------------------------------------
ROAD_GEOM 

SDO_NET.GET_LRS_LINK_GEOMETRY

Format

SDO_NET.GET_LRS_LINK_GEOMETRY(

     network IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the LRS geometry associated with a link in a spatial LRS network.

Parameters

network

Network name.

link_id

ID number of the link for which to return the geometry.

Usage Notes

None.

Examples

The following example returns the LRS geometry associated with the link whose link ID is 103 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LRS_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL;
 
SDO_NET.GET_LRS_LINK_GEOMETRY('ROADS_NETWORK',103)(SDO_GTYPE, SDO_SRID, SDO_POIN
--------------------------------------------------------------------------------
SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
8, 4, 12, 4))

SDO_NET.GET_LRS_NODE_GEOMETRY

Format

SDO_NET.GET_LRS_NODE_GEOMETRY(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the LRS geometry associated with a node in a spatial LRS network.

Parameters

network

Network name.

node_id

ID number of the node for which to return the geometry.

Usage Notes

None.

Examples

The following example returns the LRS geometry associated with the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LRS_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_LRS_NODE_GEOMETRY('ROADS_NETWORK',3)(SDO_GTYPE, SDO_SRID, SDO_POINT(
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8, 4, NULL), NULL, NULL)

SDO_NET.GET_LRS_TABLE_NAME

Format

SDO_NET.GET_LRS_TABLE_NAME(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the table containing LRS geometries in a spatial LRS network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the LRS_TABLE_NAME column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the table that contains LRS geometries for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_LRS_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_LRS_TABLE_NAME('ROADS_NETWORK')                                     
--------------------------------------------------------------------------------
ROADS 

SDO_NET.GET_NETWORK_TYPE

Format

SDO_NET.GET_NETWORK_TYPE(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the network type.

Parameters

network

Network name.

Usage Notes

This function returns the value of the NETWORK_TYPE column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the network type for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NETWORK_TYPE('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NETWORK_TYPE('ROADS_NETWORK')                                       
--------------------------------------------------------------------------------
Roadways

SDO_NET.GET_NO_OF_HIERARCHY_LEVELS

Format

SDO_NET.GET_NO_OF_HIERARCHY_LEVELS(

     network IN VARCHAR2

     ) RETURN NUMBER;

Description

Returns the number of hierarchy levels for a network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the NO_OF_HIERARCHY_LEVELS column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

For an explanation of network hierarchy, see Section 5.5.

Examples

The following example returns the number of hierarchy levels for the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('ROADS_NETWORK')                             
---------------------------------------------------                             
                                                  1

SDO_NET.GET_NO_OF_LINKS

Format

SDO_NET.GET_NO_OF_LINKS(

     network IN VARCHAR2

     ) RETURN NUMBER;

or

SDO_NET.GET_NO_OF_LINKS(

     network IN VARCHAR2,

     hierarchy_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of links for a network or a hierarchy level in a network.

Parameters

network

Network name.

hierarchy_id

Hierarchy level number for which to return the number of links.

Usage Notes

None.

Examples

The following example returns the number of links in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NO_OF_LINKS('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NO_OF_LINKS('ROADS_NETWORK')                                        
----------------------------------------                                        
                                      10 

SDO_NET.GET_NO_OF_NODES

Format

SDO_NET.GET_NO_OF_NODES(

     network IN VARCHAR2

     ) RETURN NUMBER;

or

SDO_NET.GET_NO_OF_NODES(

     network IN VARCHAR2,

     hierarchy_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of nodes for a network or a hierarchy level in a network.

Parameters

network

Network name.

hierarchy_id

Hierarchy level number for which to return the number of nodes.

Usage Notes

For information about nodes and related concepts, see Section 5.3.

Examples

The following example returns the number of nodes in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NO_OF_NODES('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NO_OF_NODES('ROADS_NETWORK')                                        
----------------------------------------                                        
                                       8

SDO_NET.GET_NODE_DEGREE

Format

SDO_NET.GET_NODE_DEGREE(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of links to a node.

Parameters

network

Network name.

node_id

Node ID of the node for which to return the number of links.

Usage Notes

For information about node degree and related network data model concepts, see Section 5.3.

Examples

The following example returns the number of links to the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_NODE_DEGREE('ROADS_NETWORK',3)                                      
------------------------------------------                                      
                                         3

SDO_NET.GET_NODE_GEOM_COLUMN

Format

SDO_NET.GET_NODE_GEOM_COLUMN(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the geometry column for nodes in a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the NODE_GEOM_COLUMN column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the geometry column for nodes in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NODE_GEOM_COLUMN('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
NODE_GEOMETRY

SDO_NET.GET_NODE_GEOMETRY

Format

SDO_NET.GET_NODE_GEOMETRY(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the LRS geometry associated with a node in a spatial network.

Parameters

network

Network name.

node_id

ID number of the node for which to return the geometry.

Usage Notes

None.

Examples

The following example returns the geometry associated with the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_NODE_GEOMETRY('ROADS_NETWORK',3)(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8, 4, NULL), NULL, NULL) 

SDO_NET.GET_NODE_IN_DEGREE

Format

SDO_NET.GET_NODE_IN_DEGREE(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of inbound links to a node.

Parameters

network

Network name.

node_id

Node ID of the node for which to return the number of inbound links.

Usage Notes

For information about node degree and related network data model concepts, see Section 5.3.

Examples

The following example returns the number of inbound links to the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_IN_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_NODE_IN_DEGREE('ROADS_NETWORK',3)                                   
---------------------------------------------                                   
                                            1

SDO_NET.GET_NODE_OUT_DEGREE

Format

SDO_NET.GET_NODE_OUT_DEGREE(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of outbound links from a node.

Parameters

network

Network name.

node_id

Node ID of the node for which to return the number of outbound links.

Usage Notes

For information about node degree and related network data model concepts, see Section 5.3.

Examples

The following example returns the number of outbound links from the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_OUT_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_NODE_OUT_DEGREE('ROADS_NETWORK',3)                                  
----------------------------------------------                                  
                                             2

SDO_NET.GET_NODE_TABLE_NAME

Format

SDO_NET.GET_NODE_TABLE_NAME(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the table that contains the nodes in a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the NODE_TABLE_NAME column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the table that contains the nodes in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_NODE_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_NODE_TABLE_NAME('ROADS_NETWORK')                                    
--------------------------------------------------------------------------------
ROADS_NODES

SDO_NET.GET_OUT_LINKS

Format

SDO_NET.GET_OUT_LINKS(

     network IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of link ID numbers of the outbound links from a node.

Parameters

network

Network name.

node_id

ID of the node for which to return the array of outbound links.

Usage Notes

For information about outbound links and related network data model concepts, see Section 5.3.

Examples

The following example returns an array of link ID numbers of the outbound links from the node whose node ID is 3 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_OUT_LINKS('ROADS_NETWORK', 3) FROM DUAL;
 
SDO_NET.GET_OUT_LINKS('ROADS_NETWORK',3)                                        
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(103, 201)

SDO_NET.GET_PARTITION_SIZE

Format

SDO_NET.GET_PARTITION_SIZE(

     network IN VARCHAR2,

     partition_id IN VARCHAR2,

     link_level IN NUMBER DEFAULT 1,

     include_user_data IN VARCHAR2 DEFAULT 'FALSE',

     include_spatial_data IN VARCHAR2 DEFAULT 'FALSE') RETURN NUMBER;

Description

Gets the estimated size (in bytes) for a specified combination of partition ID and link level.

Parameters

network

Network name.

partition_id

Partition ID number.

link_level

Link level (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

include_user_data

TRUE if the size should include any user data associated with the network elements represented in each BLOB, or FALSE (the default) if the size should not include any user data.

include_spatial_data

TRUE if the size should include spatial geometry definitions associated with the network elements represented in each BLOB, or FALSE (the default) if the size should not include spatial geometry definitions.

Usage Notes

The returned size of a network partition is a rough estimate and might vary depending on the Java Virtual Machine and garbage collection.

For information about using partitioned networks to perform analysis using the load on demand approach, see Section 5.7.

Examples

The following example returns the number of bytes for the partition associated with partition ID 1 and link level 1 in the SDO_PARTITIONED network, not including any user data or spatial data.

SELECT SDO_NET.GET_PARTITION_SIZE('SDO_PARTITIONED', 1, 1, 'N', 'N') FROM DUAL;
 
SDO_NET.GET_PARTITION_SIZE('SDO_PARTITIONED',1,1,'FALSE','FALSE')
---------------------------------------------------------
                                                     5192

SDO_NET.GET_PATH_GEOM_COLUMN

Format

SDO_NET.GET_PATH_GEOM_COLUMN(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the geometry column for paths in a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the PATH_GEOM_COLUMN column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the geometry column for paths in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_PATH_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_PATH_GEOM_COLUMN('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
PATH_GEOMETRY

SDO_NET.GET_PATH_TABLE_NAME

Format

SDO_NET.GET_PATH_TABLE_NAME(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the table that contains the paths in a spatial network.

Parameters

network

Network name.

Usage Notes

This function returns the value of the PATH_TABLE_NAME column for the network in the USER_SDO_NETWORK_METADATA view (see Table 5-9 in Section 5.10.1).

Examples

The following example returns the name of the table that contains the paths in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_PATH_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.GET_PATH_TABLE_NAME('ROADS_NETWORK')                                    
--------------------------------------------------------------------------------
ROADS_PATHS 

SDO_NET.GET_PERCENTAGE

Format

SDO_NET.GET_PERCENTAGE(

     network IN VARCHAR2,

     link_id IN NUMBER,

     pt_geom IN SDO_GEOMETRY

     ) RETURN SDO_GEOMETRY;

Description

Returns the percentage of the distance along a link's line string geometry of a point geometry.

Parameters

network

Network name.

link_id

ID number of the link.

pt_geom

Point geometry.

Usage Notes

This function returns a value between 0 and 1. For example, if the point is 25 percent (one-fourth) of the distance between the start node and end node for the link, the function returns .25.

If pt_geom is not on the link geometry, the nearest point on the link geometry to pt_geom is used.

To find the point geometry that is a specified percentage of the distance along a link's line string geometry, use the SDO_NET.GET_PT function.

Examples

The following example returns the percentage (as a decimal fraction) of the distance of a specified point along the geometry associated with the link whose link ID is 101 in the network named ROADS_NETWORK.

SQL> SELECT SDO_NET.GET_PERCENTAGE('ROADS_NETWORK', 101,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(2, 2.5, NULL), NULL, NULL))
  FROM DUAL;  2    3
 
SDO_NET.GET_PERCENTAGE('ROADS_NETWORK',101,SDO_GEOMETRY(2001,NULL,SDO_POINT_TYPE
--------------------------------------------------------------------------------
                                                                             .25

SDO_NET.GET_PT

Format

SDO_NET.GET_PT(

     network IN VARCHAR2,

     link_id IN NUMBER,

     percentage IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the point geometry that is a specified percentage of the distance along a link's line string geometry.

Parameters

network

Network name.

link_id

ID number of the link for which to return the point geometry at the specified percentage distance.

percentage

Percentage value as a decimal fraction between 0 and 1. For example, 0.25 is 25 percent.

Usage Notes

To find the percentage along a link geometry for a specified point, use the SDO_NET.GET_PERCENTAGE function.

Examples

The following example returns the point geometry that is 25 percent of the distance from the start node along the geometry associated with the link whose link ID is 101 in the network named ROADS_NETWORK.

SELECT SDO_NET.GET_PT('ROADS_NETWORK', 101, 0.25) FROM DUAL;
 
SDO_NET.GET_PT('ROADS_NETWORK',101,0.25)(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(2, 2.5, NULL), NULL, NULL)

SDO_NET.IS_HIERARCHICAL

Format

SDO_NET.IS_HIERARCHICAL(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network has more than one level of hierarchy; returns the string FALSE if the network does not have more than one level of hierarchy.

Parameters

network

Network name.

Usage Notes

For an explanation of network hierarchy, see Section 5.5.

Examples

The following example checks if the network named ROADS_NETWORK has more than one level of hierarchy.

SELECT SDO_NET.IS_HIERARCHICAL('ROADS_NETWORK') FROM DUAL;

SDO_NET.IS_HIERARCHICAL('ROADS_NETWORK')                                        
--------------------------------------------------------------------------------
TRUE   

SDO_NET.IS_LINK_IN_PATH

Format

SDO_NET.IS_LINK_IN_PATH(

     network IN VARCHAR2,

     path_id IN NUMBER,

     link_id IN NUMBER,

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the specified link is in the specified path; returns the string FALSE if the specified link is not in the specified path.

Parameters

network

Network name.

path_id

ID number of the path.

link_id

ID number of the link.

Usage Notes

You can use this function to check if a specific link is included in a specific path.

Examples

The following example checks if the link with link ID 1 is in the path with path ID 1 in the network named SDO_NET1.

SELECT SDO_NET.IS_LINK_IN_PATH('SDO_NET1', 1, 1) FROM DUAL;
 
SDO_NET.IS_LINK_IN_PATH('SDO_NET1',1,1)                                        
--------------------------------------------------------------------------------
TRUE

SDO_NET.IS_LOGICAL

Format

SDO_NET.IS_LOGICAL(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is a logical network; returns the string FALSE if the network is not a logical network.

Parameters

network

Network name.

Usage Notes

A network can be a spatial network or a logical network, as explained in Section 5.3.

Examples

The following example checks if the network named ROADS_NETWORK is a logical network.

SELECT SDO_NET.IS_LOGICAL('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.IS_LOGICAL('ROADS_NETWORK')                                             
--------------------------------------------------------------------------------
FALSE 

SDO_NET.IS_NODE_IN_PATH

Format

SDO_NET.IS_NODE_IN_PATH(

     network IN VARCHAR2,

     path_id IN NUMBER,

     node_id IN NUMBER,

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the specified node is in the specified path; returns the string FALSE if the specified node is not in the specified path.

Parameters

network

Network name.

path_id

ID number of the path.

node_id

ID number of the node.

Usage Notes

You can use this function to check if a specific node is included in a specific path.

Examples

The following example checks if the node with node ID 1 is in the path with path ID 1 in the network named SDO_NET1.

SELECT SDO_NET.IS_NODE_IN_PATH('SDO_NET1', 1, 1) FROM DUAL;
 
SDO_NET.IS_NODE_IN_PATH('SDO_NET1',1,1)                                        
--------------------------------------------------------------------------------
TRUE

SDO_NET.IS_SPATIAL

Format

SDO_NET.IS_SPATIAL(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is a spatial network; returns the string FALSE if the network is not a spatial network.

Parameters

network

Network name.

Usage Notes

A network can be a spatial network or a logical network, as explained in Section 5.3.

You can further check for the geometry type of a spatial network by using the following functions: SDO_NET.LRS_GEOMETRY_NETWORK, SDO_NET.SDO_GEOMETRY_NETWORK, and SDO_NET.TOPO_GEOMETRY_NETWORK.

Examples

The following example checks if the network named ROADS_NETWORK is a spatial network.

SELECT SDO_NET.IS_SPATIAL('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.IS_SPATIAL('ROADS_NETWORK')                                             
--------------------------------------------------------------------------------
TRUE

SDO_NET.LOAD_CONFIG

Format

SDO_NET.LOAD_CONFIG(

    file_directory IN VARCHAR2,

    file_name IN VARCHAR2);

Description

Loads (or reloads) the configuration for load on demand Java stored procedures from the specified XML file. The load on demand configuration is mainly for partition BLOB translation and partition cache configuration. (The Java stored procedures are classes in the package oracle.spatial.network.lod.)

Parameters

file_directory

Directory object that identifies the path for the XML file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

file_name

Name of the XML file containing the information to be loaded.

Usage Notes

A default configuration is provided for load on demand. You can use this procedure if you need to change the default configuration.

For information about configuring the load on demand environment, including the partition cache, see Section 5.7.3.

Examples

The following example loads the load on demand configuration from a specified XML file.

EXECUTE SDO_NET.LOAD_CONFIG('WORK_DIR', 'netlodcfg.xml');

SDO_NET.LOGICAL_PARTITION

Format

SDO_NET.LOGICAL_PARTITION(

     network IN VARCHAR2,

     partition_table_name IN VARCHAR2,

     max_num_nodes IN NUMBER,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A',

     link_level IN NUMBER DEFAULT 1);

Description

Partitions a logical network, and stores the information in the partition table.


Note:

If the logical network is a power law (scale-free) network, do not use this procedure to partition it, but instead use the SDO_NET.LOGICAL_POWERLAW_PARTITION procedure.

Parameters

network

Network name.

partition_table_name

Name of the partition table, which is created by this procedure. (If an existing table with the specified name already exists, it is updated with partition information for the specified link level.) The partition table is described in Section 5.9.6.

max_num_nodes

Maximum number of nodes to include in each partition. For example, if you specify 5000 and if the network contains 50,000 nodes, each partition will have 5000 or fewer nodes, and the total number of partitions will be 10 or higher.

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about operations on the logical network, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

link_level

Network link level on which to perform the partitioning (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

Usage Notes

After you use this procedure to create the partitions, consider using the SDO_NET.GENERATE_PARTITION_BLOBS procedure, to enable better performance for many network analysis operations, especially with large networks.

Examples

The following example creates partitions for link level 1 in the MY_LOGICAL_NET network, and creates the MY_LOGICAL_PART_TAB table. The maximum number of nodes to be placed in any partition is 5000. Information about the operation is added (open_mode => 'a') to the my_logical_part.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.LOGICAL_PARTITION(network => 'MY_LOGICAL_NET', -
  partition_table_name => 'my_logical_part_tab',-
  max_num_nodes => 5000,-
  log_loc => 'LOG_DIR', log_file=> 'my_logical_part.log',-
  link_level => 1, open_mode => 'a');

SDO_NET.LOGICAL_POWERLAW_PARTITION

Format

SDO_NET.LOGICAL_POWERLAW_PARTITION(

     network IN VARCHAR2,

     partition_table_name IN VARCHAR2,

     max_num_nodes IN NUMBER,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A',

     link_level IN NUMBER DEFAULT 1);

Description

Partitions a logical power law (also called scale-free) network, and stores the information in the partition table. (In a power law network, the node degree values contain the power law information.)

Parameters

network

Network name.

partition_table_name

Name of the partition table, which is created by this procedure. (If an existing table with the specified name already exists, it is updated with partition information for the specified link level.) The partition table is described in Section 5.9.6.

max_num_nodes

Maximum number of nodes to include in each partition. For example, if you specify 5000 and if the network contains 50,000 nodes, each partition will have 5000 or fewer nodes, and the total number of partitions will be 10 or higher.

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about operations on the logical power law network, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

link_level

Network link level on which to perform the partitioning (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.

Usage Notes

After you use this procedure to create the partitions, consider using the SDO_NET.GENERATE_PARTITION_BLOBS procedure, to enable better performance for many network analysis operations, especially with large networks.

If the logical network is not a power law network, do not use this procedure, but instead use the SDO_NET.LOGICAL_PARTITION procedure.

Examples

The following example creates partitions for link level 1 in the MY_LOGICAL_PLAW_NET network, and creates the MY_LOGICAL_PLAW_PART_TAB table. The maximum number of nodes to be placed in any partition is 5000. Information about the operation is added (open_mode => 'a') to the my_logical_plaw_part.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.LOGICAL_POWERLAW_PARTITION(network => 'MY_LOGICAL_PLAW_NET', -
  partition_table_name => 'my_logical_plaw_part_tab',-
  max_num_nodes => 5000,-
  log_loc => 'LOG_DIR', log_file=> 'my_logical_plaw_part.log',-
  link_level => 1, open_mode => 'a');

SDO_NET.LRS_GEOMETRY_NETWORK

Format

SDO_NET.LRS_GEOMETRY_NETWORK(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is a spatial network containing LRS geometries; returns the string FALSE if the network is not a spatial network containing LRS geometries.

Parameters

network

Network name.

Usage Notes

A network contains LRS geometries if the GEOMETRY_TYPE column in its entry in the USER_SDO_NETWORK_METADATA view contains the value LRS_GEOMETRY. (The USER_SDO_NETWORK_METADATA view is explained in Section 5.10.1.)

Examples

The following example checks if the network named ROADS_NETWORK is a spatial network containing LRS geometries.

SELECT SDO_NET.LRS_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.LRS_GEOMETRY_NETWORK('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
TRUE

SDO_NET.NETWORK_EXISTS

Format

SDO_NET.NETWORK_EXISTS(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network exists; returns the string FALSE if the network does not exist.

Parameters

network

Network name.

Usage Notes

If you drop a network (using the SDO_NET.DROP_NETWORK procedure), the network no longer exists.

Examples

The following example checks if the network named ROADS_NETWORK exists.

SELECT SDO_NET.NETWORK_EXISTS('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.NETWORK_EXISTS('ROADS_NETWORK')                                         
--------------------------------------------------------------------------------
TRUE 

SDO_NET.REGISTER_CONSTRAINT

Format

SDO_NET.REGISTER_CONSTRAINT(

     constraint_name IN VARCHAR2,

     class_name IN VARCHAR2,

     directory_name IN VARCHAR2,

     description IN VARCHAR2);

Description

Loads the compiled Java code for the specified network constraint into the Java class repository in the database, and loads the class name into the CLASS column of the USER_SDO_NETWORK_CONSTRAINTS view (described in Section 5.10.2).

Parameters

constraint_name

Name of the network constraint.

class_name

Fully qualified name (including the name of the package) of the class that implements the network constraint.

directory_name

Name of the directory object (created using the SQL statement CREATE DIRECTORY) that identifies the location of the class file created when you compiled the network constraint.

description

Description of the network constraint.

Usage Notes

Before you call this procedure, you must insert a row into the USER_SDO_NETWORK_CONSTRAINTS view, compile the code for the Java class that implements the network constraint, and use the CREATE DIRECTORY statement to create a directory object identifying the location of the compiled class. For more information about network constraints, see Section 5.6.

To delete the row for the constraint from the USER_SDO_NETWORK_CONSTRAINTS view and thus disable the constraint, use the SDO_NET.DEREGISTER_CONSTRAINT procedure.

Examples

The following example registers a network constraint named GivenProhibitedTurn.

-- Set up the network constraint.
REM
REM Create the geor_dir on the file system first.
REM
-- Connect as SYSTEM.
DECLARE 
  -- This is the directory that contains the CLASS file generated when you
  -- compiled the network constraint.
  geor_dir varchar2(1000) := 'C:\my_data\files81\PROTOTYPES\NETWORK_CONSTRAINT\PLSQL_EXAMPLE';
BEGIN 
  EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY work_dir AS''' || geor_dir || ''''; 
END;
/
GRANT read,write on directory work_dir to net_con;
 
-- Connect as the user that will register the constraint. 
 
REM
REM Compile GivenProhibitedTurn before you register the constraint.
REM
BEGIN
  SDO_NET.REGISTER_CONSTRAINT('GivenProhibitedTurn', 
     'com/network/constraints/ProhibitedTurn',
     'WORK_DIR', 'This is a network constraint that '||
     'prohibits certain turns');
 
END;
/

SDO_NET.SDO_GEOMETRY_NETWORK

Format

SDO_NET.SDO_GEOMETRY_NETWORK(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is a spatial network containing SDO geometries (spatial geometries without measure information); returns the string FALSE if the network is not a spatial network containing SDO geometries.

Parameters

network

Network name.

Usage Notes

A network contains SDO geometries if the GEOMETRY_TYPE column in its entry in the USER_SDO_NETWORK_METADATA view contains the value SDO_GEOMETRY. (The USER_SDO_NETWORK_METADATA view is explained in Section 5.10.1.)

Examples

The following example checks if the network named ROADS_NETWORK is a spatial network containing SDO geometries.

SELECT SDO_NET.SDO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.SDO_GEOMETRY_NETWORK('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
FALSE

SDO_NET.SET_LOGGING_LEVEL

Format

SDO_NET.SET_LOGGING_LEVEL(

     level IN NUMBER);

Description

Sets the minimum level of severity for messages to be displayed for network operations.

Parameters

level

Minimum severity level for messages to be displayed for network operations. Must be one of the numeric constants specified in the Usage Notes.

Usage Notes

All messages at the specified logging level and higher levels will be written. The logging levels, from highest to lowest, are:

SDO_NET.LOGGING_LEVEL_FATAL
SDO_NET.LOGGING_LEVEL_ERROR
SDO_NET.LOGGING_LEVEL_WARN
SDO_NET.LOGGING_LEVEL_INFO
SDO_NET.LOGGING_LEVEL_DEBUG
SDO_NET.LOGGING_LEVEL_FINEST

The logging level is the Java logging level from the underlying implementation of this function; therefore, to see the Java logging output on the console, execute the following statements beforehand:

SET SERVEROUTPUT ON;
EXECUTE DBMS_JAVA.SET_OUTPUT(10000);

Examples

The following example sets the logging level at SDO_NET.LOGGING_LEVEL_ERROR, which means that only messages with a severity of SDO_NET.LOGGING_LEVEL_ERROR or SDO_NET.LOGGING_LEVEL_FATAL will be displayed.

EXECUTE SDO_NET.SET_LOGGING_LEVEL(SDO_NET.LOGGING_LEVEL_ERROR);

SDO_NET.SET_MAX_JAVA_HEAP_SIZE

Format

SDO_NET.SET_MAX_JAVA_HEAP_SIZE(

     bytes IN NUMBER);

Description

Sets the Java maximum heap size for an application to run in an Oracle Java virtual machine.

Parameters

bytes

Number of bytes for the Java maximum heap size.

Usage Notes

If you encounter the java.lang.OutOfMemoryError exception, you can use this procedure to increase the maximum heap size.

If you specify a value greater than the system limit, the system limit is used.

Examples

The following example sets the Java maximum heap size to 536870912 (512 MB).

EXECUTE SDO_NET.SET_MAX_JAVA_HEAP_SIZE(536870912);

SDO_NET.SPATIAL_PARTITION

Format

SDO_NET.SPATIAL_PARTITION(

     network IN VARCHAR2,

     partition_table_name IN VARCHAR2,

     max_num_nodes IN NUMBER,

     log_loc IN VARCHAR2,

     log_file IN VARCHAR2,

     open_mode IN VARCHAR2 DEFAULT 'A',

     link_level IN NUMBER DEFAULT 1);

Description

Partitions a spatial network, and stores the information in the partition table.

Parameters

network

Network name.

partition_table_name

Name of the partition table, which is created by this procedure. (If an existing table with the specified name already exists, it is updated with partition information for the specified link level.) The partition table is described in Section 5.9.6.

max_num_nodes

Maximum number of nodes >Oto include in each partition. For example, if you specify 5000 and if the network contains 50,000 nodes, each partition will have 5000 or fewer nodes, and the total number of partitions will be 10 or higher.

log_loc

Directory object that identifies the path for the log file. To create a directory object, use the SQL*Plus command CREATE DIRECTORY.

log_file

Log file containing information about Spatial network operations, including any possible errors or problems.

open_mode

A one-character code indicating the mode in which to open the log file: W for write over (that is, delete any existing log file at the specified location and name, and create a new file), or A (the default) for append (that is, append information to the existing specified log file). If you specify A and the log file does not exist, a new log file is created.

link_level

Network link level on which to perform the partitioning (default = 1). The link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in network computations.

Usage Notes

After you use this procedure to create the partitions, consider using the SDO_NET.GENERATE_PARTITION_BLOBS procedure, to enable better performance for many network analysis operations, especially with large networks.

Examples

The following example creates partitions for link level 1 in the MY_PARTITIONED_NET network, and creates the MY_PARTITIONED_NET_TAB table. The maximum number of nodes to be placed in any partition is 5000. Information about the operation is added (open_mode => 'a') to the my_partitioned_net.log file, located in the location associated with the directory object named LOG_DIR.

EXECUTE SDO_NET.SPATIAL_PARTITION(network => 'MY_PARTITIONED_NET', -
  partition_table_name => 'my_partitioned_net_tab',-
  max_num_nodes => 5000,-
  log_loc => 'LOG_DIR', log_file=> 'my_partitioned_net.log',-
  link_level => 1, open_mode => 'a');

SDO_NET.TOPO_GEOMETRY_NETWORK

Format

SDO_NET.TOPO_GEOMETRY_NETWORK(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is a spatial network containing SDO_TOPO_GEOMETRY (topology geometry) objects; returns the string FALSE if the network is not a spatial network containing SDO_TOPO_GEOMETRY objects.

Parameters

network

Network name.

Usage Notes

A network contains SDO_TOPO_GEOMETRY objects if the GEOMETRY_TYPE column in its entry in the USER_SDO_NETWORK_METADATA view contains the value TOPO_GEOMETRY. (The USER_SDO_NETWORK_METADATA view is explained in Section 5.10.1.)

Examples

The following example checks if the network named ROADS_NETWORK is a spatial network containing SDO_TOPO_GEOMETRY objects.

SELECT SDO_NET.TOPO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.TOPO_GEOMETRY_NETWORK('ROADS_NETWORK')                                  
--------------------------------------------------------------------------------
FALSE

SDO_NET.VALIDATE_LINK_SCHEMA

Format

SDO_NET.VALIDATE_LINK_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to links in a network is valid; returns the string FALSE if the metadata relating to links in a network is not valid.

Parameters

network

Network name.

Usage Notes

This function checks the following for validity: table name, geometry column, and cost column for spatial networks; measure-related information for LRS networks; topology-related information for topology networks; and hierarchy-related information for hierarchical networks.

Examples

The following example checks the validity of the metadata related to links in the network named ROADS_NETWORK.

SELECT SDO_NET.VALIDATE_LINK_SCHEMA('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.VALIDATE_LINK_SCHEMA('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_LRS_SCHEMA

Format

SDO_NET.VALIDATE_LRS_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to LRS information in a network is valid; returns the string FALSE if the metadata relating to LRS information in a network is not valid.

Parameters

network

Network name.

Usage Notes

None.

Examples

The following example checks the validity of the metadata related to LRS information in the network named ROADS_NETWORK.

SELECT SDO_NET.VALIDATE_LRS_SCHEMA('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.VALIDATE_LRS_SCHEMA('ROADS_NETWORK')                                    
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_NETWORK

Format

SDO_NET.VALIDATE_NETWORK(

     network IN VARCHAR2,

     check_data IN VARCHAR2 DEFAULT 'FALSE'

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the network is valid; returns the string FALSE if the network is not valid.

Parameters

network

Network name.

check_data

TRUE performs additional checks on the referential integrity of network data; FALSE (the default) performs basic checks, but not additional checks, on the referential integrity of network data.

Usage Notes

This function checks the metadata for the network and any applicable network schema structures (link, node, path, subpath, LRS). It performs basic referential integrity checks on the network data, and it optionally performs additional checks. If any errors are found, the function returns the string FALSE.

The checks performed by this function include the following:

Examples

The following example validates the network named LOG_NET1.

SELECT SDO_NET.VALIDATE_NETWORK('LOG_NET1') FROM DUAL;
 
SDO_NET.VALIDATE_NETWORK('LOG_NET1')
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_NODE_SCHEMA

Format

SDO_NET.VALIDATE_NODE_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to nodes in a network is valid; returns the string FALSE if the metadata relating to nodes in a network is not valid.

Parameters

network

Network name.

Usage Notes

This function checks the following for validity: table name, geometry column, and cost column for spatial networks; measure-related information for LRS networks; topology-related information for topology networks; and hierarchy-related information for hierarchical networks.

Examples

The following example checks the validity of the metadata related to nodes in the network named LOG_NET1.

SELECT SDO_NET.VALIDATE_NODE_SCHEMA('LOG_NET1') FROM DUAL;
 
SDO_NET.VALIDATE_NODE_SCHEMA('LOG_NET1')
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_PARTITION_SCHEMA

Format

SDO_NET.VALIDATE_PARTITION_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to partitions in a network is valid; returns the string FALSE if the metadata relating to partitions in a network is not valid.

Parameters

network

Network name.

Usage Notes

This function checks the validity of information in the partition table, which is described in Section 5.9.6.

Examples

The following example checks the validity of the metadata related to partitions in the network named SDO_PARTITIONED.

SELECT SDO_NET.VALIDATE_PARTITION_SCHEMA('SDO_PARTITIONED') FROM DUAL;
 
SDO_NET.VALIDATE_PARTITION_SCHEMA('SDO_PARTITIONED')
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_PATH_SCHEMA

Format

SDO_NET.VALIDATE_PATH_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to paths in a network is valid; returns the string FALSE if the metadata relating to paths in a network is not valid.

Parameters

network

Network name.

Usage Notes

This function checks the following for validity: table name, geometry column, and cost column for spatial networks; measure-related information for LRS networks; topology-related information for topology networks; and hierarchy-related information for hierarchical networks.

Examples

The following example checks the validity of the metadata related to paths in the network named ROADS_NETWORK.

SELECT SDO_NET.VALIDATE_PATH_SCHEMA('ROADS_NETWORK') FROM DUAL;
 
SDO_NET.VALIDATE_PATH_SCHEMA('ROADS_NETWORK')                                   
--------------------------------------------------------------------------------
TRUE

SDO_NET.VALIDATE_SUBPATH_SCHEMA

Format

SDO_NET.VALIDATE_SUBPATH_SCHEMA(

     network IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the string TRUE if the metadata relating to subpaths in a network is valid; returns the string FALSE if the metadata relating to subpaths in a network is not valid.

Parameters

network

Network name.

Usage Notes

This function checks the validity of information in the subpath table, which is described in Section 5.9.5.

Examples

The following example checks the validity of the metadata related to subpaths in the network named MY_NETWORK.

SELECT SDO_NET.VALIDATE_SUBPATH_SCHEMA('MY_NETWORK') FROM DUAL;
 
SDO_NET.VALIDATE_SUBPATH_SCHEMA('MY_NETWORK')
--------------------------------------------------------------------------------
TRUE
PKξPK ;A OEBPS/loe.htmJ List of Examples

List of Examples

PKxOJPK ;AOEBPS/sdo_net_mem_ref.htm SDO_NET_MEM Package Subprograms

7 SDO_NET_MEM Package Subprograms

The MDSYS.SDO_NET_MEM package contains subprograms (functions and procedures) that constitute part of the PL/SQL application programming interface (API) for the Spatial network data model. This package, which implements capabilities available through the Java API, contains subprograms related to editing and analyzing networks.

To use the subprograms in this chapter, you must understand the conceptual information about networks in Chapter 5, especially Section 5.8, which explains how to use a network memory object.

The SDO_NET_MEM subprograms are grouped according to their associated object-related class in the oracle.spatial.network interface or class. Except for the SDO_NET_MEM.SET_MAX_MEMORY_SIZE procedure, you must specify a prefix after SDO_NET_MEM for each program, depending on its associated class (for example, SDO_NET_MEM.NETWORK_MANAGER.CREATE_LOGICAL_NETWORK, SDO_NET_MEM.NETWORK.ADD_NODE, and SDO_NET_MEM.NODE.GET_COST).

The SDO_NET_MEM subprogram groupings are as follows:

The associations between SDO_NET_MEM subprograms and methods of the Java API are not necessarily exact. In some cases, a PL/SQL subprogram may combine operations and options from several methods. In addition, some Java methods do not have PL/SQL counterparts. Thus, the Usage Notes for subprograms state only that the function or procedure is analogous to a specific Java method, to indicate a logical relationship between the two. For detailed information about a specific Java method and others that may be related, see the Javadoc-generated API documentation (briefly explained in Section 5.11.2).

Note that although this manual refers to "the SDO_NET_MEM package," all subprograms except one are actually implemented as methods of several object types. Thus, they are not listed by the statement DESCRIBE SDO_NET_MEM. Instead, you can use the DESCRIBE statements listed in Table 7-1 to see the subprograms in each grouping; however, because they are member functions and procedures in an object type, the subprograms in each grouping will not be listed in alphabetical order in the DESCRIBE statement output.

Table 7-1 DESCRIBE Statements for SDO_NET_MEM Subprograms

Subprogram GroupingDESCRIBE Statement

SDO_NET_MEM.NETWORK_MANAGER

DESCRIBE sdo_network_manager_t

SDO_NET_MEM.NETWORK

DESCRIBE sdo_network_t

SDO_NET_MEM.NODE

DESCRIBE sdo_node_t

SDO_NET_MEM.LINK

DESCRIBE sdo_link_t

SDO_NET_MEM.PATH

DESCRIBE sdo_path_t


The rest of this chapter provides reference information about the SDO_NET_MEM subprograms, listed in alphabetical order (by grouping, then by name within each grouping), with the SDO_NET_MEM.SET_MAX_MEMORY_SIZE procedure listed first because it does not fit in any grouping.


SDO_NET_MEM.SET_MAX_MEMORY_SIZE

Format

SDO_NET_MEM.SET_MAX_MEMORY_SIZE(

     maxsize IN NUMBER);

Description

Sets the Java maximum heap size for an application to run in an Oracle Java virtual machine.

Parameters

maxsize

Number of bytes for the Java maximum heap size.

Usage Notes

If you encounter the java.lang.OutOfMemoryError exception, you can use this procedure to increase the maximum heap size.

If you specify a value greater than the system limit, the system limit is used.

Examples

The following example sets the Java maximum heap size to 536870912 (512 MB).

EXECUTE SDO_NET_MEM.SET_MAX_MEMORY_SIZE(536870912);

SDO_NET_MEM.LINK.GET_CHILD_LINKS

Format

SDO_NET_MEM.LINK.GET_CHILD_LINKS(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the child links of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the child links of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getChildLinks method of the Link interface of the client-side Java API (described in Section 5.11.2).

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the child links of the link whose link ID is 1001 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.LINK.GET_CHILD_LINKS(net_mem, 1001);
DBMS_OUTPUT.PUT('Link 1001 has the following child links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Link 1001 has the following child links: 1108 1109   

SDO_NET_MEM.LINK.GET_CO_LINK_IDS

Format

SDO_NET_MEM.LINK.GET_CO_LINK_IDS(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the co-links of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with the co-links of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The co-link of a link is that link with its direction reversed. That is, the start node of the co-link is the end node of the original link, and the end node of the co-link is the start node of the original link.

This function is analogous to using the getCoLinks method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the co-links of the link whose link ID is 9876 in the current network memory object. (This example assumes that a variable named res_array of type SDO_NUMBER_ARRAY has been declared, and that a variable named net_mem of type VARCHAR2 contains a network name associated with a network memory object.)

res_array := SDO_NET_MEM.LINK.GET_CO_LINK_IDS(net_mem, 9876);

SDO_NET_MEM.LINK.GET_COST

Format

SDO_NET_MEM.LINK.GET_COST(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the cost value of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the cost value of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getCost method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the cost value of a link, use the SDO_NET_MEM.LINK.SET_COST procedure.

Examples

The following example returns the cost of the link whose link ID is 1104 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.LINK.GET_COST(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The cost of link 1104 is: ' || res_numeric);
. . .
The cost of link 1104 is: 10

SDO_NET_MEM.LINK.GET_END_MEASURE

Format

SDO_NET_MEM.LINK.GET_END_MEASURE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the end measure value of a link in an LRS network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the end measure value of a link in an LRS network in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getEndMeasure method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the end measure of the link whose link ID is 104 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.LINK.GET_END_MEASURE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The end measure of link 104 is: ' || res_numeric);
. . .
The end measure of link 104 is: 6

SDO_NET_MEM.LINK.GET_END_NODE_ID

Format

SDO_NET_MEM.LINK.GET_END_NODE_ID(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID of the end node of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the node ID number of the end node of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getEndNode method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the end node of a link, use the SDO_NET_MEM.LINK.SET_END_NODE procedure.

Examples

The following example returns the end node ID of the link whose link ID is 1104 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.LINK.GET_END_NODE_ID(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The end node of link 1104 is: ' || res_numeric);
. . .
The end node of link 1104 is: 104

SDO_NET_MEM.LINK.GET_GEOM_ID

Format

SDO_NET_MEM.LINK.GET_GEOM_ID(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the geometry ID of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the geometry ID number of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getGeomID method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the geometry ID of a link, use the SDO_NET_MEM.LINK.SET_GEOM_ID procedure.

Examples

The following example returns the geometry ID of the link whose link ID is 104 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.LINK.GET_GEOM_ID(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The geometry ID of link 104 is: ' || res_numeric);
. . .
The geometry ID of link 104 is: 1003

SDO_NET_MEM.LINK.GET_GEOMETRY

Format

SDO_NET_MEM.LINK.GET_GEOMETRY(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the spatial geometry object for a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the SDO_GEOMETRY object for a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getGeometry method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the spatial geometry of a link, use the SDO_NET_MEM.LINK.SET_GEOMETRY procedure.

Examples

The following example returns the spatial geometry of the link whose link ID is 9876 in the current network memory object. (This example assumes that a variable named res_geom of type SDO_GEOMETRY has been declared, and that a variable named net_mem of type VARCHAR2 contains a network name associated with a network memory object.)

res_geom := SDO_NET_MEM.LINK.GET_GEOMETRY(net_mem, 9876)

SDO_NET_MEM.LINK.GET_LEVEL

Format

SDO_NET_MEM.LINK.GET_LEVEL(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the hierarchy level of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the numeric hierarchy level of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getLinkLevel method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the hierarchy level of a link, use the SDO_NET_MEM.LINK.SET_LEVEL procedure.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the hierarchy level of the link whose link ID is 1001 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.LINK.GET_LEVEL(net_mem, 1001);
DBMS_OUTPUT.PUT_LINE('The hierarchy level of link 1001 is: ' || res_numeric);
. . .
The hierarchy level of link 1001 is: 2

SDO_NET_MEM.LINK.GET_NAME

Format

SDO_NET_MEM.LINK.GET_NAME(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the name of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the name of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getName method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the name of a link, use the SDO_NET_MEM.LINK.SET_NAME procedure.

Examples

The following example returns the name of the link whose link ID is 1104 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.LINK.GET_NAME(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The name of link 1104 is: ' || res_string);
. . .
The name of link 1104 is: N3N4

SDO_NET_MEM.LINK.GET_PARENT_LINK_ID

Format

SDO_NET_MEM.LINK.GET_PARENT_LINK_ID(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the link ID number of the parent link of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the link ID number of the parent link of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getParentLink method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the parent link of a link, use the SDO_NET_MEM.LINK.SET_PARENT_LINK procedure.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the parent link ID of the link whose link ID is 1108 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.LINK.GET_PARENT_LINK_ID(net_mem, 1108);
DBMS_OUTPUT.PUT_LINE('The parent link of link 1108 is: ' || res_numeric);
. . .
The parent link of link 1108 is: 1001

SDO_NET_MEM.LINK.GET_SIBLING_LINK_IDS

Format

SDO_NET_MEM.LINK.GET_SIBLING_LINK_IDS(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the sibling links of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the link ID numbers of the sibling links of a link in the specified network memory object. Sibling links are links that have the same parent link. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getSiblingLinkArray method of the Link interface of the client-side Java API (described in Section 5.11.2).

For information about parent and child nodes and links in a network hierarchy, see Section 5.5. However, note that parent and child links can be defined without a network hierarchy or in the same level of a network hierarchy.

Examples

The following example returns the sibling links of the link whose link ID is 1108 in the current network memory object. In this case, the only sibling link is the one whose link ID is 1109. Both links are children of the link whose link ID is 1001, which is between nodes HN1 and HN2. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.LINK.GET_SIBLING_LINK_IDS(net_mem, 1108);
DBMS_OUTPUT.PUT('Link 1108 has the following sibling links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Link 1108 has the following sibling links: 1109

SDO_NET_MEM.LINK.GET_START_MEASURE

Format

SDO_NET_MEM.LINK.GET_START_MEASURE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the start measure value of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the start measure value of a link in an LRS network in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getStartMeasure method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the start measure value of the link whose link ID is 104 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.LINK.GET_START_MEASURE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The start measure of link 104 is: ' || res_numeric);
. . .
The start measure of link 104 is: 0

SDO_NET_MEM.LINK.GET_START_NODE_ID

Format

SDO_NET_MEM.LINK.GET_START_NODE_ID(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID of the start node of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the node ID value of the start node of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getStartNode method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the start node of a link, use the SDO_NET_MEM.LINK.SET_START_NODE procedure.

Examples

The following example returns the start node of the link whose link ID is 1004 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.LINK.GET_START_NODE_ID(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The start node of link 1104 is: ' || res_numeric);
. . .
The start node of link 1104 is: 103

SDO_NET_MEM.LINK.GET_STATE

Format

SDO_NET_MEM.LINK.GET_STATE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the state of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the state of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The state is one of the following string values: ACTIVE or INACTIVE. The link state determines whether or not the link is considered by network analysis functions, such as SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH. If the state is ACTIVE, the link is considered by network analysis functions; if the state is INACTIVE, the link is ignored by these functions.

This function is analogous to using the getState method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the link state, use the SDO_NET_MEM.LINK.SET_STATE procedure.

Examples

The following example returns the state of the link whose link ID is 1104 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.LINK.GET_STATE(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The state of link 1104 is: ' || res_string);
. . .
The state of link 1104 is: ACTIVE

SDO_NET_MEM.LINK.GET_TYPE

Format

SDO_NET_MEM.LINK.GET_TYPE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the type of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the type of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getType method of the Link interface of the client-side Java API (described in Section 5.11.2).

To set the type of a link, use the SDO_NET_MEM.LINK.SET_TYPE procedure.

Examples

The following example sets and gets the type of the link whose link ID is 1119 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_TYPE(net_mem, 1119, 'Associative');
res_string := SDO_NET_MEM.LINK.GET_TYPE(net_mem, 1119);
DBMS_OUTPUT.PUT_LINE('The type of link 1119 is: ' || res_string);
. . .
The type of link 1119 is: Associative

SDO_NET_MEM.LINK.IS_ACTIVE

Format

SDO_NET_MEM.LINK.IS_ACTIVE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a link is active.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the string value TRUE if the link in the specified network memory object is active, and the string value FALSE if the link is not active. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isActive method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the link whose link ID is 1104 in the current network memory object is active. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.LINK.IS_ACTIVE(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 active?: ' || res_string);
. . .
Is link 1104 active?: TRUE

SDO_NET_MEM.LINK.IS_LOGICAL

Format

SDO_NET_MEM.LINK.IS_LOGICAL(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a link is in a logical network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the string value TRUE if the link in the specified network memory object is in a logical network, and the string value FALSE if the link is not in a logical network. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isLogical method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the link whose link ID is 1104 in the current network memory object is in a logical network. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.LINK.IS_LOGICAL(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 a logical link?: ' || res_string);
. . .
Is link 1104 a logical link?: TRUE

SDO_NET_MEM.LINK.IS_TEMPORARY

Format

SDO_NET_MEM.LINK.IS_TEMPORARY(

     net_mem IN VARCHAR2,

     link_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a link is temporary.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

Usage Notes

This function returns the string value TRUE if the link in the specified network memory object is temporary, and the string value FALSE if the link is not temporary. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

Temporary links, nodes, and paths are not saved in the database when you call the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure.

This function is analogous to using the isTemporary method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the link whose link ID is 1104 in the current network memory object is temporary. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.LINK.IS_TEMPORARY(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 temporary?: ' || res_string);
. . .
Is link 1104 temporary?: FALSE

SDO_NET_MEM.LINK.SET_COST

Format

SDO_NET_MEM.LINK.SET_COST(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     cost IN NUMBER);

Description

Sets the cost value of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

cost

Cost value.

Usage Notes

This procedure sets the cost of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setCost method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the cost value of a link, use the SDO_NET_MEM.LINK.GET_COST function.

Examples

The following example sets the cost of the link whose link ID is 1119 in the current network memory object to 40. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_COST(net_mem, 1119, 40);

SDO_NET_MEM.LINK.SET_END_NODE

Format

SDO_NET_MEM.LINK.SET_END_NODE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     end_node_id IN NUMBER);

Description

Sets the end node of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

end_node_id

Node ID number.

Usage Notes

This procedure sets the end node of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setEndNode method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the end node of a link, use the SDO_NET_MEM.LINK.GET_END_NODE_ID function.

Examples

The following example sets the end node of the link whose link ID is 1119 in the current network memory object to the node with the node ID value of 109. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_END_NODE(net_mem, 1119, 109);

SDO_NET_MEM.LINK.SET_GEOM_ID

Format

SDO_NET_MEM.LINK.SET_GEOM_ID(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     geom_id IN NUMBER);

Description

Sets the geometry ID number of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

geom_id

Geometry ID number.

Usage Notes

This procedure sets the geometry ID number of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setGeomID method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the geometry ID of a link, use the SDO_NET_MEM.LINK.GET_GEOM_ID function.

Examples

The following example sets the geometry ID of the link whose link ID is 302 in the current network memory object to 9999.

SDO_NET_MEM.LINK.SET_GEOM_ID(net_mem, 302, 9999);

SDO_NET_MEM.LINK.SET_GEOMETRY

Format

SDO_NET_MEM.LINK.SET_GEOMETRY(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     geom IN SDO_GEOMETRY);

Description

Sets the spatial geometry of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

geom

Spatial geometry object.

Usage Notes

This procedure sets the SDO_GEOMETRY object for a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setGeometry method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the spatial geometry of a link, use the SDO_NET_MEM.LINK.GET_GEOMETRY function.

Examples

The following example sets the spatial geometry of the link whose link ID is 5678 in the current network memory object to a specified line string SDO_GEOMETRY object. (This example assumes that a variable named net_mem of type VARCHAR2 contains a network name associated with a network memory object.)

SDO_NET_MEM.LINK.SET_GEOMETRY(net_mem, 5678,
   SDO_GEOMETRY(2002, NULL, NULL,
     SDO_ELEM_INFO_ARRAY(1,2,1),
       SDO_ORDINATE_ARRAY(9, 4, 1,1)));

SDO_NET_MEM.LINK.SET_LEVEL

Format

SDO_NET_MEM.LINK.SET_LEVEL(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     level IN NUMBER);

Description

Sets the hierarchy level of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

level

Hierarchy level number.

Usage Notes

This procedure sets the hierarchy level of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setLinkLevel method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the hierarchy level of a link, use the SDO_NET_MEM.LINK.GET_LEVEL function.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example sets the hierarchy level of the link whose link ID is 1119 in the current network memory object to 2. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_LEVEL(net_mem, 1119, 2);

SDO_NET_MEM.LINK.SET_MEASURE

Format

SDO_NET_MEM.LINK.SET_MEASURE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     start_measure IN NUMBER,

     end_measure IN NUMBER);

Description

Sets the start and end measure values of a link in an LRS network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

start_measure

Start measure value.

end_measure

End measure value.

Usage Notes

This procedure sets the start and end measure values of a link in an LRS network in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setMeasure method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the start measure of a link, use the SDO_NET_MEM.LINK.GET_START_MEASURE function. To get the end measure of a link, use the SDO_NET_MEM.LINK.GET_END_MEASURE function.

Examples

The following example sets the measure values of the link whose link ID is 302 in the current network memory object, so that the start measure is 111 and the end measure is 114.16. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

SDO_NET_MEM.LINK.SET_MEASURE(net_mem, 302, 111, 114.16);

SDO_NET_MEM.LINK.SET_NAME

Format

SDO_NET_MEM.LINK.SET_NAME(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     link_name IN VARCHAR2);

Description

Sets the name of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

link_name

Link name string.

Usage Notes

This procedure sets the name of a link in an LRS network in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setName method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the name of a link, use the SDO_NET_MEM.LINK.GET_NAME function.

Examples

The following example sets the name of the link whose link ID is 1119 in the current network memory object to My favorite link. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_NAME(net_mem, 1119, 'My favorite link');

SDO_NET_MEM.LINK.SET_PARENT_LINK

Format

SDO_NET_MEM.LINK.SET_PARENT_LINK(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     parent_link_id IN NUMBER);

Description

Sets the parent link of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

parent_link_id

Link ID number of the parent link.

Usage Notes

This procedure sets the parent link of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setParentLink method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the parent link of a link, use the SDO_NET_MEM.LINK.GET_PARENT_LINK_ID function.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example sets the parent link of the link whose link ID is 1119 in the current network memory object to the link whose link ID value is 1001. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_PARENT_LINK(net_mem, 1119, 1001);

SDO_NET_MEM.LINK.SET_START_NODE

Format

SDO_NET_MEM.LINK.SET_START_NODE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     srart_node_id IN NUMBER);

Description

Sets the start node of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

start_node_id

Node ID number.

Usage Notes

This procedure sets the start node of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setStartNode method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the start node of a link, use the SDO_NET_MEM.LINK.GET_START_NODE_ID function.

Examples

The following example sets the start of the link whose link ID is 1119 in the current network memory object to the node whose node ID is 110. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_START_NODE(net_mem, 1119, 110);

SDO_NET_MEM.LINK.SET_STATE

Format

SDO_NET_MEM.LINK.SET_STATE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     state IN VARCHAR2);

Description

Sets the state value of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

state

State value. Must be one of the following strings: ACTIVE or INACTIVE.

Usage Notes

This procedure sets the state of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The link state determines whether or not the link is considered by network analysis functions, such as SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH. If the state is ACTIVE, the link is considered by network analysis functions; if the state is INACTIVE, the link is ignored by these functions.

This procedure is analogous to using the setState method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the link state, use the SDO_NET_MEM.LINK.GET_STATE function.

Examples

The following example sets the state of the link whose link ID is 1119 in the current network memory object to INACTIVE. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.LINK.SET_STATE(net_mem, 1119, 'INACTIVE');

SDO_NET_MEM.LINK.SET_TYPE

Format

SDO_NET_MEM.LINK.SET_TYPE(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     type IN VARCHAR2);

Description

Sets the type of a link.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID number.

type

String reflecting a user-determined type for the link.

Usage Notes

This procedure sets the type of a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setType method of the Link interface of the client-side Java API (described in Section 5.11.2).

To get the type of a link, use the SDO_NET_MEM.LINK.GET_TYPE function.

Examples

The following example sets the type of the link whose link ID is 302 in the current network memory object to Normal street. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

SDO_NET_MEM.LINK.SET_TYPE(net_mem, 302, 'Normal street');

SDO_NET_MEM.NETWORK.ADD_LINK

Format

SDO_NET_MEM.NETWORK.ADD_LINK(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     link_name IN NUMBER,

     start_node_id IN NUMBER,

     end_node_id IN NUMBER,

     cost IN NUMBER);

or

SDO_NET_MEM.NETWORK.ADD_LINK(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     link_name IN NUMBER,

     start_node_id IN NUMBER,

     end_node_id IN NUMBER,

     cost IN NUMBER,

     geom_id IN NUMBER,

     start_measure IN NUMBER,

     end_measure IN NUMBER);

or

SDO_NET_MEM.ADD_LINK(

     net_mem IN VARCHAR2,

     link_id IN NUMBER,

     link_name IN NUMBER,

     start_node_id IN NUMBER,

     end_node_id IN NUMBER,

     geom IN SDO_GEOMETRY,

     cost IN NUMBER);

Description

Adds a link to a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

ID number of the link to be added.

link_name

Name of the link to be added.

start_node_id

Node ID of the start node of the link to be added.

end_node_id

Node ID of the end node of the link to be added.

cost

Cost value associated with the link.

geom_id

For an LRS geometry, the geometry ID of the geometry object.

start_measure

For an LRS geometry, the start measure value in the geometry object corresponding to the start node for this link.

end_measure

For an LRS geometry, the end measure value in the geometry object corresponding to the end node for this link.

geom

SDO_GEOMETRY object (line or contiguous line string geometry) representing the link to be added.

Usage Notes

This procedure adds a link in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the addLink method of the Network class of the client-side Java API (described in Section 5.11.2).

Examples

The following example adds a link whose link ID is 9901 in the current network memory object. (This example is an excerpt from Example 5-1 in Section 5.8.)

-- Add a link with ID=9901, name=N901N1, cost=20 from node N901 to node N1.
sdo_net_mem.network.add_link(net_mem=>'XYZ_NETWORK', link_id=>9901, 
  link_name=>'N901N1', start_node_id=>901, end_node_id=>101, cost=>20);

SDO_NET_MEM.NETWORK.ADD_LRS_NODE

Format

SDO_NET_MEM.NETWORK.ADD_LRS_NODE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     node_name IN VARCHAR2,

     geom_id IN NUMBER,

     measure IN NUMBER,

     geom IN SDO_GEOMETRY,

     external_network_id IN NUMBER,

     external_node_id IN NUMBER);

Description

Adds an LRS node (point geometry with measure information) to a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID of the node to be added.

node_name

Name of the node to be added.

geom_id

Geometry ID of the geometry object.

measure

Measure value of the node to be added.

geom

Geometry object of the node to be added. Must be a linear referencing system (LRS) geometry with the measure value for the third dimension value.

external_network_id

If the node is also a node in an external network, the network ID of the external network.

external_node_id

If the node is also a node in an external network, the node ID of the node in the external network.

Usage Notes

This procedure adds an LRS node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

Examples

The following example adds an LRS node whose node ID is 901 in the network memory object for a network named MY_LRS_NETWORK.

DECLARE
  res_string  VARCHAR2(100);
BEGIN
-- Add an LRS node with ID=901.
SDO_NET_MEM.NETWORK.ADD_LRS_NODE(net_mem=>'MY_LRS_NETWORK', node_id=>901,
  node_name=>'N901', geom_id=>9901, measure=>8, 
  geom=>SDO_GEOMETRY(3301, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1, 1), 
    SDO_ORDINATE_ARRAY(8,13,9)),
  external_network_id=>0, external_node_id=>0);
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME('ROADS_NETWORK', 901);
DBMS_OUTPUT.PUT_LINE('The name of node 901 is: ' || res_string);
END;  
/
. . . 
The name of node 901 is: N901

SDO_NET_MEM.NETWORK.ADD_NODE

Format

SDO_NET_MEM.NETWORK.ADD_NODE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     node_name IN VARCHAR2,

     geom IN SDO_GEOMETRY DEFAULT NULL

     external_network_id IN NUMBER,

     external_node_id IN NUMBER);

Description

Adds a node (with no associated geometry object) to a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID of the node to be added.

node_name

Name of the node to be added.

geom

Geometry object associated with the node. If this parameter is null, no geometry object is associated with the node.

external_network_id

If the node is also a node in an external network, the network ID of the external network.

external_node_id

If the node is also a node in an external network, the node ID of the node in the external network.

Usage Notes

This procedure adds a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the addNode method of the Network class of the client-side Java API (described in Section 5.11.2).

Examples

The following example adds a node whose node ID is 901 in the current network memory object. (This example is an excerpt from Example 5-1 in Section 5.8.)

-- Add a node with ID=901, and set its name to N901.
sdo_net_mem.network.add_node(net_mem=>'XYZ_NETWORK', node_id=>901,
  node_name=>'N901', external_network_id=>0, external_node_id=>0);

SDO_NET_MEM.NETWORK.ADD_PATH

Format

SDO_NET_MEM.NETWORK.ADD_PATH(

     net_mem IN VARCHAR2,

     path_id IN NUMBER);

or

SDO_NET_MEM.NETWORK.ADD_PATH(

     net_mem IN VARCHAR2,

     path_ids IN SDO_NUMBER_ARRAY);

Description

Adds one or more paths to a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID of the path to be added.

path_ids

SDO_NUMBER_ARRAY object specifying the path IDs of the paths to be added.

Usage Notes

This procedure adds one or more paths in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the addPath method of the Network class of the client-side Java API (described in Section 5.11.2).

Examples

The following example adds a path whose path ID is stored in a variable named path_id. (This example is an excerpt from Example 5-1 in Section 5.8.)

sdo_net_mem.network.add_path(net_mem=>'XYZ_NETWORK', path_id=>path_id);

SDO_NET_MEM.NETWORK.ADD_SDO_NODE

Format

SDO_NET_MEM.NETWORK.ADD_SDO_NODE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     node_name IN VARCHAR2,

     x IN VARCHAR2,

     y IN VARCHAR2,

     srid IN NUMBER);

Description

Adds a node (with associated spatial coordinates) to a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID of the node to be added.

node_name

Name of the node to be added.

x

X-axis coordinate value for the node to be added.

y

Y-axis coordinate value for the node to be added.

srid

Coordinate system (spatial reference system) associated with the node. Must match the SRID associated with the node table in the USER_SDO_GEOM_METADATA view.

Usage Notes

This procedure adds a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the addNode method of the Network class of the client-side Java API (described in Section 5.11.2).

Examples

The following example adds an SDO node whose node ID is 801 in the network memory object for a network named ROADS_NETWORK.

DECLARE
  res_string  VARCHAR2(100);
BEGIN
-- Add an SDO node with ID=801.
SDO_NET_MEM.NETWORK.ADD_SDO_NODE(net_mem=>'ROADS_NETWORK', 
  node_id=>801, node_name=>'N801', x=>8, y=>12, srid=>null);
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME('ROADS_NETWORK', 801);
DBMS_OUTPUT.PUT_LINE('The name of node 801 is: ' || res_string);
END;  
/
. . .
The name of node 801 is: N801

SDO_NET_MEM.NETWORK.DELETE_LINK

Format

SDO_NET_MEM.NETWORK.DELETE_LINK(

     net_mem IN VARCHAR2,

     link_id IN NUMBER);

Description

Deletes a link from a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

link_id

Link ID of the link to be deleted.

Usage Notes

This procedure deletes a link from the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the deleteLink method of the Network interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example deletes the link whose link ID is 302 in the network memory object for a network named MY_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK.DELETE_LINK('MY_NETWORK', 302);

SDO_NET_MEM.NETWORK.DELETE_NODE

Format

SDO_NET_MEM.NETWORK.DELETE_NODE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER);

Description

Deletes a node from a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID of the node to be deleted.

Usage Notes

This procedure deletes a node from the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the deleteNode method of the Network interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example deletes the node whose node ID is 8 in the network memory object for a network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK.DELETE_NODE('ROADS_NETWORK', 8);

SDO_NET_MEM.NETWORK.DELETE_PATH

Format

SDO_NET_MEM.NETWORK.DELETE_PATH(

     net_mem IN VARCHAR2,

     path_id IN NUMBER);

Description

Deletes a path from a network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID of the path to be deleted.

Usage Notes

This procedure deletes a path from the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

An exception is raised if the specified network memory object is read-only.

This procedure is analogous to using the deletePath method of the Network interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example deletes the path whose path ID is 1 in the network memory object for a network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK.DELETE_PATH('ROADS_NETWORK', 1);

SDO_NET_MEM.NETWORK.GET_MAX_LINK_ID

Format

SDO_NET_MEM.LINK.GET_MAX_LINK_ID(

     net_mem IN VARCHAR2,

     ) RETURN NUMBER;

Description

Returns the link ID with the highest numeric value.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the link ID with the highest numeric value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getMaxLinkId method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the link ID with the highest numeric value in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SELECT SDO_NET_MEM.NETWORK.GET_MAX_LINK_ID(net_mem) 
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum link ID = ' || res_numeric);
. . .
Maximum link ID = 1119

SDO_NET_MEM.NETWORK.GET_MAX_NODE_ID

Format

SDO_NET_MEM.LINK.GET_MAX_NODE_ID(

     net_mem IN VARCHAR2,

     ) RETURN NUMBER;

Description

Returns the node ID with the highest numeric value.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the node ID with the highest numeric value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getMaxNodeId method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the node ID with the highest numeric value in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SELECT SDO_NET_MEM.NETWORK.GET_MAX_NODE_ID(net_mem) 
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum node ID = ' || res_numeric);
. . .
Maximum node ID = 114

SDO_NET_MEM.NETWORK.GET_MAX_PATH_ID

Format

SDO_NET_MEM.LINK.GET_MAX_PATH_ID(

     net_mem IN VARCHAR2,

<p class="synopsis">     ) RETURN NUMBER;

Description

Returns the path ID with the highest numeric value.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the path ID with the highest numeric value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getMaxPathId method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path ID with the highest numeric value in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SELECT SDO_NET_MEM.NETWORK.GET_MAX_PATH_ID(net_mem) 
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum path ID = ' || res_numeric);
. . .
Maximum path ID = 28

SDO_NET_MEM.NETWORK.GET_MAX_SUBPATH_ID

Format

SDO_NET_MEM.LINK.GET_MAX_SUBPATH_ID(

     net_mem IN VARCHAR2,

     ) RETURN NUMBER;

Description

Returns the subpath ID with the highest numeric value.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the subpath ID with the highest numeric value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getMaxSubpathId method of the Link interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the subpath ID with the highest numeric value in the current network memory object. In this case the network has no subpaths, and so the returned value is 0 (zero). (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SELECT SDO_NET_MEM.NETWORK.GET_MAX_SUBPATH_ID(net_mem) 
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum subpath ID = ' || res_numeric);
. . .
Maximum subpath ID = 0

SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS

Format

SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS(

     net_mem IN VARCHAR2,

     start_node_id IN NUMBER,

     goal_node_id IN NUMBER,

     depth_limit IN NUMBER,

     cost_limit IN NUMBER,

     no_of_solutions IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns all paths between two nodes.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

start_node_id

Node ID of the start node in the pair of nodes between which to find paths.

goal_node_id

Node ID of the end (goal) node in the pair of nodes between which to find paths.

depth_limit

Maximum number of links in the resultant paths. If this parameter is null, no maximum number of links is applied.

This parameter is ignored if a constraint parameter value is specified.

cost_limit

Maximum cost total value of the links in a path. If this parameter is null, no cost limit is applied.

This parameter is ignored if a constraint parameter value is specified.

no_of_solutions

Maximum number of paths to be returned. If this parameter is null, all paths that meet the other criteria for this function are returned.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

If constraint is not null, any depth_limit and cost_limit values are ignored.

Usage Notes

This function returns paths between a start node and an end (goal) node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the allPaths method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns up to 5 paths, each up to a maximum cost value of 200, between the nodes with node ID values 101 and 105 in the current network memory object. It also displays some information about each returned path. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS(net_mem,101,105,10,200,5);
DBMS_OUTPUT.PUT_LINE('For each path from node 101 to node 105: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric ||
                       ' has the following properties: ');
  cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
  res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_array(indx));  
  DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);       
END LOOP;

For each path from node 101 to node 105:                                        
Path 7 has the following properties:                                                
Path 7 cost: 50                                                                 
Is path 7 closed? FALSE                                                         
Path 8 has the following properties:                                                
Path 8 cost: 70                                                                 
Is path 8 closed? FALSE                                                         
Path 9 has the following properties:                                                
Path 9 cost: 70                                                                 
Is path 9 closed? FALSE                                                         
Path 10 has the following properties:                                               
Path 10 cost: 90                                                                
Is path 10 closed? FALSE                                                        
Path 11 has the following properties:                                               
Path 11 cost: 120                                                               
Is path 11 closed? FALSE

SDO_NET_MEM.NETWORK_MANAGER.CREATE_LOGICAL_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.CREATE_LOGICAL_NETWORK(

     network_name IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN VARCHAR2,

     node_table_name IN VARCHAR2 DEFAULT NULL,

     node_cost_column IN VARCHAR2 DEFAULT NULL,

     link_table_name IN VARCHAR2 DEFAULT NULL,

     link_cost_column IN VARCHAR2 DEFAULT NULL,

     path_table_name IN VARCHAR2 DEFAULT NULL,

     path_link_table_name IN VARCHAR2 DEFAULT NULL,

     sub_path_table_name IN VARCHAR2 DEFAULT NULL,

     is_complex IN VARCHAR2 DEFAULT 'FALSE');

Description

Creates a logical network, creates all necessary tables, and updates the network metadata.

Parameters

network_name

Name of the network.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A string value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If this parameter is null, the node table name will be in the form <network-name>_NODE$.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If this parameter is null, the cost column name will be COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If this parameter is null, the link table name will be in the form <network-name>_LINK$.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If this parameter is null, the cost column name will be COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If this parameter is null, the path table name will be in the form <network-name>_PATH$.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If this parameter is null, the path-link table name will be in the form <network-name>_PLINK$.

sub_path_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.) If this parameter is null, the subpath table name will be in the form <network-name>_SPATH$.

is_complex

Reserved for future use. Ignored for the current release.

Usage Notes

This procedure creates a logical network in a network memory object, the use of which is explained in Section 5.8.

This procedure provides a convenient way to create a logical network when the node, link, and optional related tables do not already exist. The procedure creates the network in memory. When you save the network objects to the database using the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure, the node, link, path, and path-link tables for the network are created, and the appropriate information is inserted in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

Examples

The following example creates a logical network named MY_LOGICAL_NET. The network has two hierarchy levels and is undirected ('FALSE' for is_directed).

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.CREATE_LOGICAL_NETWORK('MY_LOGICAL_NET', -
  2, 'FALSE', 'MY_NODE_TABLE', 'COST', 'MY_LINK_TABLE', 'COST', -
  'MY_PATH_TABLE', 'MY_PATHLINK_TABLE', 'FALSE');

SDO_NET_MEM.NETWORK_MANAGER.CREATE_LRS_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.CREATE_LRS_NETWORK(

     network_name IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN VARCHAR2,

     srid IN NUMBER,

     no_of_dims IN NUMBER,

     node_table_name IN VARCHAR2 DEFAULT NULL,

     node_cost_column IN VARCHAR2 DEFAULT NULL,

     link_table_name IN VARCHAR2 DEFAULT NULL,

     link_cost_column IN VARCHAR2 DEFAULT NULL,

     lrs_table_name IN VARCHAR2,

     lrs_geom_column IN VARCHAR2,

     path_table_name IN VARCHAR2 DEFAULT NULL,

     path_geom_column IN VARCHAR2 DEFAULT NULL,

     path_link_table_name IN VARCHAR2 DEFAULT NULL,

     sub_path_table_name IN VARCHAR2 DEFAULT NULL,

     sub_path_geom_column IN VARCHAR2 DEFAULT NULL,

     is_complex IN VARCHAR2 DEFAULT 'FALSE');

Description

Creates a spatial network containing LRS SDO_GEOMETRY objects, creates all necessary tables, and updates the network metadata.

Parameters

network_name

Name of the network.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A string value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

srid

Coordinate system (spatial reference system) associated with the network. Must be specified as either null (no coordinate system is associated) or a value from the SRID column of the SDO_COORD_REF_SYS table (described in Oracle Spatial Developer's Guide).

no_of_dims

Number of dimensions for the data, including the LRS measure dimension.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If this parameter is null, the node table name will be in the form <network-name>_NODE$.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If this parameter is null, the cost column name will be COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If this parameter is null, the link table name will be in the form <network-name>_LINK$.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If this parameter is null, the cost column name will be COST.

lrs_table_name

Name of the table to be created for the spatial LRS geometries

lrs_geom_column

Name of the column of type SDO_GEOMETRY in the table for the spatial LRS geometries.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If this parameter is null, the path table name will be in the form <network-name>_PATH$.

path_geom_column

Name of the column of type SDO_GEOMETRY in the path table. If this parameter is null, the geometry column name will be GEOMETRY.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If this parameter is null, the path-link table name will be in the form <network-name>_PLINK$.

sub_path_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.) If this parameter is null, the subpath table name will be in the form <network-name>_SPATH$.

sub_path_geom_column

Name of the column of type SDO_GEOMETRY in the subpath table. If this parameter is null, the geometry column name will be GEOMETRY.

is_complex

Reserved for future use. Ignored for the current release.

Usage Notes

This procedure creates a spatial LRS network in a network memory object, the use of which is explained in Section 5.8.

This procedure provides a convenient way to create a spatial LRS network when the node, link, and optional related tables do not already exist. The procedure creates the network in memory. When you save the network objects to the database using the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure, the node, link, path, and path-link tables for the network are created, and the appropriate information is inserted in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

Examples

The following example creates an LRS network named MY_LRS_NET. The network has one hierarchy level, is undirected ('FALSE' for is_directed), is based on SRID 8307, and has three-dimensional geometries.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.CREATE_LRS_NETWORK('MY_LRS_NET', -
  1, 'FALSE', 8307, 3, 'MY_NODE_TABLE', 'COST', 'MY_LINK_TABLE', 'COST', -
  'MY_LRS_TABLE', 'GEOM', 'MY_PATH_TABLE', 'GEOM', -
  'MY_PATHLINK_TABLE', 'FALSE');

SDO_NET_MEM.NETWORK_MANAGER.CREATE_REF_CONSTRAINTS

Format

SDO_NET_MEM.NETWORK_MANAGER.CREATE_REF_CONSTRAINTS(

     network IN VARCHAR2);

Description

Creates referential integrity constraints on the link and path tables.

Parameters

network

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This procedure creates referential integrity constraints on the link and path tables in a network memory object, the use of which is explained in Section 5.8.

When the referential integrity constraints are created, they are automatically enabled. You can disable the referential integrity constrains by calling the SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS procedure, and enable them again by calling the SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS procedure.

This procedure is analogous to using the createRefConstraints method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example creates referential integrity constraints on the link and path tables in the network memory object for the network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.CREATE_REF_CONSTRAINTS('ROADS_NETWORK');

SDO_NET_MEM.NETWORK_MANAGER.CREATE_SDO_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.CREATE_SDO_NETWORK(

     network_name IN VARCHAR2,

     no_of_hierarchy_levels IN NUMBER,

     is_directed IN VARCHAR2,

     srid IN NUMBER,

     no_of_dims IN NUMBER,

     node_table_name IN VARCHAR2 DEFAULT NULL,

     node_geom_column IN VARCHAR2 DEFAULT NULL,

     node_cost_column IN VARCHAR DEFAULT NULL2,

     link_table_name IN VARCHAR2 DEFAULT NULL,

     link_geom_column IN VARCHAR2 DEFAULT NULL,

     link_cost_column IN VARCHAR2 DEFAULT NULL,

     path_table_name IN VARCHAR2 DEFAULT NULL,

     path_geom_column IN VARCHAR2 DEFAULT NULL,

     path_link_table_name IN VARCHAR2 DEFAULT NULL,

     sub_path_table_name IN VARCHAR2 DEFAULT NULL,

     sub_path_geom_column IN VARCHAR2 DEFAULT NULL,

     is_complex IN VARCHAR2 DEFAULT 'FALSE');

Description

Creates a spatial network containing non-LRS SDO_GEOMETRY objects, creates all necessary tables, and updates the network metadata.

Parameters

network_name

Name of the network.

no_of_hierarchy_levels

Number of hierarchy levels for links in the network. (For an explanation of network hierarchy, see Section 5.5.)

is_directed

A string value. TRUE indicates that the links are directed; FALSE indicates that the links are undirected (not directed).

srid

Coordinate system (spatial reference system) associated with the network. Must be specified as either null (no coordinate system is associated) or a value from the SRID column of the SDO_COORD_REF_SYS table (described in Oracle Spatial Developer's Guide).

no_of_dims

Number of dimensions for the spatial data.

node_table_name

Name of the node table to be created. (The node table is explained in Section 5.9.1.) If this parameter is null, the node table name will be in the form <network-name>_NODE$.

node_geom_column

Name of the column of type SDO_GEOMETRY in the node table. (The node table is explained in Section 5.9.1.) If this parameter is null, the geometry column name will be GEOMETRY.

node_cost_column

Name of the cost column in the node table. (The node table is explained in Section 5.9.1.) If this parameter is null, the cost column name will be COST.

link_table_name

Name of the link table to be created. (The link table is explained in Section 5.9.2.) If this parameter is null, the link table name will be in the form <network-name>_LINK$.

link_geom_column

Name of the column of type SDO_GEOMETRY in the link table. (The link table is explained in Section 5.9.2.) If this parameter is null, the geometry column name will be GEOMETRY.

link_cost_column

Name of the cost column in the link table. (The link table is explained in Section 5.9.2.) If this parameter is null, the cost column name will be COST.

path_table_name

Name of the path table to be created. (The path table is explained in Section 5.9.3.) If this parameter is null, the path table name will be in the form <network-name>_PATH$.

path_geom_column

Name of the column of type SDO_GEOMETRY in the path table. (The path table is explained in Section 5.9.3.) If this parameter is null, the geometry column name will be GEOMETRY.

path_link_table_name

Name of the path-link table to be created. (The path-link table is explained in Section 5.9.4.) If this parameter is null, the path-link table name will be in the form <network-name>_PLINK$.

sub_path_table_name

Name of the subpath table to be created. (The subpath table is explained in Section 5.9.5.) If this parameter is null, the subpath table name will be in the form <network-name>_SPATH$.

sub_path_geom_column

Name of the column of type SDO_GEOMETRY in the path table. (The path table is explained in Section 5.9.3.) If this parameter is null, the geometry column name will be GEOMETRY.

is_complex

Reserved for future use. Ignored for the current release.

Usage Notes

This procedure creates a spatial (SDO) network in a network memory object, the use of which is explained in Section 5.8.

This procedure provides a convenient way to create a spatial (SDO) network when the node, link, and optional related tables do not already exist. The procedure creates the network in memory. When you save the network objects to the database using the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure, the node, link, path, and path-link tables for the network are created, and the appropriate information is inserted in the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

Examples

The following example creates an SDO network named MY_SDO_NET. The network has one hierarchy level, is undirected ('FALSE' for is_directed), is based on SRID 8307, and has two-dimensional geometries.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.CREATE_SDO_NETWORK('MY_SDO_NET', -
  1, 'FALSE', 8307, 2, -
  'MY_NODE_TABLE', 'GEOM', 'COST', 'MY_LINK_TABLE', 'GEOM', 'COST', -
  'MY_PATH_TABLE', 'GEOM', 'MY_PATHLINK_TABLE', 'FALSE');

SDO_NET_MEM.NETWORK_MANAGER.DEREGISTER_CONSTRAINT

Format

SDO_NET_MEM.NETWORK_MANAGER.DEREGISTER_CONSTRAINT(

     constraint_name IN VARCHAR2);

Description

Unloads (removes) the class for the specified network constraint from the Java repository in the database, and deletes the row for that constraint from the USER_SDO_NETWORK_CONSTRAINTS view (described in Section 5.10.2).


Note:

This procedure is deprecated, and it will not be supported in a future release. You are encouraged to use the SDO_NET.DEREGISTER_CONSTRAINT procedure instead.

Parameters

constraint_name

Name of the network constraint. Must match a value in the CONSTRAINT column of the USER_SDO_NETWORK_CONSTRAINTS view.

Usage Notes

Use this procedure if you want to disable a network constraint that you had previously enabled, such as by using the SDO_NET_MEM.NETWORK_MANAGER.REGISTER_CONSTRAINTprocedure. For more information about network constraints, see Section 5.6.

This procedure is analogous to using the deregisterConstraint method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example deregisters (disables) a network constraint named GivenProhibitedTurn.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.DEREGISTER_CONSTRAINT('GivenProhibitedTurn');

SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS

Format

SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS(

     network IN VARCHAR2);

Description

Disables referential integrity constraints on the link and path tables.

Parameters

network

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This procedure disables referential integrity constraints (created using the SDO_NET_MEM.NETWORK_MANAGER.CREATE_REF_CONSTRAINTS) on the link and path tables in a network memory object, the use of which is explained in Section 5.8.

When the referential integrity constraints are created, they are automatically enabled. You can disable the referential integrity constrains by calling the SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS procedure, and enable them again by calling the SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS procedure.

This procedure is analogous to using the disableRefConstraints method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example disables the referential integrity constraints on the link and path tables in the network memory object for the network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS('ROADS_NETWORK');

SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK(

     net_mem IN VARCHAR2);

Description

Drops (deletes) the network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This procedure deletes the network in a network memory object, the use of which is explained in Section 5.8.

This procedure is analogous to using the dropNetwork method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example deletes the network in the network memory object for the network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK('ROADS_NETWORK');

SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS

Format

SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS(

     network IN VARCHAR2);

Description

Enables referential integrity constraints on the link and path tables.

Parameters

network

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This procedure enables referential integrity constraints (that had been disabled using the SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS procedure) on the link and path tables in a network memory object, the use of which is explained in Section 5.8.

When the referential integrity constraints are created, they are automatically enabled. You can disable the referential integrity constrains by calling the SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS procedure, and enable them again by calling the SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS procedure.

This procedure is analogous to using the enableRefConstraints method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example enables the referential integrity constraints on the link and path tables in the network memory object for the network named ROADS_NETWORK.

EXECUTE SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS('ROADS_NETWORK');

SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS

Format

SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS(

     net_mem IN VARCHAR2

     ) RETURN NUMBER;

Description

Returns the number of groups of connected components.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the number of connected components in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

Connected components are a group of nodes, connected by links, such that each node in the group can reach or be reached from all other nodes in the group. For example, the logical network shown in Example 5-5 in Section 5.13.4 contains two groups of connected components: in one group, all nodes in hierarchy level 1 can reach or be reached by all other nodes in that level; and in the other group, the two nodes in hierarchy level 2 can reach each other.

Nodes that belong to the same component have the same component number. To get the component number for a node, use the SDO_NET_MEM.NODE.GET_COMPONENT_NO function. To set the component number for a node, use the SDO_NET_MEM.NODE.SET_COMPONENT_NO procedure.

This function is analogous to using the findConnectedComponents method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the child links of the link whose link ID is 1001 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS(net_mem);
DBMS_OUTPUT.PUT_LINE('The number of connected components is: ' || res_numeric);
. . .
The number of connected components is: 2

SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHABLE_NODES

Format

SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHABLE_NODES(

     net_mem IN VARCHAR2,

     source_node_id IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the node ID numbers of nodes that can be reached by a path from a specified source node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

source_node_id

Node ID of the source node.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of node ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

If no results can be found that match the criteria, this function returns a null value.

This function is analogous to using the findReachableNodes method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example nodes that can be reached from the node whose node ID is 101 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHABLE_NODES(net_mem,101);
DBMS_OUTPUT.PUT_LINE('Reachable nodes from 101: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Reachable nodes from 101:
103 102 104 106 105 107 108 109 110 113 111 112 114

SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHING_NODES

Format

SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHING_NODES(

     net_mem IN VARCHAR2,

     target_node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the node ID numbers of nodes that can reach (by a path) a specified target node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

target_node_id

Node ID of the target node.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of node ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

If no results can be found that match the criteria, this function returns a null value.

This function is analogous to using the findReaching_Nodes method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example nodes from which the node whose node ID is 101 in the current network memory object can be reached. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHING_NODES(net_mem,101);
DBMS_OUTPUT.PUT_LINE('Nodes from which 101 can be reached: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Nodes from which 101 can be reached:
103 102 104 106 105 107 108 109 110 113 111 112 114

SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE

Format

SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE(

     net_mem IN VARCHAR2,

     source_node_id IN NUMBER,

     target_node_id IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN VARCHAR2;

Description

Checks if a specified target node can be reached by a path from a specified source node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

source_node_id

Node ID of the source node.

target_node_id

Node ID of the target node.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns the string TRUE if the target node can be reached from the source node, and the string FALSE if the target node cannot be reached from the source node. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isReachable method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the child links of the link whose link ID is 1001 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('Can node 101 reach node 105? ' || res_string);
. . .
Can node 101 reach node 105? TRUE

SDO_NET_MEM.NETWORK_MANAGER.LIST_NETWORKS

Format

SDO_NET_MEM.NETWORK_MANAGER.LIST_NETWORKS() RETURN VARCHAR2;

Description

Returns a list of networks.

Parameters

None.

Usage Notes

This function returns a comma-delimited list of network names in the current network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

Examples

The following example returns the names of all networks with network memory objects in the cache. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_string := SDO_NET_MEM.NETWORK_MANAGER.LIST_NETWORKS;
DBMS_OUTPUT.PUT_LINE('The current in-memory network(s) is/are: ' || res_string);
. . .
The current in-memory network(s) is/are: ROADS_NETWORK

SDO_NET_MEM.NETWORK_MANAGER.MCST_LINK

Format

SDO_NET_MEM.NETWORK_MANAGER.MCST_LINK(

     net_mem IN VARCHAR2

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the minimum cost spanning tree.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with the link ID values of links that make up the minimum cost spanning tree in the specified network memory object. The minimum cost spanning tree is the path with the lowest total cost that visits all nodes in the network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The Kruskal algorithm is used to determine the minimum cost spanning tree.

This function is analogous to using the mcstLinkArray method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the links in the minimum cost spanning tree of the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.MCST_LINK(net_mem);
DBMS_OUTPUT.PUT('Network ' || net_mem || ' has the following MCST links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Network XYZ_NETWORK has the following MCST links: 1001 1101 1104 1107 1110 1114
1117 1102 1105 1108 1111 1115 1118 1113

SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS

Format

SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(

     net_mem IN VARCHAR2,

     start_node_id IN NUMBER,

     no_of_neighbors IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the path ID numbers of paths leading to nodes that are the nearest neighbors (determined by total cost) of a specified start node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

start_node_id

Node ID of the start node.

no_of_neighbors

Maximum number of path IDs to return.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of path ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

If no results can be found that match the criteria, this function returns a null value.

To determine the end node in each path returned, use the SDO_NET_MEM.PATH.GET_END_NODE_ID function. To determine the links in each path returned, use the SDO_NET_MEM.PATH.GET_LINK_IDS function.

This function is analogous to using the nearestNeighbors method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path IDs of the paths to the three nodes nearest to the node whose node ID is 101 in the current network memory object. It also displays the link IDs for each link in each of the returned paths. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(net_mem,101,3);
DBMS_OUTPUT.PUT_LINE('Path IDs to the nearest 3 neighbors of node 101 are: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', which contains links: ');
  var1_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);
  FOR indx1 IN var1_array.FIRST..var1_array.LAST
  LOOP
    var1_numeric := var1_array(indx1);
    DBMS_OUTPUT.PUT(var1_numeric || ' ');
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
. . .
Path IDs to the nearest 3 neighbors of node 101 are:                            
1, which contains links: 1101                                                   
2, which contains links: 1102                                                   
3, which contains links: 1102 1104

SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK(

     net_mem IN VARCHAR2,

     allow_updates IN VARCHAR2);

or

SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK(

     net_mem IN VARCHAR2,

     network IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     allow_updates IN VARCHAR2);

Description

Creates a network memory object in virtual memory cache containing all network objects in a network (first format), or those objects completely inside a specified minimum bounding rectangle (MBR) (second format).

Parameters

net_mem

For the first format: name of the network, all of whose network objects (nodes, links, paths, subpaths) are to be copied into a network memory object that has the same name as the network. For the second format: user-specified name for the network memory object to contain only those network objects completely inside the MBR specified by the xmin, xmax, ymin, and ymax parameters for the network specified by the network parameter.

network

Name of the network from which to add network objects (nodes, links, paths) into the network memory object. Only those objects in the MBR specified by the xmin, xmax, ymin, and ymax parameters are loaded.

xmin

Minimum X coordinate value of the MBR from which objects in the specified network are to be added to the network memory object.

ymin

Minimum Y coordinate value of the MBR from which objects in the specified network are to be added to the network memory object.

xmax

Maximum X coordinate value of the MBR from which objects in the specified network are to be added to the network memory object.

ymax

Maximum Y coordinate value of the MBR from which objects in the specified network are to be added to the network memory object.

allow_updates

TRUE specifies that the network memory object is updatable; that is, you can perform editing operations in the cache and have them written back to the database. FALSE specifies that the network memory object is read-only; that is, you cannot perform editing operations in the cache and have them written back to the database.

Usage Notes

This procedure creates a network memory object, the use of which is explained in Section 5.8.

For better performance, if you only need to retrieve information or to perform network analysis operations, specify the string FALSE for the allow_updates parameter.

If allow_updates is specified as TRUE, rows in the network tables (node, link, path, and path-link) are locked at the database level (through SELECT ... FOR UPDATE NOWAIT statements). This prevents update or delete operations on the locked elements in other SQL sessions; however, insert operations in other sessions are allowed.

This procedure is analogous to using the readNetwork method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example places a copy of all network objects in the network named NET_LOGICAL into an updatable ('TRUE' for allow_updates) network memory object.

SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK('NET_LOGICAL', 'TRUE');

The following example places a copy of all network objects inside a specified area of the network named HILLSBOROUGH_NETWORK into a read-only ('FALSE' for allow_updates) network memory object named HILLS_PART1. The objects loaded are in the rectangular area with one corner at longitude/latitude coordinates (-71.64, 43.32) and the other corner at coordinates (-71.32, 43.64). (On a traditional map, these would be the lower-left and upper-right corners, respectively.)

SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK('HILLS_PART1', 'HILLSBOROUGH_NETWORK', -71.64, 43.32, -71.32, 43.64, 'FALSE');

SDO_NET_MEM.NETWORK_MANAGER.REGISTER_CONSTRAINT

Format

SDO_NET_MEM.NETWORK_MANAGER.REGISTER_CONSTRAINT(

     constraint_name IN VARCHAR2,

     class_name IN VARCHAR2,

     directory_name IN VARCHAR2,

     description IN VARCHAR2);

Description

Loads the compiled Java code for the specified network constraint into the Java class repository in the database, and loads the class name into the CLASS column of the USER_SDO_NETWORK_CONSTRAINTS view (described in Section 5.10.2).


Note:

This procedure is deprecated, and it will not be supported in a future release. You are encouraged to use the SDO_NET.REGISTER_CONSTRAINT procedure instead.

Parameters

constraint_name

Name of the network constraint.

class_name

Fully qualified name (including the name of the package) of the class that implements the network constraint.

directory_name

Name of the directory object (created using the SQL statement CREATE DIRECTORY) that identifies the location of the class file created when you compiled the network constraint.

description

Description of the network constraint.

Usage Notes

Before you call this procedure, you must insert a row into the USER_SDO_NETWORK_CONSTRAINTS view, compile the code for the Java class that implements the network constraint, and use the CREATE DIRECTORY statement to create a directory object identifying the location of the compiled class. For more information about network constraints, see Section 5.6.

To delete the row for the constraint from the USER_SDO_NETWORK_CONSTRAINTS view and thus disable the constraint, use the SDO_NET_MEM.NETWORK_MANAGER.DEREGISTER_CONSTRAINT procedure.

This procedure is analogous to using the registerConstraint method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example registers a network constraint named GivenProhibitedTurn.

-- Set up the network constraint.
REM
REM Create the geor_dir on the file system first.
REM
-- Connect as SYSTEM.
DECLARE 
  -- This is the directory that contains the CLASS file generated when you
  -- compiled the network constraint.
  geor_dir varchar2(1000) := 'C:\my_data\files81\PROTOTYPES\NETWORK_CONSTRAINT\PLSQL_EXAMPLE';
BEGIN 
  EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY work_dir AS''' || geor_dir || ''''; 
END;
/
GRANT read,write on directory work_dir to net_con;
 
-- Connect as the user that will register the constraint. 
 
REM
REM Compile GivenProhibitedTurn before you register the constraint.
REM
BEGIN
  SDO_NET_MEM.NETWORK_MANAGER.REGISTER_CONSTRAINT('GivenProhibitedTurn', 
     'com/network/constraints/ProhibitedTurn',
     'WORK_DIR', 'This is a network constraint that '||
     'prohibits certain turns');
 
END;
/

SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH

Format

SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(

     net_mem IN VARCHAR2,

     start_node_id IN NUMBER,

     goal_node_id IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN NUMBER;

Description

Returns the path ID number of the shortest path (based on the A* search algorithm, and considering costs) between a start node and a goal (end) node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

start_node_id

Node ID of the start node.

goal_node_id

Node ID of the goal (end) node.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns a path ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function returns a null value if no path can be made between the specified nodes. For example, if the state of one or more nodes or links is INACTIVE, and if this condition causes all possible paths to be ignored, the function will return a null value.

To determine the links in the returned path, use the SDO_NET_MEM.PATH.GET_LINK_IDS function.

This function is analogous to using the shortestPath method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path ID of the shortest path between the nodes with node ID values 101 and 105 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('The shortest path from node 101 to node 105 is path ID: ' || res_numeric);

SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH_DIJKSTRA

Format

SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH_DIJKSTRA(

     net_mem IN VARCHAR2,

     start_node_id IN NUMBER,

     goal_node_id IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN NUMBER;

Description

Returns the path ID number of the shortest path (based on the Dijkstra search algorithm, and considering costs) between a start node and a goal (end) node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

start_node_id

Node ID of the start node.

goal_node_id

Node ID of the goal (end) node.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns a path ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function returns a null value if no path can be made between the specified nodes. For example, if the state of one or more nodes or links is INACTIVE, and if this condition causes all possible paths to be ignored, the function will return a null value.

To determine the links in the returned path, use the SDO_NET_MEM.PATH.GET_LINK_IDS function.

This function is analogous to using the shortestPathDijkstra method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path ID of the shortest path (based on the Dijkstra search algorithm, and considering costs) between the nodes with node ID values 101 and 105 in the current network memory object. It also displays information about the returned path. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH_DIJKSTRA(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('The shortest Dijkstra path from node 101 to node 105 is ' || res_numeric);
 
DBMS_OUTPUT.PUT_LINE('The following are characteristics of this shortest path: ');
cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_numeric);  
DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);  
    
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');

res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
The shortest Dijkstra path from node 101 to node 105 is 13                      
The following are characteristics of this shortest path:                        
Path 13 cost: 50                                                                
Is path 13 closed? FALSE                                                        
Path 13 has links: 1102 1104 1105                                               
Path 13 has nodes: 101 103 104 105

SDO_NET_MEM.NETWORK_MANAGER.TSP_PATH

Format

SDO_NET_MEM.NETWORK_MANAGER.TSP_PATH(

     net_mem IN VARCHAR2,

     nd_array IN SDO_NUMBER_ARRAY,

     is_closed IN VARCHAR2,

     use_exact_cost IN VARCHAR2,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN NUMBER;

Description

Returns the path ID number of the most efficient (in cost or distance) path that includes all specified nodes, that is, the path that solves the TSP ("traveling salesman problem" or "traveling salesperson problem") for the specified set of nodes.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

nd_array

An SDO_NUMBER_ARRAY object specifying the node ID numbers of the nodes to be included in the path. The first node specified is always the start node of the returned path. For a closed path, the first node specified is also the last node of the returned path; for an open path, the last node specified is the last node of the returned path.

is_closed

The string value TRUE if the path must be closed (that is, start node and end node in returned path are the same node), or the string value FALSE if the path must be open (that is, end node in the returned path is different from the start node).

use_exact_cost

The string value TRUE if the cost values of links are to be used in calculating the TSP path, or the string value FALSE if the Cartesian distances of links are to be used in calculating the TSP path.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns a path ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function returns a null value if no TSP path can be made using the specified nodes. For example, if the state of one or more nodes or links is INACTIVE, and if this condition causes all possible paths to be ignored, the function will return a null value.

If multiple possible paths can be constructed that meet all requirements of the request (for example, if two paths have the same lowest total cost), the returned path can be any of these possible paths.

To determine the links in the returned path, use the SDO_NET_MEM.PATH.GET_LINK_IDS function.

This function is analogous to using the tspPath method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path ID of the open TSP path that starts at node ID 2, ends at node ID 6, and includes node ID 4 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.NETWORK_MANAGER.TSP_PATH(net_mem, sdo_number_array(2, 4, 6), 'FALSE', 'TRUE');
DBMS_OUTPUT.PUT_LINE('Open TSP path ID for N2, N4, N6: ' || res_numeric);
DBMS_OUTPUT.PUT_LINE('which contains these links: ');
var1_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);
FOR indx1 IN var1_array.FIRST..var1_array.LAST
LOOP
  var1_numeric := var1_array(indx1);
  DBMS_OUTPUT.PUT(var1_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Open TSP path ID for N2, N4, N6: 4                                        
which contains these links:                                                     
102 103 104 105  

SDO_NET_MEM.NETWORK_MANAGER.VALIDATE_NETWORK_SCHEMA

Format

SDO_NET_MEM.NETWORK_MANAGER.VALIDATE_NETWORK_SCHEMA(

     net_mem IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Validates the network tables.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This function returns the string TRUE if the network-related tables in the specified network memory object are valid, and it returns a specific Oracle error message if one or more tables are not valid. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the validateNetworkSchema method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example validates the network tables in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NETWORK_MANAGER.VALIDATE_NETWORK_SCHEMA(net_mem);
 23  DBMS_OUTPUT.PUT_LINE('Is network ' || net_mem || ' valid? ' || res_string);
. . .
Is network XYZ_NETWORK valid? TRUE

SDO_NET_MEM.NETWORK_MANAGER.WITHIN_COST

Format

SDO_NET_MEM.NETWORK_MANAGER.WITHIN_COST(

     net_mem IN VARCHAR2,

     start_node_id IN NUMBER,

     cost_limit IN NUMBER,

     constraint IN VARCHAR2 DEFAULT NULL

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of path IDs of the shortest path to each node that is reachable within a specified cost from a specified start node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

start_node_id

Node ID of the start node.

cost_limit

Maximum total path cost.

constraint

Name of the network constraint to be applied. If this parameter is null, no network constraint is applied. (For information about network constraints, see Section 5.6.)

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of path ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

If no results can be found that match the criteria, this function returns a null value.

To determine the end node in each path returned, use the SDO_NET_MEM.PATH.GET_END_NODE_ID function. To determine the links in each path returned, use the SDO_NET_MEM.PATH.GET_LINK_IDS function.

This function is analogous to using the withinCost method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the path ID values of the shortest path to each node in the current network memory object that is reachable within a cost of 100 from the node with the node ID value of 102. It also displays the end node for each returned path. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NETWORK_MANAGER.WITHIN_COST(net_mem,102,100);
DBMS_OUTPUT.PUT('Shortest path IDs to nodes within cost of 100 from node 102: ');
DBMS_OUTPUT.PUT_LINE(' ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', whose end node is: ');
  var1_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, res_numeric);
  DBMS_OUTPUT.PUT(var1_numeric);
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
. . .
Shortest path IDs to nodes within cost of 100 from node 102:                             
14, whose end node is: 101                                                      
15, whose end node is: 103                                                      
16, whose end node is: 104                                                      
17, whose end node is: 105                                                      
18, whose end node is: 106                                                      
19, whose end node is: 108                                                      
20, whose end node is: 107

SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK

Format

SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK(

     net_mem IN VARCHAR2);

Description

Saves to the database the network objects in a network memory object.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

Usage Notes

This procedure saves the network objects in a network memory object, the use of which is explained in Section 5.8.

Temporary links, nodes, and paths are not saved in the database when you call this procedure.

This procedure is analogous to using the writeNetwork method of the NetworkManager class of the client-side Java API (described in Section 5.11.2).

Examples

The following example saves to the database the network objects in the network memory object for a network named XYZ_NETWORK.

sdo_net_mem.network_manager.write_network(net_mem=>'XYZ_NETWORK');

SDO_NET_MEM.NODE.GET_ADJACENT_NODE_IDS

Format

SDO_NET_MEM.NODE.GET_ADJACENT_NODE_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the node ID numbers of nodes that are adjacent to a specified node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of node ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getAdjacentNodeArray method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the nodes adjacent to the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_ADJACENT_NODE_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following adjacent nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');

Node 103 has the following adjacent nodes: 102 104 101

SDO_NET_MEM.NODE.GET_CHILD_NODE_IDS

Format

SDO_NET_MEM.NODE.GET_CHILD_NODE_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the node ID numbers of nodes that are child nodes of a specified node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of node ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getChildNodeArray method of the Node interface of the client-side Java API (described in Section 5.11.2).

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the child nodes of the node whose node ID is 1 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_CHILD_NODE_IDS(net_mem, 1);
DBMS_OUTPUT.PUT('Node 1 has the following child nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
. . .
Node 1 has the following child nodes: 104 103 105 102 106 101

SDO_NET_MEM.NODE.GET_COMPONENT_NO

Format

SDO_NET_MEM.NODE.GET_COMPONENT_NO(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the component number of a specified node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a numeric component number for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

All nodes in a group of connected components have the same component number. For an explanation of connected components, see the Usage Notes for the SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS function.

This function is analogous to using the getComponentNo method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the component number for a node, use the SDO_NET_MEM.NODE.SET_COMPONENT_NO procedure.

Examples

The following example returns the component number of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NODE.GET_COMPONENT_NO(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The component number of node 103 is: ' || res_numeric);
. . .
The component number of node 103 is: 1

SDO_NET_MEM.NODE.GET_COST

Format

SDO_NET_MEM.NODE.GET_COST(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the cost value of a specified node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a numeric cost value for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getCost method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the cost value for a node, use the SDO_NET_MEM.NODE.SET_COST procedure.

Examples

The following example returns the cost of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NODE.GET_COST(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The cost of node 103 is: ' || res_numeric);
. . .
The cost of node 103 is: 0

SDO_NET_MEM.NODE.GET_GEOM_ID

Format

SDO_NET_MEM.NODE.GET_GEOM_ID(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the geometry ID number of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a numeric geometry ID value for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getGeomID method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the geometry ID value for a node, use the SDO_NET_MEM.NODE.SET_GEOM_ID procedure.

Examples

The following example returns the geometry ID of the node whose node ID is 3 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.NODE.GET_GEOM_ID(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The geometry ID of node 3 is: ' || res_numeric);
. . .
The geometry ID of node 3 is: 1001

SDO_NET_MEM.NODE.GET_GEOMETRY

Format

SDO_NET_MEM.NODE.GET_GEOMETRY(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the spatial geometry for a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_GEOMETRY object for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getGeometry method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the spatial geometry for a node, use the SDO_NET_MEM.NODE.SET_GEOMETRY procedure.

Examples

The following example returns the spatial geometry of the node whose node ID is 3 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_geom := SDO_NET_MEM.NODE.GET_GEOMETRY(net_mem, 3);

SDO_NET_MEM.NODE.GET_HIERARCHY_LEVEL

Format

SDO_NET_MEM.NODE.GET_HIERARCHY_LEVEL(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the hierarchy level of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a numeric hierarchy level for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getHierarchyLevel method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the hierarchy level for a node, use the SDO_NET_MEM.NODE.SET_HIERARCHY_LEVEL procedure.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the hierarchy level of the node whose node ID is 1 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NODE.GET_HIERARCHY_LEVEL(net_mem, 1);
DBMS_OUTPUT.PUT_LINE('The hierarchy level of node 1 is: ' || res_numeric);
. . .
The hierarchy level of node 1 is: 2

SDO_NET_MEM.NODE.GET_IN_LINK_IDS

Format

SDO_NET_MEM.NODE.GET_IN_LINK_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the link ID numbers of links that are inbound links to a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of link ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getInLinks method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the inbound links to the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_IN_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following inbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
. . .
Node 103 has the following inbound links: 1102 1103

SDO_NET_MEM.NODE.GET_INCIDENT_LINK_IDS

Format

SDO_NET_MEM.NODE.GET_INCIDENT_LINK_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the link ID numbers of links that are to (that is, incident upon) a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of link ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getIncidentLinks method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the incident links of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_INCIDENT_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following incident links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
. . .
Node 103 has the following incident links: 1102 1104 1103

SDO_NET_MEM.NODE.GET_MEASURE

Format

SDO_NET_MEM.NODE.GET_MEASURE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the measure value of a node in an LRS network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a numeric measure value for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getMeasure method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the measure value for a node, use the SDO_NET_MEM.NODE.SET_MEASURE procedure.

Examples

The following example returns the measure value of the node whose node ID is 3 in the current network memory object. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

res_numeric := SDO_NET_MEM.NODE.GET_MEASURE(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The measure value of node 3 is: ' || res_numeric);
. . .
The measure value of node 3 is: 8

SDO_NET_MEM.NODE.GET_NAME

Format

SDO_NET_MEM.NODE.GET_NAME(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the name of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a node name string for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getName method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the name of a node, use the SDO_NET_MEM.NODE.SET_NAME procedure.

Examples

The following example returns the name of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.GET_NAME(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The name of node 103 is: ' || res_string);
. . .
The name of node 103 is: N3

SDO_NET_MEM.NODE.GET_OUT_LINK_IDS

Format

SDO_NET_MEM.NODE.GET_OUT_LINK_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the link ID numbers of links that are outbound links from a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of link ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getOutLinks method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the outbound links from the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_OUT_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following outbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
. . .
Node 103 has the following outbound links: 1104

SDO_NET_MEM.NODE.GET_PARENT_NODE_ID

Format

SDO_NET_MEM.NODE.GET_PARENT_NODE_ID(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID number of the parent node of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns numeric node ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getParentNode method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the parent node of a node, use the SDO_NET_MEM.NODE.SET_PARENT_NODE procedure.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the parent node of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_numeric := SDO_NET_MEM.NODE.GET_PARENT_NODE_ID(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The parent node of node 103 is: ' || res_numeric);
. . .
The parent node of node 103 is: 1

SDO_NET_MEM.NODE.GET_SIBLING_NODE_IDS

Format

SDO_NET_MEM.NODE.GET_SIBLING_NODE_IDS(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns the node ID numbers of nodes that are sibling nodes of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object of node ID values in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getSiblingNodeArray method of the Node interface of the client-side Java API (described in Section 5.11.2).

Sibling nodes are nodes that have the same parent node in a hierarchical network. For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example returns the sibling nodes of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_array := SDO_NET_MEM.NODE.GET_SIBLING_NODE_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following sibling nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Node 103 has the following sibling nodes: 104 105 102 106 101

SDO_NET_MEM.NODE.GET_STATE

Format

SDO_NET_MEM.NODE.GET_STATE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the state of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a state name string for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The state is one of the following string values: ACTIVE or INACTIVE. The node state determines whether or not the node is considered by network analysis functions, such as SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH. If the state is ACTIVE, the node is considered by network analysis functions; if the state is INACTIVE, the node is ignored by these functions.

This function is analogous to using the getState method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the state of a node, use the SDO_NET_MEM.NODE.SET_STATE procedure.

Examples

The following example returns the state of the node whose node ID is 103 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.GET_STATE(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The state of node 103 is: ' || res_string);
. . .
The state of node 103 is: ACTIVE

SDO_NET_MEM.NODE.GET_TYPE

Format

SDO_NET_MEM.NODE.GET_TYPE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the type of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns a type name string for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getType method of the Node interface of the client-side Java API (described in Section 5.11.2).

To set the type of a node, use the SDO_NET_MEM.NODE.SET_TYPE procedure.

Examples

The following example sets the type of the node whose node ID is 114 in the current network memory object, and then returns the type. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

-- SET_TYPE
-- Set the type of node 114 to 'Research'.
SDO_NET_MEM.NODE.SET_TYPE(net_mem, 114, 'Research');
-- GET_TYPE
res_string := SDO_NET_MEM.NODE.GET_TYPE(net_mem, 114);
DBMS_OUTPUT.PUT_LINE('The type of node 114 is: ' || res_string);
. . .
The type of node 114 is: Research

SDO_NET_MEM.NODE.IS_ACTIVE

Format

SDO_NET_MEM.NODE.IS_ACTIVE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a node is active.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns the string TRUE if the node in the specified network memory object is active, or FALSE if the node is not active. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isActive method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the node whose node ID is 103 in the current network memory object is active. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.IS_ACTIVE(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 active?: ' || res_string);
. . .
Is node 103 active?: TRUE

SDO_NET_MEM.NODE.IS_LOGICAL

Format

SDO_NET_MEM.NODE.IS_LOGICAL(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a node is in a logical network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns the string TRUE if the node in the specified network memory object is in a logical network, or FALSE if the node is not in a logical network. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isLogical method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the node whose node ID is 103 in the current network memory object is in a logical network. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.IS_LOGICAL(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 a logical node?: ' || res_string);
. . .
Is node 103 a logical node?: TRUE

SDO_NET_MEM.NODE.IS_TEMPORARY

Format

SDO_NET_MEM.NODE.IS_TEMPORARY(

     net_mem IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a node is temporary.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This function returns the string TRUE if the node in the specified network memory object is temporary, or FALSE if the node is not temporary. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

Temporary links, nodes, and paths are not saved in the database when you call the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure.

This function is analogous to using the isTemporary method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if the node whose node ID is 103 in the current network memory object is temporary. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.IS_TEMPORARY(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 temporary?: ' || res_string);
. . .
Is node 103 temporary?: FALSE

SDO_NET_MEM.NODE.LINK_EXISTS

Format

SDO_NET_MEM.NODE.LINK_EXISTS(

     net_mem IN VARCHAR2,

     node_id1 IN NUMBER,

     node_id2 IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a link exists between two nodes.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id1

Node ID number.

node_id2

Node ID number.

Usage Notes

This function returns the string TRUE if a link exists between the two nodes in the specified network memory object, or FALSE if a link does not exist. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the linkExists method of the Node interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a link exists between the nodes with node ID values 103 and 104 in the current network memory object. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

res_string := SDO_NET_MEM.NODE.LINK_EXISTS(net_mem, 103, 104);
DBMS_OUTPUT.PUT_LINE('Does a link exist between nodes 103 and 104?: ' || res_string);
. . .
Does a link exist between nodes 103 and 104?: TRUE

SDO_NET_MEM.NODE.MAKE_TEMPORARY

Format

SDO_NET_MEM.NODE.MAKE_TEMPORARY(

     net_mem IN VARCHAR2,

     node_id IN NUMBER);

Description

Makes a node temporary.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

Usage Notes

This procedure makes the node in the specified network memory object temporary. (Temporary links, nodes, and paths are not saved in the database when you call the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure.) For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the makeTemporary method of the Node interface of the client-side Java API (described in Section 5.11.2).

To check if a node in a network memory object is temporary, use the SDO_NET_MEM.NODE.IS_TEMPORARY function.

Examples

The following example makes the node whose node ID is 114 in the current network memory object a temporary node. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.MAKE_TEMPORARY(net_mem, 114);

SDO_NET_MEM.NODE.SET_COMPONENT_NO

Format

SDO_NET_MEM.NODE.SET_COMPONENT_NO(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     no IN NUMBER);

Description

Sets the component number of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

no

Component number.

Usage Notes

This procedure sets a node component number value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

All nodes in a group of connected components have the same component number. For an explanation of connected components, see the Usage Notes for the SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS function.

This procedure is analogous to using the setComponentNo method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the node component value for a node, use the SDO_NET_MEM.NODE.GET_COMPONENT_NO function.

Examples

The following example sets the component number of the node whose node ID is 114 in the current network memory object to 987. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.SET_COMPONENT_NO(net_mem, 114, 987);

SDO_NET_MEM.NODE.SET_COST

Format

SDO_NET_MEM.NODE.SET_COST(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     cost IN NUMBER);

Description

Sets the cost value of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

cost

Cost value.

Usage Notes

This procedure sets a numeric node cost value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setCost method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the cost value for a node, use the SDO_NET_MEM.NODE.GET_COST function.

Examples

The following example sets the cost of the node whose node ID is 114 in the current network memory object to 40. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.SET_COST(net_mem, 114, 40);

SDO_NET_MEM.NODE.SET_GEOM_ID

Format

SDO_NET_MEM.NODE.SET_GEOM_ID(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     geom_id IN NUMBER);

Description

Sets the geometry ID value of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

geom

Geometry ID number.

Usage Notes

This procedure sets a numeric node geometry ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setGeomID method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the geometry ID value for a node, use the SDO_NET_MEM.NODE.GET_GEOM_ID function.

Examples

The following example sets the geometry ID of the node whose node ID is 7 in the current network memory object to 99. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

SDO_NET_MEM.NODE.SET_GEOM_ID(net_mem, 7, 99);

SDO_NET_MEM.NODE.SET_GEOMETRY

Format

SDO_NET_MEM.NODE.SET_GEOMETRY(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     geom IN SDO_GEOMETRY);

Description

Sets the geometry for a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

geom

Spatial geometry object.

Usage Notes

This procedure creates an SDO_GEOMETRY object for the node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setGeometry method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the geometry for a node, use the SDO_NET_MEM.NODE.GET_GEOMETRY function.

Examples

The following example sets the geometry of the node whose node ID is 114 in the network memory object for a network named MY_NETWORK.

SDO_NET_MEM.NODE.SET_GEOMETRY('MY_NETWORK', 114,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,4,NULL), NULL, NULL));

SDO_NET_MEM.NODE.SET_HIERARCHY_LEVEL

Format

SDO_NET_MEM.NODE.SET_HIERARCHY_LEVEL(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     level IN NUMBER);

Description

Sets the hierarchy level of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

level

Hierarchy level number.

Usage Notes

This procedure sets a numeric hierarchy level value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setHierarchyLevel method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the hierarchy level of a node, use the SDO_NET_MEM.NODE.GET_HIERARCHY_LEVEL function.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example sets the hierarchy level whose node ID is 1 in the current network memory object to 2.

SDO_NET_MEM.NODE.SET_HIERARCHY_LEVEL(net_mem, 1, 2);

SDO_NET_MEM.NODE.SET_MEASURE

Format

SDO_NET_MEM.NODE.SET_MEASURE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     measure IN NUMBER);

Description

Sets the measure value of a node in an LRS network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

measure

Measure value.

Usage Notes

This procedure sets a numeric node measure value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setMeasure method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the measure value of a node, use the SDO_NET_MEM.NODE.GET_MEASURE function.

Examples

The following example sets the measure value of the node whose node ID is 7 in the current network memory object to 30. (This example is an excerpt from Example 5-4 in Section 5.13.3.)

SDO_NET_MEM.NODE.SET_MEASURE(net_mem, 7, 30);

SDO_NET_MEM.NODE.SET_NAME

Format

SDO_NET_MEM.NODE.SET_NAME(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     node_name IN VARCHAR2);

Description

Sets the name of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

node_name

Node name.

Usage Notes

This procedure sets a node name string value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setName method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the name of a node, use the SDO_NET_MEM.NODE.GET_NAME function.

Examples

The following example sets the name of the node whose node ID is 114 in the current network memory object to the string My favorite node. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.SET_NAME(net_mem, 114, 'My favorite node');

SDO_NET_MEM.NODE.SET_PARENT_NODE

Format

SDO_NET_MEM.NODE.SET_PARENT_NODE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     parent_node_id IN NUMBER);

Description

Sets the parent node of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

parent_node_id

Parent node ID number.

Usage Notes

This procedure specifies the parent node for a node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setParentNode method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the ID value for a parent node, use the SDO_NET_MEM.NODE.GET_PARENT_NODE_ID function.

For information about parent and child nodes and links in a network hierarchy, see Section 5.5.

Examples

The following example sets the parent node of the node whose node ID is 114 in the current network memory object to the node whose node ID is 1. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.SET_PARENT_NODE(net_mem, 114, 1);

SDO_NET_MEM.NODE.SET_STATE

Format

SDO_NET_MEM.NODE.SET_STATE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     state IN VARCHAR2);

Description

Sets the state of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

state

Node state. Must be one of the following string values: ACTIVE or INACTIVE.

Usage Notes

This procedure sets a node state string value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

The node state determines whether or not the node is considered by network analysis functions, such as SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH. If the state is ACTIVE, the node is considered by network analysis functions; if the state is INACTIVE, the node is ignored by these functions.

This procedure is analogous to using the setState method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the node state, use the SDO_NET_MEM.NODE.GET_STATE function.

Examples

The following example sets the state of the node whose node ID is 111 in the current network memory object to the string INACTIVE. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

SDO_NET_MEM.NODE.SET_STATE(net_mem, 111, 'INACTIVE');

SDO_NET_MEM.NODE.SET_TYPE

Format

SDO_NET_MEM.NODE.SET_TYPE(

     net_mem IN VARCHAR2,

     node_id IN NUMBER,

     type IN VARCHAR2);

Description

Sets the type of a node.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

node_id

Node ID number.

type

Node type.

Usage Notes

This procedure sets a node type string value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setType method of the Node interface of the client-side Java API (described in Section 5.11.2).

To get the type value for a node, use the SDO_NET_MEM.NODE.GET_TYPE function.

Examples

The following example sets the type of the node whose node ID is 114 in the current network memory object, and then returns the type. (This example is an excerpt from Example 5-5 in Section 5.13.4.)

-- SET_TYPE
-- Set the type of node 114 to 'Research'.
SDO_NET_MEM.NODE.SET_TYPE(net_mem, 114, 'Research');
-- GET_TYPE
res_string := SDO_NET_MEM.NODE.GET_TYPE(net_mem, 114);
DBMS_OUTPUT.PUT_LINE('The type of node 114 is: ' || res_string);
. . .
The type of node 114 is: Research

SDO_NET_MEM.PATH.COMPUTE_GEOMETRY

Format

SDO_NET_MEM.PATH.COMPUTE_GEOMETRY(

     net_mem IN VARCHAR2,

     path_id IN NUMBER,

     tolerance IN NUMBER);

Description

Sets the spatial geometry for a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

tolerance

Tolerance value associated with geometries in the network. (Tolerance is explained in Chapter 1 of Oracle Spatial Developer's Guide.) This value should be consistent with the tolerance values of the geometries in the link table and node table for the network.

Usage Notes

This procedure computes the SDO_GEOMETRY object for the specified path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the computeGeometry method of the Path interface of the client-side Java API (described in Section 5.11.2).

To get the computed geometry, use the SDO_NET_MEM.PATH.GET_GEOMETRY function.

Examples

The following example computes the spatial geometry of a path in the current network memory object, and then places the computed geometry in a variable (of type SDO_GEOMETRY) named res_geom.

-- COMPUTE_GEOMETRY
SDO_NET_MEM.PATH.COMPUTE_GEOMETRY(net_mem, path_id, 0.05);
-- GET_GEOMETRY
res_geom := SDO_NET_MEM.PATH.GET_GEOMETRY(net_mem, path_id);

SDO_NET_MEM.PATH.GET_COST

Format

SDO_NET_MEM.PATH.GET_COST(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the cost value of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns a numeric cost value for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getCost method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the cost of a path in the current network memory object.

res_numeric := SDO_NET_MEM.PATH.GET_COST(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The cost of path ' || path_id || ' is: ' || res_numeric);
. . .
The cost of path 21 is: 50

SDO_NET_MEM.PATH.GET_END_NODE_ID

Format

SDO_NET_MEM.PATH.GET_END_NODE_ID(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID value of the end node of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns a numeric end node ID value for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getEndNodeID method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the node ID of the end node of a path in the current network memory object.

res_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The end node ID of path ' || path_id || ' is: ' || res_numeric);
. . .
The end node ID of path 21 is: 105

SDO_NET_MEM.PATH.GET_GEOMETRY

Format

SDO_NET_MEM.PATH.GET_GEOMETRY(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns the spatial geometry of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns an SDO_GEOMETRY object for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

If you have not previously computed the geometry using the SDO_NET_MEM.PATH.COMPUTE_GEOMETRY procedure, the GET_GEOMETRY function returns a null result. To return the actual geometry, you must first call the SDO_NET_MEM.PATH.COMPUTE_GEOMETRY procedure.

This function is analogous to using the getPath method of the Path interface of the client-side Java API (described in Section 5.11.2).

To set the geometry ID value for a path, use the SDO_NET_MEM.PATH.SET_GEOMETRY procedure.

Examples

The following example returns the spatial geometry of a path in the current network memory object.

res_geom := SDO_NET_MEM.PATH.GET_GEOMETRY(net_mem, path_id);

SDO_NET_MEM.PATH.GET_LINK_IDS

Format

SDO_NET_MEM.PATH.GET_LINK_IDS(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of link ID values of the links in a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with link ID values for links in a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getLinks method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the links in a path in the current network memory object.

res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Path ' || path_id || ' has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
. . .
Path 21 has the following links:                                                
1102 1104 1105

SDO_NET_MEM.PATH.GET_NAME

Format

SDO_NET_MEM.PATH.GET_NAME(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the name of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns a path name string for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getName method of the Path interface of the client-side Java API (described in Section 5.11.2).

To set the name for a path, use the SDO_NET_MEM.PATH.SET_NAME procedure.

Examples

The following example sets the name of a path in the current network memory object to the string My favorite path, and then returns the name.

-- SET_NAME
-- Set the name of path to 'My favorite path'.
SDO_NET_MEM.PATH.SET_NAME(net_mem, path_id, 'My favorite path');
-- GET_NAME
res_string := SDO_NET_MEM.PATH.GET_NAME(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The name of path ' || path_id || ' is: ' || res_string);
. . .
The name of path 21 is: My favorite path

SDO_NET_MEM.PATH.GET_NO_OF_LINKS

Format

SDO_NET_MEM.PATH.GET_NO_OF_LINKS(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the number of links in a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the number of links in a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getNoOfLinks method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the number of links in a path in the current network memory object.

res_numeric := SDO_NET_MEM.PATH.GET_NO_OF_LINKS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The number of links in path ' || path_id || ' is: ' || res_numeric);
. . .
The number of links in path 21 is: 3

SDO_NET_MEM.PATH.GET_NODE_IDS

Format

SDO_NET_MEM.PATH.GET_NODE_IDS(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of node ID values of the nodes in a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns an SDO_NUMBER_ARRAY object with node ID values for nodes in a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getNodes method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the node IDs of the nodes in a path in the current network memory object.

res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT('Path ' || path_id || ' has the following nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
. . .
Path 21 has the following nodes: 101 103 104 105

SDO_NET_MEM.PATH.GET_START_NODE_ID

Format

SDO_NET_MEM.PATH.GET_START_NODE_ID(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID value of the start node of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns a numeric start node ID value for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getStartNode method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example returns the start node ID of a path in the current network memory object.

res_numeric := SDO_NET_MEM.PATH.GET_START_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The start node ID of path ' || path_id || ' is: ' || res_numeric);
. . .
The start node ID of path 21 is: 101

SDO_NET_MEM.PATH.GET_TYPE

Format

SDO_NET_MEM.PATH.GET_TYPE(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Returns the type of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns a type name string for a path in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the getType method of the Path interface of the client-side Java API (described in Section 5.11.2).

To set the type for a path, use the SDO_NET_MEM.PATH.SET_TYPE procedure.

Examples

The following example sets the type of a path in the current network memory object to the string Logical connections, and then returns the type.

-- SET_TYPE
-- Set the type of the path to 'Logical connections'.
SDO_NET_MEM.PATH.SET_TYPE(net_mem, path_id, 'Logical connections');
-- GET_TYPE
res_string := SDO_NET_MEM.PATH.GET_TYPE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The type of path ' || path_id || ' is: ' || res_string);
. . .
The type of path 21 is: Logical connections

SDO_NET_MEM.PATH.IS_ACTIVE

Format

SDO_NET_MEM.PATH.IS_ACTIVE(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is active.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is active, or FALSE if the path is not active. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isActive method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is active.

res_string := SDO_NET_MEM.PATH.IS_ACTIVE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' active?: ' || res_string);
. . .
Is path 21 active?: TRUE

SDO_NET_MEM.PATH.IS_CLOSED

Format

SDO_NET_MEM.PATH.IS_CLOSED(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is closed.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is closed, or FALSE if the path is not closed. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isClosed method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is closed.

res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' closed?: ' || res_string);
. . .
Is path 21 closed?: FALSE

SDO_NET_MEM.PATH.IS_CONNECTED

Format

SDO_NET_MEM.PATH.IS_CONNECTED(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is connected.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is connected, or FALSE if the path is not connected. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isConnected method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is connected.

res_string := SDO_NET_MEM.PATH.IS_CONNECTED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' connected?: ' || res_string);
. . .
Is path 21 connected?: FALSE

SDO_NET_MEM.PATH.IS_LOGICAL

Format

SDO_NET_MEM.PATH.IS_LOGICAL(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is in a logical network.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is in a logical network, or FALSE if the path is not in a logical network. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isLogical method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is a logical path.

res_string := SDO_NET_MEM.PATH.IS_LOGICAL(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a logical path?: ' || res_string);
. . .
Is path 21 a logical path?: TRUE

SDO_NET_MEM.PATH.IS_SIMPLE

Format

SDO_NET_MEM.PATH.IS_SIMPLE(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is simple.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is simple, or FALSE if the path is not simple (that is, is a complex path). In a simple path, the links form an ordered list that can be traversed from the start node to the end node with each link visited once. In a complex path, there are multiple options for going from the start node to the end node.

For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This function is analogous to using the isSimple method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is a simple path.

res_string := SDO_NET_MEM.PATH.IS_SIMPLE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a simple path?: ' || res_string);
. . .
Is path 21 a simple path?: TRUE

SDO_NET_MEM.PATH.IS_TEMPORARY

Format

SDO_NET_MEM.PATH.IS_TEMPORARY(

     net_mem IN VARCHAR2,

     path_id IN NUMBER

     ) RETURN VARCHAR2;

Description

Checks if a path is temporary.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

Usage Notes

This function returns the string TRUE if the path in the specified network memory object is temporary, or FALSE if the path is not temporary. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

Temporary links, nodes, and paths are not saved in the database when you call the SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK procedure.

This function is analogous to using the isTemporary method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example checks if a path in the current network memory object is temporary.

res_string := SDO_NET_MEM.PATH.IS_TEMPORARY(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' temporary?: ' || res_string);
. . .
Is path 21 temporary?: FALSE

SDO_NET_MEM.PATH.SET_GEOMETRY

Format

SDO_NET_MEM.PATH.SET_GEOMETRY(

     net_mem IN VARCHAR2,

     path_id IN NUMBER,

     geom IN SDO_GEOMETRY);

Description

Sets the spatial geometry for a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

geom

Spatial geometry object.

Usage Notes

This procedure creates an SDO_GEOMETRY object for the node in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setGeometry method of the Path interface of the client-side Java API (described in Section 5.11.2).

To get the geometry for a path, use the SDO_NET_MEM.PATH.GET_GEOMETRY function.

Examples

The following example sets the spatial geometry of a path in the current network memory object.

SDO_NET_MEM.PATH.SET_GEOMETRY(net_mem, path_id,
  SDO_GEOMETRY(
    2002, NULL, NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1),
    SDO_ORDINATE_ARRAY(2,2, 2,4, 8,4, 12,4, 12,10, 8,10, 5,14)));

SDO_NET_MEM.PATH.SET_NAME

Format

SDO_NET_MEM.PATH.SET_NAME(

     net_mem IN VARCHAR2,

     path_id IN NUMBER,

     path_name IN VARCHAR2);

Description

Sets the name of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

path_name

Path name.

Usage Notes

This procedure sets a path name string value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setName method of the Path interface of the client-side Java API (described in Section 5.11.2).

To get the name of a path, use the SDO_NET_MEM.PATH.GET_NAME function.

Examples

The following example sets the name of a path in the current network memory object to the string My favorite path, and then returns the name.

-- SET_NAME
-- Set the name of path to 'My favorite path'.
SDO_NET_MEM.PATH.SET_NAME(net_mem, path_id, 'My favorite path');
-- GET_NAME
res_string := SDO_NET_MEM.PATH.GET_NAME(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The name of path ' || path_id || ' is: ' || res_string);
. . .
The name of path 21 is: My favorite path

SDO_NET_MEM.PATH.SET_PATH_ID

Format

SDO_NET_MEM.PATH.SET_PATH_ID(

     net_mem IN VARCHAR2,

     path_id IN NUMBER,

     new_path_id IN NUMBER);

Description

Sets the path ID value of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

new_path_id

New path ID number.

Usage Notes

This procedure sets a numeric path ID value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setPathID method of the Path interface of the client-side Java API (described in Section 5.11.2).

Examples

The following example sets the path ID of a path in the current network memory object to 6789.

SDO_NET_MEM.PATH.SET_PATH_ID(net_mem, path_id, 6789);

SDO_NET_MEM.PATH.SET_TYPE

Format

SDO_NET_MEM.PATH.SET_TYPE(

     net_mem IN VARCHAR2,

     path_id IN NUMBER,

     type IN VARCHAR2);

Description

Sets the type of a path.

Parameters

net_mem

Name of the network whose current network memory object (created using the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure) is to be used.

path_id

Path ID number.

type

Path type.

Usage Notes

This procedure sets a path type string value in the specified network memory object. For information about using a network memory object for editing and network analysis operations, see Section 5.8.

This procedure is analogous to using the setType method of the Path interface of the client-side Java API (described in Section 5.11.2).

To get the type value for a path, use the SDO_NET_MEM.PATH.GET_TYPE function.

Examples

The following example sets the path type of a path in the current network memory object to the string Scenic.

SDO_NET_MEM.PATH.SET_TYPE(net_mem, path_id, 'Scenic');
PKḐ߆PK ;AOEBPS/preface.htm Preface

Preface

Oracle Spatial Topology and Network Data Models Developer's Guide provides usage and reference information about the topology data model and network data model of Oracle Spatial, which is often referred to as just Spatial.

Audience

This guide is intended for those who need to use the Spatial topology or network data model to work with data about nodes, edges, and faces in a topology or nodes, links, and paths in a network.

You are assumed to be familiar with the main Spatial concepts, data types, and operations, as documented in Oracle Spatial Developer's Guide.

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

Related Documents

For more information, see Oracle Spatial Developer's Guide.

Conventions

The following text conventions are used in this document:

ConventionMeaning
boldfaceBoldface type indicates graphical user interface elements associated with an action, or terms defined in text or the glossary.
italicItalic type indicates book titles, emphasis, or placeholder variables for which you supply particular values.
monospaceMonospace type indicates commands within a paragraph, URLs, code in examples, text that appears on the screen, or text that you enter.

PKPK ;AOEBPS/index.htm Index

Index

A  C  D  E  F  G  H  I  J  K  L  M  N  O  P  R  S  T  U  V  W 

A

A* search algorithm for shortest path, 7
active link
checking for, 7
active links, 5.3
ACTIVE column in link table, 5.9.2
active nodes, 5.3
ACTIVE column in node table, 5.9.1
checking for, 7
active paths
checking for, 7
ADD_EDGE function, 4
ADD_ISOLATED_NODE function, 4
ADD_LINEAR_GEOMETRY function, 4
ADD_LINK procedure, 7
ADD_LOOP function, 4
ADD_LRS_NODE procedure, 7
ADD_NODE function, 4
ADD_NODE procedure, 7
ADD_PATH procedure, 7
ADD_POINT_GEOMETRY function, 4
ADD_POLYGON_GEOMETRY function, 4
ADD_SDO_NODE procedure, 7
ADD_TOPO_GEOMETRY_LAYER procedure, 3
adjacent nodes
getting, 7
ALL_PATHS procedure, 7
ALL_SDO_NETWORK_CONSTRAINTS view, 5.10.2
ALL_SDO_NETWORK_METADATA view, 5.10.1
ALL_SDO_NETWORK_USER_DATA view, 5.10.3
ALL_SDO_TOPO_INFO view, 1.7.1
ALL_SDO_TOPO_METADATA view, 1.7.2
API
network data model, 5.11
performance, 5.11
topology data model, 1.8
application programming interface (API)
network data model, 5.11
performance, 5.11
topology data model, 1.8

C

cache
partition, 5.7.3
TopoMap object associated with, 2.1.1
See also TopoMap objects
CHANGE_EDGE_COORDS procedure, 4
checking if active, 7
child layer, 1.4
child links
getting, 7
child node, 5.5
child nodes
getting, 7
CLEAR_TOPO_MAP procedure, 4
closed path
definition, 7
specifying for TSP, 7
closed paths
checking for, 7
co-links, 7
collection layers, 1.3.2
COMMIT_TOPO_MAP procedure, 4
complex path, 5.9.3
checking, 7
component number
getting for a node, 7
setting for a node, 7
COMPUTE_GEOMETRY procedure, 7
COMPUTE_PATH_GEOMETRY procedure, 6
connected components, 7
finding, 6
connected paths
checking for, 7
constraints
network, 5.6
containing face
getting for point, 4
COPY_NETWORK procedure, 6
cost, 5.3
getting for a link, 7
getting for a node, 7
getting for a path, 7
LINK_COST_COLUMN column in network metadata views, 5.10.1
NODE_COST_COLUMN column in network metadata views, 5.10.1
setting for a link, 7
setting for a node, 7
CREATE_EDGE_INDEX procedure, 4
CREATE_FACE_INDEX procedure, 4
CREATE_FEATURE function, 4
CREATE_LINK_TABLE procedure, 6
CREATE_LOGICAL_NETWORK procedure, 6, 7
CREATE_LRS_NETWORK procedure, 6, 7
CREATE_LRS_TABLE procedure, 6
CREATE_NODE_TABLE procedure, 6
CREATE_PARTITION_TABLE procedure, 6
CREATE_PATH_LINK_TABLE procedure, 6
CREATE_PATH_TABLE procedure, 6
CREATE_REF_CONSTRAINTS procedure, 7
CREATE_SDO_NETWORK procedure, 6, 7
CREATE_SUBPATH_TABLE procedure, 6
CREATE_TOPO_MAP procedure, 4
CREATE_TOPO_NETWORK procedure, 6
CREATE_TOPOLOGY procedure, 3
cross-schema considerations
topology editing, 1.10.2
topology usage, 1.10.1

D

degree
of a node, 5.3
DELETE_LINK procedure, 6, 7
DELETE_NODE procedure, 6, 7
DELETE_PATH procedure, 6, 7
DELETE_SUBPATH procedure, 6
DELETE_TOPO_GEOMETRY_LAYER procedure, 3
demo files
network data model, 5.14
DEREGISTER_CONSTRAINT procedure, 6, 7
DESCRIBE SDO_NET_MEM
statements needed, 7
Dijkstra search algorithm for shortest path, 7
directed links, 5.3
directed networks, 5.3
direction of edge, 1.2
DISABLE_REF_CONSTRAINTS procedure, 7
DROP_NETWORK procedure, 6, 7
DROP_TOPO_MAP procedure, 4
DROP_TOPOLOGY procedure, 3
duration, 5.3
LINK_DURATION_COLUMN column in network metadata views, 5.10.1
NODE_DURATION_COLUMN column in network metadata views, 5.10.1

E

edge index
creating for TopoMap object, 4
edge information table, 1.5.1
edge sequences
privileges needed for cross-schema topology editing, 1.10.2
edges
adding, 2.3.1, 4
adding linear geometry, 4
adding loop, 4
changing coordinates, 2.3.4, 4
definition, 1.2
direction, 1.2
finding edges interacting with a query window, 4
getting coordinates of shape points, 4
getting ID numbers of added edges, 4
getting ID numbers of changed edges, 4
getting ID numbers of deleted edges, 4
getting nearest edge for point, 4
getting nearest edge in cache for point, 4
getting nodes on, 4
island, 1.2
isolated, 1.2
loop, 1.2
moving, 2.3.2, 4
removing, 2.3.3, 4
storing information in edge information table, 1.5.1
updating, 2.3.4
ENABLE_REF_CONSTRAINTS procedure, 7
end measure
getting, 7
end node
getting for a link, 7
getting for a path, 7
setting for a link, 7
error handling
topology editing, 2.1.6
examples
network data model, 5.13, 5.14
topology data model (PL/SQL), 1.12
exception handling
topology editing, 2.1.6

F

F0 (face zero, or universe face), 1.2
face index
creating for TopoMap object, 4
face information table, 1.5.3
face sequences
privileges needed for cross-schema topology editing, 1.10.2
faces
adding polygon geometry, 4
definition, 1.2
finding faces interacting with a query window, 4
getting boundary, 4
getting boundary of, 3
getting containing face for point, 4
getting ID numbers of added faces, 4
getting ID numbers of changed faces, 4
getting ID numbers of deleted faces, 4
redefining, 2.3.3
storing information in face information table, 1.5.3
feature table, 1.3
features
creating from geometries, 4
in network application, 5.3, 5.3
FIND_CONNECTED_COMPONENTS function, 7
FIND_CONNECTED_COMPONENTS procedure, 6
FIND_REACHABLE_NODES function, 7
FIND_REACHING_NODES function, 7
function-based indexes
not supported on SDO_TOPO_GEOMETRY columns, 1.11

G

GENERATE_NODE_LEVELS procedure, 6
GENERATE_PARTITION_BLOB procedure, 6
GENERATE_PARTITION_BLOBS procedure, 6
geometry
computing for a path, 6, 7
getting for a link, 7
getting for a path, 7
setting for a link, 7
setting for a node, 7
setting for a path, 7
geometry ID
getting for a link, 7
getting for a node, 7
getting for node, 7
setting for a link, 7
setting for a node, 7
GET_ADJACENT_NODE_IDS function, 7
GET_CHILD_LINKS function, 6, 7
GET_CHILD_NODE_IDS function, 7
GET_CHILD_NODES function, 6
GET_CO_LINK_IDS function, 7
GET_COMPONENT_NO function, 7
GET_CONTAINING_FACE function, 4
GET_COST function, 7, 7, 7
GET_EDGE_ADDITIONS function, 4
GET_EDGE_CHANGES function, 4
GET_EDGE_COORDS function, 4
GET_EDGE_DELETIONS function, 4
GET_EDGE_NODES function, 4
GET_END_MEASURE function, 7
GET_END_NODE_ID function, 7, 7
GET_FACE_ADDITIONS function, 4
GET_FACE_BOUNDARY function, 3, 4
GET_FACE_CHANGES function, 4
GET_FACE_DELETIONS function, 4
GET_GEOM_ID function, 7, 7
GET_GEOMETRY function, 7, 7, 7
GET_GEOMETRY member function, 1.6.3
GET_GEOMETRY_TYPE function, 6
GET_HIERARCHY_LEVEL function, 7
GET_IN_LINK_IDS function, 7
GET_IN_LINKS function, 6
GET_INCIDENT_LINK_IDS function, 7
GET_INVALID_LINKS function, 6
GET_INVALID_NODES function, 6
GET_INVALID_PATHS function, 6
GET_ISOLATED_NODES function, 6
GET_LEVEL function, 7
GET_LINK_COST_COLUMN function, 6
GET_LINK_DIRECTION function, 6
GET_LINK_GEOM_COLUMN function, 6
GET_LINK_GEOMETRY function, 6
GET_LINK_IDS function, 7
GET_LINK_TABLE_NAME function, 6
GET_LINKS_IN_PATH function, 6
GET_LRS_GEOM_COLUMN function, 6
GET_LRS_LINK_GEOMETRY function, 6
GET_LRS_NODE_GEOMETRY function, 6
GET_LRS_TABLE_NAME function, 6
GET_MAX_LINK_ID function, 7
GET_MAX_NODE_ID function, 7
GET_MAX_PATH_ID function, 7
GET_MAX_SUBPATH_ID function, 7
GET_MEASURE function, 7
GET_NAME function, 7, 7, 7
GET_NEAREST_EDGE function, 4
GET_NEAREST_EDGE_IN_CACHE function, 4
GET_NEAREST_NODE function, 4
GET_NEAREST_NODE_IN_CACHE function, 4
GET_NETWORK_TYPE function, 6
GET_NO_OF_HIERARCHY_LEVELS function, 6
GET_NO_OF_LINKS function, 6, 7
GET_NO_OF_NODES function, 6
GET_NODE_ADDITIONS function, 4
GET_NODE_CHANGES function, 4
GET_NODE_COORD function, 4
GET_NODE_DEGREE function, 6
GET_NODE_DELETIONS function, 4
GET_NODE_FACE_STAR function, 4
GET_NODE_GEOM_COLUMN function, 6
GET_NODE_GEOMETRY function, 6
GET_NODE_IDS function, 7
GET_NODE_IN_DEGREE function, 6
GET_NODE_OUT_DEGREE function, 6
GET_NODE_STAR function, 4
GET_NODE_TABLE_NAME function, 6
GET_OUT_LINK_IDS function, 7
GET_OUT_LINKS function, 6
GET_PARENT_LINK_ID function, 7
GET_PARENT_NODE_ID function, 7
GET_PARTITION_SIZE function, 6
GET_PATH_GEOM_COLUMN function, 6
GET_PATH_TABLE_NAME function, 6
GET_PERCENTAGE function, 6, 6
GET_SIBLING_LINK_IDS function, 7
GET_SIBLING_NODE_IDS function, 7
GET_START_MEASURE function, 7
GET_START_NODE_ID function, 7, 7
GET_STATE function, 7, 7
GET_TGL_OBJECTS member function, 1.6.4
GET_TOPO_ELEMENTS member function, 1.6.5
GET_TOPO_NAME function, 4
GET_TOPO_OBJECTS function, 3
GET_TOPO_TRANSACTION_ID function, 4
GET_TYPE function, 7, 7, 7
getting link IDs, 7

H

heap size
Java, 4, 7
heap size (Java)
setting maximum, 6
hierarchy
network, 5.5
topology geometry layer, 1.4
hierarchy level
getting for a node, 7
setting for a node, 7
history information table, 1.5.5

I

inbound links, 5.3
getting for a node, 7
getting link ID numbers, 6
getting number of for node, 6
incident links
getting for a node, 7
in-degree, 5.3
INITIALIZE_AFTER_IMPORT procedure, 3
INITIALIZE_METADATA procedure, 3
invalid links
getting, 6
invalid nodes
getting, 6
invalid paths
getting, 6
IS_ACTIVE function, 7, 7, 7
IS_CLOSED function, 7
IS_CONNECTED function, 7
IS_HIERARCHICAL function, 6
IS_LINK_IN_PATH function, 6
IS_LOGICAL function, 6, 7, 7, 7
IS_NODE_IN_PATH function, 6
IS_REACHABLE function, 7
IS_SIMPLE function, 7
IS_SPATIAL function, 6
IS_TEMPORARY function, 7, 7, 7
island edge
See isolated edge
island node
See isolated nodes (topology)
isolated edge, 1.2
isolated nodes (network)
definition of, 5.3
getting, 6
isolated nodes (topology)
adding, 4
definition of, 1.2

J

Java client interface for network data model (sdonm), 5.11.2
Java client interface for topology data model (sdotopo), 1.8.2
Java heap size
setting maximum, 6
Java maximum heap size
setting, 4, 7

K

Kruskal algorithm, 7

L

layer
collection, 1.3.2
topology geometry, 1.3, 3
linear geometries
adding, 4
link direction
getting, 6
link geometry
getting, 6
link level
getting, 7
link levels, 5.7.5
link name
getting, 7
setting, 7
link table
definition, 5.9.2
LINK_EXISTS function, 7
links, 7
adding, 7
checking if exists, 7
checking if temporary, 7
child links, 7
co-links, 7
definition, 5.3
deleting, 6, 7
determining if directed, 6
directed, 5.3
direction, 5.3
getting geometry for, 6
getting name, 7
getting parent link, 7
getting percentage of point on link, 6, 6
getting sibling links, 7
invalid, 6
relationship to paths, 5.3
setting cost, 7
setting end node, 7
setting geometry, 7
setting geometry ID, 7
setting hierarchy level, 7
setting measure values, 7
setting name, 7
setting parent link, 7
setting start node, 7
setting state, 7
setting type, 7
state of, 5.3
temporary, 5.3
undirected, 5.3
See also undirected links, inbound links, outbound links
links getting maximum link ID, 7
LIST_NETWORKS function, 7
LIST_TOPO_MAPS function, 4
load on demand
using for editing and analysis, network editing
using partitioning and load on demand, 5.7
load on demand analysis, 5.3
LOAD_CONFIG procedure, 6
LOAD_TOPO_MAP function or procedure, 4
logging level
setting for network operations, 6
logical network, 5.3
creating, 7
SDO_NET_MEM.LINK.IS_LOGICAL function, 7
SDO_NET_MEM.NODE.IS_LOGICAL function, 7
SDO_NET_MEM.PATH.IS_LOGICAL function, 7
LOGICAL_PARTITION procedure, 6
LOGICAL_POWERLAW_PARTITION procedure, 6
loop edge, 1.2
loops
adding, 4
LRS network, 5.3
creating, 7
LRS nodes
adding, 7
LRS_GEOMETRY_NETWORK function, 6

M

MAKE_TEMPORARY procedure, 7
MCST_LINK function, 7
measure value
getting for a node, 7
setting for a node, 7
measure values
setting for a link, 7
metadata
initializing for a topology, 3
minimum cost path, 5.3
minimum cost spanning tree, 5.3
definition, 7
minimum cost spanning tree (MCST)
finding, 7
MOVE_EDGE procedure, 4
MOVE_ISOLATED_NODE procedure, 4
MOVE_NODE procedure, 4

N

naming considerations
Spatial table and column names, 1.5, 5.9
nearest edge
getting for point, 4
getting in cache for point, 4
nearest node
getting for point, 4
getting in cache for point, 4
NEAREST_NEIGHBORS function, 7
network analysis
using a network memory object for, 5.8
using the load on demand approach, 5.7
network constraints, 5.6
ALL_SDO_NETWORK_CONSTRAINTS view, 5.10.2
deregistering, 6
registering, 6
USER_SDO_NETWORK_CONSTRAINTS view, 5.10.2
network data model
application programming interface (API), 5.11
performance, 5.11
concepts, 5.3
examples, 5.13
overview, 5
steps for using, 5.2
subprogram reference information, 6, 7
tables for, 5.9
network editing
using a network memory object for, 5.8
Network Editor
interface illustration, 5.1
network memory object
creating, 7
using for editing and analysis, 5.8
network schema
validating, 7
NETWORK_EXISTS function, 6
networks
analyzing, 5.8
directed, 5.3
dropping, 7
editing, 5.8
hierarchical, 5.5
logical, 5.3
partitioned, 5.3
spatial, 5.3
undirected, 5.3
writing, 7
node
getting inbound links, 7
node face star
getting for node, 4
node geometry
getting, 6
node information table, 1.5.2
node name
getting, 7
setting, 7
node sequences
privileges needed for cross-schema topology editing, 1.10.2
node star
getting for node, 4
node table
definition, 5.9.1
nodes
adding, 2.2.1, 4, 7
adding isolated (topology), 4
adding LRS node, 7
adding point geometry, 4
adding SDO node, 7
checking if active, 7
checking if temporary, 7
definition, 1.2, 5.3
degree, 5.3
deleting, 6, 7
generating node levels for multilevel network, 6
getting adjacent nodes, 7
getting child nodes, 7
getting component number, 7
getting coordinates of, 4
getting cost, 7
getting geometry, 6, 7
getting geometry ID, 7
getting hierarchy level, 7
getting ID numbers of added nodes, 4
getting ID numbers of changed nodes, 4
getting ID numbers of deleted nodes, 4
getting incident links, 7
getting maximum node ID, 7
getting measure value, 7
getting name, 7
getting nearest node for point, 4
getting nearest node in cache for point, 4
getting node face star, 4
getting node star, 4
getting number of, 6
getting outbound links, 7
getting parent node, 7
getting sibling nodes, 7
getting state, 7
getting type, 7
invalid, 6
island, 1.2
isolated (network), 5.3, 6
isolated (topology), 1.2
making temporary, 7
moving, 2.2.2, 4
moving isolated nodes (topology), 4
obsolete, 2.2.4, 4
reachable, 5.3
reaching, 5.3
removing, 2.2.3, 4
removing obsolete, 2.2.4, 4
setting component number, 7
setting cost, 7
setting geometry, 7
setting geometry ID, 7
setting hierarchy level, 7
setting measure value, 7
setting name, 7
setting parent node, 7
setting state, 7
setting type, 7
state of, 5.3
storing information in node information table, 1.5.2
temporary, 5.3

O

obsolete nodes
removing, 2.2.4, 4
open path
definition, 7
specifying for TSP, 7
operators
topology data model, 1.8.1
outbound links, 5.3
getting for a node, 7
getting link ID numbers, 6
getting number of for node, 6
out-degree, 5.3
OutOfMemoryError exception
raising maximum heap size, 4, 7

P

parent layer, 1.4
parent link
getting, 7
setting, 7
parent node, 5.5
getting ID, 7
setting for a node, 7
partition BLOB
generating, 6
partition BLOBs, 5.3
generating, 6
generating and loading from, 5.7.2
partition cache, 5.3, 5.7.3
loading configuration, 6
partition size
getting, 6
partition table
definition, 5.9.6, 5.9.7, 5.9.8
partitioned network, 5.3
partitions
caching, 5.7.3
partition table, 5.9.6, 5.9.7, 5.9.8
partitioning a network, 6, 6, 6
resident, 5.7.3
using for editing and analysis, 5.7
path ID
setting, 7
path name
getting, 7
setting, 7
path table
definition, 5.9.3
path type
setting, 7
path-link table
definition, 5.9.4
paths, 7
adding, 7
checking if active, 7
checking if closed, 7
checking if connected, 7
checking if in logical network, 7
checking if simple or complex, 7
checking if temporary, 7
complex, 5.9.3
computing the geometry, 6, 7
definition, 5.3
deleting, 6, 7
getting cost, 7
getting end node, 7
getting geometry, 7
getting name, 7
getting node IDs, 7
getting number of links, 7
getting start node, 7
getting type, 7
invalid, 6
minimum cost, 5.3
returning all, 7
setting geometry, 7
setting ID, 7
setting name, 7
setting type, 7
simple, 5.9.3
subpaths, 5.3.1
temporary, 5.3
paths getting maximum path ID, 7
performance
network data model API, 5.11
PL/SQL examples
network data model, 5.13
point geometries
adding, 4
polygon geometries
adding, 4
power law networks, 6
precomputed analysis results, 5.7.6
PREPARE_FOR_EXPORT procedure, 3
primitives
See topological elements

R

reachable nodes, 5.3
reaching nodes, 5.3
READ_NETWORK procedure, 7
README file
for Spatial, GeoRaster, and topology and network data models, 1.13, 5.15
read-only TopoMap objects, 2.1.1
reference path
definition, 5.3.1
referential constraints
creating using SDO_NET_MEM.NETWORK_MANAGER.CREATE_REF_CONSTRAINTS, 7
disabling using SDO_NET_MEM.NETWORK_MANAGER.DISABLE_REF_CONSTRAINTS, 7
enabling using SDO_NET_MEM.NETWORK_MANAGER.ENABLE_REF_CONSTRAINTS, 7
REGISTER_CONSTRAINT procedure, 6, 7
RELATE function, 3
relationship information table, 1.5.4
REMOVE_EDGE procedure, 4
REMOVE_NODE procedure, 4
REMOVE_OBSOLETE_NODES procedure, 4
resident partitions, 5.7.3
ROLLBACK_TOPO_MAP procedure, 4

S

scale-free (power law) networks, 6
SDO network, 5.3
creating, 7
SDO nodes
adding, 7
SDO_EDGE_ARRAY type, 1.6.7
SDO_GEOMETRY_NETWORK function, 6
SDO_LIST_TYPE type, 1.6.6
SDO_NET package
COMPUTE_PATH_GEOMETRY, 6
COPY_NETWORK, 6
CREATE_LINK_TABLE, 6
CREATE_LOGICAL_NETWORK, 6
CREATE_LRS_NETWORK, 6
CREATE_LRS_TABLE, 6
CREATE_NODE_TABLE, 6
CREATE_PARTITION_TABLE, 6
CREATE_PATH_LINK_TABLE, 6
CREATE_PATH_TABLE, 6
CREATE_SDO_NETWORK, 6
CREATE_SUBPATH_TABLE, 6
CREATE_TOPO_NETWORK, 6
DELETE_LINK, 6
DELETE_NODE, 6
DELETE_PATH, 6
DELETE_SUBPATH, 6
DEREGISTER_CONSTRAINT, 6
DROP_NETWORK, 6
FIND_CONNECTED_COMPONENTS, 6
GENERATE_NODE_LEVELS, 6
GENERATE_PARTITION_BLOB, 6
GENERATE_PARTITION_BLOBS, 6
GET_CHILD_LINKS, 6
GET_CHILD_NODES, 6
GET_GEOMETRY_TYPE, 6
GET_IN_LINKS, 6
GET_INVALID_LINKS, 6
GET_INVALID_NODES, 6
GET_INVALID_PATHS, 6
GET_ISOLATED_NODES, 6
GET_LINK_COST_COLUMN, 6
GET_LINK_DIRECTION, 6
GET_LINK_GEOM_COLUMN, 6
GET_LINK_GEOMETRY, 6
GET_LINK_TABLE_NAME, 6
GET_LINKS_IN_PATH, 6
GET_LRS_GEOM_COLUMN, 6
GET_LRS_LINK_GEOMETRY, 6
GET_LRS_NODE_GEOMETRY, 6
GET_LRS_TABLE_NAME, 6
GET_NETWORK_TYPE, 6
GET_NO_OF_HIERARCHY_LEVELS, 6
GET_NO_OF_LINKS, 6
GET_NO_OF_NODES, 6
GET_NODE_DEGREE, 6
GET_NODE_GEOM_COLUMN, 6
GET_NODE_GEOMETRY, 6
GET_NODE_IN_DEGREE, 6
GET_NODE_OUT_DEGREE, 6
GET_NODE_TABLE_NAME, 6
GET_OUT_LINKS, 6
GET_PARTITION_SIZE, 6
GET_PATH_GEOM_COLUMN, 6
GET_PATH_TABLE_NAME, 6
GET_PERCENTAGE, 6, 6
IS_HIERARCHICAL, 6
IS_LINK_IN_PATH, 6
IS_LOGICAL, 6
IS_NODE_IN_PATH, 6
IS_SPATIAL, 6
LOAD_CONFIG, 6
LOGICAL_PARTITION, 6
LOGICAL_POWERLAW_PARTITION, 6
LRS_GEOMETRY_NETWORK, 6
NETWORK_EXISTS, 6
reference information, 6
REGISTER_CONSTRAINT, 6
SDO_GEOMETRY_NETWORK, 6
SET_LOGGING_LEVEL, 6
SET_MAX_JAVA_HEAP_SIZE, 6
SPATIAL_PARTITION, 6
TOPO_GEOMETRY_NETWORK, 6
VALIDATE_LINK_SCHEMA, 6
VALIDATE_LRS_SCHEMA, 6
VALIDATE_NETWORK, 6
VALIDATE_NODE_SCHEMA, 6
VALIDATE_PARTITION_SCHEMA, 6
VALIDATE_PATH_SCHEMA, 6
VALIDATE_SUBPATH_SCHEMA, 6
SDO_NET_MEM package
reference information, 7
SET_MAX_MEMORY_SIZE, 7
statements for describing, 7
using for editing and analysis, 5.8
SDO_NET_MEM.LINK package
GET_CHILD_LINKS, 7
GET_CO_LINK_IDS, 7
GET_COST, 7
GET_END_MEASURE, 7
GET_END_NODE_ID, 7
GET_GEOM_ID, 7
GET_GEOMETRY, 7
GET_LEVEL, 7
GET_NAME, 7
GET_PARENT_LINK_ID, 7
GET_SIBLING_LINK_IDS, 7
GET_START_MEASURE, 7
GET_START_NODE_ID, 7
GET_STATE, 7
GET_TYPE, 7
IS_ACTIVE, 7
IS_LOGICAL, 7
IS_TEMPORARY, 7
SET_COST, 7
SET_END_NODE, 7
SET_GEOM_ID, 7
SET_GEOMETRY, 7
SET_LEVEL, 7
SET_MEASURE, 7
SET_NAME, 7
SET_PARENT_LINK, 7
SET_START_NODE, 7
SET_STATE, 7
SET_TYPE, 7
SDO_NET_MEM.NETWORK package
ADD_LINK, 7
ADD_LRS_NODE, 7
ADD_NODE, 7
ADD_PATH, 7
ADD_SDO_NODE, 7
DELETE_LINK, 7
DELETE_NODE, 7
DELETE_PATH, 7
GET_MAX_LINK_ID, 7
GET_MAX_NODE_ID, 7
GET_MAX_PATH_ID, 7
GET_MAX_SUBPATH_ID, 7
SDO_NET_MEM.NETWORK_MANAGER package
ALL_PATHS, 7
CREATE_LOGICAL_NETWORK, 7
CREATE_LRS_NETWORK, 7
CREATE_REF_CONSTRAINTS, 7
CREATE_SDO_NETWORK, 7
DEREGISTER_CONSTRAINT, 7
DISABLE_REF_CONSTRAINTS, 7
DROP_NETWORK, 7
ENABLE_REF_CONSTRAINTS, 7
FIND_CONNECTED_COMPONENTS, 7
FIND_REACHABLE_NODES, 7
FIND_REACHING_NODES, 7
IS_REACHABLE, 7
LIST_NETWORKS, 7
MCST_LINK, 7
NEAREST_NEIGHBORS, 7
READ_NETWORK, 7
REGISTER_CONSTRAINT, 7
SHORTEST_PATH, 7
SHORTEST_PATH_DIJKSTRA, 7
TSP_PATH, 7
VALIDATE_NETWORK_SCHEMA, 7
WITHIN_COST, 7
WRITE_NETWORK, 7
SDO_NET_MEM.NODE package
GET_ADJACENT_NODE_IDS, 7
GET_CHILD_NODE_IDS, 7
GET_COMPONENT_NO, 7
GET_COST, 7
GET_GEOM_ID, 7
GET_GEOMETRY, 7
GET_HIERARCHY_LEVEL, 7
GET_IN_LINK_IDS, 7
GET_INCIDENT_LINK_IDS, 7
GET_MEASURE, 7
GET_NAME, 7
GET_OUT_LINK_IDS, 7
GET_PARENT_NODE_ID, 7
GET_SIBLING_NODE_IDS, 7
GET_STATE, 7
GET_TYPE, 7
IS_ACTIVE, 7
IS_LOGICAL, 7
IS_TEMPORARY, 7
LINK_EXISTS, 7
MAKE_TEMPORARY, 7
SET_COMPONENT_NO, 7
SET_COST, 7
SET_GEOM_ID, 7
SET_GEOMETRY, 7
SET_HIERARCHY_LEVEL, 7
SET_MEASURE, 7
SET_NAME, 7
SET_PARENT_NODE, 7
SET_STATE, 7
SET_TYPE, 7
SDO_NET_MEM.PATH package
COMPUTE_GEOMETRY, 7
GET_COST, 7
GET_END_NODE_ID, 7
GET_GEOMETRY, 7
GET_LINK_IDS, 7
GET_NAME, 7
GET_NO_OF_LINKS, 7
GET_NODE_IDS, 7
GET_START_NODE_ID, 7
GET_TYPE, 7
IS_ACTIVE, 7
IS_CLOSED, 7
IS_CONNECTED, 7
IS_LOGICAL, 7
IS_SIMPLE, 7
IS_TEMPORARY, 7
SET_GEOMETRY, 7
SET_NAME, 7
SET_PATH_ID, 7
SET_TYPE, 7
SDO_NUMBER_ARRAY type, 1.6.7
SDO_TGL_OBJECT type, 1.6.2.2
SDO_TGL_OBJECT_ARRAY type, 1.6.2.2
SDO_TOPO package
ADD_TOPO_GEOMETRY_LAYER, 3
CREATE_TOPOLOGY, 3
DELETE_TOPO_GEOMETRY_LAYER, 3
DROP_TOPOLOGY, 3
GET_FACE_BOUNDARY, 3
GET_TOPO_OBJECTS, 3
INITIALIZE_AFTER_IMPORT, 3
INITIALIZE_METADATA, 3
PREPARE_FOR_EXPORT, 3
reference information, 3
RELATE, 3
SDO_TOPO_GEOMETRY constructors, 1.6.2
SDO_TOPO_GEOMETRY member functions
GET_GEOMETRY, 1.6.3
GET_TGL_OBJECTS, 1.6.4
GET_TOPO_ELEMENTS, 1.6.5
SDO_TOPO_GEOMETRY type, 1.6.1
SDO_TOPO_MAP package
ADD_EDGE, 4
ADD_ISOLATED_NODE, 4
ADD_LINEAR_GEOMETRY, 4
ADD_LOOP, 4
ADD_NODE, 4
ADD_POINT_GEOMETRY, 4
ADD_POLYGON_GEOMETRY, 4
CHANGE_EDGE_COORDS, 4
CLEAR_TOPO_MAP, 4
COMMIT_TOPO_MAP, 4
CREATE_EDGE_INDEX, 4
CREATE_FACE_INDEX, 4
CREATE_FEATURE, 4
CREATE_TOPO_MAP, 4
DROP_TOPO_MAP, 4
GET_CONTAINING_FACE, 4
GET_EDGE_ADDITIONS, 4
GET_EDGE_CHANGES, 4
GET_EDGE_COORDS, 4
GET_EDGE_DELETIONS, 4
GET_EDGE_NODES, 4
GET_FACE_ADDITIONS, 4
GET_FACE_BOUNDARY, 4
GET_FACE_CHANGES, 4
GET_FACE_DELETIONS, 4
GET_NEAREST_EDGE, 4
GET_NEAREST_EDGE_IN_CACHE, 4
GET_NEAREST_NODE, 4
GET_NEAREST_NODE_IN_CACHE, 4
GET_NODE_ADDITIONS, 4
GET_NODE_CHANGES, 4
GET_NODE_COORD, 4
GET_NODE_DELETIONS, 4
GET_NODE_FACE_STAR, 4
GET_NODE_STAR, 4
GET_TOPO_NAME, 4
GET_TOPO_TRANSACTION_ID, 4
LIST_TOPO_MAPS, 4
LOAD_TOPO_MAP, 4
MOVE_EDGE, 4
MOVE_ISOLATED_NODE, 4
MOVE_NODE, 4
reference information, 4
REMOVE_EDGE, 4
REMOVE_NODE, 4
REMOVE_OBSOLETE_NODES, 4
ROLLBACK_TOPO_MAP, 4
SEARCH_EDGE_RTREE_TOPO_MAP, 4
SEARCH_FACE_RTREE_TOPO_MAP, 4
SET_MAX_MEMORY_SIZE, 4
UPDATE_TOPO_MAP, 4
VALIDATE_TOPO_MAP, 4
VALIDATE_TOPOLOGY, 4
SDO_TOPO_OBJECT type, 1.6.2.1
SDO_TOPO_OBJECT_ARRAY type, 1.6.2.1
sdonm Java client interface, 5.11.2
sdotopo Java client interface, 1.8.2
SEARCH_EDGE_RTREE_TOPO_MAP function, 4
SEARCH_FACE_RTREE_TOPO_MAP function, 4
sequences
node, edge, and face
privileges needed for cross-schema topology editing, 1.10.2
SET_COMPONENT_NO procedure, 7
SET_COST procedure, 7, 7
SET_END_NODE procedure, 7
SET_GEOM_ID procedure, 7, 7
SET_GEOMETRY procedure, 7, 7, 7
SET_HIERARCHY_LEVEL procedure, 7
SET_LEVEL procedure, 7
SET_LOGGING_LEVEL procedure, 6
SET_MAX_JAVA_HEAP_SIZE procedure, 6
SET_MAX_MEMORY_SIZE procedure, 4, 7
SET_MEASURE procedure, 7, 7
SET_NAME procedure, 7, 7, 7
SET_PARENT_LINK procedure, 7
SET_PARENT_NODE procedure, 7
SET_PATH_ID procedure, 7
SET_START_NODE procedure, 7
SET_STATE procedure, 7, 7
SET_TYPE procedure, 7, 7, 7
SHORTEST_PATH function, 7
SHORTEST_PATH_DIJKSTRA function, 7
sibling links, 5.5
getting, 7
sibling nodes, 5.5
getting, 7
simple path, 5.9.3
checking, 7
spanning tree, 5.3
minimum cost, 5.3
spatial network, 5.3
SPATIAL_PARTITION procedure, 6
star
node, 4
node face, 4
start measure
getting for a link, 7
start node
getting for a link, 7
getting in a path, 7
setting for a link, 7
state, 5.3
getting for a link, 7
getting for a node, 7
setting for a link, 7
setting for a node, 7
subpath table
definition, 5.9.5
subpaths
CREATE_SUBPATH_TABLE procedure, 6
definition, 5.3.1
deleting, 6
subpath table, 5.9.5
subpaths getting maximum subpath ID, 7

T

temporary links, 5.3
checking, 7
temporary nodes, 5.3
checking for, 7
making, 7
temporary paths, 5.3
checking for, 7
TG_ID attribute of SDO_TOPO_GEOMETRY type, 1.6.1
TG_LAYER_ID attribute of SDO_TOPO_GEOMETRY type, 1.6.1
TG_TYPE attribute of SDO_TOPO_GEOMETRY type, 1.6.1
tolerance
in the topology data model, 1.2.1
TOPO_GEOMETRY_NETWORK function, 6
topo_map parameter
SDO_TOPO subprograms, 2.1.3
topological elements
definition (nodes, edges, faces), 1.3
topology
clearing map, 4
committing map, 4
creating, 3
creating edge index, 4
creating face index, 4
creating map, 4
deleting (dropping), 3
deleting (dropping) map, 4
editing, 2
export information table format, 1.9
exporting
preparing for, 3
getting name from TopoMap object, 4
hierarchy of geometry layers, 1.4
importing
initializing after, 3
initializing metadata, 3
loading into TopoMap object, 4
updating, 4
validating, 4
topology data model
application programming interface (API), 1.8
concepts, 1.2
overview, 1
PL/SQL example, 1.12
steps for using, 1.1
subprogram reference information, 3, 4
topology data types, 1.6
topology export information table, 1.9
topology geometry
definition, 1.3
layer, 1.3
topology geometry layer
adding, 3
definition, 1.3
deleting, 3
hierarchical relationships in, 1.4
topology geometry network, 5.3
topology maps
listing, 4
loading, 4
rolling back, 4
validating, 4
See also TopoMap objects
topology operators, 1.8.1
topology parameter
SDO_TOPO subprograms, 2.1.2, 2.1.3
topology transaction ID
getting, 4
TOPOLOGY_ID attribute of SDO_TOPO_GEOMETRY type, 1.6.1
TopoMap objects
clearing, 4
committing changes to the database, 4
creating, 4
creating edge index, 4
creating face index, 4
deleting (dropping), 4
description, 2.1.1
getting topology name, 4
listing, 4
loading, 4
process for using to edit topologies, 2.1.4, 2.1.5
read-only, 2.1.1
rolling back changes in, 4
updatable, 2.1.1
validating, 4
traveling salesperson problem
TSP_PATH function, 7
TSP_PATH function, 7
type
getting for a node, 7
getting for a path, 7
getting for link, 7
link or node type, 5.3
setting for a link, 7
setting for a node, 7

U

undirected links, 5.3
undirected networks, 5.3
universe face (F0), 1.2
updatable TopoMap objects, 2.1.1
UPDATE_TOPO_MAP procedure, 4
USER_SDO_NETWORK_CONSTRAINTS view, 5.10.2
USER_SDO_NETWORK_METADATA view, 5.10.1
USER_SDO_NETWORK_USER_DATA view, 5.10.3
USER_SDO_TOPO_INFO view, 1.7.1
USER_SDO_TOPO_METADATA view, 1.7.2
user-defined data, 5.3
ALL_SDO_NETWORK_USER_DATA view, 5.10.3
USER_SDO_NETWORK_USER_DATA view, 5.10.3

V

VALIDATE_LINK_SCHEMA function, 6
VALIDATE_LRS_SCHEMA function, 6
VALIDATE_NETWORK function, 6
VALIDATE_NETWORK_SCHEMA function, 7
VALIDATE_NODE_SCHEMA function, 6
VALIDATE_PARTITION_SCHEMA function, 6
VALIDATE_PATH_SCHEMA function, 6
VALIDATE_SUBPATH_SCHEMA function, 6
VALIDATE_TOPO_MAP function, 4
VALIDATE_TOPOLOGY procedure, 4

W

WITHIN_COST function, 7
WRITE_NETWORK procedure, 7
PK_[J1PK ;AOEBPS/img/move_edge.gifsGIF89a """dddfff]]]!!!www{{{YYYؐ򤤤%%%aaa嘘???...777PPP;;;TTTHHH&&&CCCGGG222333UUU666bbbnnn***jjjrrrԄ---\\\eeeLLLxxxzzzDDDsss:::)))KKKXXXvvv,   ưӎ čˢ փ lA8ǯ5<|0\ `"@` ( A EЃN4A}3 JhzP H V`2pNJ% f( S R?@cf jظA6tķK&!:a F5ʹϓdcv(4梆]Fl$f[uo58q71xxq@4xrf CPc,o4vZPmӫԣ?([\—2AKLp̰cxt.A0 ab̬c6@gz(b4a`D #Za P 0Zp; FHq@Dl%M`̗P@3l;Еr/g@'4iw"~>Pgj/ @Ѓ e N@D?J.ˎ<%D[ *t6HD>L,vٵ@ @A3Bpĝֺ춻^ Ё A$[>q U06tA"B 0w ,$l(,0,4l8<@-Dmt<Ļ#xӯ/Y@eoR]!&0PBJYC@n{6vݮc\k3y*ٌX2W_S'6xPb/d3J;-JY- Yd0qO[N Z\%;w \a'l Ao3[ a*?wF=O/npQh,PRl7PH&p] 6I@ :'\u@jW|My3+sV@-ӅuhhX Q3`,LM9D'(`c6Dn Q,@ sycx#)F7o"폀 IBRP!-#)Vе<2d2yIhh2,A I28JW#zOJDTObueG9Ґ&]J?ZҔb.eK9ӘB6)/9Ӝ>iOWԠbFPXԤ~N}RUVժ*Ucխru:P0+ZTulU+\ ֓u|+^QWu+`SF{%K W6݄cuXl#0FVlh;;C 0Qu%L(zNˁk dH(iS.j]1թ)-xzf$x (L= 0 1S?p6U&-k )Co!F l(` RQj0o<$PYD~Lxll*p^`FWMm_VApP^UqAeuq D@zax* #IP|7Œр+Q=@l i JL#X9|0Xmr3ߡE t.t{p#{N.ԇ8%%VEKwoSfTK T4b &k/jH ^k%l6[jgQlgWmlO{ۮjmk[1nq6j:oE;w!nx{o}ispW< io{?tqg}9N{!-2.ZPUyNЊ2 9)ADDE?r 9Г^ VPINX6s\`؏YgOI1 M"{1{.C͖Jo\{zZwܶtd;񐏼'OGmܱ] _Qv-M }%TISl{$s 4|k!}n{6 t3@O-qXva#T3a IF~0lQw?D3b9#(`J ϓ"{Ug5h0$dw[Ip\XQ {W%25h50>P_w@9Yc1>h!x{'{q}>TxlGF>$0} Uh24yS֕냅C6HƇ4G9I'0 2z:X!Uz*B- ድXyȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏32 ^膋&=PoZ]#52c< $腫3b0@wQ1  b`p"p#!&- Q$PCd1&l>@a24p[0SQ2@4;0faTQwY ~q;4`pSi:aO\*0@/;0"Q  a ```i&Q7I—֡!`  Xݲ axB1 P%;0eI PeAi NR f Q&a?D ` |p!9șQ"ʩ"d@edI x7Y#`#p# S"9V%ٞj `b&h#&l E  '|\25B)ev'sb*b6(`&9Dvaì+BG—,2-h-آ-<j@ r.a. ?/0/~⧀0C0p0 0 HC1p1zک:Z2d43>7Sxy#J Z5_6\$n% 6p#7j}cQ &8\ĬD%#9csQ9_S&`sp%#;X9QR=ci>za@?G>s3cc#DB`@ZeA@uX80A+?%[đaB8!B-GB`S/D14C ƠC^ Xz ا=8 & 2V99;8<&!8._FD*ȂX/1 M8ZWނ4)(D|JXon5 hȅЁ8P;Ȃ=A< 0B &@~M[v[KJi$ `}=AVxՅh)3DI d5te 1.DD@٧1Z)$@<|XlBs-4@D 4+6J)*䭪$sZ HD K<'î.;.rKIZ mJK ;4sD%b >Lj0qJ:7 c0`D[s?3bI%rMM2P3O4l6sPBTv>a5NkO07dݢ%q04J9MWnrw^~~04Ʒ\d?<5 ҷN@[y+)߀=7;$6!* 8%L.o`U QtD!E({.K2`$|L%4{9O9'1PjШ``t"F`#lhhW@kC1?K ;hB-ީЧcCK4P.2`Ue#6"BvqÈH ѥ\0!hA7e!hbv&<*66Br.\ -(H6^@c C"ZĻt1_F2c!p,6(B EHaP%@=2%!D0ܫZ&,eIKSHL|zK1t0,X$CW͓PNj @I\b@Ӛ &INs3 e.z6T5D2Y:Ǚ4CzM0L8)NkӞ@MGBJԢHMRԦ:PTJժZXͪVծz` k*0 HA'!}""艫7Vyӝ@6mQ *.f\Z72ԯ%p7;pA^Q^E>dD8! ֓`@FJ#Sd hЌ!Ǜ5.r@>P xx`;/|0!,]"6B=}cz  <` BȀJPZ袪¥qnUdXjr7=U&%ބ ;xB*p'K*@I 0 BQ#WpY  :ǔ }h +je09<u1c1 U?#@HqJ2 >A-5"pAq2(MKOs DJ*EB5!L  ?6Cb2(< <Ԓ "Tpf Άvy 8 a@  XP`  %L b ƀ8  s>DJᴥ1)ܠ #):(PUNy(@lDZ*/Dˏl%ĀA1b"ss̀a^G-Avxi >-Yy}aw''+[pio֠ YBP,|-3V^A'LxxX`D<4=/İP8dr9!fη- .pk?+Hw.Aɨ=ˏ0:!t> !z\'"A=DfmZ^x9a|AEN%0L䂸A݀# P AKTw8!xGJK=eHM.J @i NBpY.34`7MI%yh|MafTV\ǵi)<1vWŤVxE)R0vZrE3hiG&P qZseXe5QX{qǰj2(y 27*PD%I#0W%@``hRcQ!1M:t a 'P@!WZY'A`M/H=芠Lf0WL@: j C7/DaZۂ %#P2Q5f2 z  *70/?К9:D&π AJ: ФW ֱ9ڥ=2)\0C=/anSO$`/axj( GFf!Scx|# ` ;!Gִ;q1uQ:ca$Z< @"0"#4b#1 ! R w (0Z.`$t7 z |(90!; B(} #P9WWnP"](`#Ot: -p q+S Z:  2P܇z{hJ , s#Q *Z "4%PAk%pP1/r ~)`jQ*sز**`0@#3@HD ea P[G(h1AfSpF kiJڇZ˵^ ic[g+in,)tTt): - 5j~& l 05ŀ;X2BC/P2 (PZB8j!0p2k8@qkhr;eLw MP(){ {KXȋŻ:9q488kjVuŐ8fq!x6? vc 778Ó9:ྋ}+ Tv:߈-pN;`p;ePo 6,)" ~$l‚*2:e/h1+ $@d@3 и=N3H @ 86`X, *D#)ũtRC#"2P?\2$3C>C3 iq j^ C .ShJ<DUʦ|ʨl ;Ȃȭ,6>PɗX,HE ! ?D7`FFh:,̹]8M-ɂT V9dtLWIp6pNT@poitRTyG}#M]KR&QX 491 t ɂ>kp_Y;e,۶mpʺ\׀| ҫ}f=L Jmp=k\fcy:p0 [8TW^`#t#j Ys#GJٷdz07 @ڦ}MڃPx(,m۸M9uD YmTE!+@=0i!:eSewm0T|ས}bh]a]9 .# 9TPn> %pZT n #&~(*,.0 ?=WG@|VU3.5NZ1^·_~M =\[DEH_K ]nç*NZmuWd ku,`e^~<16cAnFÊ0uyF ^2b[ a$fbkv }*`;eׁ=^.؍RN>0M dq[Mhɩ7~k2Ȟʾ짚>̯U~lmnvmlOm6nvnn6mo60onooUpU*yqEi&iq'ȃ3 se ~( F_DdNYuxv`'vSvuikvowsWwμw|w'xgxxxWO(8s>z p .mZS_<8Sg~~Wh#LKqdO((T@(y‚۴wEwys1x}9F  @E߾?5;Ź:8LPql(QoxsuxOzȇ~XXȈV1OA *X wg3wP;V_/=ʰO9 28<3J HH3H 3#h@Gd"KORN(*0N< 7O5ZJ#2Zަy*\^ 'ŏ24eAaţCa'WPa>`Iȍ,@\@ *#?(0E & &hqc٬ tx&h#  ~@nx+]a= dIAA2] R+#Q=T1 C RkR=H,p9ڳ9D)b*B2Ц$$inУKNe sw/b_ϾM>n (U& 6 VhIC0 &<@ rp&LȬt*j<;%+(#,0,4l#] 䎢 j@%;<Ȼ'46>;H4Mm3 uҒ WlKtPr:eԚF٩x l0y=fɳP\{/'>2HGlqs0L7iHqEfFw#@g1lP#+A# lx`@Le%f0Q(>3#4o`&yw2AĈ-*+[J_dEC3HeV !+eG>FLl \S&p`L"/N?Sci N#p^51#8!D ܨ&M=ݫRdd#(HHbҤ$S-yILfd'&O"@R┤ODu%BR BpS78Jg?So 9c #YLgѐ# rVӚ6mpC݌Ѕe@P{xRoL};Γs\<^L}Gǁh3#O+hʹ7-~Ա׸ 4b}M'ahAB8HHAdziVB.Yݯ5tYHV //k`ͦ5M>Vhe*h "73Qccq>V+AC?eC~`~'}8r\F is^rs>G*!93{H5U "`t|#,x,=PWmC%=A.tMso->"~zC3>AJn zez#X#D؁ r?ңwYv<#wb=n\rHq8v|u`!"k`@`0@ DS w8/EH Irk0$( frdžцTy2M)b7`]Tp]?{y7QPR 3R#5(R,c/S0S5uSŘS;SS(TDeTHUJT;V)Et(p6E& ` 0H~jY\vuYuY ZeZe E/5[u[Y[%\e\ȕ;D50Zbv.8kW50 ,^___ `f``aH6 aa aVBb`bb*b.H! 0 Sp"M?`<@o/yVAryq7PYePffb&,|yfffng gtfgtgg|gE) h@hh' ;0)C&q8r Wo \2k k0Ff Z  l fb((`&S* ܐUɚxeo'p0%q!p+p02A6)0qA1MRGҀT@pI cn ~u|sC 1SG M7` uu]BoPPn }yHr!qsD9WxyPxnI^ Vb@a:fZ@ezj?iB0UB!f o'0'kaTҋ) G r MS4*zzѦy! L7@VA5g4ڒ\ڪ ^緙p700 z21 qBhJD!1H#z LJ3P5Dij7V3x-I 3B 눪g4#:گPUY0OKP@1ʧ<:Q+H:S.򬕉>~I$K!QW*#a+;PK%%PK ;A!OEBPS/img/topo_node_edge_face.gif':GIF89a@ġ&&&222""" vvvለCCC{{{XXX???eee!!!TTTrrrfff;;;HHHGGG)))DDDnnn...sssPPPLLL:::bbbUUU333aaaKKK***wwwYYY%%%zzzjjj666\\\]]]dddȮ·777^^^SSSiiiOOO,@ѻ 7h*\lÇ#J8!ŋ3j܈"Ǐ Cqɓ(S+˗0I͛fɳI> }iHtӧ!u )BuZPڵك_i)Xdʝ"Hӂt vV .`+h ʠAV@yd8tCΨS3C:1⬀U=uٸ&{+pQ(dkZ@zPܫ rP:/# i\ޤr7FETu2ht3H'H,LNUK3 ==]Q?65Pg$-$mXct$ C Ag1dm؉g+B$5bw5oޑ,qҬwWt`,9lK{/6,.N]l1(QmR1F,qmf_?⠐!H, @" >sH =6P&=6_r$PV2k9YZ,[%%8JdZ|7@8b,e1@qit+eYѐ$.]T&pLq3a<7IS#F7sGp $A-|dO΢T5-hl !8/@B3$tUt@Fґ*T> T%F:5SuJph %/[N ӞIۉ.t>ZԀ`B`2'7Pn ҧ:"Ȭ=M+IAF:\W?jX:/Fr1d5/}{9B,: k:%R5Zbe qTȄ(!Bf%v80**_e; 0 &C܈X` V[׼5#n['ԠeFZ @.a%]76 ^p*W&0- /愷Ń$ /vB`_aUQ-"\ K=Qj5hv0-8,Ci6k+^͂ K@#[TqΎ ")ngI.mŒ)JR]Zg*@>3:ήXܟ_ZiLcyރ6葌тt=GÚGv$3fҟ#P6Yt|̫!=EP06b '}gns&WI%Wy!}Ӑj`@ } SMB#Y`tz`q: ;Hr4 |}85~+fg`N{ X [\S~(86\go`ApqE"i0-$p@9hN&x9 0>(D+=>'؃W Uk]  5 !ƏbXopP;$0"!`0"3\9gs ZF_q7 :#&8W 'gx 1<sSN çb^ɹ)fitOW6Ht .ɝPQ5RPqP%6&ٜ=vYa.6a7vryA *{r'#qf{ zx)7)G)@I 71zj:w꩚FpA 2rD*qO%!b0$0@5`\'k_ W`3#'0t:a9S2) tJl ȞhNsPBS(>#qhg Ei]Mp.8j*pWrk, .\!Qgq>ڧKBz+RiZB) "٢dx1*ժ/HڪPi4VY` Rw *fڭP6ρ) ްWg<h 7g^ ۩djIi٭I t   `teG%{ ٪u1@ފ)LL :@ "מfqhDm7#FTp>k׬PWz'&+* 9 ׵:F :JFno0W[{Y'dTEz۷:wk˶[kqdNiGQSƸT0<{``(rAj f;H5#yX $ qc.E{㴺[) eꑒ7@'XY@ż1WN9w| Cp!yc\j5CehEҫ Kk9̕^Y`B{E[r6C& TJ{nl@݅^ÿp;B6[`乗K:Qb/VkH" < ,^4 \4 L784+Hl$@Iڣ@ӌ] &p1ڒ X0л< ڂ ?#[Ƌ|ؽڽwgQ{6L֝Ds} 3v0ߨޗm [)@Wڍf;jMp;Ib+=`~">$ ^*,'|<*|k(ܹq'K Úmd+LNPρmZaUO Pz5+kVl#IQ"eZ.Dbt.Z/L":G!OU@P$y^1h^-7; P 8A+_c4By709Xޯ@2P0% ^'+Ypa%b$PND2Y"YzFے Gz'oHvx  $Ip%V.V0ڞ+V@lSֿΪ"j$$o㶉@%g 3'#^o(%/Y`t ѸzSP)>WVt;,:gVb Poqղ_*!v#gV? 2qj.0SaL/H`67ܾzFʚw/H:{/4v_ȑ 8$xfY~?CtOo/OIXjYw/ťT_'iMˀR.jvfbN0QŶR44_QmnyAUHշjn( 5L=3P)$1+,3 ϒƈ-. ְ"4?#PfaCoV" 0,@@v(Ë3#v `*Qq`%Q#fhōqҥ0ɘAm !?R+DG.eJ"i" +hDUD98JI`V\A X}RCOJJiXA$ESr fǑku3^nȁ`,FA j$$Pк#蠊V8}4#GXv8up9<(ض @@)_l+^R^8Q`QW "|2]?Yǃ4iǛ3P8+O!Rj),Dl'x!Ҁ $aŐ /8#<Q &?a@ `0C4؀|ظ&R7ِ) ā[0e^zhÙi)gS飝VՉgzQ~#nTGeR:hF#iUQ)DBvʩJj飒*KιH2aS@jkrz 0 >$,*@#Jl̀,tny4 ki 2omL맹W 0[VO jl$q0 227ljʜ>G41 t)-DQs- j- Vzm'56) vlji˵ ޾}u S<Ma'䊯Ϛy y\g秒^V%"=qљ$ꉬ~ zF){ ,YN /ʼn%Qdʻf+OF9Q\xy~M8P7}>\0"vF8 15A@JArDnD$n~LL)V00Ğr(Npab(AD B9$Ca\bAF5@"A pAXHGtC%i@`ZC/ xsB"zD[\Di:,PS"z!YJG :I&K&``d:b72^-LV=SrΕ;%&aYƳ*'7g)̺t7-Fl4t0;KNE10*iέ0Õ~0 HjSqL _*^ʣk\Nސ+" 4&d T ս&B0D@̫V@ ` UA k<'E2dy8 jڻ Zjٞvcl@| ""ϰpe;;q!ݏP׺wJXYtweu!na%{ݻDE) j&/~N=_WiY{yWWM̯" >b.":80nt!~0#R spW0$b k9&z}h`|āt(*׼G{År9L /h:]|w$gwn]d6˛r<}Tanms(G"n  <K~/uuQ5A?Oy}1j5b(ܮ!P $eR{1w>Ti|=Y1ӳX 82#,bi˟d,pX #Is7uG~'KgIfvj'YeYzRdH"ACQtqE+P~,.z^Á{Ԁ4 \P\\k"4pEYE[!x;1A  0pYh}U!Ehf xDw33%AE}T! oGsy"(%$BT5!ܱhEo0r#$aFx Y #`;eDb$HH|cY&%.0SzmH~"}dfh3Vc6o!Wr)(6&cZ&2V1):~`gFq׍2JCR$Gi׌%:s^h7Wl8( ײ1YAB2Yۇ R1 ?Y0 q = [8ZǑф(3qY #x195 0*)84NB((1~f?葞APO4!,JY(5"5-yo1<T3ҕW-TI.`)[r#/i8!Քg6R7n*p6cr8{sx◉6]Ye S )lFpnjX)DgS8W;PVgn2Wu[US(S O'rr]Tw0YuYxPxXP!A396?p {B_0}7D 3QbXmKKj TkQQB> H7] rAv!lcKjg_֣Y+_ = +-(PsQcP&w#p˶9 fzKdW:聶Kd_Ąd'㸤^Ƹg)!rKjy(G֘j+3:hX!`%X%_Hhqˀ[{;Xɬ{tٻܫ۽[ݛ曾KW߻;G{Fj<|jf <\P|ܑ"\ƒC&&*9.ð 2\Ê6IK:>ĻB\CFĭJPTS\XY'\Ŏ`<ƣ#d|Ɗz*hưlrx?pA-$ bRt9`B$0@`1iQ"DA@AIpRq%B4\@Gj5 .@* @@RIuXf vTuy0y'f3`VYeec|lM:p5\i__x_CVࠆY@Ep  d7`F"'J0T ` (`PPAPMP <@j f< : CSFT+ii.^j&0aLcM5j\s`']p]vy{p'*1D `q=0 Ё V3+v@ !k<@ 0$E2]Kw[FH"P-0*0/c*TBGh0 oڐGyrw^xM7~x*0}x``d0( !d- @r&"ry 0h@4 @N)tDªS>w*jUYe׶VcfXh3zǿֿ9g?}És8LJ aJ`|lk@ Ax`LXl'f3VEpc6\I|0Vw>%^84zs7_7'a x86 0$'*6gëbgMU@5Ӡ;JB&|pcqaTT#}l {a$\ /Œx85l \49կ.DFI8ptlOz,Zn .^ !tYbLf2L0Ь39MgJ̦6nz 30qJ 9 ʸӝ{~?-$P MBІ:t1@$*QDYͨF7юv1f4c(MJWڛ/YL]*әڴvӖ:LӠ>Rԥ&ըFeRԣ.TJVkծz` XJֲUhMZֶp\J׺xͫ^׾ `KMb:d'%|k8 lP% (@j`.lgK[sqa,BW NB:QJHg (@B37 P $z `+n2MW%@"+ aU  ,X,W8S$ fPR3,"2/$x:ضBX).& f]%0^AeP!-Jz+b-V a `0@  xmx .^ǜВhN6pL:9*ȳ>πMBЄN@gWZьֳG7zѕ!K[ӛ4CH/ӚSOԫtjH:ӫGMj^ֻs\Z֮nkbzҭ5AGζn{MnpNvMzη~ߠ+N>( g!Nq37qc8-q!'~r-O9er*7y;,9yt#HOrMΝ?S˳.:չ>v] z٫Nvo=b{/xsr_yw;/30?{|?!yc^~8nl^׻ꏾ'>fW7\vw>f߽{ڿ~!~m1}o[ K2C?  /T [׿wg|y.ן|?rws8yHC~x q%1`!c@c@}`pm'~%x}W@wyxGy|79X|x?68 %x(zPq3p0X \=Xi1b4*ڳbh4kI% E(% mYGjYn PC}dȎ|TI,ɗ[i1[ٙJj{s9\yٚ`R#i)}IzIq%E)y*%lIQJt^b\ڭdə6dЩzi ;q:Ǯ+ٙ40_z`9#R& X)E) ;Ax *)Ya#;S<멘 );䚢 ʮJZ:qح٥ʗ m b)pcgZ:Gf 8=NkƘ+ʟ}$j jdT+׃PʚW,Vp߉ sU D+p*ij ʰp.!ƒ+iQd)Ad k!:U4#E!o)+ %P3Zb$40=A`B6-’ *pj@ 9Ԝ`40e͹ݒ@2;i#NY_s=P;I4/!ʑAZyY_c->˽IsjROdpZpYr:ף%A מ餼%i؛qE+-pT:R֬\_͵@:",)!Ͳ#E拞֜־ =8ÎIKăQ:ӻ6]}M ̈ٽmӿe pݪBF<֌řY\!B[=cJ=Pֿe,AS*ʥ=}^5~m/:-=bZE`<}%?"[YIQl=!)j _JZsMQ*-uZR Vϧ*Zia~ pI=#-6!=2nH3 eި}]!ޜ`\"R^:\Z\ӣnnz@ZgRqɩn͗X=!jə$Eu(3dvI  _U5_O*jE3Q;diE(oŎ^ ƢjW< |m BZc@jZڥٕo<\ڜkTۥưMs2?'Qq7:-lkܷ9 jZ(q[ug(,p>t)z8zNz6_E;C RĞ[YQ4m-Qs?m" _>MMI vP4pپtŸ Z# - 3DJG]ϸ Ppƴp. j)벸ZǵdT/_˚y^OӀ00H88pxH@()Q I:ZzZjj8J+ 9ZɉX,iY |\KP aܘ\KN]11@0x( p(?0OL/a:`<‰&|"yєWw(4СDVȉ4ҥL:} 5ԩTJAĉ$zH0C$0XB!B0B"|(;胉8 xB|уA$B;Lذ`„_%ac0| CLBP40ox <`o GSj"̛\8D-W܀Koty8-cH=zu>y&!z?(`ͅ>=f& ` <`AV B<`}Ck1B Y  ) 7f |P9 XpCJ GeL@;8m)x,$= TnEHjfDj^ߕlxvPLt ē 3S(Be~)`ni!|0 A(9@ãX0 2܅* &|C@~=(a@ ( C>;B &T1 + ;HxCz@Ƀن Uh [nݕrΤsr4 ( |Q1-Rx2CV@`us" 2zX&DJ =,h` G $ cah"L!! !WZ 0p\jip E!86!G'{O<#1o h9c(F<HJd!X r : <'`"m€!4 T@@}00 1AT@ .ۚ E.BL A 2ȠrV !A񜕣ؠ؃'Ayْd;xd O= ݍO|N lC삀j>mYH d40@ >c$ T@ }Y HD`]z:!hTpAJH@ #Exgp!,j#ڕ>PzkeYߪV5i]k]VծyYW+a׿"VykaH qe"OPPL`,ؙ@ 8A ddE2 I xB1+ 6!&3&xg=P<!ҴB%ﮩ&lJ e Vx;^7=z˻^Wo}KW/zKwl"$A]v Fbx@U5 g8iV JW4@Dn&`-*H>  A`"R3wLd0 r 6lp7} /W4h׼_5A)V7x xL  r: ^3^-! `$ب1Id@|{LmiEVi!PJb{b@g~{f_~,hk0]ߺen \6X,ŽcN%; 7lЀ I #xގ$T` T3;*b( 28C[o> 2cv:H : K-HxoNysmm0dF׬/>p.4\wѡ,klAX ARp=PUlv`FȤo85dZ%eARw=zĸU*B=%P) /_1OӖ=ipozk瞔tzSz f~N`i2)[:Z mA cL>{Ǭ<,k*ByA r`=hpsa5+ ^='F%uSp@y g]>!(#H%h')+Ȃ#n!Vv|3h2]EߗhMD4sLY#0Bv,!IHTj@cy3+j P!Psda@b3p[0j@? uljQVPtԅV omtFTl{f{mpu6|xS|4艛""-&6M7@# Q"+ T#B3$fdB{!TC#2 p*D'Pj L`L)u<+ro!>!Peef^l pxzlQutlvq{x{riF_wgy)R)e;T6#0A@>r+0@Cp$Uih!NUsi56`5  #j`L32$aiz}C@)!t*" L!41$!#`-<8:D4d<|eem􈏿g{a g(sfe`Di)UC 37*C<õU6VcB!Hp!}P 31>!0P>"<%|XQEpVMPՔ Fޥڦ(j*jJ^uԉ)KY+ Y;w@M22>29 h( ~ R֋c5@F507`L5e*}FcFDD( GyN`X^Ysmx\)ZZI|~u%/#LwbE0{I6c"$<,KYj10@D R8w=;&JDtRSC`I!!߄I f p7@इ|(i-ʭ` A80bhYQ mQ5S Q$5$G!"`Yk)MHj2*qIh9$Epdϗ!%#2U8H1;p>˓(8}zjj V zVכ |3K5k79;˳3+ `jujRR&wB#"04pg+w&d!P,ݔ%cBY\dqakax=P8s=נHfYgj՚X̛fk[3qs lPV5FZe5RY8f13 @K_J,2.33YT!P !%MCE=`}Tgy'8~QbpYVTFLD!|zf cXPPVg 7gjPRJQ60 Ajރ %P 6j"zzJFSHa0"\TK'3SU-(",7VZcQ@8M\cqDS*8` AWPz tȌRI>n!975@/DuEFUXcɆ``C9,Ƚ'g П8~V.1RI%<),"3@Me&u6J;{<+:RR_A P7;F9pєmK:<>P( qrG*{<Ьa5ƾ^Rkc<"j 2*o=ǙVh-77:j& /:3HGaa (@a>27`%'ƃ!"|Մ{x\U(6!j3a3v#w<ZO16r>&)` P>pĝz@(] XͻYCe!55Ke%"\)$,5-Q Pj\[gHn"q!ZsAR!'YU!F2)p{!9vIleRӫ7q&9, wE@yJ٠y_ٕwl03935͕p4k޸8և+9xP]Wh"B.6cy\0չ >dq"PM|>m,4qs 92;;.bI`<eP̔/jj_!= ^^ Ѕ*ReDʋH " QU,DW P!;';'5P5.9*|)3FV5T,Hp[T58ɾa{zvZ_|OUuH])g4Eq)F#a `QMxCȒ@#+@"e!a9*0CR;Ic#7q3)`@s=Yx8]?:{Ԃڧʯy_/UUHeuO!G*!Ѫ BB%%Msp6C@`!THQC!; %> 0 =!<!2=28 1+6·˺" 7  )` v   $d# aD#aȲ4<@F* !"Y]==Y@$D $J[Q{u믮ʹEUlXdeٷzG.zx˷:RH0$7Fdyh@x:"Ӄjd)8`"ȃ X NX18DaAi ݏTcao#vk̞7[X/[nMu_hC% e"@i4` F`h&L 1 R ` d2bؕ%] @&C- >@3 C!%1+!:HN2a#[ɕ{pGIK#&9 ࠄ 8:&hda@"0DYC B>` 9Ce10@S 6H6uР`d#;PI; E&P:`um&hk +k宫b0 /|#e0Hpqу!*M,`].#0T< <$qOyTxB`lj3o6"(@'X؊ poߵٛǟ35ͽɛ & HН`!8OB 9hDb t: BOPtKaBЁ]OUS\|p !@ B`@JGGH@=MP@"@|$@AB3l`0$ B5lM!P6H@04H~p\_憌^S>Cn`C 8< autg @r2`7%HA/1&! 3 6 |{Gz]~V>cd&B/@X)pU4@$yO>Cb{xf{LBPs@Ay,wX +A*ڎ&Ȋ[ @@ H% @2 8N-De%FL%GC\Ҡ(Nݳ-TW T~ssK<͡eP50R :ec!dS P`@̙i$lȓ9p#'KthVj4l:@LgyMi:#T0d-(*DElUEӅv~W]'Q_e5!P Ԩv`ṗ;lOycfG?U" vr@O> - d@+ 8|L90Pw#l( ޏ<`""lC&/sO@U*` jJ3A*Zi!>El@F2 hDhw&S0\q( VZ@#+'D¼,WݯLS LsTGE V𡦈hT4ȵLqSf X *z*0&(cS6x7@!éxKi؀V ¬3c5jJL0!QiC05B7XM.M4%n܂HV6fQXF Dh2@>TDӝ x%,14IRh L g9 @6W 4InWsɪz8p`FP@P [KKx U DflhK8P2Ny\0w6+7Oć=~\bAA`XHPP@C<8!A8&tHa@ zb͈K"MH /n { @@'84dn{Ӕ슿OZ058NP@-)p64 WA `ߠ/ % sCS&0Jm"U TDM h# #q7s'UA7|VoFoD@D'=*p<R"ς͢&@?2f&we4`^TD_&ְqDX=FDvP 7"Vt,0(!+01 L 6t2 tZ0H%7 c8f:è2t[$;HB/PU wY5mMxPrLr rH"2s E;(205$th 9CtVq&RsKB94̓G8?لE(LXCIiKVHv$yY1e p^0"@ 7(0#1 vCp s$lu|`@ׁ @$U1;+pyn5#nDdIhGpQyVY0BB"5$qsP 2@IzQp#AIiDO%p"7W 1;MGz$B#@& @|9rhDwȉ99RGwt?SX@[ @E, z 2A}\2T\;@w!5$ my1:r5OHYV&'V`큢^QaaPvYg@r%D"P@H07P K T3-c!PZTpXs!<}'2p҂f&ivzƞy&b=j s221 }1 Kp,"f=S<5@Al@ >#x1rd٧y_A8Ț) BY rTT#0Z3 (2ćl+AA  $(v"56&C8k3{AbU[`^Rɬ{vꉙɏ}ʊjP:Ԙ45?`8!r@K`S%"s:FD,EG:a 26()- j <cQբv7mah[,z+zw큣R9!ۊב@=Op'=D! #01);j 1 OK 3&@; 7 2 }:^.D Wg_k&a5|; Qx(w5cHņ)[]Wz%pQ [0DsM @7 a0':7 5@K C4E7w"}Q `5 p^I0_P~, XtBI#-˚(xãP\P p8[!3,[%DzF{!" >@B$0̧3@U` ֔fGGKEɔuwNWC/P@P9%1Gq,i)t m* %R & zZWk,3jp I&Xܜ9k9Bgm{ ~9(-m ):*-.})?'<Ezc9G# '~ IXuZ! "p}˃0 ΰb h3`"<Мgn. ^҅~$ A#Zpd@0 70:6;MDCO $q 5 , 41~ugnA} yG BW'תhᘥ<3dI P 0p3x!lp4!W"ݡâ'@L0[oܓƊ=ƚhҬsҟҫf~&5+C;⡛q[ ,6x!#8#:0&2s%4K& tLX~=xҹYk?"0 4M-8;E*KFP% [_NaԐU&|!{9s9J心 +Pi/rxM>y5QnM5;orL7'0; )>Z) "Ү,Sz7)a 1Xq 0 >%3´<藼M }Ҫ܍a' u ^(Y`Uq$# (R

`B `®^8$^e Gl CՓ4pzW\4K( L//I1\X6\a `BTЁktLie5V5β.j6 jeSPpT@F;Zv6dppŽ 4$2<`5k 3t9Ј+rSK($@x \  \P@='(0h j27BT .rb\2̺W!*0 $&Ġ C _}(k"€ | L0 $Y ̄b72A ( c& @ZȄ;X"M{   X,ЦK Py gpS03 '`"A4my: x]6 Lَ.:x(c}HQlPC`Vb 掭1@G>HDnAF`:D X@DܠAP`" Jj",4,d#w]M$tQr HZ9Ȳ@305,  @0FL q LN0 Lqq;Pl5@A`W!2 \!@$َ5PIEn@,u 9ebڒ^p @G;( ǂzZT`P3#hX2,IU RC(e* >̬Bq3]#,`H h L vl@ hgL`g-+c1@a7LNT4V#B.Q`A&ʀ5 @ԛ[ϊ6+)h|e7< bg.W;̖mm|t[%kF2Z'ju/ @Dc002p }I=G =P \epHWVJ 5#*>>L ߃bщunj@,ɾ5l6[>l2 N 0+n1*FqqiY Uqba@vpD+z ! Kv`.P0,0S!&@^YT l#A@8KBhR lS۳%T4eIrE7=0Tthm=Ǥ)1& JC%yP@ADP|@*M$$ >wPN $ ئT:=H+g+(訤@bѬg&eFM&mM;x&[Ehep}cyp  P*4 ωì pNO6Qs*$"wbݣ!WD;Қ6S:9s8)1VvyXVDI ^܀*fcӮ,9Wеt|Y2 4<ܠAuB1 E A |2F'Wp`^.K7Mx> :oz=>2%6@0 91 E`[ u \Gp `&p |ByQZ @6)GO% Y'rC {6oohHfwGowo'F1,`.@Ip>ȑ /Tg3 w4Pc4$0<%GP(ز-+AN/#qk 'eQPfTtwzPAW熖& u aQ yTpǐ )LV5 .XbmTE`lgS>1k\X~p+bd+`NT6T0~.O:02 RjPAaMW{ aV7KԸT/'(/xXHL;`WqWc 05@1;@>1Q;V3R QB(k+)P*4KE*B pj * A=@~5^# < J+#sUQysn9ozt؀!MQIUiWY1eAiM)(&dt6A`Sv5BC~G96u5#D4`?"cU '&6g8*.20%3ezdD #NSQiF{I9 ^0ɛɎi +#b)j`A6tS }1XK%YF`q8~f@~jtYBY0$c `S"HQ_TU)q*@YT/v# aSXbru$$`(PA'OЛ TY\ L /i>6&2.1*R:RQYTg4@;(S#_88IdA 6Oq %Ufv #p5>]+st#A00Q#&Gt :512!jYy>\䀢+j@r*]2;jDS+8@(7P0A`a)Ub!.1>C t (p<` * Յ-JA I0W`Sh†k)8dSjA/ƚ 6"j;1:e(QJ":SJ$;a7<1l$ $0A 7pVP?" $0P;ӞS?`aT7Ý.pF0V R=0.@@'0 T{Ry 3IC,%& %0iŀ/9J7kaxKbHK^aC#(A1k$Z&W%p pCPV)19#,@$ fA_FtXoYA 1c6]>A!˴"N|aZO'"R#,p"+-6Aagz&c739rJ"7zn'J8j( AA :A ' 򩓻\s+5go3F$=G8pj0fP@~A Nڡ<21# Ep)0`c)bhq5.R 8^pa|_v7Xaul9^0"T"K +c;xc~^ Y#B ]&` e@j$Bc@B5+UBX!(0f!]G!Ż!{tF̸ ^rj(sդ$+!gI#zu7-s /qh{6ۈu۬{'ȾE0> ʡ17PWC'#Y::!2pO4{f#p5;vAS";)2r "Y a2"+M` ` 7Al]$mh+XoqȔK^ڸi\{`)RDg30 0^+Q nK>pQc1d" OP5.*Pڅ&oF@CulU(EA J$Ĝ"bn8~>K}KnU較-e 3"$] . 06` l@ig(jI p(r| -GF` e,XPkC`=dg'pVV q@ML DAv*'^~膾w2 |;m.ZC@NO=GTq` :bXj-6+`%oYܙfK!w5,q/Q:1,+,#c.39` eKwiWZ cuWT3 WţM5$t*`*Zג7$WJv3Pۭ? &pS #(tU%ᓁ 2  &0*& $&' < && ;=1G;8822 $Xa!mPA (l1B :q:&>TLP# 2|Hd dD Lx@( e S["ŵ,& Z˶Z [)Ix0T˷߿ ؆ =dc`0 ` C(0S<`P#\!& d!nʠG!F!2$l`0탇&2t`;( ;`PpG&x!Dvb KuTq`*@0 ba0A@+n3/wG ~ ` LȳO+hV E,eCBT?16bIB[ȐeL &#@ lP0WpH42$f;28XX`FXC ȰC zĝ0<` !!*H0 '`@ (QVTTP$%ĕYa`A @Z XlPJZAŁb+ JI/v)#ze£ j$ @ ,0ǯ  \eU0j7w^x20wD 4DrCd8  @,G+C`ƀ M`%  "!>̻TP P2$`!#ƶd@$;t9ȌJ (`9 d2d*wT 4[nSd5*DW)@ ,Հ3D^e VVgYYYZ!`w9 t @5OtD8 ߹6N - bb@=4e2 B"Gb!ALqd@'~ Ħ ؀ Ё#`;HBR$ ¬(D {X$4*`-S$"CPAC ҍ|'jh D3$> KJ>T@^TtK. D l@j% ,-P&$ Xu@^q2ͲRh ne@D\tBQЇwx 2JB؁ ie0`3PRQùnɩhxPЊJ 6p_V2H* @ʐ,a |@H :Ղ _q'ajJ c0h|eS"@9TZ}@*e!iq+LXV?Knsz^Q"U )-j.XJ!워 8? !Hn EJtBVD:JXه`pUh 8Ad6~I9 0M#NABʎʠ2i;Ͼ ]"زvrh39w@&jT)jcB$;pvʀ x'0T2RP( V#hl4 :&0 8 ylp@gCFRC9؇D}*) vj,V]S;PԧN[XNJ]` nR?D hi)@hndX@ /!CxL2Ѐ 5Er5ֺ!%"V 2玒(ëd4z0'AZ%HXЀ!;mЌ#:%j\"vfK>X""ӑcW;w9دRS!`, ;ؔsVL.32nb2!2`  s5N70%{a$PJ! $  55>1 5 0q; $>\srW6Mt6flc|b3YMGtPuwPAB 1QP@@60f2@z'@" 1w r "0p@@pdsh!$Ⴂ1'`8`/v w  !(I!(S@= sV' #1!!MF{KttH؋Ƕ` kx]የ0_n]b_$w! &V{@!0@A,G*Q#.ufG06 8@5EU (/`LȰ2&9@Sr +B{A+@$#<0I3{! 2Y8l4N脿 8Gד.!)pv F5b@'(')1Py _#ggDw&r,- cA;`S!u0u90K/706>0'U(BʧȋȨN HJLڤNN wvA !%Saq?`J6eDau 3N4A&>n"k@ ЕbrR,0.!$`Z`2ŜJWQwQ v0&G[jI20IIR~y ,4Uk4<& 1XS1Lo#hS'hq\bS$С&@9ѐx gR&j QS1 9Y 1Gad#LMʤr93V.DHBr#5#!@ Cې2aS2@eUPG V=[#YJ`; p `6C8'^v}ZpA@@"ЕЅT@xT&C*0bbۏ.a @b%KrT.] |9ΐ_41`;2VȰx>P0=0906蹿Cc8/U" E7,W|} rc  2XЂ,@W-5 \mSG_Ȓr4l4zv-<@:@sh2!2$޲a5 eHs/T<1 gy`6v"?~:+DA%"251]]D']?3`9Uכcʹٲ@V9piA jqVƻLyKӐ@Q :Jɠ &'.Ȑ@UY%V 'qŪRq0(084, 1@ =9(-m= ujP!ps:/쐉`eaXS2*Ia5KQ07({t eR6eTi O6]2Nc T(n낥t 8аkGSP55:q KY `?Go =pN@kۧ*Q8c   pr54C/8A01&ah2>ǁ#rs@eDgF7l^OMh $ee~PC h K\ j攀F}WZ0I4EP`(`)sޅE /x*aQ.#'< 1< (PJ!Mz- ̌0pBn$=; 1 vEP@Ó[1jpw+}0Ž.N)+lٲ†˼|ܭ+p1+ƉW  ??1YcML}@P0HXhxX)9IYaS0Par3 pa)"+c0 *0 !0+" 0;ѡ"sj0s```k1ba!rbp10r`0`p8!yG >``j6Q '' !tP!Ć d<>(!PFR< LwA CpԨREMѤE.:iլ\n*,T`j3.!Eڽ7 $X@)I 0,vbà `!B @ 7R((X 2$*Ā"7QD_ud` HA 0B C AuB xOy#"#| TnPNm1 BR$TCQ]<,RB6,ryBBDJR}<_ :S ZV.աXrZJ@[5"еbfm2@ 00r`_Ad!|P´r }W29" X0dL;fA y -Fh£ǜ8DZd% }#!A3 ZC9x\XBLq< C = 9tsh1TP M?RshuK/Ve H˖[Fj''B 30N`@7 2@B0J#H 0s- tIBc~&L*mQl !& ts16_DD |~Wh9$TAʰm9c=pֶ31ܐ}JWrRתaP쏁 `wЀBqPl!| 8"A ӏ6 GB D\!G_P¥<|聩ng[SB5QN=@@d0@삂 $`-fӗ0ox5=jC$&A*(C ǫF2Wt'9IФ&; JO2(MJRbRi\)[D\pla0<#a/KP)y XFd q0A`F"BL L L`*w A '4A|R J BU hQ(cJFh0_ p4KJ~xGp$VAiV[)KY*6T,$0t)x9D-jNHX,ip"ZJ5Y0B?c`,JP0b?2N s4!J2tDT d)[dAL`X@9@ (֥Tj[0$9S]<&𮴂 "( @J#`S)x lz4qI`+)ҦXE7UR4}MW%q: *CA5 p[u$xkbר2 XT} 8\0xf O@z8FD~ǀ`2_mR1@ B/SdbP(`F|00YVռ?x> &6s hk MOT[*AHAZU*g)@.pl C!H}f~U@ A! TX &&Ty@z>0V4m]D`HXĺIH`pv "vक़u&z:dGQ: D ftF͠/8a`ʍd*M@ЃtOd`"3?BOB@=h?!]Ih@$` (R  8y^TsT( ]:fU^IN܁VyA6pFk&uAH9)S+A^z   )" &vg|1,IH)-"#<a{%؀K>"ƺ`Z#؁fObQ`{@m|&0PFFz4}< =,a8ZЌ#b'λ 0] (@tr!Յځ h& @f ۖy 0Cv:]R""_lGpUw,Pw&#+A%'0d+@;c16p2%V1Q(Pw :XCCc^ٴ2E#"<`e0F@c8Q9 pV!h%)d)2 D` Kjr]Ury}Vsw~9s P5b] w # j'B1:tfq2D5vrvh>PU`ms;(`kcZBo#j P*`~Tj >P\}42 7? )JbQR~'s4gsCs`haQ(a2 / Bf;$3`"v(^* gW'7Q$r8 (RHv]p+å^s`*{[tk{ Ax6[d,04%;<1cކ}1#+ `(F@*;>@D aF~q"01zeDf%1s0u!)1 W4)@Ez qpE uZb$n GR9c8DA(窓+G5QCrF5SL#___`YSf(`f9 ÉVg 搋 b`ou8s(!h&P(02$@ $f =7P٪" v 52P 01x;P98.1; = */$AБ Ix>[,WP&Zm>2w !{ܷy{5}]I~dӞFRU |BQw)`xsfs R q' 면 P-0r$-&(m%1*5 q1 (Р62 l-zLNjGxĢU ΅ ?^~U?!MtKW߷+I,^I6Q,R&㨋$R2\$Fge6p8 2P E}%P]#]/$͹ƅA v 0@O!@iIthB y;!dpVС p#1@; 1 P%@<@y؇-u}; Z6uSXIu^THؕIA9i&` ,FqzFb;tX$=Q ut cyް  T&:9 $ڒ1 b;i Ec2t2 ;K8A#w Lb'KVHl].5䕦g*T:ę9TSvS5{c6l# (!'o*7,Y+QйNħ7!wBu w;G"p-a WٹЦQi XEWm;hRE?Orh\*}@N]%8,TA G6kwAzU%Ш9<";߹B& ʫ Pa5dE9A DܲC<fwT"!@G/ (_ /wj(Q*n`qDA9 Ӳ @Ġ --HaBt>|('R-wiisbspl !#&$ #!  (10  ( &&  6>=͞0;*; $kf` `rXD"Qˑ jH4 (>|لf>gzdP"LܤB08add0LZ, s*T@ $H! maC p9v-j'~Q,HRA&":໠B+/td#T (P97ěAFVmqhrN0' @6l1~15AVf@'h nV P ЃNdK24Ei55ѧ>AHh\DJVuMFm!OTԦFUTխₕhyPSB8L+,z`2T&Rh!wVh e>P !@5(X J)FpDr1(I$yل'0*>ܧ(AO঑2Nw9IO:uM#횀r{9f@&@iҒM%u;@Yx%PioyhwUx{'UmF6_$C$ np0>hZ3$ BЮ@6Y@3BBd`&Dp5T*8A Ռ `Th%H08dq >Kx#j7w ICpCA2+1[/YPٲYr޽el^w3v۬49b5̩Y83Ա 6LZmx8]l6X2r|RqB#c ʖorn;AzHA|@pQ4&7m0peYZ]̋3w{tx'w1~SbvEEtkDN:ܣ/p@JRd$&88Ww!NHchITG ƮAi)@5ãakmq`X; زNTpFb^gsWhPV-a_;jr]{4<Jp~41@`d8JV=$OP @`[$m ?YP=`&B&@\Aj` zp'ܠu (`Rl^՘ҝ:Y@2Q޽۽fxn67/ko{waF 2`1CCp<  @QPNYPhNwqߠP1@R "jPC(GqA@1 d߳`/48 }! UZQl32R$[u1 \lѠ^ 0c >3B`n]uFevcĆaB( ^owgcCt<4&P"PH/@`%HFp z}$HC`*BPBh`#6e& $%@FEdDah051h [, L ~}-hT 2<)u >vdTsjKvkW?#IYX$H(X꘎ dw_wwSH!< 0@@ pXr&D4F<^>nC~b(o궞!B _ QMtvP7ϑ:`Qd>p7Rh;`[q 8FWa0,51X͠W`;r*1@AN'dA o5Vj@P0`+J( Sc*1:StiG=>Q^2?33@qwfBETh1vz06Tduhş;CW 7@7L (`& .E6*ts" V#!pIkp(H@G* R{``0[/RY7*)B@uΐ!(=5{Z6G?åCXd%oQ?,?VV`&NmfQLxmuz} j[P`6јܠ<5!+"1J .;`7D  8bX)HsQ_f G#pKm' Wf9;C+0G@70*Sf67 0"zD>1"O+ !udb `.VV"S`waٷ"'J&Iw %3.>ce<2 j@.%P A@!M 50l"0/qQ!7ZpA5H `3*pb 01%%G9@2D7v`Tֶ ߊF Q ;;-"$nQj' y[YW%p??nIUvhW4%,BcCcw7M$@tI4`A@02^4к&Q\g%eE!"`!2'd; 3Hc1@/ гI'4# mq%P~b&&8 R`i$@ 51;pR'"GH< `N.mW&@:CX}_x`n]eI 6\([ `!V( CZC( 7)9DOX@8᱊ aJhie.}xX^$Ǔl5N9IWdXܩb|ܐ4f'pYp3 `EApI(f佪4{P!19`$ $^1{b&P4[F B7*8nvbvK?l ̍o>5}-mt2:ǩ0l,1 f+FH1PP4!+qp7pYsp{10|A/y?`m%#/Q &cP7<̪IR12/=4!SSqaP!q  fQ *:0pa jj+{Z{J; kۺ[ , |@@00 Mz] .>N^`20ÐiA.nc1`RJ$&Lأ`#x1CAX0A I0#'1 ޡSA>L7Npॠ } % |Ӄ @ر" @0NAX`eʜ *1¯b;py0fW]Zj|K#h:!nH 0%ĘF"<7i~$60) )>PqA$g N`iDx% " b 2A;(7A1pC0(A!ܥB70),=`DP Ft` j`e *.P6b 3ˏ%fK%eN2 哛A9)v%.&i7fszbɚ'P&OP +I #H%0Ȁ7TI+`K7:L' A&M &jc'e^$ A1 OBX` #P % Pw 0@B D ח@CD&.n`Hoދo>M0 5ֈ{6d8! ޭ P2 4@l$P у$C*p4 AsekC`qd C 퉸NPIZ(X 40  2=M0ve {~ C;v LaBb;@@ @ j|)[/34#z袏Nz馏骃`6  ߎ (25o& @D2e@CVIRړ( G0Py0P4E"U~Pיp `7X  (&8 _i@\bg D X j2RZ%ٍ`bgL\!s+XD K(„(L+Ў d$pG b #ގ*DA&a~tR EJ $A;i1)&T+_ |`)T0AJp`Fl F [0F|¢*n@4`R;lDPH3k:[(  FVd@ Hy 0> ͐xQGdgx9NvO`4@ h`l`@D)<;BAw(tYA}*X (x:@ Q `lbFL?S-G EP@1@% Íl&*pKr F9:=5E+!7@2+ 0ʕ H욀 !f*p XP*j& 8]Źv-DDe/lKՠg=cpZL<&0@VNe Ց c)$ulzJX*pf v hT2|0 1d0XM %J/  Ԭ AnP `#2P̚6Ȓ{=XG; *_d3Gq- Xj.P $@]yO8VBН%2|dt9u-4Y&rk$izf*PGLd 2) p9 bH/'XH~Cx]V&3f kd oO_^#Xփ_n`oR$e%.r AdbCzr $ ТZrMr+1Pcj4__@ 5/fnpn191n!tAL46zBvVIH,wQU&, ,DD%B`0, Г V0 $2aq0[*\@â& m0Dv`lO[ d@` ,TAe^ sjUY %DL((s׼3|1qz (zm]ø1Xw0Ȧr6bB1@`(KX @$Ty@԰@@` +&#;7XZx0э~@nT[ơ*P"$ߡ:;؀L@x,~$hw"jhC@ v ;Rq.79YW:$CdW:8DD<%RDyUi2^t0C u 72udA v %gJ1 3X>C 'Ga}jaG&^ Y;V!@ Bcg0a,} ^O'\(2*P`4 'Qlht9&6YAuNa001aA P1c8XxanEVlt7,2=tQxsi #<"3hQZx@ qI>"6A7D, !Hpt4"3 jl7g[0@(6k_v rCp\&@ROjWYt9@Ҕe#I%i')7xo$(C&3,p@s_'+6Pt U 8*|*S Qްr0+߀y)8jP]9Pk37&0+猄 X1 3 P"Ȧl  i9Yn !99Ց%Eo3)Z0"3X{j3@#H6S?Ep'y '>P#`!tV!aD " !@&I7)}#PX@ I`E)"*)1ΨAH+5☧Pb$.&h9٠ %ddjI2#YoUcXFąقy3]aph#I6%67K0:Q)241f6j0^^('2(ò$ oa!<2P,`x8rCmmu/HD9y(009;2项/ь)#T; HC@4;jwpVj+n4y21Ox 0b$&E8,d\IToR P6J`!! u'CTʨJyz #09eje1h*#1"ɱ+ !j0\ ) )F)zs+#Qݱt ?K'=@7w1.6& ;#!4#`AѲ56PFL0X. ȠBTN?@d7DclgQ֡Z8e!'G.u*jbJ0=d ;0'!'&/(KRz;37'> $qE 7@PBGSQw j` 1 ;j8;RT(HJ0770,t W0YxB,~ ņa3X::Ťš8:[lU|`,:a񁳰AcK&U3I@3x!Q8>GQX[<h!ւ o!y]' )(bc3O'sjcqq 9Q ñ3,#@VJ6@+p7t5fT164i;eSamp-a+f "A 2BR b@enQ#"P1<~>@cD'$h{j*/S \֮Nnx,E@*!0pu)UAݱG8P)Wa70> C6r)0G%@rp0uT BCt2P<#da,wI#C@{zT;puVr r2w`~JX2f Mm hU'_dɠ}/R;*;@ *PU'=P95{a{!%)Ohkm4<5cP"#U”G * #Fn VV*&@!A0Rjݠ%px h^I^#z:,?A$ ` k RlWWw1FӴtW5VKQLnf|P8qN܎::Y0#A2!RQVa=T7D@$_:r>^jY(*FQaB)uR(Fk BR!_u^i*v&X[0 QKҀW4M M:d bTYD]Cˡ c%' Ѝ`:C!#0:DZ"~Df(@;l*t.22L䷔u401 2(0%22#< 1* ! !)&#;=0< 07;<=O'= Bzĸ#톐i }xő'D.DحkGX}BܳO:9z̝g4 !j +VRyb4 (7 %,X57``aA bH A BV% 1`-rX<<+x]JVe-@ЁY` )X` fkUĔC :3r(sy΃6裐F*餔NZA춑F 5**JT!H5"" 2 n*M="@PUhĬdS0 `H@҃!&0R2BVpj}< 0T)D (pbm9;J#Fv,"1L C, o&laU@%!dx @ J2<,,+l#|Qzz H-4&@ %$d<@,<0 ; O )#0*!X @100b#`@p> 74@ &;L0AT%p# 0CML @Y@C|f MXQVx@){ R@-C5GGrh`Qf.[^gF~gL2YeY<3%+pq0B(R`T`p,˱3(T;Ճ @+CX\J U#"H oz( `@8ĉ.$ Ȃ1S$L6 ]Cx& Yh*l@)ddpn7FSESPë^$v㯀_*-l;$ˈFq=NP1J~Q TPhDEUz8j-.b؁6E@-?x@t@ W#X &HB p-Z9Jp@Xhx`$ ,@ >:`8X3N櫄ʼyΰ7{ oO:1(V+.br2)T* IP@,X` )E <0*} b(1>@8}DHcq7 LI<+G/ HRS+ 67ٗ+|9qMI(*< Զ6t ËJv4`] 6ԝ47RHA#7r4T!c"0!P$&$ c*!*kS %!p~aI33n=0%d'-6`W6pPp`P @0F(GwPRh^43EAYCw &r W{qߣO0'|2A0t 0L6ucL5T EH&0&Lo`e9P;AP9gH0HES5-WS6.LA>p#e4 6+7VrOG0"(e6p%80V$q-oan PqoErEp w ` p>p ׸@q >xxG(oHcs? Q3Ofx`2pRbXsnx,Aא-oAsDSKq9p \ `fUP- '5mADH&#e~G0sWHF]4NqZag0h%5R4/5%W` ^I]"Oe#6dA0@8iCqDp`aAdG=7Z#}BE2A7g7\T}C^y1 r9p Lc"Q"Aع7 JdqWa4*r%Grq8X$k ;rk[Г)7G&q' {jr Eo@ ,&@-Uh``!pZR@eU-̸,0 Q8z+"x 0+ = |Ik d6tDltѓqh=)ˬףF񠫾WYċLR'" 02[To=BL`79%B/*0<0R` ֔$ eB JJj0,0oscL HA,m?Su0^J;\5 u]2WZG[f\Fۃ++Fpr˫̉P$^Nd6lh@;Kr`&$=G& #@xW{7_ZE7j !0Z! +!x nP ",k8@+iE @4" A&F'103i"ciٛi$ٞi ڝOi4l8-?s!#\\}""LBep̼hŤ4>Н+Ƈ` f:Mj@LoqRSLW7E2# P e0t"!YQ #T-"y!\uN{WiԪY˫-0c)@%oG[)'0׍)% SwsKRKC 5R[G Y@n'"JuFė EAC A*'qwkC~E zd\lU7(,Hq{t"0s0   4LNÈ.É腎~蹛$v^#4&]HH[7z/ %T‰(KBvCàeAYL p9`Uur4H&NxT_B'R۲i-#!i9Pdo;$ @;: $8C?4l!'0`70%*ZYO-@[#`S/& ㇇/+1 O @oVA1J9` ~D"O0dr N8X%4Wr`zZr\T&O{<)a`rh ""2 #!!t SɠA"3pArC c 01A2p,r #00!s&`1"# 1`! aY`\pQbBbpc> @qC61d<{A 5T:z2 .\ & $päL )@P^0 O+-<( ,`A  y 6رd`8j 7nڽ7&$ȐA (0 jx NVq$čx3ćO 23q" z@ഇ}護qN00A̓'!C*N0bB+'|b2v@AU#O0r QJ(xAG$PK.At.X.=X$`P .R!@tAWe I0hmBP_RN`wǜ0%P l@ %(S%At0 x&$ 00oȌ@8420T::SJ'/sL{z # U C*6PgN?A0k1<Œ&$7uXZ P J`OePZ{a Y,%Lt ,<@W@ @\Y 2ldqk33&Xm9j4Fc1`Y ,d `uƀ;#9CUo7 ^Qy$P=\IB'Y"Ȣ2HeB]U2 <0  41"xeO>9R b TPSV-I@O[AS΢bm. i+TPt- }`K.0z 6( oF >L"@Ԡ(`HA)O$)C eBxr!q(\ ]8`! ]hqT_Pb|ncI ;#P2bc Q*a0}ǘ@ĀJ 5xvcL Ltc0DT 8Lŀ*70z&(fl3 p@eg1oҤ 0'c`B Fl1T֎L2a)H,2MXI7yjJBS aNZB\lW0ġ(iI &H v|B)URF @! @UDtܐ J<1@)  `M#A ,\cFL ))}PXS8spR G3s lҥ&`X*ڰ O# ?0)dhώ$)fnxM|Zsz%`R!c׻u_J^J׹,h=VSmŀ3 J0@abfɃ@(qD@Ӭ90 P5(9FSQ$J9'H0e GqŌ k&P 56@C( PGx ``T&vdHhMwE]6Mw%. +%@)p`nano S v&@ T,у*'@|0OnIl_p <)cG̰j! 4%,P)= z+i F8DΞ=sn0`jm%ӌ?5T3F$ߔ)NEhe7 }hBnYUntF&Yxxnli l΂8a`1AЩ&pz M頎8l@(@KP@ 28p#2Zf&GG0*61g/A̲8ݲ H}DQX=FBedXj Ҕt'{+pG['Z+v9t `:_!<@ ZW~;t"A  xTAMMAkK g۞ |p#i`G Hi iOCl`2$`,7`@;!b6?53R@ 2`R!p}<'v7 0kcH12^%(pV4ʧ{%;pX(QQ&uTP 0ppE=~6P @+}I@*F&}J uRJB~w Ux 1P(Yd8E_iAxM_ᤐ _\IiYVJ;naӉ b@ѷGp$Zߥ)], 2'w'B)>u!C@57N30oXwpo '!Q5]~|A/Yagg&  edF)&ƕ5w 2, ,F*H'ш9p8i/{|%W)Wi{řiW~u_7yq%4fH' wa8Ajv a3T2  ?Ԑ3GK!#sv1N@C%x &@4p$3 F)#v5PtKv&0l(&QIq a :gwa8 MhȀ 0;΂y!iO; vA''@" @#r * ͵6r !@@zo\ @;_dNc\ 7zQlw7ߵ6E;$$x73%<@n"7)p e\ weXe2P /$/ 9M9Ԥ'q}\DA/L!C;+b;y)Z|j`j̓G MYWs7 '?s]J2E_)b;55m}x:Gnt}x,Z3@qO8q$@G34@)%`t$al/u!+0 Т<18Ux dV s`q`Ԅ@Vh)"fp bAM5O#FЄ)[B $) &N0@҈elbsqPf^DP}(r p+]1u1>@7[H\pK''ô<862͵m8!@\tlH:@Ʋwa,V1-Db.;CR-Ӳ-"-òi0^8$)0UPB ՞r!APy p$@,`&k$fPYGYVrƠ+m܅DAB*F|2,0A6H&T%Kl uEQ"Cc9'b89$b!#.뀡50NZfqiQ?;FڼI K)rpҐ/ 0%5#l%/p?':0Nw~ X ":;<`+/4"fR!A "& EP#{RHc*Q@ @NGpb'@`Y0u{)'hD.;+q-C5a"8.$-?t=sqi#S<,3[ >@cI[ tc3,WbM*|VUE= +p,@ 0r+mß0@6577U\B,~@/ds+>WոLt6S1u;I[L xv$zQv vC=aқ$/!-Sk" 2 ռ.HiKQ ^RLp-a,VP]LLV!0zs%SF27hL_=&Dۆǰ8t< dC1gLT^t,>ب|#(~aT J2p AE# a qya! yxI#)r=W}W]WY0w{XBQ(PBVv nm)@0# 'qbS#3(FG2)4"Xv+4u(aH*@8& mYcK0ccR!P%FJϡfw($ca41:F8(`ԐǐY>4mp~s qNrxnEa}8&vXGRCN0 57 'Y Z{Y#*`S˴%Pg'0<\ _V9#l,ŴZpK|KB. 6$qCb$`4@/kՐ&<&n۰ L2Z {( c ݨxh an򔼀0z= Lu ==%U$@(Sľ=@`B"pxnFAJ 0{ AWA  eYU]i{ b@7R/91Eȶ f+G@ lfH@y/`3F#=I[1@r |r+0L%iXwp.m Go/;]YEPk%RaIe'#@Ї2%&p06l66HvP2) 5j 7G|Ud=;I tK"Ћ|,dCN K1>}9`9Є ejdU#`!1'vQ]X M_Y_/ &1 && & #)*6  &j '&!%* !,1;*&0%&7&& ;2;: 1 72C!==$0 8 >& D|``Br< !(5e@D`%b".%PA?hڐDw|7:$AJpxA 1PA L 4 B0afH( @s=B?7a<@WYuU]jWG )]c-i]H2$]CNQ)&SA@bdi$Y*@PP@Dt2H2&8QLԁ?НG9h #q`,8@V%Ꮓe` `i*;0AD ER&x@@ xNªMF\Y^;X{;;{p<_G2W Hp7l0eB tw4"lЀ H@O$P 1=H`8 |@A`(@.l` 2@-m@ ЀN %I].TB9X `ɘ< 0@PvDL*vE]Ђ sB&Qg#T &1 N@HJQGx Te8F2p&UP[$Q6q1A<k#`0t?HC>80n5H') hd LH *P@`(*=Dnw<2"όgC;ڻm,Vb8  =9% @sX&' K$=cLSd ~JALe*Wa#)6 46XC;;PJ!>6P ,@2dErfD (Jl"*@H%4]&ؔ V,YS̊JޓT<啸/.];/0=]Ip p%s |>AfuS0HfHl`M4C!8$Rd 4 '-ȱJyaMf;!Xi-!"EYG PXgm+A[ -|ЏcH`!֨2RtMhBh5׽goŀq _zQ`L|Dvo(g:`\l`ȑXT05( x1,"$83idd"A S`|M NPD@AYLLd);4 VH%^M\'i1I^AkYO@򋗒e3;Y?"9Q߀@ 2T@ KMXm" TA"s@752pB@j>nPhnpUeg9@DAw g%;-VP NOK@D]IkE]qOx0 qom~ԟnY.rqݍ;zqjfm&^Q-%Ÿu DG@<3r"'rv)p@q %p߆C8)[`R!!*(@ e q7RfAV$~0A9c3ƇB !) R!Kwt|u׷tuǣbMh}%[Zc%~5`0f0b,p+$@,a&Pp! 3@ 7h9llZC`-% j-Rp+ f'P6F',&3j7 fY#E@:$N[# i=& iRwH@r5Qcsj|@Uky1PkLR1HFk̓Q[Z^QAz"'#+Kd*070 q$8PT}4P1`3S 6%~piC6pч`.G$ ""'2IdSֆ !=!a Y> fX6 .jDp"7(7G/IWu0vXGKxY46cU}VW}4b7Z~H2^A PA2A#Nu Bzr%v _#A@r Xc  T]NA a'q7Ed |Gk&(PNt)> =E@o79#p1 ,` =H tSfE'k?P+Y'WZ}WcWF<ݨleGAopj;4 ', V23 A`#X) f @PJI/!0VJݐ'3J0CrMj(0DWu O#&P\YkIQ%0KP#1eVXlCluZ&4,( WIea2D:d r .y $ r+e'!8=qەLPpl}TQ:)z: X,u,7G'`.rT `|u >v RKiQfq 2p(Pub6@% @!v*zCvto#@(_F3&D} Ke4?Z& @C\=#`OUEx05151%kQZWg*r? &  &AG44H0X1 n3?"ef5G‡[<>`(p$8Fy4љ +Rpjj̢:!02 V\2R6,C=@=p7z !Oi;R(Y:۳T8dz?kr<'DěfACڅ Kqx*FL 3 ݐD`+ ߩRCp g N! (P\:Ww i@pot:> Dm0G5j0D2?FʧFlkȊF F˝޾r?A&0)`ȀDh WԊA#ڵ\A6 8t qKJ4JC>h=୸79A r9,`>A&@DiCpn=084{P y@ר] V1@&А```0P!(pdb(F"20!pP b1a0bB$(abb  c"Pic01R`!CYݭ1pa !qAn޾._?ώo@vGO 0!p+(ƍ;z2Y LXQ"ۃ(>h$R*@1AR(Xa2 BƄ (&PΜ\!L\C(+*@X7BQ&6yD 8(T"ɀí3 nx"|(PJ >(`1wȝ@@ n\xxě'':ӕN{ #J s, Ch&r Lo5Lp @Y& ™2G`,pB_}½CP2 0<0 B2<`#bjd@< '2ӈl Cd C U >Hn -4v muI'r׵ɐy7QWajcJ@Y ʀW 6!%dhiAHBHЈ HXBDh ASto0Ifog`1鋃ChѪY1 %d0V;` TH3HgT`B7Lc@`+z*d3ApؠA,ЌU !DPd 0l @YF+?Y;|sșDt&Jp #.7C*w=@8oX'9ϩ ]C=eG:s W:P9~NDUBnnuDzЫF*։II^E R0{`xش8 zcxKW  @ȍƕsrQ0PΖ:ִ_ 9 @a HI'f&A`pF(Wf@@]1 ·U D`ъ2o-y6)Nk hǀ %E$s}@7ؐJV=*@ CH6CXy2Cܒ/$U""c6NZ:g9ѱSvִ=t6ԓN4u"IX,32yJTmc;3@ɀ> V`hBMG,p 4eb G 0jaͯY$@5FS)p4 )7 `m 2$^M,R ]6-89v!obNtpwT7i%5NV&UHr \MJ|M PKfRϔw@Pi)\2j< o@M2 @jJ:Q@- hZe8巌 Z2 ls@g^L_ex #-lbDg><E%"@A-瀚&X l`8# ̡pa}h7{I5inUd+`#TaaNJ8Y1a4 {xe(R`uZuq#IS[+4#Dg&1wru"l2/7ssTBC6:U[zC#`Rwx!/3cUw5j`q+)_ȳ`0n r>Y10U' E ʐP 7`#U)!`Xu%UP[8HChkFTB–k9NU&3P5*@ !xp@Bfx &@ Hw<93y&7p2$%rU b `۲V$4&Or"5)4 P*W#5= -2n`XB/)r'׈.rxhNv198W`-#0./1x2 |. d3P+<40pt* 7zp~ej~cg80! EA1yo"0Ġ߅m$c.a*`pa&P[cd51Edd'zt)1H0/G10ghA hV @!W g~=*iP$#W6%   a#*`> @ts'+0E"p@0G9s/M 7m@$=x] P B 'aH2 *A7m3pp&_#)% x:8891TkBir! B#E$ cu-@Cm*1If2BB*ZPF-o5=ɒcq20Pu26gŃM A B*7`M$ Y;WI \2EBS`FSƏ8h(T\)aE;6 V&h150 eM'>-(`F!8 ǎH6%c2A) 4@) 2r=DH7gSfF!6m9hB",%v- /:[Y a7 48ɖ2GLāLZ:\ު L(#HTX=% @!p@>pxE] -P GEAq%#$@@!4+r v56;C=j:NGp-q)F- PaXf pn=P h,A%'pD@!{A\T,ydfkiZKwyV+ML;׮PE#b{@b@ b@SpmUPfqAQ0s7=p_4$]F%p47Ra5yaR !eA9 #a 0cGq`ܷ4O-&xȟ<%;/7W>(+cD0{s#@*A0AXD+"`Snd PD%?Ó!G3UMPnk3S.;D$Aq>Pa5eV!ڣ&Yp=R0 6#2Y1 j63@t`Jc–?d 0LLET'Ia`$T #0# R ?ׅM34 70v ߳hA%_0UZW[& q-_e~+T40 *‹9 $XeA ;@:Ij3RI֚1¿E\E7U<{z6&!6elM@?`IԦ>V GP$DH%j'S w-ЊwT7 VXGd, }+h-d-@=3V!58 c+aI_*WCJŷwjdIvKS L1dB+<y\ 'X3h+ !O45"  1v A%# `3 5W4o$% J$"p|)#xq#Oj&EJSz{@'"kh ֛lLL:"9`Gk O%pa,u'pb Z4JG 6f~Zzq ]e]  ) .A8b A$ \N귎볞~붮n봎h ߺr)!S3z=İ!Fs N -51M 3 N' A4@1Rz, })2j w~ `37#.1"oRJCo"1åy=99][۸$T%zjP?AC#^[G< KMeRTOW Z[<\` d/ROdLbBu/w h!-޽l'ed+I/ n4독;vT6GE*gX鈘r?kSoǏɟ5m?y1L^Ŕ :пcDC#/OTyڿOE  ۦ EJ\X,XJBX=|C*Y}5'D2%qX_B:k 2֒\+9ȳGl3?."AMx.>RYe 0lmTQ7G-3PU Ֆ[K fnlغ= z5li1Bh7ҪZˉm7ofm>uVÈ޹9;ΝV3DjN33KM0qG{w N,2J¹܆nڟs*bi-|\fa6@|QTLomX^߮kpQC');,8]jr\ 0e,x[엷(hak&ᖴ4D/"e ;8B($aOB0.acBְ2! _0?! B @U6 gMd(?IK%*URt*eJZ%%kXr*!IkЭ_29 MCŴ 5֤fQmVӛ6kv&8qst9INu'ie߫'s)^u@: UϣW mKp {_YZhFSd`~'0fx z@'x{7 z(b聃G+me:2w- ҂7mr{ P$xf@P4{(@/"PW~glx'$P#!bWa!`0hv`ȇHCd|dX7zsd/X?!gM' `FEXc#~瀇x~  p p (f  @&h|x Lhy`#p  )0$` ۰|k}Wth}ST[w4KgzP!@0 `'`؉&' 29'@!h#'ۘ9xh% "0``!`Џ"p!0!@Znև$aGw:΄p8'+87&! `x~gH]~ #xHi Iy VpPhi/.I`~ YiILZwerwFH6lV#X^ &y"`'hlIyp0\Yg$ y{ Hn'~& @#!͘ei*h_i`ؙ ` #;5?zg&ٳdџ0|80m0hi) 9 0&)p9sI{s.7i(ȕ`+i! p9ә~{Fco[CT6>^H!oQG Zy$&Ȧl:a(v*?B߷[ izx{:zf|an2Wfz5,LFا)J:wFvW8e9I'9Jxtt)ک ]gګaZMvʤ5hwݦ `>֭zbHʭ3dz&zA=V;?5oƨʥ*oofy [{ ۰ #[{  /.%N7/vh8g9_T Ejkֳ:kDkkI;;F ~V}(];Kwb2f[gIipnr;vmw׊|q;ךhA a11K{o|ӸZ;+乗۹ kkk溭J0V[+kpKK+ɫۻ ˼ۺ ko`;[{蛾껾۾;["@ۿ<\| <z"- 0 Jt p;P@OR  `R-0R@2$ 0";7\ @+\_ őxA( &kQ 9—` 0 @ !"0!` 0`VMs(_< ,.40SP2 Bl,"!"ʐH" 2LV  `cLpFx@ ˗ &l`U|gʊ_%"<pr-$,-s, 9 0| ,l pa\-or Pg"-/@#')</1^Ð"UGr: ͐\  JbGDXm`ЃpqHAm-z ؃t-l}ׂPn؂Gt$$/&=M؆=ڤ]ڦ}ڨڪڬѿQ }mpۄۃ+4 mB­- ý ̍}ҭ_}`ڝF=  -}-MMm> . -N~NndB&"n#~(N&-9B2^%3.1N>,(.?+nGN=JHK^MO>QNVLnO^`b>d^f~hjln~;PKw捓PK ;AOEBPS/img/add_node.gif GIF89a """dddsss]]]!!!nnnYYYaaa???鋋222ÃfffPPPTTTCCCXXX&&&HHH;;;777{{{GGG...666wwwUUUșbbbvvv***\\\jjjԄ---%%%LLLxxxrrrDDD:::>>>,  ›ʮ ̊ԃ`pġ.@ĄF(Q̄ b <@  E$45#)ϟ@AbC& /J$ 0Đ1F C"\ta@ ,fc 4[c ھ]1l]nQU T͢U ҪA#KL,YhUb9:uDA# Ck|:A;[p+il4бg9سkw7 =%6LKB)CX!l, ր1j:3DDrAr'Hz6 xͰ݅fxJw#:(S1H7b!I'&

8@ dP0 3Dr} @ 09S 3L!PA @ њ!yk؝<,l' 7G,Wlg+7,2*B0Hx,3Y,B_$LDGsL3E(|EG-"8 QP,"S-6~^CA Ŭ͌$`_I#|,`ނ@C+Ũ}'> 'SK" 标.褗n cW]*îKSNJ_#? <# }'W/o H q:'H Zc`vG< |K%B{Q(d"L  ACj(H"HL&:P(IXf 2aТ!2B0XTnp4 8s,DI} d& L"F:򑐌$'IJZ̤&7Nz (GIRL*WV2;CLcᾖ2{ed4@r .*̐f "AL`u&GAx$Dnrl< HPCN%,|*p"gNi+,c)CŚqJx+$B&21 bb?0\d82Y`"e[ I eAY@- " `!sJ ` Ǵ2 I@zA`>NR)DsV0(3I<+ @JRTb1 kDDسcuL@<X6mWzNrm;v0A.n`1wv-[y*Ua_1\Myf(0υb6pAaƒqa =.S=0H.\^9!' 5|~cw|_k'&_OMq[`>Մ!vرC=Kc'X>^l/MxϻI,_Aar& ^p)C]}YL@ƚ^PZH|kP? R{y>A/=,oSmq?T|nL ZO7";PKu PK ;A OEBPS/img/node_moves_several.gifOGIF89a???333黻PPP]]]777 OOOSSS"""222ЄCCCnnn&&&{{{DDD...GGG᝝---Ԙjjj***vvvsss!!!)))fffaaadddLLLXXX;;;TTTeeeKKK%%%:::666\\\,ܷ֞޺ xmؠmZ &NÇ#&S[͒ȱ[Y]Eȏ(S|W^I ɓ&Nz g-D*e4ҥPjzԫX#Q-e5ׯ,: ٛb=M]ʍRܹx֕t7n o"Y :@ܒ""V,ARvd p@kf%@ТIii+u> XoA-@0dr݆`LÆݔv8 h#~ʕx 'L 6KRA)Xq#Q8;( +LO6|v_v@ '(eMMvc!XS9 ˜cQ' !^7>KcgŸ-`jOGI d#(]f!% C]ZD.xbP&r0$b`j))C+\Щ5+ K Bɗ1 2JeQKfRb鮞Nj0K/m9y;՚MH0Hd%bd>`9 `/ģX7)1 b& }>|kR⊺z2:wR@_FE SoҐ XAԕȷ;)wSK(A_z:^}I׼CC^|K3 /]KPpOC 40\/>WpO3|Qb@[=)CD~AEvA ) `pP,+G@5 ) 69WX :y!J8 `˅ ?\zA^Dn( >S<? Ek hV6%b B؀ǨD8@iTBM|qD-sABRs[UWCCR2$lbE)Py dG8$52/%elO-#hn1=`"e ’F~r¼ʂ uL'1sIU8lcg7.7 Zݴ&6 mƬt%쩲e{턊2LqvC̒ICAISMj8"n1AI2UHl34$TJ dsI 4*, Q©T.'m#,}*StSP)[~ʖJ7%gQТd4sL5S7NM-UHR粂e魲JQ̦dWN4UiNhfNſjLhgX-%U%U*e;<@Cle˿y[gֶ5vCUꈻVpyE=zjga [*eT+ .E,s\.)y.ڝaua60@S&zY۔L':@Y^Bvo01=c Q `>|=*Kx ~z7=f[nm|k9bl#X4JM~m1*Jb`@+1=`ЉTFad8Ίe x_cq %gz=c2+'gdy@͙đP$L7ɏ`D#V1x%APsQ6g5s)Z&@sjFiRftHzVJi:"bʧG|M;F{$!m9^/nLܭ7-/iR94 ds~66Mk^MM^qS7W]Aޢw.V{ xv2cƛ'p[ag/du!-' ϚIv GZ(2o5].eˮEBMs;ngD9۠܃D59 'Á%T]D~(K]+T^`&k-wXAkDz;dLP ޢ?2;s>yGۍ%C LgliDu(JgpKXq>Z@=$Vo(P ԝo|AH R0*,|d{#6)PS(2CUK=N  PP YU@@#`1vE@U9h/זR&ԢRW-ǂESG0Sp}'%0`x+ %jJpT" "<I2!Fxچ +F7p@_NY`"`@-212#WsdG3 ?3hrFC$<"`X/AXH$;p ` hTpta8 O%\%y(M,>PJ' (ugKtG{~Dl@s H9mG'iH=X;hWs&;3 Wn3,]hlw~khipf&~  +rǵ|^yr 5|XXS#IU'@b+ɒa/ ^3Ie74B;ɓD4? Q>CI(YGUAnȔ@KvRTu+؎WIQDs]Qb8H+jlٖji.fYg4tYvyxu0h斀9闹" 9" N9iYp\9Yy~18 jY8H Dy%%)نo$ !  HPVșh$& Q' ֩P݉Sy2Ies첞2R%^)-)IG)-9];PK5\TOPK ;AOEBPS/img/flip_node.gifGIF89a%%%HHHDDD]]]nnn...KKKÔ"""{{{;;;吐aaa333???GGG LLLrrrYYYPPP***222TTTCCCա)))!!!UUUjjjfff\\\˺zzzXXX&&&777bbb͌hhhsss666wwwvvvSSS:::, Ǵ˂ ø ܧ (ݺm"dӶf4]BjDAftASfBl! X*B"1AD l]$B&NPPI(Ay 00e!)jS.TU%"@ES@7AV^ ! ڿd02 h`.k"ӌ B?[ܸu_33ٶ Dԧ zSl` :6XB/k\yz{6soP5zW- 0l_@CR}# 55 #U@03`f y"ǐPÆRǁCҁ$<˜R  S iBɠO5Z8Z"ew2SLZ UQ!4Y38H 5a-!1ph1 QffM#T44/3:'hojYݽ]fP'`Nx'XB}q9eR j:#l\9%(@ TVaT>8g2 P-"G6$$"= 9xh&@T HI*[6X,*A\E-yS_֔O~TITe!Z8AS-dh K1t`ΰ\H[e]W8.^P)0b`ErkH0!r'\r 0 e/B^Fn:;1o*"hD&$*ͳ̧>~ @JЂJBІ:D'JъZF7юz )DDҒ(MJWҖ0=)&bJӚ8ͩN#Ҟ@ jDY HMR':SCԩBUWBW3Qձ fY-QֵR/s(*דuj+IOkV*XN,ad%,dqWI8vM,fne= ZvV,j'KWFu-^C+,ms▷`Z-d} \G-rqNnR->'ZʌUp7" u\-ષFA4Fmgƫ[7=극B ^)7EQ| px%)l`rMy+STچ ▹80o}fScع9CxA푑.M-DPN=Q6Qeub'=tkve%g[&fd l7#Y>͙-#F6sۜ(b.s7wѢˌ1bԄ+֧k[p!%0!p!SZ GJvmqLIiQٯ/PS%U5"mR;&EMrܮ@5=a{fESl;=~߬ 87uWUxy 7)M қxb5.} 7= gxۜ=_am3X8PA XN wC%ǻGVb-,y%, VH&3po:,Wc㛠]O{N-aoy,Ү׵|v\uu{$n}Lw><×&o#n?}3jwQs|v]w>$|׭Ax%}- `X9|HKxG o`} qc$PߙyC( 4À\Yh!UB;gXZ- pG 6F \ ]iY57u h\ s:3+ ,4}pE}}ec0CC-=q'x`}lUapD/0t Tx Gg(K8b'>[]EG4Oǀ_H}bBtX4%DQCA5p0]zoQXZc -p1Vs6HCWkqhLxj$ulp[ƉYg|eE#V֋iVXkFTU,nh{<ZV;Ս6.dVܶWlu!긎#%hsZ(ȎX6exG1/#+$jxwtYHڸm OނK|XDfis9NUni,4WneknZD#UpIxAP@(VzP@e2-N ` Ni`p^0Iy!ȊYMY/aH(@Khxk$ɌM)&pI#W<3e}Qf] 5(9ZM;"bH3Oc`Ř ) 94W3w hCQ i w-Pf$&!Y I3M),P+@z2 Y0?(PyAsuHnT5 v -DP6fy I~dEOTT9z@b 2mwj3 ДPd 0E٘c׌&Ň# G%S0[zXVDЛVM3-SP@SewG, a44 PZ2J $V\=J畩xhnj p@V;kGkVI4_BjO&q5]2U "(>@)OUpi;Gi7cc;K;.*WE,|;1xe87!#aB ] C[(z'I&,LMpA^s/@# 2V:)#8*}Y6I 蹫 `1CU:~&M>S\bC"0›ҔSl`N `?PLU!REU\ Ap8U&IձF"MQ?aS(խ TFVM&^7+1{`U<],oO"ezE\'1RWFrXdD8ug B/MX4&unhA6a/^-HMPn1l֑}Djk֮pA\`u-#xۀE!B&@ls#+TQWl!YCyJX&v]#{GKa> \ Ha`XzMaؔެ'8/ V19 2 b'=(%dE_]}Z#2tX;O\&0OEDg^/kNߕx$Y|^!|3{{e3=) m1||hu`n|c5K>Ղ|z]:^OMDJ{#ЬYaXͧ`H<ϻFsj`OՖشYKB$wahӴ L!4lmƘG1qČqj۽nwige*; 0=| ,NO;'N[ϸ7{ GN(/cDR6̪j2/te4#x˩a lBXD5- mA4C,]zcuf"`N } vbvl:5P}wWW5xD`ffhsi),cIcUMw i04888C85Z5^J]k+9Cv)4j8]7rcL45 SS5:Y5]5m\dc6 66mo7sr'=#;#cБ;0<Îr<Ѓ S=:Zzګ:jc5x:?[>"BnUEm봭aXfE]ZFPcҕ?3PzMZ^A#;[s 4  "[0[%J\ԯֱ< ;0p(< , .M2V-[EI" Y%ɴLv0'W7K 1k B*MÐy/W*G G; x/%OTE HrkW Lr%Vz2[xQ8\Eknݪ ZR-Eu@ٷ H%AFV)?uL+]*۸VIU@ ' 9 KEVK Ue0T I0 G{=e{_6_2e[o/{ZNԻBJ⻽[OA+Dߔ +lexn놜MZ *@/oS{ŵfJeoFAakZj+^6%kՍ{aӄx֫DB.FY4mJ[R!aKPÅ5 VjjZ ,vރlDcU𺎐H >vF}k |/ַź#(++f%S-Ri7 ro|l(Km;b ȁ,{ȉNj|t侃`#kD[DTxL?Z|k%icD[ܘ@|%|ZJRL(Px#9p?ޫM# ʭEӻ70>|BA+PSkbLvaʷbQ@CC(Qdʸ;S|6i?ܫr&NsͼZSUU0  ,Q[ʎܫ,d ф C@,,aˈfdΌh%\Ӏ6ZvB2ԮKA@@%B l D%̄ tpu0xx'atbwb\u0VKݫ]enq52pܝݹ/ x0cNP6w'y@yyy|s#4t{[SQ~*0z k17!ApAe./GA}g9Wqc"ނy#]gYX-0c]/o>@0Ԃ q.JM޷'F.y> 0F[-PDSXZht4g0s~N(r|]ux/8xLn{$!H<2Q@p{;".2B#IR9r<0F@9XBi>Asa$4mҊJJ(Y{$''QX⒳)Ly(G 9B(bDB術s&LO tB.`4N%J~3qO=X ,\`)τ*⚰Z)2*( .-߲*Bo&LÉzsj.r.#;`l갍fOD z1##ْé <> SU^" Yp1-sp2),c321Ϟ_A5I\Q0"JR2 $Y0T +xj*9Т/ $j9ڨ?* W&]8#W8S8B8#9=)9G7D 5c ] 3 27; "#a("bEK)H *Ԛ.)BSу} ȰÇ#*QBE./Ƌ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧ!KnӤy RBh%|i"@^"dQic'\B@ iV͚!ʏ{Z)@.*鈢Dݍ+D +LҪ+4jkOXiMYI=|zJ듛7퇘\$qM`+V5Y bKے=Tgu)]HUKO\s1^`2.l32bV Id8ְ'bYgݎcTyȉlAg$+\IsfjiLG>J77FȜuF#mHQ፭V |mψRF'5YP4J|4D-BC)dA[~QDg` ):)ںLk!r޲Jz43Sl4{:C<8aL7wG0|s8piۏ/\L+uT#;a-C2pIL, F`q|H-Yщl.I"h.n5g$̆rtB 49eKf95ȍis7 ]uSdZf=[LCr1H'\"V}Q3n;|FH.>SE9@Bo4(HQ(Α6%;PKɩ PK ;AOEBPS/img/subpaths.gifGIF89aԔ勋ܡ陙;;;DDD]]]***&&&jjj???TTTeee```nnn666ι"""ݭCCCOOOٜKKKaaa...333YYYzzz{{{777PPPrrrGGGР bbb222)))dddˤLLL!!!HHHUUUsssSSSfffiii|}|vvvmmmXXX%%%www\\\,  ¢Ʉ إϑ̂ !"!a- 0P`Aѳk` -, l(S\RD`h\9HҭC@\x!BF\xp@ TPâqc^ 9$8$D"ukA`Dz߿I 'p!<&0,*AB)V0 ,C{ `@h IGC$$A^ .[vXdË AZ"<@@6$0H#H %QjpJD  *(A\ *L4%ndRqJB @ 9< ,&]sDJcȜuޙ&kt؞}(9Cv駫8@ '`p"{-D < @  ^~@leڪ PA0  P"+ @F;ؙ.&O|Tb> i @VF bQ݅\4v@;N1L<ЃbZ.x_ H 0 ' Lx@(@x.tWEH%D#/h (a'pB .=Nh bxa Q%C@ H"HL&:PH*ZX" H2 \[5'a4jWǽuHB2b H$HE  @V]xNzv%#FNzod#3JU,?IKbK.D T 8bYb $)]ҏ%/3-iPf8Hl%H&'s"'7@TD(R6|ഛ7;PrUD57yD@%mjV5kTh=gET%\q~$kKHhn#FZrs?hUtKP(xRUHd4 /uK_T|S;kM=[%oZ;]ieu[ΰ{k.D \l7<$| (e 0 ah0_/°F.xo~7"X0c0i@@J*CTn|s61hNhd.< _2[õhƲ4Af1π#G -s9J*6ЇJotp.";uɊ\JԘ^>8gL[z͘.(ℍ¢o1h4;Z'>*|c3Bϯi }GP¦nݵ#F]e12%1m!9ИffҦKi«c}0xFhK\SPtZ6ZBY5ߩ7.*C4sy|h83v*YrPeTH\u3|uEwbC%<ƄM*Ҋ_8g "p/}m`GxL'X,0@ _Ҕ(tQw<@  `_*o"d| =&FKPaJ& 3G`=`( I?(rw7.A Qr ~6fJ`1}A,`,rEs?P#MW *t)p^P*!dhpa-xCjXg_PY% zT&>xiVPaHC2 E{7sliVwg]/JЉ,Gt`x @ +G@+ &icGOP0*XH34U$4-ƋTWp )1Hp01!貍ts!g/؍/Hs0}t FO@u *@$`'SH=Z-"jf 2@|#9Q9P"ixް<+6n7J 7 #i avF)nΆTf֐ t<fG-°I0x$`Ey3IãFmc+ɳ۱ڧЈ!<0B{ P6!J,zx{00>| / 0;ˡ"!Q " FHCa@!qqeE\?`/Dt9X hA; rh+p1P),b'/"=R bI1 Y(}}5[mȡ 2 `'~p]:꺜bT(٢!ۻw놫1Y/8`!>^Z*(TpJ@8P-[HpAX؁=L0g2[:zMXDLEp,(fp !8L.k븒f> K p~  ۂ. 1ٸ`-\;鐅:"ɫ([l-ep& Ɩ9ƨb>bRq6jPi9ը )5K3633.3o1.b!9DL?1(&;1e+*,]4\DY廵lZ| % :9c , b 5 L9jʤq)=J\ΎA'ޘ2!7134P4=Ϛ\p7;4 oiוupB锬eF}[H "I),, J  I1 q --|*H9A9*p6Y8.) $A7@ux7#1B>-E`AA >[ [IsPMaԔBMiwRMH C-F9DYpsH =P%DlC:DE @%0aB {}N;PKvTPK ;A#OEBPS/img/delete_obsolete_nodes.gif! GIF89aP ԿCCCGGGsssLLLDDDÇTTTfffaaa???222nnn]]]&&&...{{{wwwvvv666"""鮮%%%ղeee)))YYY777PPP\\\;;;---zzzXXXHHH***KKKjjjUUU333rrr!!!bbb^^^xxxiiiddd:::,P   ԹŇċ ̑ġE$y&*R$ C A%p,%F 7 pHG(DKqhbō*MBhb 1R&Rl$Ёi"0cTFh@ Z"'d@"↠ ~U,G'5bAar v ܸ4:P| \=H,ǁ pж<^:$ [7[NB8@QPC:qaX `,$@}-k]hHD Wʍ1m"BHSLi,1n\q B 6gU{ x[_-bV[x B\ٕopf- x0Ir,)(9p+ L4QOAC!I@aYPC"qZ Ą 􈣎D $vŘ$ H Zy碐 b@|t\7@ @ pЂIkA148԰q"P!0R<5U{nZ -O +kLVA "pʂ< %eױ3!qiЉ6n7e,S 9s! @|yM|Jք^ؚ תnf0qvҫAmm=k9NrfO޸`qt Ka Ә`A0hɩtPX4JȺrq,mK_>T)GzS洢+KOӟUCqW{MBD5@FU]N9+:!,,SykִÉ[ux@rf)׸8-R(|9X^ SjzF1@&zah. $jGն2(S\v$z`c#&SmH Zҁ4b~d]*P,`nbkؤEWMa_+nZ.Ǜ,a78z ^՞6k HA`1@{w;\ @WW˽.g":N݁2'*'TjVY9# G88!p=??CEVF{M=#7;S~GV@$Owi 0$CeN 0'jiV u1BB/C4CVBHAxG{CF{sWt3}~[UB308|#@+rQ09yF @SD{C:GUNC<$,C`HRN"hW)KQ;pPd~KAK`KAKK/$ ʼnOL#Q5MTyTW4:" gKdP 8Pq(L%MxXQĄҊL4XԴ|% PX jSUUQLa 'SUa5VeujLeOUVSUHZhVhTk%ZrreDuVsXeg`gZ5*E-@`]VIE[Uy,Yf I\[g5C.9Wsb\V_e慔L_5s^Q^%aVy_`ŕ_byhjlٖnpr9tYvyxz|ٗ~9Yy9Yy ~hlPEW\:@Z0$pD TÙg` l /6 >@A`v$*IUvYS"jV2`kVIa%0p0D@ PplΖ+6&SQ _]!aP  jعqg>@,IB+&%qe-Xv"%Tb%'&dҟ `& /;L.P@O!,ss@Stzt+ P.+P EgHp5 +70Gx[5}SB SPw0V CxL`/Nww!0y% 1Gzp*SP-p8o)l`#@::0@#哪V3G{El  x~j1) )$S3ԁŊ:ҡ"Bh$53CH(:$ZU$ҴIJPAcHfJ $$6@Zl)l/ $xkQJZ;EٜH(xij_tա x8` eT`W%QbcI eLvDY.6mP. fGwcgGB}Ɩ  iHiuWl RݫBx @yoM6@2GZ#q jYPI\elǚ\kY *+@+&|ϗ*L v +<\ *Gú"C HZ\hX>QIANA;@{$<(0Wl$hXkm,K~ǀȂ<Ȅ\Ȇ|ȈȊȌ\ƄV f"0 ҙl^3lavpɝɄ`4ʕW3 5-fy ˜L \3}ɸl^%P̖,`ӌ\L <_ ,XQ͚\,ιLcL lq}a (Pw<]} 4 =Qʝ"=$]Қ<l*,0- U1Ϥ0a,<  6-(`yvI ]da)M<ڐC}f,Ԏ'S] + ]m`<׃΍ת kׂ|aW-pLρԼ k;fQ]\D付ǟ]D6}չ~sچ`^MQy}\'3-=۲f}M-<̽a}ŃCEۅQtݹ<۾ݖŏ`lN5]gWى܃rڃuHރ Q>$~f- \>!~a~ွ3"^$^~(*.>؏L <41 7Ȑ]xBv㫛ݒdŖ1B~MlL#~M @ #3gbm儌9 eU ^X~%]P_Nݚn>sڜ|>Ҡ->\膾Ȉ艼茮d<ǎ^tN.;~k.p)-Ijf|k냎.꼞灎ǞL̾s>3NCNn`rKK^NTpbX=0 !%;.PPW(! پ`L!$+U; a_]⿀&1ީ  PjlUPMW`K'Qa'08,~.` p>M cS/}Z\^O+t._eϛ1/k j Ki^yzŀ'q+EH,{Ou!PIO{\ eYE2_?_p-/FI3W j? 9@e ܐРG@C]0, ߠ  G0Gd\y܈  .D>6/+(&*)4ǃ3&""8?Փ 9%:;;:<7f(6,F80!E (f Cx0Ug:{AU2 Gs#)Z vz矇^r (4Tt C#Tݫ랺)ew=$J+N"37#w= 8 2<NpH7  pM @#%B] p8 :q K[J!(hA bz 6!h*NjRBBA XKI˒YX PA{Z4 *dmlG@6gx j7G `` v 9@g$dV<`4@3]IJZ̤&7Nz (GIRL*WVr QP2򖧌%,p ,dI"  fȼ Z@#4g0sQcPof$@8ԁ bL :i (` VPH/>Yp  h>XTEZ0[DTm &ZQB<`Uh/6JK4h#~S0J[jPu1 X PkЬa#Qq4HmP%;iԨz^261:Wfh(VEh@J׷U `KMb:d'KZVxe-GbRscPJ6jZh^KXֳliFޖl rC}LoZvr۹M.D6výnsko W /4+/v,Kͯ~LBN`L [ΰ| {D]ftaȗ齨JlNŌ.>%ݢW⍵[D8nnd׍=d(Ͳv$B`沖üh$3<^ҊcV#tenY 1j^{qFLrUp& Nz/xsEI =]GA M ҇1Ce[=U?Zh ;[֟؀=V)הn*y)w^cmf[۫am{;q>Wu۔~Cyۛ/}ɾ<?K;^MrW[?=76I2G `+e'ʷbr{g.\sS/w^ Q41χ Z-ї ZWu|F-^g2'1'=څAڭ ;ܙ[v{w}~/*?=ָ?˦&=u{ ֧~7Fum'G_C|nm}‡.~#^y+~>-۾E{ٯ0loA ԱD`B HM)$ Mcr{`r $+@Bv|n7@V<gunsp 03n~OTRs!ng +~P_vQpq}X ߠvT7*wc焣jRXVxXZTT"@q[(pDaHT"/0mg[oPj؆FRiQvn3u 0-W@8oJ %sV PHuePXx;PK4C!!PK ;AOEBPS/img/delete_node.gif ]GIF89a"""%%%fff !!!www܏]]]aaa̐DDD݋ǥÃsss{{{LLLCCCXXX&&&YYY???...777jjjnnn>>>PPP;;;TTTHHHGGG666:::UUUbbb***\\\222Ԅ---eeexxxrrrvvvKKKzzz,   ŒǮΞ   ƍт <|! i#$"yz A&Np8A  P1 +`a (88f!H*}% d̠Q n!A v끯*TVC 2@`p,C 2-QDahAU5(",KS^T"(EfBKۭn.H@)zi$0F! vx`24Y07a6zǿa2~gͿU#p q0('%pXZKܠ-(a@Gtw,r?<$^MԠB36Η[& O&ATcG᳟#@JЂMBІ:D'JъZ2E0*Ӣ–QՀG`aIuAn [)RNzOl  4O T9CM2o Ԥ~ LgkUNS=eժ[jUj?}UaQVchXnͫ^׾ `KMb:d'KZͬf7z hGK" -G좄D+5"Nx5L'@ULMm #J$IQR] qDH(v“|a0@]Ԇ%=GLfbum#0PtB*e( h(+4Kft8-nJUr" cB @ q^ F1t{ !$CJrKWѐ&*Oƃor~c8QNf<>:(xZB;H ljw dBd6ԡ% A"W#m98r9^$HCCH A@\.y!L]b" Xx6) u*[|Pӕ`(A$Jft0ATɳ P^ku ӥ@bܲZWB,aA7>\xDC" 1D NHbƒFP!HcH "IZΐE)-*\o@ uEB ^!D3hA l*(8b@ 1v +4cؠz$@]4V-[q3kLIJ Cx\Xi/VXH胏! @}lAp2ï )~J5FTy !V\凌:\7x*'v꫰Z @ PDj@hp <"VU /$0[^<RB0kky+| HAXĽlpP'pE @JT}WlŰ<$l(,0,4l8<@-DmH'L74< $0h 2,QOW 2MaOH X] \1wH]u b!TY1n R_wc.HYcߣ Bc_ Zx֦k `e @~\ 2|X߻z6TI1R Rİ}vw@C{ЅфacaFVȥWx?h Bt8; ⏁dDb0LJZ̤&7IKj-d47Q㓡 VSBLF)] X&2KZB/]5^1p9Uh6Le3yLT.nz 8IrL2v<˹N7n/<~'@JЂf.X sxAz QWlxh()ˊB+8Ur)lRZ)E6]JӬ)43Nvӈt@]SNU1Ԡ5ME4T$KmTTSTuXOլz5W%EXJi]-ZqPupufZe:׸uuk^WFUn{`Oua Ɗ5ud YUv]b-[z6=#]'{I $FEWG", Z0@ HZXĠaWl1[  6 9R.dٸzUuPV(=r[ 8) jC Nм\(,臻]mn(%wڬ.^DՋ@&m $t8BC׹Qֻ11 +Fgi5&  /0\`jq!.`5K˓o%Ly͉}% gҹw]fy|D<\?cbЄ&+Dgэ*iz%*ir]?bQǖB65gVp_]Xg֘u_\Zk)*HZRtw%v0QKR،dgO쐞Zvlk.EW{r&Hvw榺~6&o, Ѯ1HNGk?{ GNofd&c5`)l9d(Wy*qI&Rt#W>D@/l69V#[EHd@(`$V+]s OB'.au!R@ D.A2Z;۝ X+F!C]#z"&A3X[l?=9N)pVYC=?KC1P9B*l^_ , 0/1pB-;O/9$b9;Яb/v Hx8X;Ld,ag p}  ! 7GzPʷ&̧}~ #Lf,u7&[#:0#=tur 9sx|C?NFH>_H?ϗD4@T:g$A $5p{btv{q:6<B CdB(|ۣD.$6C(PCC]<4J/#DDdDH5DN4P$EGVEZEH`$FF*9qjm*GSHwy Ht:<pG'sWxw7w xyg?m:T-ygyJ z[ 7%G|~Gǿ:k-~̂{90|(*ݜ֪7g}]d_|HgƗ%A~0 ֪Ê} }G~w$8 ~A(W-Zm%,gwm۵+%hتşZpL'5/(#zMVP8r@8\Gxٰр҄3Qr;PK\=8PK ;AOEBPS/img/move_node_2b.gif!-GIF89a؜˥%%% 333GGGPPPjjj;;;www"""]]]777ǡܶLLLfff???YYY{{{TTTbbb!!!rrrsss...KKK&&&CCCHHH)))***222666aaa\\\iiiUUUnnnȾ```DDDĺWWWvvvzzzXXXeee---:::>>>SSSOOOddd^^^, ŖóҒ     Ɖ ӭ  {AH߼ hA A`Ai@D CB BAX 3D *COPdCR4Pahʮihרhh(4.x!n[0-P EʟKP2fB Bo`AB93Aء$!CtVmžJf] n5"D@aBP .`n9'h! =sclrA\LБmK7%hP3TN\D_V5pD:/ '`fHHPB4@s#3 "t9$ <|CsDzzhCD~R@EHd7р -@ tHVPD# DJCR: %p8ly8KC>XѸęRʐ,DX=J0U4H C4AN4PW364G84`64p!!QxeI&؊գz@ D >Aj K\T40@ | SáDT-& ]~L@ڄsE:N@dӬA4Հz| rZPX *'Qy}al (ƒL #kjf D#<ʖ pn& !CY(-M:o G#ъiRPYę0;cDL0 5, y\8g'vlªmedU4 u @[2UV5D }/#T Kσ0R Ǟ:@F2B (A݌sXp$Ώd5w\&ڐHxC0~@ It (TCT 'DCW1H` ` AX S@AdPBzaޑ/|绁捣{H8 h, W P^A&IC 2Xv: ޅ=)0"V-%`66jX8?]:ع ?QN t0"Ȥ}!aŰ qҊ `3/!!X@2X bcnH@c*$f,P}9Mj2lܔ/ى&[Dzf0ɞ>a L xPI H :"Z54'%|2 i"NIؘHWҖ0LgJӚ8ͩNwӞ@ PJԢHMRԦ:PTJժZJ \=z@VeE6$լc}+T:ʵGbj^@ֻn%_ADnӰ+02Wj]ml+Z'R80 ʊL/>Ъ"ZM+ ~%^m6pЁ[S,ŰmoY1[. ^#[ؽ6pn_z[rB+v a]-w1]E</'ۗVW`HA^^5{ۈ>7++^A0"k^ֵ o`E$8†0#V` [X]ą#lC8Q &K(G!%-  >9'D \@B[f`$NHbg'D 0p ނNiDn:<Ɩf y߬۫x@./jgUK}=!~2Ao*\. JПFӟ!oNk3~}TIM ~ _ 2rpeܧy Rs0x #GM@ufc#dgOj aw[0NPEۅ/=@~Oax x|37 FWL`!ަa#`rmlejWaw|w봁mJk&~"q"@OrK42hΧ_]n5Xo{hx ((IP%b\UPU8W $dFz+և"u9V t20_D(v<5 `:Ոo eP`G4} u~;Eze0rD}8p6i!茜 "E@&T9 ([#8xS h GfSW8gqhdfDakŐlR @ ڠ%@| imP8 7>gP֨-${x utv? 6)8Y&@~(I80@*}ψ!jRŠRDRdnI99)V}Rܘ?W< T)9SIx_"Ұ#eRI:dgpYqQ|RV:'(H3ؙ+՚t)RWW3L\O9H+x`piYkd :5 PXOިT''`9IY)p9cĉ9))"rPPfiz+U̔T8(Qbh JIB-I8/hPd\aөybw "gianŐMruv%1*nX AIApiآ.z&2] Fb0d f s*:mXq딧tz棧ǰI_ʨ(Qi@ fw  : @lj`Z kÒwJ\:W* z_`%%9Pm窛ZЗ0թNrH9[نV$4:jЏa.3Nj h(v:jb.0zpV:QMs7 چsհU.b⊱. ˰@7*}+)  Ʋ{*P6zR]t'{fz蠴]g:>@ۧ[;Hy%Jf)絜V0k72A{&p9!RT'{ a+crO3cRUȷkLJ{] G D~u;E3K6Wcuշ}+U`+n9iu+[}+FK˼vZk#=R l G0lCӤ‹'|oLY.EppnZKAke5kY cZ#BzVCP`Y݆d W𷭬\ P$ -mdn,@իP oլ F+w *;}3|py qO$ (3n:p\pK Up²3FENE7''@ \薈?}nDnCjDž_-,nD&V?@PkL-q{l.8ʩPn*a[z,bRSo?Z! ?OBt;4  ZZ0'K J-.[[H%EÒP Vd|YYR"g5 Ab* X@I\; !dW6ː )Á839w(.?>2RR*9!H`"/D>2JG<0 YJ%DYC8^}(gI>_J0Btpp%idJ_GB",rKW-URBNi|^()dbPBKxaqf#FclÅ10(W4J 0Z4_ƠqmVRUoX2Ԕ71=\@Z!j("e41 F e90q#;Czd^dV2!b%pK|4G]>0,,XK_,-CZ~v% UP vFQ):4ד>C6ҒscA@ǎiA3؎2-jW?.4[hg׿fYmS3rAq٪a]&M&Rf=l!Q:=ih@1vYQ  =>Nĩח*r-MG'feǻ(]-?)o=YxGyK*yF{{7 Z|1`׌4| !2!*͋<.ߚ"I pI/,G>> B7@+pdOSPl |7 _@Nw| 71DyX 瀷QeHp.7oHb5k>tf!p炈F>P?CvZaR ̆FA/q IM\PuoT2"4,6=ׅe%I27@"Qւl%vuHsm|VȀ8.4@HvHA|,eO;PK!!PK ;AOEBPS/img/net_hier2.gifw'GIF89aпDDDwww!!!{{{܃???Ëỻ777vvvYYYGGG CCC]]]...rrrPPP򈈈ݐ"""bbbaaa666nnnUUU\\\娨Dz&&&iii%%%jjj222;;;TTTSSS***XXXLLL:::sssfffHHHeee```KKKddd)))333BBBzzz,  Գۨ ܍ކ*`a P 4lGh@v$hCd^Ce:^lȗ<@6qh8hA%(do%\œYJPULAL8t)L0"XeC }JII]s5鴓_g@ ^t8CV&Y!3:7_R+-UzoaQfkP(i8`PQ %XRbns]w($`"=Dn1kVͯr_tCB2D'_^D8 EP3@|Ї'Vޒ 2QBPR)zF Su&A܈<9TYH6)3GaQ2 !8T^!Wr%x)ʔUl΂>W @ 򃝃!tYz) OmFzJ;$z\9 JUmԩ) .&trhLB)4BYʫz*B8a%kW6k?J,!r-v. OpɭSe[`;ڎW?P WwD F Sr# W1,P̑luXv,R,t:t%L:,!V#D RD1:2 ] 20WrbkOmsm( RCm we ܳvm/zsKx{ $673E|sN/3^׺+b2D fٌ!ɶ ".HwtTO4/ %i*6[/~7+2 A2~$nO ?I ڹ&2MNHĶe5YyW[оA$s1i\0u]$w'"0O??;¯ D!gAA*ZXnCp`,sJDrbrdgP4Q;4PQ޻h75ؙ ?]1fCGDP|D;bc(#سjwk܄:F毀D+JOl|@(ҔV^ Vbs$WxK1r1zL/5n|;n 5aO`J?1 2Ֆ4gh˜j NA+:aRs*lð9uK55S!\9z**#%CP's*h&rLp(DjѸT$2$4{t)-i5;y3HQїT<^ZNll6%m1QT&&`<ԅ%ʈ:pMjW}V8JYV6u!qi b tWFn",(v.#^ kBxU#I'9 ajg);D:Ac'Ylh#-lbZ":K쭛jEǷKriubV4F&}_[3D>F/nv$#!{5 &{M# HA&`r ߛŦ0u,i`LWD}u(円Ya 40!V;LMarUS#f?- ~l.a}m0 &GP^ܹfٔ:2+ֲ2 #:}𛅤ӈ>v];y#PZɹC4x"Vᰜ_ӑ-mtW*N7PӟI]+KԀ>ZZmTImfZkwԪ浰jf{ȦH+rd;[չ~MmضTmsL43 63#܀F]?vXŝnwa wۛ/\7-r7>qO|>qx >rW\ 8WrrO Og4?9e߼]6M]wD/͏5 ;=VǎԑJm3&}F';5~v:m;-> ~ߴH;Ynj?k[#Ux{)9b~+5) 9קF)鵎{_^Qg7{Y@Ⱥ"bGfςBֳڒ7L"3csZmS8UPF+WP +u !a2 f~|Ѥ~@q9?Q(#` 'lKnAf~bXhP}zQ7CBAqڀS?ntfbٱ!䁅@q'Qb@VTaR;7" b  q a(ImHlPt{hh|}x lu%X#/"*b-B"&ˆy(K{hWU O*Oe NcxFb_5! X .F2$xN1t8aȦMXW#<Ջ4x Xw h ACh (S+A据ET!E){X0jKgh(h~7gєz4D9sB:hXE"Mz9mYSc IPdž)D:zG~Ǩ}'!',%51NU).# ^1@ P(F fcoGl6uwDSpAD#`)IYeYP*v!0hpe7󌷖$X-%@IY?N9yYGՓZiI< `!*` )Sk6sǙ6  i ;y&3 RyV  ({F`@ )B0G^隻-؉ 9Rs0* \"9:~gԦaOņ҈YDS#U^ "F2M8h38 <rh]$$٨(韮\GU" cF:.8=)j?ڣv)B:I)Z≞`TuCS0c !W y!P* %G Q 9fɏ]1v`'`G!:iQj'z'2^^Y ?\,C$={BPИ,*K9MȺVHvr]X{βڲ %KvR %|c). D+4LN+\*2Kui' PY޹# 1ܿr` ogkl1 'C@ 죞ޙ-bi'gRĩlYSƼr!T 5ꈷR \{'.?&*0%%)I VB.#E(PCv"٘iOC+W0+: A:[ .,%  Sy1ȰPS [ꌤJ! +F; Ȯ|ަ)iO1\{NqM PޞV{l'q!cS!@+C0k{F*>WcMz[tȵnfK ]GМ ݈Z?KK5!S OgS<%*eüJufpPCK ܾl[D p p6;M(ԍS] 61؈9mGug ~QCහ>y-:u޵m'[.T< %XJg5f[y3 Qʪ侪'`ANT$[wPm-[/ 랞IIs^:&<}2igj!VJ.v x!񽄹ԇ}s0?SOP?p,?8"Z?FҘ|F[1@+&G>b{fA#`!` 9̐|ϒ@C gPsLDxv!0S) [+cI@ޅ+o ypK|C)rpE П-[3i=`V_ cOZZJ~FpF%DDR) P)A1S&˨ϰƪȦPKH --A@˕U% G==g+?g!UERU6ɚTY+&EU=U,# uQl8( +FQZ)pIT&5VUBM=UFlh*/RE@Hi$LBG4YA&b:P%G:8 16, ~6@eƏ0C1ANaw̭^PZ=Q6^ڈ- Lĸv G%@*Y44XZ$t TۈbeT,@O1Pƌ` $  OX)ǛwhdqDh&D "n=e0ab/E8tQf TRn84LwA % &j @ 1!EB2Uǂ1R  c##jK=(s.vf 4) PPEG@20!Q1vD0G0:PvwƵ/`CjM Kf@Q-dV%I%b0?$%bmK -OVF{(PZr 6$75U!/0 (\[$lN2Xz񛑔?:;ֻ2&K 9T:\·ZT2&pb TD$~FDtjEPB,KՄ=+K@<,Bwqf P̚ x*SrM3@0G2\:wh!h tb5OdLؑ7tŬ)u  .xgF%51 T^g!QWH=F#5.f&6 GRʱ$'x.T\'2tTDHt!"@By١sQSN2Ӂ $5=zDn Y2'h,@(, Cb>@|)NnIS[Hx]B3ie) _ fJN؅!ycx GN5h,pvANw^xA(J!W ax QN[;D>A I ꣋:v Q2h(zgU+OP|&R}ah7aH/vՠ/ju)U:U $Q Hg;7;Rp©$%qW*kf5қR®~iۥ/!јNۂ\d'(AY/%m \!jlٖh4lAPDD֌Ī#%# YM 8LŕU&ƕ10iUƵ˜uq̘5ae!MPRя('hb3}GH.sQ-E2%<#4ˏ"搙}EF36}1Ul}n+jE#/gԊjQkLL@h"jkbFߢt!gp3#$A D9Q ( JPT~5kkDY^^aJbTmS_aVg# t&a}QSJ?7qL||ȏdrLml܀2΅3K2 WuLA2\Hfb'q~؉q1 1QH]C[nVP Cg/g&Մx!ɧ:9Ջ!ZQ)`AIpx{bRH|lxx7_DW+Uw H^PW| x卍ҍ3'0,h@U' UMUÕ\1%^PW;RUL!͆qZ @0:8v:Fyw%>4lG`,YFk֒(hᎌATfP% *|0ٕeJr>g?6{){Fdx %`R%{Y*p۸M 3Lu!pbP蕫P~26XD[0kPF)^-6t):F@?9nKL- 9 q)")hSP#L@`Z{ Xnkg; w򉐗zlL)L9k SzGGțl )!Ōm2mvC[6FEee!wYkAEѷA108Gi)g$ w.rqƱqs2V FP/2Q.pS3i)xC,@Azv¨:3!coi>>%%%777\\\ddd^^^·kkk###|||666eeeHHHLLL---```jjjMMM___KKKPPP~~~}}}VVV RRRggg 555]]]SSSqqqiii@@@OOO$$$zzz+++yyyAAA888,,,ZZZxxx ppp===///QQQ,|H`*\ȰÇ#JHŋ3jȱǏ CIdEL\ɲ˗0cʜIM(oɳϟ@ 1D*]ʴӧPk8իXj*sjJ`ÊKRSͪ]˶۷ ݻx.JU߿ È+KŐ#K|UnZʘ3kl(_CM:㾥S^]iְcˆl+ٸs{z* ZȓУt{aسkXËOXS/8™w} tm߀J\}6`^pesa Hwu8$[0jb4Ԍ6O8$`(#H&iH 0@BG*i 1 ATz dY"R80afp Xpd&jpi% ht{Ib2* ,T夘Bufi, U Wꪬ꫰*무j뭸뮼+kK@ߴVkfv+k覫nLlҪ+k{L%`q !lp/qW,_qİ@#\' +ܲ/33\7;lGtO HGEK VWWw& :MT\6`-=5e}im}wބ]x߇xǽGS[8<-g>蕓~梗Cz꬯~3;y:Oo'O<+Co8:Ksoo~3>@M (o / ?π, x"` 8A `1A Ѓ 38' ! WhBЅ*l _86aSCp~ﳉGD|G4W>5}F"'21 bMHE'bS cx.qf,Fi&\\(G5ḲHF>q# 88tDiD:~c (JΌ21# IJҒ(CIJErzdL4IP2d,]IXRe+Je)s9YfNI .˗ҖD1)cfݜT`@Df5]42 OSa>O|g OҳAЄ고`ZMT^#s զH͏ԤPgA@$ @ْkʴ8NS4=SР6PtΣAfTCSZUWOUJ@ 9`SsJS@Z*UNJֵNoW4`O˺m_¦sD( @JjXͬe[F9(!|0l%dMBY u-f7 ۂEBqMmW[]pPEq\e.t;]s|@[]F׻.oIZV5z8@IBf#֍NY9{ˢw pxGR'ؿ/',yf!{_oߩ,8"F})`z B6UX$|2 xA8a#Eφ9^O+n_Ac7FNa$T)LfLB8Miևm#]fq f&4KH(LlBszgS:1+:C^P,YUgca@he|Ls+u/ϷwD((j]<.4(+ /K.l0*r|y>dgK.*pA h@OXcc)vنt4@6£o>[:`CcK e ]߇?&k*-q g / h.qhABp/gqxͥ]G$x= x"{cbc7t2*~s~7=l>>86㷃AX0,"OzH*7q`Z07-.U[Ht=X8v3IiDh%XRHK.0bL?&KCs_9lf%`Nh؈sQ4NF+w TdhPy9`iv舶xX7F+whiO(a;pk,R0ň(C7oN+77D8iDmZbTHT80OEP p#z刁0xq! ?,hgؕ ŁvayXshYID4gsHQWwuxigq43&WQxu]XŌ`b_"V$ɐ#>I*3Gx0ZuZf`0)9hII0%gZ5^\SeLch@cS`LL)b1sM)ghGmyYKTx|ri唄k'Q; Ƀ3)DCx9[hqF[$际FÂɚby 8?X(؛B@؏¹BI#41rXx99Aeɛf)JEy(IL :hUJyI噞C=s9kәٟ&c99iɝ]:ey|:V䱠9d)/piք)ʖ,*IZD9J3z۹l Kpq %p7W@*p<-08J4I!4yj:lw "P10zv]or ?s@'P# ?v˧ ۽BH=JT\9YщNhQph-,Qzw D,(/ +|%&t,QWf ?lHQ6 Y$1P ~}K#GL{OTjM@NT> 4FxmGGzijڲSɝua =|۠3QǬ;̆*s ,OVUV1 ͜y]h6%ݘ4 _F?@,' }as# zm=b4fk&)9={e)+iMĈ[:SlS |@uqb'pZq0? *yZd9db}Oj~` ACPc[~v.Cd59n1P@fRP̩QMaϝҚ){|߃N3"+УXn-K[ .X'WL7}뻭 ݖڡP'k'0/բ>a6{ /] c~4S]-N1 p^!|ҘT}e.Sh,HJ* 2 C[9y.=XN($N p'7ZV.m0{/졮S{f@# ?]XXy<\W!O#6` ޫ|L k08yXkB+#̀. `0Fnd-| :a \scóN[fsa0@^8;M9$ pAY f\)I|fmpl/j˶K6ft!ar׶Tc:=?`#Ppz_pL Wc:?pt~3T`^1X X ThÇ'>ذ‹)Fȱ!E dČ O| $1eΤYM0@͟4_ Y2!@̡>N5JUjU3B-z̠_ek+W bB@ٱfݺ0 `߼xt]X,sSC ; HL !Ccԧcnk<'+Q2S Y֐g%޷8]Í/vn18P?X`kb@.[ )G1-G,˼L lDM * A= s?4MHBC HcM rӚ nϐ>/^" &>]sV2ô^` ΘhZ_>ӼDT/gH'.Wygv,ZijC f7:Ƌ C2orH;NdVv#"3hA!B" HJ Kzs'}wyh%poHދ]w52u|WxU=!O^;y^{҇8WZfHI}OOH Ph DD b~OS3%Zd): ׯ 9Ni9 ( N#LtdAp?GBdPƵ8aV&xn(aK!.D|acV Qb U(51I!sɰћ0) Z!fqc&#vu1oE¢ /&Q Hǀ?$)sPQ)dR-"ICb 9&68&D"M<BJF:A#,#42T$$?Ƅ`sUA9Gzia %KaAZ4H\.Kt&ZN+晼 OfNr<8j^]Vx}B+f?)Mt:9 Ebآ]<ӊGDPIt$){i0sf/J 6|hMLxd)EJПRDxR&p|iʚy5*?D TMW#k:<ի峪ZjVr-k=L{+Ah9!ծuaZد6K1}mrUm%\EӅ  OF͆2EU*VNRօL% x"AKS5AUFmqK Z*g( h \O҄41ZelzS-iQѲl1@bb| 1'^↗Kb @ϕP0 L邍B6iDcp#O6} 4{/X({ApdA [/Q"|&AQx ;y_R00\M3eь'cBYY"eiH)[e:ǒ89Q9A 4J41"xzh!i>Ù@0%@ =Na RUXZֳ5UZk\Z׻^\j;"LvF&`5 7ē6IZ&fUnt[ݙqE~n#zpm Z5v\%Et=hRPWX-p)Ir/6"[^~>y͵T1|N#\F22Fg]\]ꮤ6+ -˥b'zӽSW: ]hpG:@X;!Ta7/a|:d?q]>Nppggtx랅' ^bq7ۖϤIx]ypo/}L.cF׻ft6%2) 'C|+o~/}$ "<|?[/6}k`߿~?J]ғ<n;3ۃ˃p< :>k d<dAlR'r$ #Zs |µc-tŦFnRFRpcI4IS:Y;c[d!6a*u+fc>fdNfe^ff~(fET⾬ffmfnfoVeTz4{eDgFfp`}Z,vcѭJL;eD 1A! z`YeRh 9"h%g4^^vg<LVX&σiHև6PG$2G^jxGQYzzii x؀6j>IΉ-н=|%[GcfkBqkڀમ%&>4KSjnT֋xi=Vk(gGV h 5&&m0,m^ 1lն"~m>%8>eʴ8^ N5 `l ]anV j1HrnhHMHXnq.`}n펁o !0@ `o0 O@@  p|6/L`&ba,NxfXK5TqwPF; 6 oYF!r)rPGpr riH 'L` PU6;1s x߶x8s0 /7?啗ocIqp-ؒ-fs}[B-HT86fptPx&*@@T'tPȀGč骮ʮ' O5v&FvVTvSAŢ//c[f/f̔t>x%wåIx?2DZU:iy rڴqrJy!_y.a-X gOb/렯ΡwBOAX5o[b/w_x|˟r XFyzʳʬvWH&pxOqԴȵ_'8z޲<ܻҽŗGHvwǠGͿ|qЯz4}'}7{Owm}?+?y!ngy+}}6W|t2p+gļٳbЌI.]˝WT:fcP"Z9 |bBN$F\ չ skݠ@Y; ,š1vCbso[ENx-n}oj?~uW^[D ypnEF1eTa 4 nhQ,׆NiPO\`"`A8PA.IC !`z )a.B\ZIҀU:"SI N@آy' @BB ,qǓ['bN5P& $3Jk`'$B&WgLWYO&8@@zit٨p4`u)'q^*HY&z za,pcBZX#(1Qhph9{5h7J%di@i+#{p#XqJg@|@ P pF\,x C ½SxD_-p|@\U5\/ѲߵDzbdҵ~91>0a4.]dA`DԽ@hxLQ"hY֝8AY8(@> SgNw嘇  :"?>硻9& B.~9*I鑧D(x<ۮ Bgȿ9 4t=GNA$?n9p 2H ?Տ, @o_SƸWdi/٬J ~q$`DZp`d\UH“yp P8C ЄZa[C8aT(,Ē)PAbk-qKU!F .q-#Q#"(FsTbXG7Pf<ژF|ܣG iE2#F>RTx@r^$=iJb{)5ʐRLd*GIHfQB#-gŲI+[)Le9LFq%9\ q&%e͡Q3T&2ymz\&M8΀ tx&PMדgӁ'NrO~ӟ' ~SM -(C!*Q> >'zPZ(G7L3$yӜiSGXss;jKQZ3@54uJҒV䤾 cS+-]jN&rL%7kf:Ej5YjGr@-Z԰q^=Qj4z _{1UZKչ2֭diJX$l,TVUձ%L`;mv,f*BV@`M-MgLVY-dmG1,l{\ŵK@{Mߪ2rvesw]z֮ŕh%ۓfex˫[֪]y2ٚck `'H# R014p" `X01<A 0?R>11,ÓXT(` h 6C⎙;/׾qڻR@d&kk9e,_[- Z`OthV!b~Gz=YX)n'f/4g҉UU|vxsȦKEw]KGr,c ˑ0Ђ|w˭Jr/s `'k:L!]ps9恭rV60nn𭚮p~@k>x,lj|/!Hݏ>OSo-xE7ϰ8MkRߡ? ߁eMR} %Dݔ)`V A`__Ke9WZ ^ܖ`g nAV;͝]G  d;`!He@l Mb ݆ թX aqH a_Evm!!ơ!֡!!#4_u!!!""&"."#!Y}߬ z _ax |a{U}yKm&bp .a"blS ca@ D< ,ҢfK. .BȀcK"1@2D/ A5Ŕ0B8"$U%FbD"/ ]LzQ#$2d$Z9 =ڣ5#PR(SYZb=c]E@xc?!,+#GVCdD`Ɠb3q@$]\@v#!ցYK$LFpqdd".@KKƇE@PnQGGcHQ$zh \@5 ]ФUt}eX%Y`Bv-$Xe! SZ"TTReb:VE^eUe|DecZ*eZ&f̼i eF A\L`dTJ_a^ U@e&@\JldPA @͡fZ"p'kZư@ ss']$%n&9֦av<@L$`&p{>"|'ByNO~gVN) D(g݂a BA鐧^y"(&@cs\PpBt@̌p|Bt>r$xևVR X͒T'f#l~&~)HjE, g"W T )y ,BizV%M@`*J~gܞJmVjߏ\j:=]j_ަ2"*)jj}jR*[njjBj+*vjwj*欦j +_:ԁՕnv+"!za(Ӕjj䴞jbFji9Խk"T2,^a,bk֪*l:Il,,R*Rke+6>*l^,6m 2ƾ&lʢ*,BkĊjJ"l ~RJY>mfт֪BWm෮+ٍΫږhپṦm--y"-,A ȿ-AAٝ͒\9-DA ᘎA@ ؀@ڟp.6D(b^4؀G*mU@)MN Z X\p$dX4$D < #dv VHEh,t]=^p,@0@bZjxF@(lІFE4znċraE<R86*\]@Z˒B8@  8؀ton8.䂯IhJ2@_n|ތ ,% AL@XB"{0#8< p T dlob/NO -S,ABAp1kD ܃4A]L9̓E[D&0XMc6Eg=;2sG?0{s$@ \`M7{@ tHnmܢkz LLXNXT5]@)lV ON"$@0|5 +$%x`ˆ5 `Bx@*aaWN#T"T`-_W]s9t1 v*Zk_BW,8@owgk knliwR|^. CM7 #7ʂvncwl3:s4z Hةpyipuwj쾒v7,,˷~7ĶwvӶv$~ß)7 ]w$w885euJ1{OѶӀS7u8QvhIh-h_ڭ7iu' >8]8bbNM;@RYgwi-VyySJ[U\yyxxgX#¹UUVGwϹ),ן9Վ9;XShE:GTR`צ_vͪwK ye׫ _ "nI캬c9Oֆc|)P(x5;ozп89g!X8s{aDX^L9ukv;[݉;)w :w; :l/k#l |+s{-|  ~ "J̜ tĀBdo-*u-A8+3Z)Jo{Kt a D'@ H P!2P!ƃ"ǁ"V4 Ɛ+S"d&Aiִy3UgL>ʼn;=8PSzAA^T&Nb A1$&evU_jK6Dumn[u_s'r:w6l尙9ƚGw}pϩWnų& ۶iXEK޷sˮ]wqԮ>N2swW8:qƵwW\u޹Ox>| @{vol/oA#o3,ĉ=TPv"@̘ CJpCF,E KqeO, m1D..<28dq:UPD`r* 'k?)51DsIM|SK#0C23˝  P 9ӣ?4t}\Q?N6/nNPEEARO PQMuUS[-QSUT!"\uݕ^}`b=vW!\TfcugjUkvR_p뜴*Et]v}_ Kr77p7PMSތ"FLI^&1~2._v\z36S}/ІK15.KxdJ8JBW7dH6c `f}#@k"D  rRrhrO&:g :멯ƚk>l9UTrA kb E :A.z4I;v-[D[ zA4Qu<+?>}MT[\BalHbÝh&Q-Sms@NE4>nh##b-6fHzt`^_e=U4`c> K?Em@> L;T>", :\AQp 6'҇:rqT"XP\  0P}'<u,@ 3AkhB H`.4`uaXd"Bc  to[qa9j'8Z eK@!$ +n񐆤"E*{죲ƀ y#Ii}Ҏl$#E HяdDR,_IXꔓT2,OL-Y$TxF̉J('<'PSo%P :P.f5EExYķLmiO{ƧΤa7$0 4p2(B$wF)&TB /4h;tr4 @M1*l N~@07S0A (02Ԏr.; @P)oV Nu ?Q 3CP R$NSoծOU@ҁ\` H@jϏkY_*6ieYzmhIKVfM{Z}lK٢j-ܺŭmK[j}\:W-p{[B7mBa*x)3z͛SMwޗ%{{wMr3N.u`7°%0Z a>807[xxi3a{0?\bgQ+SL.qWj7yc#or{u1OZ҈-p?W8)pGC|_xq1ox'W+|69-Ӽ>Ϧs$3m?gP lw}yE/24jsA`/h.Cy\@ U06R=N׾ﳗLl`s1B{ߏ>-' 8@A.?'/MLby\d^P,@ o\>|o @`< P ?CPGKOS] UcPgkoc0sPPXv7O  P   P p O  P א f P ŰsO Q=#QZp/3Q76 / $h DQh VE1Rq H-Bl@ $@sPoybhd@l J70a B1fDa<K$wљ d љMʴ`P  %PQQt@å@jnQ{{ 2!@ SB`(@[{"1R#%r =f(#R @D"=e"$%Kd&J8`FJbҙ  @cLoglrJV(r)=)@F  ,ǂ2ș+)*jr$2,5r-ϒ0@(-ҙ.@./"/S,`nәB Q "  6$@),@43=s` q6 ` 6m`5[=!@ FDfjz7 7]h ` "8@Qs7::(\1YS9 6@iw;f0 @S4ԃ, 3Dj@0c .#ә@h@AfB5 B h6)(bAB`>@Q6@;E-TDcEWBF-Cԙ@ ( 3?3ln2 6G 5HHIJ3܏7- ITKJ I T cJ`(BM<N@NONSՙ$ BܯPc !IT 4Ƽ " >b*@S=TOto`E FJ LʙfUU4VEQ VW(X)Sz~SL`(Xc:@*@<@V=[ZO*\µU_Y W`\KUTITyoB0U_x@Hzc`_.`a`cr1b'֙87?aa"B6d36ee5e)vNfaq֙ `صf)<>_5`c "2`" = Pi`~`3\ ZvKv*@6lc^  Rm֙oS-GnŖl"4pV_i WOVp rN @nq lrjj9tKtOuSWuWu[u_vcWvg;PKsQnQPK ;AOEBPS/img/move_node_1.gif GIF89a???DDDԋ]]]"""vvv...aaa:::&&&LLLÇ{{{nnnsssKKK***UUUwwwGGG%%%;;; PPPrrrCCCjjj222TTT!!!YYY333ݲeeeXXX\\\666^^^777ddd)))zzzOOObbbfffHHH,ʝӇ٤ٖ Ȑ\AS*ذb{gc2kiܨͣI\$iKsU"TMP5eReQܴvFHp8 p Yd|C 4pSk+s[^BA<%tLB"Q( T G)7\A (wpЁU@?v %b!x@]h G 1V ֐(dѥ"~gHkV˓Pnx$8SclN~JiGB `fc 4p )܉gz2(~ +`衉~[j H0) "0Im9 /i&^vk.[ 2Hjpf[ _ p&td ߳մpVkԥ܈7:.[oF/ѱ P0pC ;"@n|]7 K7 9Ĝ '2Ϝ8@Cp.[!w4_^y5b9؅P )y2"(":vnG] prq2\:2~I/n7Tr}>so4σ9Jt>-CίM>+_>j63_?ƇRCiG h ZXY,  ]m" # 7@q{ iB#{Ar'MҴ!r0(@?44q*9*P%C OKAb;`"C *ϕhO\ 31ϸ [c-;QLI L@G̈`bAP`tH3M `P%bbkdhJPZT@6e$TSIZKuLCCCԦmi8a}[La4ʍQ]*},E&\Tߖ *Se)ھQdm5YQlp BP 8z+^js6Qep@!.7Ӗ6Y-nG<@"O' #97"w+Qd 7s ]`@lva; B`}%,-twN{1EU?`HZVVhvȣ]Pala`/cA, Y80* E7p$P,X$θ_~@e`ZO]eyw`G0lT %U0Gizy{93p4zBuxk ' r%TVeJY5''PAtusB~bbPn |$$7E0{33֧af!w)з  FHv*wA6s_z'_X_P5`>XCZH*6 `N|"_#  4(T63'Q@ \+U^&+R<\^2 eCTe &+(牌An@8P(C/R8O5o7؈ŵFD2kd^~t(N7  Vw(d؉A\jkaEX@5;wr+Hh` GԃF\hbYMH~H!4Hӎ)UZ !'Wy&yO iIȏdᐺՑE7oIXyeOI>[ƐDdžuɒѰ? 46U:)4&Ev2y\“CfM;CYꕓTyySF1VVƍbycF p`pWɒ~07P/Y]nR@;d97ri Sdpc?)'_d *eef)+'piOsIe;0A9NdQcM)tyy.y^ryTԚ;PK{ PK ;A OEBPS/img/topo_editing_plsql.gifQGIF89aM???UUUDDDnnn***;;;PPPjjj666\\\&&&%%%333"""!!!www{{{vvvYYYfffշbbb...sssCCCٻKKKeee]]]aaaݥС```XXX:::TTT222 LLLGGG777)))|||HHH---汱zzzxxxiiidddooorrr^^^OOO>>>,MŢмݗ֖ X(=n]( H^~3jȱH$LD1N."p$ XH͛8I6h @i&NPJRJ i"14!E !|@ l#X!)TƖ1߿;Ka% F`AC .$xF ;UD@2\$ÃfPc:ɔ--}Z NaÔF,ȡCJ摞w$Ek]ŽH-$1S>CKϟ Lr@ <ܖW `=ub%vA$)$)D p%m :!BS0(c`}y0l@D$"#MIydE\I<<YXRBӌdiF!+ Q<pD( Ad Q@l@ :IIde%X$ĢS%NAD E$L26]x,q1B/PGžD UB yt$1I%tr$ITٟ,tW`5 mX-u MUB$$M%$ $ p=١]褻g@@ޭ@=i=ĆdR^~69/`t IDi@0]<'~M OwA@k^vv`^$,MI{rX$@yOCYt U}B "U%A(>ai+؂Pf\.7 <DAbjRld A@"ۅ @ Ē@G. (Nn-b((-1 LP)̩Nw@lP Px`&  $ZOi-B `O~J XvP%Yd$>B,cEAX|5@%B0^ Rb^p) K"pWlcO-v^ 0Ib󘋈$>DGR~H4KJ̦6nzd!Y6RfªqMrJ+D2 L; GT=9}tAu1Ќ̕ˀPJP(E3Ai> .UJUn[@0@eL@J_4)mmSXMT^q}du'#$NE ]' -AI6*@ \׽z#}_%HI\pf,!J3!XkPQ^yp|6EXj 5m$P |Dw她%xn7]fp Xam{[X`ZAiTAа5{#v#ptvR֮lYj_0x`%Ew2 Lb_ Lkv?e[^$,d|#Qz¤%3NOFq6$+9"Xʒ @IwV`n1U`,e)4-{as2̍2o ]~3pgaypMBЈNW>;F8'=F?P(FN:О5-R TP+TmV$cuFZ #*tmkGG{_+ظ6llu)^Ed".1хmRt;v 'M*ERPj둇X czݣ7w߸^J ] 'ᮆNx5/[TyI~Ąxʋ}~̗3"?y{n<L2Pxm2 $Yu2i[uguΆ=5W5~v}픎/., |#~] O7Qv@ζvO[Oϰsy?y^`{t N;}%?^=ǕT ݎ$y_聏.wKELuE0|>esawg ՄdR-Z'I00Jwm!2 NWw} 2X]5 G{(7 m'G 6U 0m$p(p‚.5;q0('? X.}ePu0pS?#.pU $I$'"=$^*%+h%$]PSyb~mx!mXhT|Y05lPA -mQ+؉RZDyQ+KPDyp*d= 2AC!"#L!Pȋzy|@ƈ'~'a!/0R $TP0e  :0 x F%PET@8*=7?r&16 0>*;1! x h(b֘ ը~2CAW0GW(Ip!(ɇ2Ppth r "0WC!% GyA!by `!Q_"X))bamUǍqP1A+ U^+2 ci!~v w`g0hT =`p&c!HݨC|љh4J`}9 B 6:pޱ}15 `p밖e3*SN) =u. 5i#0 9T.s) LdX ff)ҩ 7ؒaP ) j ]XdPlSOСj f'y2: p2!?PDpJ !e#0(77 j6,Уz 2ZpN@C C d<꣠؀Z"ҥ_ "bɒP31*!  (@Hk0 g VШG& 9jLY6ڈ7Jg! `X==RlPgH Fe`OpF P(p@(K8*BRpO`gDf{( {*y@<0I5P4AXc3Bh5C0#j*/vx %{NB(r1T)B ?Zg:z{J¶T5p!Ɖ@Ȣ"r2*ѲP,"K,G9^"GkWxr1Kp, G ԃ3ZjԘAX@;c>!'0.Pe7) K$ 2+,ai5%ɧCwi|2`ZPD4Z )m(DX =;q\4/˫ޑU "V{K'&oibEÖTɲtd7X غ8[4`{!ū}-i.JNhA.`Ţɚ)q*|a#l A ٚ ,ө)"K19m n{kwOWuХA`T!@?A28>b20 $#bQB$ ||qc% /x7~@8Sp8-jDayzaZ# PJP @P10;| s8 8[1njqq ,Vn*H@@8;-c %tH SٟiMʉw7 3QiNyN:Î;A;cC^y!Y<# ]e'O"[sDZzaM%` 2`-Nb.^C@+? bLM3TqC9d=:G B aB%2yAQ +'u[]xֿM zҖ0qH\ 93 ;ؐ- S)3ZْՕˈ;06& ]EFcTqFFlFMө93ɞ)1;POFVr` XE Ks w׬p0R&QiXO`ӒP>`tAF( U3ӓPc:m>]]IXpDM IvJx 3-.(-IA2S?z>o~Ļ .5Vƀd.ّi?n>aoOs i$I`WP-铰sT$;ZU,\+$EAg/c|"jo} Xʠ^= >;OO XB_ y uzfip 0CF5Frg^`O`W E@1 KZk\Z{P5W, 0:8>bI!8>@5`Q330*@m ȑQHɛ.0\ɡ2;x*<@/J b?YP_OU#Gw p ؏N 3mz&;y7+.cmbGf!-+- 2,-&.KY3T-12 ->>11>&. 0.RJ'OMe;5^n nQv@@tTHl K Ypa"'LS4Vb bB`a$PIZ')Q*yE LaG`34$4WTAn$9]V Z;ض]t w-Q@RH%@ Yˆ#bbԚ$d8,S"RȉM"q"\IԚyN̸d 2Wӳk/Y"HB  . f@FDJ$ Zm0DBG%!_p$ 3IN E2h^QAuN_~sA($! @ Vh<YfD"*&1R`" A@Drl%?̀δh%Z'b #wyݜxYMwTc㝲BiDH2sa6IEHH4A h$mXqivj\} @4Aab=JEHB t5=.QB/CHģr$D!,2#,CxP(ؐ8 ؀TF`! /AI@(H ˺ Z!U5)$|!pQ$Y X!"$Upт$3BD,*a) HER4\ aUt!Td  V@KTP0qKpm؈4!vۑ`$#hq ZD7A $ Dte1WoNfi@?9كWXB6]su7J$(|q Dpc&I `AKTT*%MM>Cࠒ%JG6r_ķ>XL@qT&R!^?AAkE@M3db252 Q"ǮJӚ8ͩNwӞ@ PJԢ1RԦ@b[,@ժoUUB!pSJֲh5k!ԴA $`@c] ׀(!1@ꉰ4 2NpB p@lR6;Eg1;ڃ:EmK=ekknZ1R]nղuEf8:;n-dIv궹H݆u3[[_?Zt늖`q׼M0c\w;򵧞 <,#Ȥni' M7L–T~+'~"~ [֕vad45C쌭cצ-IȚMrk\UANp+|Ӕq^${O51kzڜFm.5bj96uƹ7rovwiV.٦ehADž$vgB[ē7#y]3LF҄ƴo@G:fӨdBgF3;VB<4Zλ&Sg\M9Ĭuql/GcO=yi7k;ml\{ܺ 5UnuϘݫ%>f>zl@+0zgm-xsxg o8 [wȖ4;=\]+9~7ЏMymWFO{ t }-ң]x̭>\Y:w}^/]~vڲwfoju\y`i.=k{.xh9nwƧ7jSxw^oV2]jbV¨т%&t>~|>zm銍;MH \6Q-B{TʞH-oP=t>!@ hAWbsVX JM~Dܔ|~g Ȁ 5/s }C}u`wE=  `6P%p#B,#TLR(4X8Q 18&&HwAx3yXE?`O:P{ qIgkh0R `MP/(PNj-#/6P@%`/2S؄Uǂ%1L2N3tdE!=P$z|#5# x @MbB ZxuPbp2 ʘ*qrE&`)0$L2@aaBF(DC>a(! 0) 8-pXK`z[y](p@@Ќ 9DQ* c!y#ISbՇG1-`a(N @5%u%l55{ZHYx}q!P^u "qn eGn #`*.X `X} =P8 @ (ЏbI 7PiY?T4dl2`=0BPW-P"bPOt$ Dj9I0Oy-( >L.`6BT 0 Jb@!]q! +6R@ D m GYٛM\P0h`Da'+K(p 9p!`R3, g iu\(`hQ gguZ\OxUf*s"ڡ]k_OQ4xv*ntj YB ELdЗ:wZ@KJ:P"\Qqs|cHJNE! 2P{2@B$Wʧ}: OM >l@81%Fj~,"0 `)0aPsᰌ؎K0pCZ6@05 7U? T[J&T}8kG =zh* T2Q}5`-7`I ճ3NϤM@-@ayS`/+{똫^8ZZ|^J 23`5 MI{VAkX=f{ LSGtk<?06",#PCƺ+ Jmv1 JwR `WtCQ}z ̈́ *XuXp{Cˮ9؛0BAN㳽ๅ k5(r '@bI `T}[ě -Jֺ>ˋ &p %Ӂ{,,5Aq ً3DA2s>a'+80K&"I pxI|D`V M[MP\RP 1;N `P(9I`OK@K N Ag7l2K2 `8pUSp Qq0"0 ~  iPb|%+5 yolPa8 V0w| T32(ǸÁ,ȼS?P¶U˝Xp\ R t®$ SQ̪k$*P6Z(zS`y#p i൚!<Ȝm<+@ *" Βi͓(Æ6"#0@ N'D=m Eݩz@-0)E]fzWxT:rm*Ӓ}܉9z PӌJʪ @Iy0=ź?sI׀Uk׀ׂosz[FV0Y T֩C$ٽ ،cR,p*Ȝl!y:_ ֬MqxTLt]Q&AR&0i&‘@!bP%pPHo}mM۾xZSխ0 U Uƒ:(}7 n@ Bѳ.˺U*\1~`\}*zd(2 gX05#>M/ ~ ܰ(r) 8gi 7 DJ\ P#5<n˓SsISӫ.mI 1C#D4I00J@P5s3h7CVP06X PnPv<3Ŧ>GZbJ~qj .E<٤!. 5LP<ۚ>Ǽۓ> W)D  $d@>dU^;2~-G{4NT O|D`>L9^1eTn<<% 5 zP JE]E'^m qt)A+"+O@=~tK[4E_G-ox[d]tIpe/373nn Ƣ!@@O `WP!+QDNP!~O_Z _^aec B2,y @PMPtgC*P;80H G`iV(5 +4އ˯R'@ Oc/L\k`ߺ P/ P3 b2% _sk &Y3WǤњډ՜̨Meݢ,WKHÇ#j/N %F[GPv?r(ɍ))HIX]j2pb"C.+ē2-aH-9aIM߀|$իX7QLRǬ]"`B 0" >P4JB0h"E%PXِ목`YM̸f- ;qlgL E,D$  $*i œs_+nMMu~&C1 Il4XPCB#PCA 5F(a)SThÁg  z[Z,IQYJVhfaE 6epBli]V01A#Bdf<0$3He hЂ .hЃQ@/D BJ!3+BDUBHb[c=C.φp)thY583+b!Jrq$$0j5V–m N+3V" (50@]<DRdQS$^PD!WkHD"B}`ş@e̪@T\ s\{3k쾅 ly*,B U!O\c&WG pD   Q@lW]ٚ)g2&3|}| MN0@]!9Š_N  hVHA,@B,! LyZ`@Bm5^ sn{.h9l0iO؇kKh0D:*y'v=KH};郵#MYڧɀ "fKlP%+aW2 0b<Ǎx:pxmREENB*|;1LDXXH0p1_,4?x\NFp qTb4P-BR{!%`2CPfq-Y_ c! Ȏq QCA k@!@ _'-00'@/,D8ʓҔ9;bdX$*(&!\R;D aQ8ԛ(BF0pL@p$g5A 1Je^'E-*S)X&vB J@0SZ*IPy}Ё(+ ;kh@Zj%0"KT!e}Z/]eE AӪ\ pbA `hUr/p D",P-$k!Lքv,D b$ .B[vPTA(Xۖ' 1AT ) UBP O p0eZrV}, 2x5-#@ЃeD}^P-B$p*+o%\P%iU>B_րIIAt #(Gn@֍[Lavycu(PA `50kaX Kn<"-&hI[XA$Jx  Be'Blqc3qs`"q3z(ļ;>` JG:DBf} <_b? %ǖIb/լF7 k:֎q5 GM8#ubt-Z N -IAf63OK^Ć͍⳯>eHrNp'4ԩTMzˉה}; ?%RP4_и#QPU?|͵A:j.\.zIz!AoT.'Qz?I:D.S~=!Y/; v^io.wxu'<Oƣx7<޷Ꮋ䍈yY|7+V~j=g3Vk̖c<=qlq?¿ Z}'G$m> *MXC_swKz emGjHzo {}Ѐ bMdƁT!}{7*`D /1(@'}'v$hx<!"Ȃ@8:H ChK295S{ESx^AwxZ=]wu\8d(?M>`(wbhr:sܓm#׆U~HN}GO $n^upvrfXUUewLJw~v7ULjbGxHwF؇uzH(uu8qx_/. T g> 'M׊Z)iFdHjGEՐHr]\E:2A`Y5AHJG0=ykPXu(&iTaOJLt@KO OTdN3P01jaN(p'qK~S8ˆ ɘ3 cE[QEZUQ12U"UGB%1=e`4#,Шt(u Y ΢|U~WXcpXB-VlURjB]R p7ȏ\7P^`9 %[u] ^̕Zf9])B]?% )R^@#T hJWtYI -`Z@V%PIa\D_p*_0"%#?d)>BaÙ 9V0SWEJ`$@Y`@hr gfe`uddKg~&&Og`@jaDf&\,{ DYtܩ s18@70i}闢H0;h ʤ7A0 Lj w Tڒ1":, AdžE*.yV i'PFP B8^wC(@>Wj)ޔZ(Ewk:b{Nz YI=A0E.BIYK0 GE =/_Z4ŐJXS #0 VIuY/y1 Z||ɧ}C2K2V1  9-ZK (<U/p7QCڬZzjv1Yp0k:"6iW" %ބ:{Z0uIA  ' I$p7Za@ ]"6f*( \Т,[H;\&DJ xic^B:9t̐ 0j*89k;=\[^ Z3*D@06 c[seOJR[ z±kK@p  C[B+:%`Kz 8i0)^` ]@9V" K*0n`pp0;"{|ea0)&"SFlJd: R`{Syxk+4[zSk(̳İߵ@Pz,|2Ph#얜P "@(l*L7<9Lۤ`kIR S sLsi߃|^|;ؠfW>BI\ ul ƦpAAyrJ,Ƚnspsr ML4JLCGǙhq5Z]h1FA)^BĞwAMH X ʅai:Ƙ6;p~˸mttiKN„_Q4B 6 l  p*jO†,Km|5 @Ŝ{j\ Àm%0 Qu @+qOQ'a EHUJX;uw|J6̵(rI-Htd= QҨb"E<@MZCl0 ~ X Jx( | 1!&-;pGĠ]ܥhB^\Qͫ}U![ 'Kb;Bep1B-PAMZ&spbb.c-%Ծ9_s̊Lc ppn}F4 =A CP kRfYpۿ, ~ȸ1՚ v[,׀]Ъ/ ޛ0q-mޜ2 .)\=s<јh3Aji :->Og ~+f" ^&n`⅀!n;,$~ H޸7Ӌ= ` `Dy)`ϣ2y3kPtQK<AAi 0ũB [[ƛ9P pޤ%)CDgy}\2Y1" EY4=bzW.0&G#P"%^Ra %RPW0WeWa0Y@ɐ]1 T~@+%,U">w. bR$EbcV頇r))R He&8@W,>Lp6P\4,™` R2*+ 4Vϓ.-R ZVoMtMdMN  pM3_b69BV=.B P \~}1g)2W5VnU{G3C3pA B5pS0k@-qՠCYG W2(H@clىTs5?R6g6P6( oC C_ /<;P^ PN  /pV@OA|?5U4T5Q0Ѣ/t;::B $@BQ!tj#F.ApZpɯ:9n ?A- AK5&PɫҳCդ Uo!LP]ÅǹHb8a1#ĂCtpP`ʗ0Q L TϘ7"S=-y0`ˠNyjO' QZ*ZSCzuسv4aBA C쾏gx/m\P!%DB!R]C @$aw@ @ 1`"C3M"Zq& )_̄&0f1{ 5˜Ua^@9J,#@Zp,ta ,gBăa Ѐ0|7M0Ȁ jX 8a;L`  >?H\EDQfN \B8qcvȘ" +T 6 #C@؃@yDF/<.|i١0>`3d`rl!&3 H@.N˜@(By B .HZ  !R$&!@x3@Se hOaZ#i, DN$R`0@pB z X6'[ђh F@7"9 `X%ƝrըIB,%UF2֥ZՔ5LP)`C Π$t A$PpaOW=]SvRJlw]J(+MԬ3-l! `D.pE^`H[M@+ х춷B<3I" liъZgv.80 Z  TDnC P 8 QȿϽ8!uMi'Z@ `V pmG+bKx;ЉD@2`pSbC86F(0id4@$G(4B тkU0)cb')S1 A37'/oaC~ OC@$LAʔ\Vt%`p-6bvgJx󲚻hC 3EKD`f/D &@팽ѹV ^[8෭kz)n vO hȶw?'$( -p"?I ! ]kG ;$RZxh_ BgY}iS=8?sџ>1"=@݆gy|YB~)P$=A 5p%Zu^ +:J;ԀH}gzvp{xw>pW w a$n]G  LC OU `ԇTDhWzg wppXL?HoCX,dV0K*L1'Dgt31`+0%Wf,MM_vhK?h iV za}(4-8&NSh UzޠO{R@a%2+:aebd8kga@cXcc%6bna'+Ljn0c5a؋h46TF@]P9 G z xkK07j(P>yvSGuj&=V0Sא9 I%xl +d Fz0j@zP@p@:PXZ EXPı s_ _,w 51RUSz xw^g~X1808"D 0=p0=+3m-9EzT@~Q6 ԃHA.H*afwM`Up6@sfTJZ|p{O1`w`6XO%@F~Vug1`UN)I@1 \0S`r"pP?ДwPI j8ɹ8!G \0?$0@p6HVnSkixɏ !YV 3>@(w% K`#=XlԎP P rtyi.*V)r4 F-bBZ@O4`7  dIf:esz9#I Ap)C>JSy (M+IA ^YzF֥i!^ yh-Pj'dZpq(@\3`EY@d y} |\ =P ~}ee+iM 4 gXꃩʩDfZ 7  1@ЍFڒ:S;H0\zuJ.qnSy^Jg 4@ !ں ݪ5`r05Kzڤ hq5y PJ q pt5Z+ cOj媠PPv3P!5 BgGCW{Jeê ةE ,pfLd3K5kzNP{+( m ZjJq'KMk(qi3d@| #jEuXGFe['0O0e˴mZ *b M Z`r{Q{r:Ik;PKB UQQPK ;AOEBPS/img/topo_hier.gifdGIF89a2???""" TTT]]];;;...PPPĘ777222LLL򻻻GGGǙCCC!!!nnnKKKOOOjjjaaaiii{{{&&&333̷bbbDDDsss***XXXzzz666:::rrrYYYwww>>>vvvfffSSSHHHeeeUUU)))\\\%%%```€,2ǟ˙٢ӗܗY  !4\W|  4 ŋ&VØ%C|7B+<ҟ8-iI޴5SK+{*ԝBT (2OE=4&:5ԴVI [RZ!H0P K0ݗ*/ןN?L/2 k6&qL`VlB sd ZP>! zp 1ߍp 7ȊЀ*|c(CҰ!-J> H"HL&6NtX)R{VbxAVċ>HЌ/! 1юu,xG={6pD!/HF. (xa~S-EL^b׾,dMZB&P@bYQgGi}ck+w3 NvÎ&!)ؠ8~p$ t(t^o#7&`YByH 󵣨6R S xA,`=%׭z ~g!@ ֍b` h1-ŬKFsnn3GKyMWz5AMPCQudE K׹ӨlN)@j_&[+/k't\,Btz3tTHў .~;A:>c<0>}}~GA9>{z>͎s_"=M (h!)a/܁0_$|~CJ@[ַH sb?O䧿?=Qf~#DIgIGIxȀx|HJ h ؀H 䀣("-/Ȃ3(8C ~:؃>@B8D7WpHxJЄN 焳HTtpLZ8 ӅQrM` 8Mf@՗E{lXd9oQurxWz$&cxPׇUOzv8Oeyz#y=~7~)$z7xU<ewR ቿR:S#a#wBv#eBE1T5vQaޔTTB|Z@8p+uhTxҲ`Eg膋CxU.0uň`^`gX%u5YdtEPZM&ZҘ<Ga$}Ń@0k`ͅ\ڸ\a\] ?p D' AU`2`FDbU[t!7`"_!s< @r6 7`^ W0aW!-.F0icicbc^&7  (  Sip0^p qk]&_ P(dv)fcf*U9F S "€g# -h+q(=+bii,3VU0i5gRyap[LpkOkl&/EiΦl/Z +՘Sa+ 0E`3nn` 8 1$P#'qӘBq@r @L`yrhs;s?g *L+KLH6YML(+KӠ7LW13M_u]g9 7*N(?׊%:;P8yxw{z@w{׉vCywx7xTNװ)ȉg0?q}SxwrZ]8 tXN(GJبD|z>p#ڈ٩} BZHHEDȪCBH:ZzAȫ@?>(&%x'hZzJڬZ@ڭjjʭJjI庬8:Zz@:ȯ'VXT`TZ|ڢ Nzĝz|@ $TUm*ۀ'Qzv{@yA'RX:4"Ԥ<)ŴUBg<*cf3Tj{RWnk,@?@uFv7JUʶ %`혎 "-,_65ZJ`osd1apPV?˨S Z Zِf  'J]A2i8`e֐hY!q4A` e<zk(К<` \&+22o3aEap;5,,4pJLWEBY1riFkvj~pg9 YL Orhpa`x3<4a@uAN6Lӹi[ pz<#zw7?{At4KNاzȍ MkMǚRkK K ;Kd=- >^~ޝ HN,(aN?.kjx^+) >f$3)N1J<=J늭AޮBHH@n2678~Q^S~WY.@wh]_eg.Tdf)t^v~x;K('ַ}*:ͩAj븶jzمJQ؍gݕWEܭ 筍ǭ9[ƽd~(yMգ<;M $5ݲȊH'z(i裐zfhj hj *窞h笮 td*L &{Pi"ʉvA %PA]qkz+ˮ/n&9䫯&|P,G q嚦ŕ0w,$GL;PKzidPK ;AOEBPS/img/net_sdo.gifzGIF89a)z???)))SSSrrrÇ݃...{{{،TTTnnn&&&ܶsssKKKHHH***UUUwwwGGG"""%%%iiizzzvvuXXWƤԈvvv]]]aaa666[[[ :::CCC˒eeefff222DDDjjj ;;;!!!,)zȚʛ̟Сč֣ޥŇv`9{P #qŊRx#C8cɌ'E$dˏX&L5QTySgO -<}SiRG.*hPc Sjݹgל@B]:i٧(ҩg%;l]>~{wUC 0=yb@pVfֻY^ǟ!?;Z&C'pYkί=w=[thҷM~ƪ-[.;6mkV;79P`:뢑#Nxۛ3]|xA 2p@ @ >|/?`| X`  נ~{[ ao$( s Bv]qqW\5|VɺB1Idk]W2s| W24{I-\/R<<+',09PBX&PF. 4 OX$4YDNeP`#w4LpՖ@K]PR0mIB3I-HgHvv>+JF3-$JuQOMkL ˷⎐VI*U k&XD!։UX.xNjgl *:@n6Ni~J㬥kcc:O^,= A敭U,bJXvPZ& M5d$l`r[JnsN%.oS,ݙ^=4P/8!Ô|K7mf_n5_.(זּEoY b0TC8(DpAHyƢ¦ /HU2D _aU)1>傴z}8 B+hѷ" #b,os%/c Y0sxQW e@&|B ~#BDF.VaT9[6T !` lg`bW^D*6fіpfK lIBmhs446x:(<؃>(=h:74Ȅzg8HAHCXZ\؅^`bhXfxhjlXT}02f r71!{q0}w$ЇphDVcB~V2xرh\0Pt#Gw/^GAqX:G 3'p07|BUgvWCCxaTRl(CB&HPBPR7.4".˧(ƐKr4ؘ%+(uxaG&јθb좋GR:W1]hc7wӁ Y5Ԏ9"r;юVXqEQ1|ĨUG4{刌?C{Gި1s$"@u*s?iac(( ِ5ȎY5[If.AS>>,'Ĥϗ۾ H`-!LȰv F|Hg @ h2t@T$%P^0cʤ 4p@TMM~ A҄-KMɴSB)Q`A 03 " P`XF RPI| "F0 C$H"Pزg{0ǐ# s,I KNH@,"pF 2shJo u4V,83f‰-G> vݘJN&60;t#89IPfw9'v}pȘ]v9rȏxE|e%`LXF  ;BEB4VI0@sF0@Q \ '`BeaTx5c"_~5'2 \DP ,G;rƉ\u==_o9Gt0  .T9Bmx|߀R] } >`|"@}F 1s.w砇.sb$irG@$㒹[߂"Iu%aYfo B SP: ;(W_.~SZRPD$L@ NP$W;=klֶD+\P  2@D .x a/,ăkF n(τ0  14[ w uz!* !!#2JdUXQQEU\YܢE!aBQFT|a\SQV:QG 珀 IBL"w=:2`& <>c)NR %"-R.;c M!wJ+g?#S%-i[ &)zɳ_Q1KP43R\&> cBӑ5k1&&PGPћ8eHg:שb,kyMz9[F N~"ӟ@D3j~ >QP6ԡ@ QPdltŨDjPBL4D9"]T9>d|1}hY0tk25GN k j9RvTZTj9QSe)iSL*:KCq"++ͪJnjNEߺ\+uWG%`Kػ8_: a:I&Z:!T5YΎ³Ňe?!ڰִ%lSW E.?Ujg+T2r\R3Xm5MBM $$pPZܺ `;>"@B ` ),!, ږq/t3 HAWեD\ h`rC@fp hY^"JP c8xeI຤ J0 + HSXbHO cSdZ )^djh|'1 }KoDm#?H9[-&FF,X ؀$wL`yZ$&Ǟh 4qyy u\X@u HHD?)O#1'@BQ7U׾򃡭H@lp'u$Nע@G6\ E򦷽#eU@M` #[b6=`dIkI`hy]bg# D_o}u&N]0RKX@35!K+з2u)p8/z<ٍ"!" pa$2]Ӈԟ1).=QG`K<y@fLޙ7(eDht7|4eWR/_>_n=6h [[##Y_"(&[B> #<-j rЅHD_ңf3-u92\L$)_*2[*L>>1r*r>?%`^x>x _- =,_-'J-R-rh]("$&2vsG2' !jl^=@ I/75+K]iOfq[5fc6q"pgkXMpaM(R{]^:YR4@ ,B, @".X@M0m@AcjUrc64oر#pߑ/kSk2af(yP\VC 2kʘ/kuь0!0  ĵTh tFޕ\K"g!"?As,:~^2h&˘++gso:-Q(Vorw"?%tHwXDHFЎ_`v{ %Lbte251@TL YL pNuZ'>I5u u['1Z) '芎ǒT1%\2 2(ҏz)C"CY )2v ( p9>s)vٖ`yM{rg>E,$ &sc Qe%I,B5r]s ro+ )@$}dR:X_p(,5ؚ!b* # ҊHT"pa&R2)Z{*tCpcnnߦmuqm#pn:A VYR("[pNc/99)`s0bJHz?`C:fwyp/ 0)@HQ1 B qYC0eT5r8r:7s ! EC )!/7q4(.R;* `00,: g5; 5c4q'\2:' e hZpK 0Uak8 qxMxwA22E|Dg&ғw*k8Pt0 8:kt-0ftiu 'Bgiɝ9 -46z/$@'50WW`P*l뿣  7Iˡ`?05Pty'y'} ?#7 `9'@d B*: ,@ :s0@6`4Pi4* D :5 OAP ƣ # Tpi* 4s TP2&pM0xNPb=>/tj  pKi-KiЌ ֘Y지ɚ(tZ*ajcpDYL%^8H.?Q+S+!8ƙ,A# ! [b  Nb!4E+ #@woMI !#9@﻾7]  ja*'k ݗ{"!2}޺B ުC2_ E&{@> o)>t@͊E`P.8=`> 9B( 5 p0/H + MF TC͗Y y 'h"C 7 h/y o$FaXa CNa7nm9 p|$O)n4+O\Y>}gcfW*ᇀkVfa\6?;K_P /a3 Fk]m_#A-j ydw_&z9v ]"v o62װoa0-eUmL_oĿR ~K+qtۘMG} ύM PU%W %^p؂њ7)'°y$JK ?  KJ?7OpιӷԸ#MFMQR=*7_-*'0O*-83NQ(Oœ TJ_VuC1#GiCz筣ȓ(S銚ɕ0c)Mk-m|H` -\ZF!y2UEFSjf$ԭ`_a 'Yc_ehAV(OX?L٦WSXÄuM,,m A^ |@{O :Ѣvij_UL۸BQ9^MV]V^89aV ڨ+\{ޛ&esp𣀔A5B88.CjNid'r&(Y BBI"QCaQWM rpV"/'G 2/[,I q@  H;~=[/aqRW #2N,p KBi,@>|8pM0 441G`0 `@P& d.xj9H `ppÆqW@{!V@7 M GDsS]t*bcf#* ,eC\'j u2.*aEKbx2)͈!pv)t)fߢ{ǐ^ʶ,V')lhcՌ%zIZ<njé#C5\ ]GGGR $lHH }4IYy44dKP,R4, .K&Јrɠ PGMɤ&D=jReqm)PXTi?KS8UpE4wd@NaӞ|@=)HT94@SQLj4RMNaiQKD2G~1Tڗ042 oc`^T`ni B Ό@` +L aag cVbAU,Ta+KͿ` 4` + =A 0*8-ؑ`%nW\ -.j H jc֎CE J0RM*xrJP X9`;dXA0ѿ.`/ * 7 ĵՅ 0P4Ad< "ŃX:@p bՅe}ӊ_@N(j+h@b&﮷_6\` 4X$ ^3!UA.n%!aL%fAB $$v*ĠGѐ 'VP?pp ZTEVi @40.czG69HN 858# {,zp| W8Hii̢ Yc KM ?ā-P F@p,`j:=ۃx8 68 ݊N8F4LZ+@qA\M1u [pB.N`GDe6,*'7ŨY<b p;XOV8}v% n`P@l @0-#A ̽@@^tGMs[Rp&l.xFp.<*,&_  (@yI *P\IMeó&Rc(8 M@BGq `)‹QA ^>{O[ #4uu_4@}YV/{юw|ÂzP"t3X@M0 *)cjR{~,U}E|G$He$ah)XJ&X3#IG$vQ:(|gw5?J'>Xe*s62.}XFb[,3H_DH -Z1!TqTTwT?R]8$LVbdHPT)1gK!st$Uyh[i`Lu e&@cB0"LvKp40* 3A34귞d⓱Ay?p55@闳99 ip6BP+0)`iz*# ) 2 $~8%$ C8 90 8:&9Vb!R $`!7cC99v)& qh޹ 1Y5pTZ ]2rum @"#%ɝ(:B\*@ O ;$Wʨ cѦ:cA TvZ&@cזxI<):" 1N #9p?!cX:T@?u< t4/Aq$Aue' !_Nlva6v'@dP:pU#+r%wrQ(02'8'rrG Jb$ L&U0nQ,:{ɐ R+Zxw|B0ʂxz˂7ι 6o6v@8n!JW7 [ Ӭgqiח}/0Xu;*~^Wџȉt e/]0l-0,ϳ[е ɟUo8݌ 4Ѐ@N P 9 è`؁g{ Az ._prgb 6;96HPr}Gl >l.tO1%ʭUalѥ%}ԛV!`G 68 =%m̜̚}gLכ]85 ؚ̮Eτń@lXr e& +Rۣ۟K)"sh`b 5}.{F {%Wֽ؄R|+R0w N X%șRI@Ĩ倕r JYIlQ9LX W' ibi۠} i*N:B 08Il 7~  y i KB Y Uâ:.2߲ڢave` a;CiSu@ڦp Nru)ݳ4ln]}ڝ!v:4F[WjʦM'o*9)j`bn l@Zݹjϝ>Zi1K: 0qpw 27`LJ ڬ. փ~?0 - /N 20p~RTI+ڨU1=ߞݥ(@/*˲60+4/3k @F08E0F0/.@ep `|;< dagPmn[fA麮dU +?:Z󣎽w$dR}=_tvG g=mR;{E]N"_kpHڒ`ߟ28BӛX*.? LX T`EA `+{aw:}OAgL<]O8p?]w\Ě VAf^å^BE-F8 )C' (,83277@H陛摩I6'*=h L@`; EրFD1!x"ćw˗0c~̛҇l‚NM~ZT(!bX@С1FTaH D$ ɗ*qs{:+}{sn-8)pc(a KJ܈2bk-hWڥ-װGf4;vڬPqCC/Z8S `IR0 Mr*cbxB'Kk?Z |﫥p&{pهʖ_/`-Ƞ"Mhaj xa&n(THh!HȢ#h4f\7a:3($60FXcH6I<:9H"T e5A`)dihl)I bɥ[Ήcx|IK huj+''&jۢF "VH : e ۧ'jek ߪi(c+ "jl[.,)25K;m>FK״ꊮ[ ƻn[ƫ;Z_з+)8)Wlg ,$,&024~97bθ8$"<_ɧ}=KvnO/O_.¿- o/w0S}4ofuI'73 A  :AC_" 7+[!v)#\ ]h/*O䡼XZPBt І u'BK,_h+H1)a  " #,Az@F0Jb5$IFM][ܞhq` 9ADЁl"T4$,`!20@" F@|`& !XJB@APZ1H$ .>D ht.x b) PV0?5:a0|a 4hDD7PM>0e:uDEvf +iR#)F/:Ax!QN<#/p .I1i"xCް3EAQ@bDpvG@NP" ADG Bx8.2 PX^13\̚P4"]ՋYrNa*򕒦* @E@ !+zTF@`%F.C f <8P &0F@Zd4%d(c$!,IL2YXf;' ]C!z& $\ *h)8AxzۥKrӴ*N$D H!{ KRX7UZ^̄<?9@<7K1bZiudUZ y(cN@ < 6rJ"88ތpի`by)&eE DR1"6 c5!b y FrPp p\iN5x)"M44(XPH t`4 (hȓ? Hj7:8|a\Ӿ#SDy ^~ )r[pC @Ȕœ!520bFH<&j4 fzJ(wfE4p a zqkEE/@~f#~FwtT#e 7e)x *A 'q<w]F34wjSw"p9vzS愔ۃش.?GPtՆ_mOJqj(>pYr8c]c PVT#K(I@cTJza`8IgaKtg lpwL!`Hzb=R9`N/48vNk =5WO2Mĥx*0M PqS@ Ѩ/pNNTO,6 X#.^;8  YUyR RpRt0 @ O+ Np E$?6Qa>cX_wQ0 mg 9$19UM'%ie3&*i @0sUs(AXKp'<=XIMeɓH9X^K9MycO9d &Vo%HA1s\-ؐGmfzƘ{^[@z՗ŔU_^T>`*`g_ga`_telw)F Q&UY H aYeәR8 Fg IecUh c! EZHw\>CH4 : JG`f੠t! QK Pk0e0l ЁD!D號ag@'`W`P*P=Aj%F`c0 ))6yejF`j_OkWiKa(R왦iEW%pK ^Ɔl Ƕ{ ^.`J}ȐkKpe_6jepr@H67nonmpzzwn J$pߖ}'* ZGQ<" & o&pE&,U:C`rC 'rpsy8 VUn#ІCq- :+Я%bqEsz!S'H4J6Ou[TguyeViC0l@`Kjǐ Zg=V.9PgY !@SNJG7v0j 0"iKGJy0fr& 7#U@R 3Gxx a`JUW]M'|v{{ +O5@00`Sg"@B03Tp0ŻhhpB"+|G7|7P-}ߚ7h)`߰!  K49`J50[@0JȀG7I ؽ3R:TZ,β!L[ؠ%a-\_<b+PB2\3Çm>|dFdr@\MSf Lʥ ʉ 3# Ų 1bǐpȸ?c,|||\Q|B<79"ڜdr6R9͘\s:b2aw(ή'_F\Eiap^LάQglrCШ,;4f -Ѣͳ%>g-S0(Y%! +^B&2ҁ c?ҽ=-m>8"o 5mǣԊGg: Ҽ8Rmϋ7]|eim4p]2-n.xm1u=?lw#}m8}^׃>],"؉5-,؏mב++ؕ}0D>Z]$b-CI ڐѤb)#4H@8p&Gr2.ڴم@0RAPF >Y K=ą pV0 KK[ [!]ިJP$ wVDI$Ld],ڰ]ݺ3:_O ^=$.O$f0 `i(AM;!(p$ۄM\7R*TO 'YUG]#VY A `S )x pfr'דS~JpvVMkΙ0f ER!f "A=w ,S.097lxM'MM8fgt ЖLcQ*ɬ:SUR0#os PU% @HKyeAḵj,4;:F_wn>_,X`SXfeuڑ`aʛrګaatN%rb/vMad .DdoYy??s!y]4Vg+ K r<-0g gdPe!ū0_ꏠY% `I754?!G@Їxj~PLP cYO!_k:lņkg h!o3VBPjݻmotM޵TpkqO=A͖x%  !z(!;i^\ 1om_61pzJO` QO?P0%Pύw`'-./014+ :#ED#5?*Åė$69!/* ؾ, ڙT'737 03L}aCF>6IcPܲm CIIQ^Ĵ,L^׫eĈ5bf RV%W±N.tL hk1@CYJpI$ گ@ؙ5 8Db;x衑VJ+^̸qUH!aFל>Y #FEAcM>e\ o89 ;ڶT`D1'F`Bێӫ_~$.yBo,HPNgpNoD0,Ɣ*N&NL%$p q17A`n H"t<,aMI'WL1@ @5K'TV{m`kzlbC *[m)I@뫺;hƛֻɻTF)omۋ) qW c;1)q$-T&g;(h2I\)L26 H4oX9m0FG6K3%5"MuzRK3,Ĥ}*pڧ @ :IY_mVJ*-$!RAqUJumzy_NLs~v  1RT+y$.5G R{F/Wob{)$D7 ӽCo?+~` %M</8 ph\&H y@T `p!6t`jB Z0'X 2̡kCU+7HĐdG,1!,LEUqX,xE-z>s"2o\$vd]l瘮4x<ь BL"g@;PKGGPK ;AOEBPS/img/topo_features.gifuGIF89a@???:::]]]***&&&TTT...iiibbb)))DDDPPPfffGGG"""%%%ĘwwwKKKSSS٠222CCCjjj;;;̔!!!rrrXXX aaaLLL\\\夤nnn666///___ȋYYY777333eee{{{HHH,@ѻ 7h*\lÇ#J8!ŋ3j܈"Ǐ Cqɓ(S+˗0I͛fɳI> (ѣH3ӧBJ*4Vj +ׯ`z KӱfӪ v۷1Kwܺx1 '`a q/T0 $.( 1e XV^L:d͕'Ƭ:~g qEά/gvZxm6 F1ïxCΰݸgx͝w^}ܗ߂֟<6|jgaqU0 2!7<8Vahنt%G$Bzmb..(d2o&PcjS! ~3Z\v3P)Ֆ]a`BZi1&@p= hg]~YlɧYKR (`S@'T=:7b'-:"کDjPjӥn駚ȩ(cZ>P뫿YZe鋭4ʓh0Ȋ͂-LV](]Rnms8&Zc./BKfY`Mjb0XK$ @ n+OLV-@@K.1\Ĵ pZ1trEv@P.33p ̻yLR`@>#ݧH7dt`Y@el@@HsUoډƮL* #Ax0&ݶ43f$ph )Ҷ(A @@{'.._n @^o!uy1ޭ ૳/LY qg|L;r ~ sdvYSmw+rnc1ʺ L$vMHt_;+z_WC u0,#v "ػ{]dS9 3r,`poA~/pBN0J{B]+_>S*t}0'G 0"29`^fF@6 "D D8Xb|NExhP ьkDb f:Zxƥ5(NP8&4X#Z (H h 9"oQ&e.'5EM+ Zа{hD40Q Ih@3w Չ""~I/ #QROIhpx,FFsq@ f3 `,A l`Oa*Q 4a}1};iEV-P p@v>49ZB TiBxӋ%\znʅ=L)jMuI2~*O]T#M)I5?VB# 'lk1$O _jXۡA^N"T(Y]MosWU)bԠ2Ur,òpMPءPCX3}yv0k8&ZԂu5 Ё,pp xzj[y"=\f>,x T:ӵlPRr@,VЂ6w+zTEE5/-hд a{{撾/S*-B-*"L$:Hko`s7eo eQ# קa 8KQ @BHezIPJ 햠^$`gTΞ,]teA7Z& r@-RopYmy'(ЈNjϲdҀ fDad.'5)pZ0Z:(ָεq PC+ HNPoL䬼¼$YvS@Q0uv{'[u<Kx3=,Ġ ĦӢvb"8gSrϵ;r[X@Jp[2P@v` lhcaG]@40#O9[;0‡H*"5UQ)xCЗd!r(J[gZS jxy>A:WE#WcF@HrArsl.Lh6T+k XȂ_ W(;SzN? rZ:mHA<@zGCfЃעۮ{$D,&_<x9R,D0I,1S$=1i|" e-spG|CG\a;q1E*)`#090pFdryt|4`H@F +ÁW0o0T6;POdy.kWR;IJa!`:(n)#űуrqqNÂ042([}7]]h?*\8hKR.?r=s' A; ՄGOQPS^F t%b8~='+{Saqd7g;`~䄛(s]LV(712"wB+ԃ#?bxWv5Lpe׀uw&.JWJ%$R.Ɉ zzDp[ Z&n_(jUyF Mք}ܐ||YPXȀ1w(>\t |5Rut!aA$#I&i|8Ip*X @9bE~ka;du-MSWi2tוvtvuqr[~RHxuQǰY#QhvhMZ(Q:Y&3 vnYy~)WMHn2Uc9BN)yJ1%vuo9-U{N!sWhIᓐ˒3E^ /[NxVIu# %)3֙i} aPM9Cݙ@؉Xig1GSaPsAY*I1r nul>k_&z'sDp_q eZk-j, EE1z4*?.6z`AD0UGZNJ  ӗ=Z18X5B ɉWڥV1D5dZ%S̹(㦉u%9\*aAuazZ|*hSƨ*:{:*!Tک0 ZkéڪIZxEګ,ĚzڬК:Zؚܚ*Zz躨꺮ڮk:ڥzQZگ>;%Z Uc:[s[5(ӱ/ 2$[-&{ڲ.0; ɪ6{8۲3˫ŝ2Y'4 <;osB[JWꙴ@OXS,дI9;T V;YeRU/|yl+bbhCjVuW{=ٵx鷥9˵Psu?Bb> hkoqk{-+ 6r継kakc˷^뺌˺9[Q +Ky[ɫ;;; Lٻi+{»˛{VQ۽䛻۶?QpkKk {};}ljG+Kk߻<1Y1"$sۻ | 4|9£^X)<. lF8T+N\J,@K?6^X!D' fC\ڠ![k wt 0y g00!o*Ў=\pZǏL !4D|ɑgAĂ L IU<ƈls0)\7Pl\O<¨ # o𐣜 {-@q̢L < ˱l\̎Ͳbͨ DsFʝ< ]p;7 &Ϟ ́cR¥9#)KMG#.oZu:ҙ$ 'm}0 4}2]:!p;+8=A>8׬ad Hގ )s1o <򷰍'Hng>@OQiЏ ?* /,bاs֑A毛 ~rqW~wèLJȺ̤աŢݦ$p%\hC&(Ŋ.b\搡ƍˁqcɑ:.Ų˗0cʜI͛8sɳϟ@2aУH*]ʴӧP 'uիXj}Vtׯ`Ê]uٳh>,۷pKݻ˷_tz Lˆ+xxǐ5L唁/k9WΠC~4yӝK^ְc}-o=67N8Ɠ+8|CNسsw\ҿo)<'rOϾ=#㋇/~vCǯrx& 6xFVxfv("&H*.hz2ֈ6:8>BF&IJ6)NFyNTTViXf\v`)dih f ;PKzuPK ;AOEBPS/img/edge_table.gify GIF89a%???nnn777!!!333***&&&%%%---CCC岲vvv턄666222sss))) PPP...]]]YYYTTTDDD{{{XXXwwweee:::rrrdddLLL;;;KKKjjjµaaafff>>>,%Òίюە曵ڥu @n\PWz[ËU=,( "!eIf9>D˗VL -ray2MnB˹(ƞ8-EPDy(ѐUj&DŽL)MJZWY-VIKٚݛ g `3-$WEĕ$J(` 0h@M,S^IuD2z0aMƲeuRP0M(A6 8>Jj/;˦l(+J:k<!EJ)2 އY;H྆+{KBnR{LPېLPmAr0½8Ӱ;,JP<0H&0I̺[#ԲJ,/1,2|o&1mQTô@MZQm?X+HZ`'Cbh p" R ዐZ#fW"%0kVo!Dko@$g#J67DA\ `Z. ·gŪ{hʩdp[n5?naڊcc:-֮4s.Z8X:f:K >*g9Cbd2ùk26bV׆^sK.8Snom;06$ueS]vPD>LsU*&f84C?,zF&m43scVIs>I+cmdjdzMcO_ ;!aP2Vp|t7%qT4pg h77H  `RGk5%K~q9<"@S .5&%%8/=X,X=S:ʓTQ R@WR#EXSJ CCRZgP&L[>>aaawwwHHH...GGG{{{%%%222DDDbbb\\\---eee666LLLUUUzzzrrr:::333)))KKK777vvvxxx,   Ű  ʢފԃp*|0dNf "D#*/ 01'PXKqAEB#.T&()jHKV A`…*]4<#X,B $pEU X(@ 3hXMІ&^ɢF6n X8rrB@-.HAŌq9 fpc<0gӮmʺױf @[1@ |`uokW," HYܺ !}x1 KJD@@bKp@d2Dpہ&(Sn 9 ('tIMu5d!Bp&| q> : +W)ǡ *(T ĈH ""҄}Ht6AZr-dF r4!=uI } B1^eVji& .\0yA B>K~*Z+7 (Ye0ew,C1pclf6D*'ĉD\3 @!td;n RK @q01\py1i`ETRƻ$< `8p*WH1{n@ a1C{s~۾5>}+ :$bES30psҴ. 4@AT}{IQPx/AИAuQLl D +Pu1zCYeIMM*`>$ 9@)Rr[bɬ?*Y X F0 XT0N3B/tww hHYo'TKBO8 І:D'{Вc5)юz ECJҒ 5F zR4(BX B'ʥ@Ym[{[ɠh^^%8i=pV᐀c%.Y᜵b5ZgxN]gGU^q_ueqߛ!ȡr;ByluW'z^k7f~r\MwzеNY;!@̧rWNnQآ$4IPOvKK>bg(JƛAu'OyD}{79}q/ϋB7Nfgvr]roFQOO|ƖaÏd{O";ҔX$ׄ&Ф Jo_x `P =,`Q =/zH ~' *f0#0)s4+͢ifP^A2" -w"?}`dF>99/+rr9[PPB+- fc3`k0E^#~/WG8K=hP #h;5Cfh@Epb8ʓ4 Tg8GP 7ll89+""v 85P .@} @ J/62&pf>{(>g UI-KӋYO8sinvo\&/&C3@Mn5b9 $}9)~q@A_9>I)@<0GZijAdnfuqyQŀ!0qH@<@'1qa[)7RBDbfYqA!B p!Mde!ᚖBf[@&$:%"B"&! +"#3R#z#/$pf0`($K~("!HRB2XQb..`:)I!scv''!3& ڄF(m2"~D ; 8C"<*@K:B*`*+2r, $,#1#6¥㥱SbE'$.0h /L:/6r!!//2#0[11HpEcQ11ޱ1B.nK.#12/ZM?4C3 *434QS *:Zzګ:zX 8@8m8Fmu|Ē9$9;eB::chPۘN;;Z#=E#˃#?]İp?HƦ#};@T& @(Xj A˺^*A*kA,+B@B&dBp-dD4dCUC:. 2TF 3HD=yHK[ :DfI^TEEYD:FlFto#CFf4h9[ nGrDGGzGj`DHDuH~?&} g"8PIʬ5 DJsJ0dD6$ˠ;j^ WT| A՚%U>Ex{vNvM[ nN`GSwoջJV7zț5RۼKQO*[ ż֛O+x/wZGS-gSw,{byv IT;[Rev|EptemvgX6mv , lEL)]|6!# % '<%)+*/L6-d5:DfdI,t_e]`&fd5gz{O| j&|ghF͕NƉid,iHjkzU|,kRkskkĠ\Ͷ?f8w)[m Co2ʱWe6oCB\ݷ&Ƭ; pILW f~'׆d7fH?im/8 dxN2Hh#%80HP҂݃13h6芃ƒs?:0c腤ٔkF$T:s[PXIaHe؇~xm8o8q8mדXܹ q׋hCM%Ȉ/ሾz{X5$}hF]ߩ؃4ށ@͹i+Hms)ȡpD^0H3_h#c %>.;PK>UOPK ;AOEBPS/img/net_hier.gif6GIF89aпDDDwww!!!{{{܃???Ëỻ777vvvYYYGGG CCC]]]...rrrPPP򈈈ݐ"""bbbaaa666nnnUUU\\\娨Dz&&&iii%%%jjj222,  Գۨ ܍ކ*`a P 4lGh@v$hCd^Ce:^lȗ<@6qh8hA%(do%\œYJPULAL8t)L0"XeC }JII]s5鴓_g@ ^t8CV&Y!3:7_R+-UzoaQfkP(i8`PQ %XRbns]w($`"=Dn1kVͯr_tCB2D'_^D8 EP3@|Ї'Vޒ 2QBPR)zF Su&A܈<9TYH6)3GaQ:iȔU\>eЙ&h^fHl)+oٌBvKqg%uyI埈JQ`]5 ڕm2'7R꩛ѬuT~ *.몉lV:&:bL|!j8z]NRu:md;g!2[n<+n^\2ss"okeu 믷Ξ$;dˢ O,1 ywh|1<ʽP$p#{rHr,*PO-8:gU E=,Pgm>RGGlS2| ыj$͕K՞!k+sv2Μtݕڇl3L6's\[E}X/vu`sRն=IoOTQS:WԼ!*^r(SP>"=WC>'*5|Ԭ{?}w LW&+ h];9%@ 4KR#!Q=#CR :T. "'PK`KEURApL9Ekt$GG}Xlb*Bt-J/[9_֚h1Dt$k\[FEsDTlL1D ]#d$<" HzLGITli"-G)}&aT”G!I1iHO+*Bؒ%%LäZ<.aL W6g^nAXsfPػnϕ8!8b=n:4-3qܛ';I<lR hЃԧPJqz2hmpHuϗbH?@P L[.}Ӥ&gTETSiS}'A޲>|kH/tXL O{6:#^RAK}P~cpyf&a(z XQ_G_ ~8(U4/7 =%w4tp!:JFB2sp68y-tă|D%(#.:aB'/f{T4TP n\uNcHEf8dh@^( soJ0wuRSy󇀂U(.X/%(`DŽBRE)*8&nuP|`҉S's2\(:4B_T H|2[$KUb3Ȩ8k󉔠H!wj&K>6>X H+|w cؘh4H冺ge~HE H*#t)ph4 X )e0Ɨ wR 1%x6DL$D gt - "9+@>8'3(odYB5{Lp-u.B> ˠ&0*py)ڨ H a7M EwAvltPK?H*m13L9 5|{G'4s6D)dx \i!|iCd8Yx[)|QAAAט*I2Wxᕃ`hCyA E^Qr;#AƢ'Ohփ @isbs}?It[z(3vaXTL˭XO tƼm\1U[Et4+EŸvǪpq=$K:yMxgpF9ʳfԎČ܁1L%j5}=GKMS^AHe(Aie"'N`qNٻtΎBoU~G堇.^.HQQΪO{>@mb!鞾"åvLΥak=ꧽa9iC/i QPa6#͸xڼeR7̴M-$uڮ. xVPΘLls!x`¬ԆXo;PK-DPK ;AOEBPS/img/load_window.gifvGIF89aXLrrrԿÇ???...{{{،TTT"""nnn&&&嶶sssKKKHHH***UUUwwwGGG%%%OOO;;;777!!!DDD]]]CCC222 vvvXXXeeeaaa666\\\)))PPPfffLLLzzzjjjYYYddd333:::iii^^^—ˏbbb,XL  Ӛ®ك(D*\$T 3jp (!H(Sn+se !MhMH*]HUW%@ ӫX1(8`5ٳa DK݀xDUۧ\ڛk Q"  \ $ Skd.ޒ0@>#R(j'<D2>1x4\;4 H( t +ɅÀ-tP7hltD0MЛܘ@6T4Ը]Ɯ7]Tw:3g"x\ܕ<93v#RdEtޜE,&B G&ȥ-} X~38֒, l{ D8<[9Rb$0=p$tӟ4裢(q 6 p |MEst -gϱ%-8 2Gt#5D9T0HHW͔ )6*2A[-qIXI(`N0C4eED!2\AINlp9ĢA (/"p}Ap*hco#/ Wgz i}ޡbSԘ0yseO^, T hJ5ʜ6|dD n>!Hs)5,p$f8da`^xZЃ[`:uv *y}R$zgOԞ@wC0{6"2f"=gp@|A@*tò0p,#/RP5}tWʵRKR[”Bp9);\͑s,v(e3ϋS%F(GʃGK]J}$ >Ӿk$'b/a_$:<,OPea{1g5q~Pʲ8  3O&w-cvSG =cpk>.`xXH/h 1x@}HjU0#tϗ1o3 @H8l]X5g@4d H3Ȋ-x?i!H"eK))mH)(K`8Gxf>8( ɗ8&V`bJw5茥|@u]u0FGWw[wQTR>-`hA$q!ڴ%9YD &qyE6ȐNKV] 8)L75!U='$Aph5]w,p JP tQs i2LOu`(Y?<I$"vmQOU,&_dqUćII36 _a9> R s nx`_pJ4`eiLU$SvoG]aI#>3&@3P"Yxy1 .H3(mU0{w)8 N0ЙXte~8h.I6ÑxR4<ބE5+Ѳ'gy@ (6dy'p(zvxD! 7u1{XWK`ȟ!0z0y g5ugїɳ%+aٰaQp`y}%@6=wlʨwa'23*M]&e=K^WM߉E˾Sw)ُk=Q=[Sm21u2'` 2_p;a# ʣM޽ <@]BC:H|鼰0= nZK (ɫ!:EK^pQ7A邞<;꺐ׯb gNd"ܿ:騠ե}q$ :$;ݍ# g3;#<ݪꬲĮM<ҹqR=KH]fΦ|*eIR3;3gήʧBWdpͱ7LUX9SEq#W#hG r$HzɜAicwn+~1"sW'" sw7&@o[;w)s9aJLVe.uhݾ>LnNc[+tǣ}sW.]j_Itǝ?_o"Fd*~RE>^JBP*%MgHX_[B΃N$2NHD"]%W.*HThڶ/'z?(fh鵏P))~2@oK|T7 ϟЉӧ9؇A]FF,B B`6Oŋa-Q 'nId~R"^B0y%x`@$͟рdH PSSC3E}h*ՑVye "WmJYzcɦ=VUضAʝo-]hvWa޾R.VCMJSacbs149cʗ-CƼY䆭*k@k="($<+BUv{۴֦fB I@l 801kVv pANCl[Ď3( '0H +(R ŴT @dú0+ ˶=ۣ IKH2h3+ƬI M Pc̛&L ihJ,6 FIF Hp1%X1pñFi3: !E# (h0CW$̃brNWeHQ" )74DMjUڿ]d>Y6RFVUa} cŞJfniu` 4zꆼN]-CMÙU폯pV.V '7G/Wogуe k5@o觯/OŭtW;Lx]y"*)ʄ;PKFqPK ;AOEBPS/img/net_roads.gifECGIF89a6/)))SSS""";;;휜iiinnn***???ddd؇򘘘UUU!!!YYYfff僃sss...CCC 222www777%%%{{{111PPPbbbDDD]]]jjj///&&&rrrLLLTTTXXX\\\---<<<GGG666```:::333aaaHHHvvv>>>~~~շeee٨фvvuhhhIII===,,,KLK^^^qqqEEE[\[888;;:XXWKKKtttOOOooo555|}|GGF|||jji BBBhhg^^]###QQQWWWSTSzzz''' 000xxx,6/H`*\ȰBd(qŠbqƌ-82bG'ta0cʜI͛8sɳϟ@g<8 eQ-TڑiSP&iՓAjʵׯ`I gYdӢU{,Nm]Vͱa˷_x _@H%u(^| | VHH\]`@%  0@„4(^ +0@IºN /`@ Ѐ 2@ "@C >B^cgӥ-t[_6 8 p˩@;' qЃ@>SB7sOl @A,@M &@,C= |`@^@ ;]K4M5՘mz;N chAV` TG H{,Q, pC  ,7I0!PS?t[ d罹k%p+L.5Ğ-pDr:%a+@OVD(HA L"H@R *Lu@P+ 4z 80R J0ha o:y0)p/ɡ@: j YUQtWl! 8uz_y ‘W:Z G 9Al !{,H1<dYC. G`B.uK)`H*WTT+cYҲ*sKWe09Le2oLZ6$@Q#',^;$ v`MKl@ԭu8,M3l+x$ 920l< d'?Eກ -8`46S8!I&IvBEYѤa #39=`bjΘU@j(6@` lAe60<!H=I&TG<65,UUw5GJ0d dađCҍUUp£!I`N ds ӻI8"4r` <@}:6gAzU7l` 0LpЈ!Mp9a~ow<^S_A )pJkbZWŴqlBEݶ-nAƷ vikT`\oCtJ;ym{:Nvr x'bDF_1>4w}1:5y[8' у6=2vE3n`8A343w8_aHՔjJ`:l؆: :7Xs0j 6 g6"43pr&3"|},7/2s>XG|R#!;!׆sSqHZXyGRtFK:MG'P3u%8VG<3u<ݨ'(uX2cPt>aHXMLKh L~/ vJ M_JE@P@Ɣ @@@ e 0 @H@ 1p`4Mxb^% 7@d[=ƃ4.`l_2J[xX Qa#w$)f<@E{ȏ|@Vw@u^9R`<T)@v1{wa4~\X}y}e熡mvЇ%Y4[6T+pMI'.'rh q ) hTESn􂁐)Y-bY'#@9vI. G+ V&e. фHvp7t؅Y^qڲs_N F,<Jpm #zZ'%C@C: z 2V )s9`,Y/tB= iه6PcH)W#ga,zr@<y9^T_pZ,V~r*pprpQէEUR#߹ ᩨHQSyѨ7!q$>2Px!J5Qgz4!19n@^S3(`GG b:[:\Zhoײ z2Kک̚`09 J @P5MX: ԥ_:,{Zk2r zbS 5 {w ;Aw%٭nz겓ٲj Q<#;-6y {9(LLt 1N;En'X; C\z Yx05)<%ʩdz{u+QkxF[u #9`1k9r  wol#;A]{;?" m:=[@I*%؜BM e@ۃKҸ1+yK;v[ޫ9)s[5i{c;!$ Zk:Bv/*Z+˧{ ! g1軏\v 0q 9s;Y8\&̼qgZ21e }_kÞLBj J¹)`ػ^X:2zۺ2<Րb9LJsKaIK`KwK0 ǿT$DŽD*mr3%x*zy@0CƊLCR$G )IsN=-lLaME|5% xg >r-1yFmϏ]&=܄΁ַڠl. PiQܽ&:eӏ9y3q[ Kͅ. WDl9M;,gޣqq*ّh;!.LAޚ9<=N}9c`p ֽ~B^E.PLjjL2I A@J`.L~q4m8-Pܳ7#r֓'f` ǩQpp0T0QS}[ @~m^Fe~5f O|[rExW\>~̛ԒNA2qpOP¹~g>Ǜ!]سr7a!nMc߀U% >'+.!&(?>Fb3@-VYh .A̡+|eC8B (?5:ʣ),cXFxdlɢw#K?/Boڅ/J %V]r{z-/2D[p_rڙ@M.d:'hb5&UYϜ\/:p@{LAC.ڡћtzxϮ =d:zR _"e;~#{?s /$Z V @XPƉLx@ر#G!NJ'Uz|0zPE9Sٳ#;w$ZѢxN]^ʫXfUWZrUb,Ƿ&Tc˃!(`"8uR[8#;x /fRwt`o:g\3HZB>~i 'nMcTmă `SȒ/g~qQsFlֲcgҵk=`IklL̀!sƏNtiN)첃 Î\鵞V{;= ۃCTK0(U,| K4T'UJc=Q(uaYKjxE=s`ApZ'lUQJ5bhqg_S;e㲉(8e5b?Un:=Y%zO`@Sڱ;Y⷟e8:a%:`Qfnkj;$ZwgOj5=p_e,>O绯j5 }-e   (\(X^fsh=EhQ 6,P5- 89[bը8IId* ΰ0tEĝŸE ( 9 OY 8ZxDn(, =H 5BHl4iPJe~Qi&8cӜzdrħ>ΡZKiʧ.Ј#a. P U,(A" k̢+])Ҿdt]_ m!REFcAB<'L<V*UFCEjoVqń "EP)P .gQ0 ~H 0m`S<UBZ` w&FJ:1D%hhբ5nJ[zגqL h1ތd ; 6PG2α۽'D҅̀ -prHdLY3P5/g@_؊emg#@0@ȜXwfwnxޖ{{+0/oJl@ AR;yɍ,sXGv\ @3Mu[+gy鍸WSٱx=Ρ' p8@Y2w#N8O҅.0;A@$5\<&L \C ȹm 6|?\8Wқ;>4|C5tBBL8]lB>C˟?dQ*:0Cx$D* )G_`\8 )hYT;CdGƺG,DŽ$ Ý10P[ G0G.8-X UZ*؁;4>%_THL̡C## ExPƃT3&¨H>c,tsvԳUy{U=@w0(Mݪ; 3879[8w}I[@UY }ʅ,JL0&_]Ԯ\\JݝLJO޺\0iM܌^ݬյ^- mM\ѓ}ߒ{dYpUyL<|_# _MEY]`_]^`W F D`x```6 >[ ѵLᒀᔠ .=ba` a!'"v`&ͫ}b^=f[|O{4>c6\c4h{c9nc8VN0ダaozU-$b>_1ȑUz^IՓncᒭd6a D9E.GFB^CMfM@nnaJg.IeEgUg>+fgi%zᡓ*&acnޔvW>(։|}~hmhr6sh*1莝兆%ng.e2W HRyv_%e]fF^O>f)[b>=j~ZMngݟvgzjvH?F.^FEꈆjc/h~5jkvkOe|Q:&6lm{Qf~lD}kNg @fv>khYfÐ.lljЦkHq&1="kKFޙmrHVmfp9&RZZ>z֬,ގE"&b'"Έ(=L&]v4|v `}ڨ(o2j#&f I$("j~_&T^f~m "vz^8. +^ೠp.Jֈ"SEfioў* qV:ψ&8ӶWg`/ L',P>m{'(?`G؃n#ۼ3Xxr q3*!8.374-`*:;#q9ta 8E53zmpަHWRT82t3taa|,am p,'GKriPu@C5_`oa'AFJef_WoWi-tLmk/Cc]frvuY_ ((#jEt(V*nnw܅qyd  hŀ'()e7ogxI)+0#.(M0rÌuvjFxnWӖ֊@'[ ɾc?짏zȾ6Ǿ6;zpcW#K3?KHǤo@rwxu^^7jLB7{=)tXvvyfS%o p"*'dy4yĹ#>|D'g|zq'8JHׇ@;]x!D֓q{lwqv~T~}L_7_ki>7'ܼ{&Do,h`2$Ç#J$H5n8PE$Q"H$|ؒ•2E>P̜:wc%8;w~m*0J/NDX z+ɮZ+ϴjײmve)qbGQl*D&ߧ 5[avT\ǐ^K,XA86yk4jz4[4C y7&n S5眝HE\x"9)m;пUpp#\Ъ<%q  :$0PLl+Aݑρ;n-hfh4;=fG:h0:饛>zNzꫯ޺{ӎN:H;.5m Jq3  n`?dR8x>M˱ox {|q4GZxcnQzM|+Ʒk89 ^.̓ߦD\jǁrPٲq[Wiݜ8@1 .ӽv;w{;vy3缲3޶`O#Sv!Vc &+v\X#glYp8CЛװR5# ".Ό0A( 1L`nc*Zd-ߖe@LPP@ԀDϒ=%aZ[(dw"׫T<4㋲A84%@悭/ .ЂDZBRL \ ]cs,MwH@1@@etAgY5_`a76c^Ǵf?64Mv 8h-%c+u__3h3h;\ Ge+vfdǶSfvf6gfud>>Ga :;5 ovoGB}e4C\egw0^r1vNM y$$./{6wgӷ7ZL0Lzv6{c7|CspTҠ~37`GzS}g傃xjڇ#www]}{L8gl?xpb98A+>ϳ?[9@s'ϕs{ycyǎ@]Cy҉@.CAWrs 8f*SUW,u@ mys+zgy%uSZ.r7j^8b9 ׻ÇF̧C/ztUTG$I2I)KL@M6Nvx8n:dl׵M e@zs%_f`:_vz'{%7KPT{rKmڦn&{8qx٤i'vF {@rSy@zz{#s x£5u< }#>ӿq:~_8$޿=X`7=.+;׽sfY9Ad|>\1b~~>~*8/?ߗ~3[~#Wm;׆?_+D4x@ *dÅ(VxcF**I4yeJ+YtfL ygN;yhPCyiRK6ujTSVzkV[v /)pTl%ZD=VnIuEl`ɴoI 6Fx$Zy/Bf㊍gAbI6s" L=AR}PA (&pɴai{Wƭ9ɟGn.슾1f|iɗXvvUV[ ѽ9ۖv/#l| }+/h.So`k4M 5kEX[Q1Lm [)Fk+5Cj5l9α;&atμ~LZs%(]$Ƃr<-! Í[OIdRS: i0 PA8[NF 2H%>!PE %9/C3cL#L7T>(LRm$Q1MsMbLqV:31չv}Rzs54Hdcr$!aQx%==Yz66'3GmI0k4a^[8kkC5STAMs3$xU'4c9U5f_j{䦝?4HZX:NO5֚K.FT{I 쿊fޛ ; ;PK2fEEPK ;AOEBPS/sdo_topo_concepts.htm Topology Data Model Overview

1 Topology Data Model Overview

The topology data model of Oracle Spatial lets you work with data about nodes, edges, and faces in a topology. For example, United States Census geographic data is provided in terms of nodes, chains, and polygons, and this data can be represented using the Spatial topology data model. You can store information about topological elements and geometry layers in Oracle Spatial tables and metadata views. You can then perform certain Spatial operations referencing the topological elements, for example, finding which chains (such as streets) have any spatial interaction with a specific polygon entity (such as a park).

This chapter describes the Spatial data structures and data types that support the topology data model, and what you need to do to populate and manipulate the structures. You can use this information to write a program to convert your topological data into formats usable with Spatial.


Note:

Although this chapter discusses some topology terms as they relate to Oracle Spatial, it assumes that you are familiar with basic topology concepts.

It also assumes that you are familiar with the main Spatial concepts, data types, and operations, as documented in Oracle Spatial Developer's Guide.


This chapter contains the following major sections:

1.1 Main Steps in Using Topology Data

This section summarizes the main steps for working with topology data in Oracle Spatial. It refers to important concepts, structures, and operations that are described in detail in other sections.

The specific main steps depend on which of two basic approaches you follow, which depend on the kind of data you will use to build the topology:

You can use the topology data model PL/SQL and Java APIs to update the topology (for example, to change the data about an edge, node, or face). The PL/SQL API for most editing operations is the SDO_TOPO_MAP package, which is documented in Chapter 4. The Java API is described in Section 1.8.2.

1.1.1 Using a Topology Built from Topology Data

The main steps for working with a topology built from topology data are as follows:

  1. Create the topology, using the SDO_TOPO.CREATE_TOPOLOGY procedure. This causes the <topology-name>_EDGE$, <topology-name>_NODE$, <topology-name>_FACE$, and <topology-name>_HISTORY$ tables to be created. (These tables are described in Section 1.5.1, Section 1.5.2, Section 1.5.3, and Section 1.5.5, respectively.)

  2. Load topology data into the node, edge, and face tables created in Step 1. This is typically done using a bulk-load utility, but it can be done using SQL INSERT statements.

  3. Create a feature table for each type of topology geometry layer in the topology. For example, a city data topology might have separate feature tables for land parcels, streets, and traffic signs.

  4. Associate the feature tables with the topology, using the SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER procedure for each feature table. This causes the <topology-name>_RELATION$ table to be created. (This table is described in Section 1.5.4.)

  5. Initialize topology metadata, using the SDO_TOPO.INITIALIZE_METADATA procedure. (This procedure also creates spatial indexes on the <topology-name>_EDGE$, <topology-name>_NODE$, and <topology-name>_FACE$ tables, and additional B-tree indexes on the <topology-name>_EDGE$ and <topology-name>_NODE$ tables.)

  6. Load the feature tables using the SDO_TOPO_GEOMETRY constructor. (This constructor is described in Section 1.6.2.)

  7. Query the topology data (for example, using one of topology operators described in Section 1.8.1).

  8. Optionally, edit topology data using the PL/SQL or Java application programming interfaces (APIs).

Section 1.12.1 contains a PL/SQL example that performs these main steps.

1.1.2 Using a Topology Built from Spatial Geometries

To build a topology from spatial geometries, you must first perform the standard operations for preparing data for use with Oracle Spatial, as described in Oracle Spatial Developer's Guide:

  1. Create the spatial tables.

  2. Update the spatial metadata (USER_SDO_GEOM_METADATA view).

  3. Load data into the spatial tables.

  4. Validate the spatial data.

  5. Create the spatial indexes.

The main steps for working with a topology built from Oracle Spatial geometries are as follows:

  1. Create the topology, using the SDO_TOPO.CREATE_TOPOLOGY procedure. This causes the <topology-name>_EDGE$, <topology-name>_NODE$, <topology-name>_FACE$, and <topology-name>_HISTORY$ tables to be created. (These tables are described in Section 1.5.1, Section 1.5.2, Section 1.5.3, and Section 1.5.5, respectively.)

  2. Create the universe face (F0, defined in Section 1.2).

  3. Create a feature table for each type of topology geometry layer in the topology. For example, a city data topology might have separate feature tables for land parcels, streets, and traffic signs.

  4. Associate the feature tables with the topology, using the SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER procedure for each feature table. This causes the <topology-name>_RELATION$ table to be created. (This table is described in Section 1.5.4.)

  5. Create a TopoMap object and load the whole topology into cache.

  6. Load the feature tables, inserting data from the spatial tables and using the SDO_TOPO_MAP.CREATE_FEATURE function.

  7. Initialize topology metadata, using the SDO_TOPO.INITIALIZE_METADATA procedure. (This procedure also creates spatial indexes on the <topology-name>_EDGE$, <topology-name>_NODE$, and <topology-name>_FACE$ tables, and additional B-tree indexes on the <topology-name>_EDGE$ and <topology-name>_NODE$ tables.)

  8. Query the topology data (using one of topology operators described in Section 1.8.1).

  9. Optionally, edit topology data using the PL/SQL or Java application programming interfaces (APIs).

Section 1.12.2 contains a PL/SQL example that performs these main steps.

1.2 Topology Data Model Concepts

Topology is a branch of mathematics concerned with objects in space. Topological relationships include such relationships as contains, inside, covers, covered by, touch, and overlap with boundaries intersecting. Topological relationships remain constant when the coordinate space is deformed, such as by twisting or stretching. (Examples of relationships that are not topological include length of, distance between, and area of.)

The basic elements in a topology are its nodes, edges, and faces.

A node, represented by a point, can be isolated or it can be used to bound edges. Two or more edges meet at a non-isolated node. A node has a coordinate pair associated with it that describes the spatial location for that node. Examples of geographic entities that might be represented as nodes include start and end points of streets, places of historical interest, and airports (if the map scale is sufficiently large).

An edge is bounded by two nodes: the start (origin) node and the end (terminal) node. An edge has an associated geometric object, usually a coordinate string that describes the spatial representation of the edge. An edge may have several vertices making up a line string. (Circular arcs are not supported for topologies.) Examples of geographic entities that might be represented as edges include segments of streets and rivers.

The order of the coordinates gives a direction to an edge, and direction is important in determining topological relationships. The positive direction agrees with the orientation of the underlying edge, and the negative direction reverses this orientation. Each orientation of an edge is referred to as a directed edge, and each directed edge is the mirror image of its other directed edge. The start node of the positive directed edge is the end node of the negative directed edge. An edge also lies between two faces and has references to both of them. Each directed edge contains a reference to the next edge in the contiguous perimeter of the face on its left side.A face, corresponding to a polygon, has a reference to one directed edge of its outer boundary. If any island nodes or island edges are present, the face also has a reference to one directed edge on the boundary of each island. Examples of geographic entities that might be represented as faces include parks, lakes, counties, and states.

Figure 1-1 shows a simplified topology containing nodes, edges, and faces. The arrowheads on each edge indicate the positive direction of the edge (or, more precisely, the orientation of the underlying line string or curve geometry for positive direction of the edge).

Figure 1-1 Simplified Topology

Description of Figure 1-1 follows
Description of "Figure 1-1 Simplified Topology"

Notes on Figure 1-1:

  • E elements (E1, E2, and so on) are edges, F elements (F0, F1, and so on) are faces, and N elements (N1, N2, and so on) are nodes.

  • F0 (face zero) is created for every topology. It is the universe face containing everything else in the topology. There is no geometry associated with the universe face. F0 has the face ID value of -1 (negative 1).

  • There is a node created for every point geometry and for every start and end node of an edge. For example, face F1 has only an edge (a closed edge), E1, that has the same node as the start and end nodes (N1). F1 also has edge E25, with start node N21 and end node N22.

  • An isolated node (also called an island node) is a node that is isolated in a face. For example, node N4 is an isolated node in face F2.

  • An isolated edge (also called an island edge) is an edge that is isolated in a face. For example, edge E25 is an isolated edge in face F1.

  • A loop edge is an edge that has the same node as its start node and end node. For example, edge E1 is a loop edge starting and ending at node N1.

  • An edge cannot have an isolated (island) node on it. The edge can be broken up into two edges by adding a node on the edge. For example, if there was originally a single edge between nodes N16 and N18, adding node N17 resulted in two edges: E6 and E7.

  • Information about the topological relationships is stored in special edge, face, and node information tables. For example, the edge information table contains the following information about edges E9 and E10. (Note the direction of the arrowheads for each edge.) The next and previous edges are based on the left and right faces of the edge.

    For edge E9, the start node is N15 and the end node is N14, the next left edge is E19 and the previous left edge is -E21, the next right edge is -E22 and the previous right edge is E20, the left face is F3 and the right face is F6.

    For edge E10, the start node is N13 and the end node is N14, the next left edge is -E20 and the previous left edge is E18, the next right edge is E17 and the previous right edge is -E19, the left face is F7 and the right face is F4.

    For additional examples of edge-related data, including an illustration and explanations, see Section 1.5.1.

Figure 1-2 shows the same topology illustrated in Figure 1-1, but it adds a grid and unit numbers along the x-axis and y-axis. Figure 1-2 is useful for understanding the output of some of the examples in Chapter 3 and Chapter 4.

Figure 1-2 Simplified Topology, with Grid Lines and Unit Numbers

Description of Figure 1-2 follows
Description of "Figure 1-2 Simplified Topology, with Grid Lines and Unit Numbers"

1.2.1 Tolerance in the Topology Data Model

Tolerance is used to associate a level of precision with spatial data. Tolerance reflects the distance that two points can be apart and still be considered the same (for example, to accommodate rounding errors). The tolerance value must be a positive number greater than zero.

However, in the topology data model, tolerance can have two meanings depending on the operation being performed: one meaning is the traditional Oracle Spatial definition of tolerance, and the other is a fixed tolerance value of 10E-15.

  • The tolerance value specified in the call to the SDO_TOPO.CREATE_TOPOLOGY procedure refers to the traditional Oracle Spatial definition, as explained in Oracle Spatial Developer's Guide. This value is used when indexes are created in the node, edge, and face tables, and when spatial operators are used to query these tables.

  • The tolerance value used for internal computations (for example, finding edge intersections) during topology editing operations is always 10E-15 (based on Java double precision arithmetic). This value is used during the validation checks performed by the SDO_TOPO_MAP.VALIDATE_TOPO_MAP and SDO_TOPO_MAP.VALIDATE_TOPOLOGY functions.

Thus, for example, an edge geometry that is considered valid by the SDO_TOPO_MAP.VALIDATE_TOPO_MAP or SDO_TOPO_MAP.VALIDATE_TOPOLOGY function might not be valid if that geometry is passed to the SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT function.

1.3 Topology Geometries and Layers

A topology geometry (also referred to as a feature) is a spatial representation of a real world object. For example, Main Street and Walden State Park might be the names of topology geometries. The geometry is stored as a set of topological elements (nodes, edges, and faces), which are sometimes also referred to as primitives. Each topology geometry has a unique ID (assigned by Spatial when records are imported or loaded) associated with it.

A topology geometry layer consists of topology geometries, usually of a specific topology geometry type, although it can be a collection of multiple types (see Section 1.3.2 for information about collection layers). For example, Streets might be the topology geometry layer that includes the Main Street topology geometry, and State Parks might be the topology geometry layer that includes the Walden State Park topology geometry. Each topology geometry layer has a unique ID (assigned by Spatial) associated with it. The data for each topology geometry layer is stored in a feature table. For example, a feature table named CITY_STREETS might contain information about all topology geometries (individual roads or streets) in the Streets topology geometry layer.

Each topology geometry (feature) is defined as an object of type SDO_TOPO_GEOMETRY (described in Section 1.6.1), which identifies the topology geometry type, topology geometry ID, topology geometry layer ID, and topology ID for the topology.

Topology metadata is automatically maintained by Spatial in the USER_SDO_TOPO_METADATA and ALL_SDO_TOPO_METADATA views, which are described in Section 1.7.2. The USER_SDO_TOPO_INFO and ALL_SDO_TOPO_INFO views (described in Section 1.7.1) contain a subset of this topology metadata.

1.3.1 Features

Often, there are fewer features in a topology than there are topological elements (nodes, edges, and faces). For example, a road feature may consist of many edges, an area feature such as a park may consist of many faces, and some nodes may not be associated with point features. Figure 1-3 shows point, line, and area features associated with the topology that was shown in Figure 1-1 in Section 1.2.

Figure 1-3 Features in a Topology

Description of Figure 1-3 follows
Description of "Figure 1-3 Features in a Topology"

Figure 1-3 shows the following kinds of features in the topology:

  • Point features (traffic signs), shown as dark circles: S1, S2, S3, and S4

  • Linear features (roads or streets), shown as dashed lines: R1, R2, R3, and R4

  • Area features (land parcels), shown as rectangles: P1, P2, P3, P4, and P5

    Land parcel P5 does not include the shaded area within its area. (Specifically, P5 includes face F1 but not face F9. These faces are shown in Figure 1-1 in Section 1.2.)

Example 1-12 in Section 1.12.1 defines these features.

1.3.2 Collection Layers

A collection layer is a topology geometry layer that can contain topological elements of different topology geometry types. For example, using the CITY_DATA topology from the examples in Section 1.12, you could create a collection layer to contain specific land parcel, city street, and traffic sign elements.

To create a collection layer, follow essentially the same steps for creating other types of layers. Create a feature table for the layer, as in the following example:

CREATE TABLE collected_features ( -- Selected heterogeneous features
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);

Associate the feature table with the topology, specifying COLLECTION for the topo_geometry_layer_type parameter in the call to the SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER procedure, as in the following example:

EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', COLLECTED_FEATURES', 'FEATURE', 'COLLECTION');

To load the feature table for the collection layer, insert the necessary rows, as shown in Example 1-1.

Example 1-1 Loading the Feature Table for a Collection Layer

-- Take R5 from the CITY_STREETS layer.
INSERT INTO collected_features VALUES(
  'C_R5',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    2,  -- tg_type = line/multiline
    4,  -- tg_layer_id
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(20, 2),
      SDO_TOPO_OBJECT(-9, 2)))
);
 
-- Take S3 from the TRAFFIC_SIGNS layer.
INSERT INTO collected_features VALUES(
  'C_S3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    1,  -- tg_type = point/multipoint 
    4,  -- topo layer id
    SDO_TOPO_OBJECT_ARRAY(
       SDO_TOPO_OBJECT(6, 1)))
);
 
-- Take P3 from the LAND_PARCELS layer.
INSERT INTO collected_features VALUES(
  'C_P3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    3,  -- tg_type = (multi)polygon
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(5, 3),
      SDO_TOPO_OBJECT(8, 3)))
);
 
-- Create a collection from a polygon and a point.
INSERT INTO collected_features VALUES(
  'C1',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    4,  -- tg_type = collection
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(5, 3),
      SDO_TOPO_OBJECT(6, 1)))
);
 
-- Create a collection from a polygon and a line.
INSERT INTO collected_features VALUES(
  'C2',
  SDO_TOPO_GEOMETRY('CITY_DATA',
    4,  -- tg_type = collection
    4,
    SDO_TOPO_OBJECT_ARRAY(
      SDO_TOPO_OBJECT(8, 3),
      SDO_TOPO_OBJECT(10, 2)))
);
                  
-- Create a collection from a line and a point.
INSERT INTO collected_features VALUES(
  'C3',
  SDO_TOPO_GEOMETRY('CITY_DATA',
     4,  -- tg_type = collection
     4,
     SDO_TOPO_OBJECT_ARRAY(
       SDO_TOPO_OBJECT(-5, 2),
       SDO_TOPO_OBJECT(10, 1)))
);

1.4 Topology Geometry Layer Hierarchy

In some topologies, the topology geometry layers (feature layers) have one or more parent-child relationships in a topology hierarchy. That is, the layer at the topmost level consists of features in its child layer at the next level down in the hierarchy; the child layer might consist of features in its child layer at the next layer farther down; and so on. For example, a land use topology might have the following topology geometry layers at different levels of hierarchy:

  • States at the highest level, which consists of features from its child layer, Counties

  • Counties at the next level down, which consists of features from its child layer, Tracts

  • Tracts at the next level down, which consists of features from its child layer, Block Groups

  • Block Groups at the next level down, which consists of features from its child layer, Land Parcels

  • Land Parcels at the lowest level of the hierarchy

If the topology geometry layers in a topology have this hierarchical relationship, it is far more efficient if you model the layers as hierarchical than if you specify all topology geometry layers at a single level (that is, with no hierarchy). For example, it is more efficient to construct SDO_TOPO_GEOMETRY objects for counties by specifying only the tracts in the county than by specifying all land parcels in all block groups in all tracts in the county.

The lowest level (for the topology geometry layer containing the smallest kinds of features) in a hierarchy is level 0, and successive higher levels are numbered 1, 2, and so on. Topology geometry layers at adjacent levels of a hierarchy have a parent-child relationship. Each topology geometry layer at the higher level is the parent layer for one layer at the lower level, which is its child layer. A parent layer can have only one child layer, but a child layer can have one or more parent layers. Using the preceding example, the Counties layer can have only one child layer, Tracts; however, the Tracts layer could have parent layers named Counties and Water Districts.


Note:

Topology geometry layer hierarchy is somewhat similar to network hierarchy, which is described in Section 5.5; however, there are significant differences, and you should not confuse the two. For example, the lowest topology geometry layer hierarchy level is 0, and the lowest network hierarchy level is 1; and in a topology geometry layer hierarchy each parent must have one child and each child can have many parents, while in a network hierarchy each parent can have many children and each child must have one parent.

Figure 1-4 shows the preceding example topology geometry layer hierarchy. Each level of the hierarchy shows the level number and the topology geometry layer in that level.

Figure 1-4 Topology Geometry Layer Hierarchy

Description of Figure 1-4 follows
Description of "Figure 1-4 Topology Geometry Layer Hierarchy"

To model topology geometry layers as hierarchical, specify the child layer in the child_layer_id parameter when you call the SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER procedure to add a parent topology geometry layer to the topology. Add the lowest-level (level 0) topology geometry layer first; then add the level 1 layer, specifying the level 0 layer as its child; then add the level 2 layer, specifying the level 1 layer as its child; and so on. Example 1-2 shows five topology geometry layers being added so that the 5-level hierarchy is established.

Example 1-2 Modeling a Topology Geometry Layer Hierarchy

-- Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('LAND_USE_HIER', 0.00005);
 
-- Create feature tables.
CREATE TABLE land_parcels ( -- Land parcels (selected faces)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE block_groups (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE tracts (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE counties (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE states (
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- (Other steps not shown here, such as populating the feature tables
-- and initializing the metadata.)
. . .
-- Associate feature tables with the topology; include hierarchy information.

DECLARE
  land_parcels_id NUMBER;
  block_groups_id NUMBER;
  tracts_id NUMBER;
  counties_id NUMBER;
BEGIN
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'LAND_PARCELS',
  'FEATURE','POLYGON');
SELECT tg_layer_id INTO land_parcels_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'LAND_PARCELS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'BLOCK_GROUPS',
  'FEATURE','POLYGON', NULL, land_parcels_id);
SELECT tg_layer_id INTO block_groups_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'BLOCK_GROUPS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'TRACTS',
  'FEATURE','POLYGON', NULL, block_groups_id);
SELECT tg_layer_id INTO tracts_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'TRACTS';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'COUNTIES',
  'FEATURE','POLYGON', NULL, tracts_id);
SELECT tg_layer_id INTO counties_id FROM user_sdo_topo_info 
  WHERE topology = 'LAND_USE_HIER' AND table_name = 'COUNTIES';
SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('LAND_USE_HIER', 'STATES',
  'FEATURE','POLYGON', NULL, counties_id);
END;/
 

Within each level above level 0, each layer can contain features built from features at the next lower level (as is done in Example 1-2), features built from topological elements (faces, nodes, edges), or a combination of these. For example, a tracts layer can contain tracts built from block groups or tracts built from faces, or both. However, each feature within the layer must be built only either from features from the next lower level or from topological elements. For example, a specific tract can consist of block groups or it can consist of faces, but it cannot consist of a combination of block groups and faces.

To insert or update topology geometry objects in feature tables for the levels in a hierarchy, use the appropriate forms of the SDO_TOPO_GEOMETRY constructor. Feature tables are described in Section 1.3, and SDO_TOPO_GEOMETRY constructors are described in Section 1.6.2.


Note:

The TOPO_ID and TOPO_TYPE attributes in the relationship information table have special meanings when applied to parent layers in a topology with a topology geometry layer hierarchy. See the explanations of these attributes in Table 1-5 in Section 1.5.4.

1.5 Topology Data Model Tables

To use the Spatial topology capabilities, you must first insert data into special edge, node, and face tables, which are created by Spatial when you create a topology. The edge, node, and face tables are described in Section 1.5.1, Section 1.5.2, and Section 1.5.3, respectively.

Spatial automatically maintains a relationship information (<topology-name>_RELATION$) table for each topology, which is created the first time that a feature table is associated with a topology (that is, at the first call to the SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER procedure that specifies the topology). The relationship information table is described in Section 1.5.4.

Figure 1-5 shows the role of the relationship information table in connecting information in a feature table with information in its associated node, edge, or face table.

Figure 1-5 Mapping Between Feature Tables and Topology Tables

Description of Figure 1-5 follows
Description of "Figure 1-5 Mapping Between Feature Tables and Topology Tables"

As shown in Figure 1-5, the mapping between feature tables and the topology node, edge, and face tables occurs through the <topology-name>_RELATION$ table. In particular:

  • Each feature table includes a column of type SDO_TOPO_GEOMETRY. This type includes a TG_LAYER_ID attribute (the unique ID assigned by Oracle Spatial when the layer is created), as well as a TG_ID attribute (the unique ID assigned to each feature in a layer). The values in these two columns have corresponding values in the TG_LAYER_ID and TG_ID columns in the <topology-name>_RELATION$ table.

  • Each feature has one or more rows in the <topology-name>_RELATION$ table.

  • Given the TG_LAYER_ID and TG_ID values for a feature, the set of nodes, faces, and edges associated with the feature can be determined by matching the TOPO_ID value (the node, edge, or face ID) in the <topology-name>_RELATION$ table with the corresponding ID value in the <topology-name>_NODE$, <topology-name>_EDGE$, or <topology-name>_FACE$ table.

The following considerations apply to schema, table, and column names that are stored in any Oracle Spatial metadata views. For example, these considerations apply to the names of edge, node, face, relationship, and history information tables, and to the names of any columns in these tables and schemas for these tables that are stored in the topology metadata views described in Section 1.7.

  • The name must contain only letters, numbers, and underscores. For example, the name cannot contain a space ( ), an apostrophe ('), a quotation mark ("), or a comma (,).

  • All letters in the names are converted to uppercase before the names are stored in metadata views or before the tables are accessed. This conversion also applies to any schema name specified with the table name.

1.5.1 Edge Information Table

You must store information about the edges in a topology in the <topology-name>_EDGE$ table, where <topology-name> is the name of the topology as specified in the call to the SDO_TOPO.CREATE_TOPOLOGY procedure. Each edge information table has the columns shown in Table 1-1.

Table 1-1 Columns in the <topology-name>_EDGE$ Table

Column NameData TypeDescription

EDGE_ID

NUMBER

Unique ID number for this edge

START_NODE_ID

NUMBER

ID number of the start node for this edge

END_NODE_ID

NUMBER

ID number of the end node for this edge

NEXT_LEFT_EDGE_ID

NUMBER

ID number (signed) of the next left edge for this edge

PREV_LEFT_EDGE_ID

NUMBER

ID number (signed) of the previous left edge for this edge

NEXT_RIGHT_EDGE_ID

NUMBER

ID number (signed) of the next right edge for this edge

PREV_RIGHT_EDGE_ID

NUMBER

ID number (signed) of the previous right edge for this edge

LEFT_FACE_ID

NUMBER

ID number of the left face for this edge

RIGHT_FACE_ID

NUMBER

ID number of the right face for this edge

GEOMETRY

SDO_GEOMETRY

Geometry object (line string) representing this edge, listing the coordinates in the natural order for the positive directed edge


The NEXT_LEFT_EDGE_ID and NEXT_RIGHT_EDGE_ID values refer to the next directed edges in the counterclockwise delineation of the perimeters of the left and right faces, respectively. The PREV_LEFT_EDGE_ID and PREV_RIGHT_EDGE_ID values refer to the previous directed edges in the counterclockwise delineation of the perimeters of the left and right faces, respectively. The LEFT_FACE_ID value refers to the face to the left of the positive directed edge, and the RIGHT_FACE_ID value refers to the face to the left of the negative directed edge. For any numeric ID value, the sign indicates which orientation of the target edge is being referred to.

Figure 1-6 shows nodes, edges, and faces that illustrate the relationships among the various ID columns in the edge information table. (In Figure 1-6, thick lines show the edges, and thin lines with arrowheads show the direction of each edge.)

Figure 1-6 Nodes, Edges, and Faces

Description of Figure 1-6 follows
Description of "Figure 1-6 Nodes, Edges, and Faces"

Table 1-2 shows the ID column values in the edge information table for edges E4 and E8 in Figure 1-6. (For clarity, Table 1-2 shows ID column values with alphabetical characters, such as E4 and N1; however, the ID columns actually contain numeric values only, specifically the numeric ID value associated with each named object.)

Table 1-2 Edge Table ID Column Values

EDGE_IDSTART_NODE_IDEND_NODE_IDNEXT_LEFT_EDGE_IDPREV_LEFT_EDGE_IDNEXT_RIGHT_EDGE_IDPREV_RIGHT_EDGE_IDLEFT_FACE_IDRIGHT_FACE_ID

E4

N1

N2

-E5

E3

E2

-E6

F1

F2

E8

N4

N3

-E8

-E8

E8

E8

F2

F2


In Figure 1-6 and Table 1-2:

  • The start node and end node for edge E4 are N1 and N2, respectively. The next left edge for edge E4 is E5, but its direction is the opposite of edge E4, and therefore the next left edge for E4 is stored as -E5 (negative E5).

  • The previous left edge for edge E4 is E3, and because it has the same direction as edge E4, the previous left edge for E4 is stored as E3.

  • The next right face is determined using the negative directed edge of E4. This can be viewed as reversing the edge direction and taking the next left edge and previous left edge. In this case, the next right edge is E2 and the previous right edge is -E6 (the direction of edge E6 is opposite the negative direction of edge E4). For edge E4, the left face is F1 and the right face is F2.

  • Edges E1 and E7 are neither leftmost nor rightmost edges with respect to edge E4, and therefore they do not appear in the edge table row associated with edge E4.

1.5.2 Node Information Table

You must store information about the nodes in a topology in the <topology-name>_NODE$ table, where <topology-name> is the name of the topology as specified in the call to the SDO_TOPO.CREATE_TOPOLOGY procedure. Each node information table has the columns shown in Table 1-3.

Table 1-3 Columns in the <topology-name>_NODE$ Table

Column NameData TypeDescription

NODE_ID

NUMBER

Unique ID number for this node

EDGE_ID

NUMBER

ID number (signed) of the edge (if any) associated with this node

FACE_ID

NUMBER

ID number of the face (if any) associated with this node

GEOMETRY

SDO_GEOMETRY

Geometry object (point) representing this node


For each node, the EDGE_ID or FACE_ID value (but not both) must be null:

  • If the EDGE_ID value is null, the node is an isolated node (that is, isolated in a face).

  • If the FACE_ID value is null, the node is not an isolated node, but rather the start node or end node of an edge.

1.5.3 Face Information Table

You must store information about the faces in a topology in the <topology-name>_FACE$ table, where <topology-name> is the name of the topology as specified in the call to the SDO_TOPO.CREATE_TOPOLOGY procedure. Each face information table has the columns shown in Table 1-4.

Table 1-4 Columns in the <topology-name>_FACE$ Table

Column NameData TypeDescription

FACE_ID

NUMBER

Unique ID number for this face

BOUNDARY_EDGE_ID

NUMBER

ID number of the boundary edge for this face. The sign of this number (which is ignored for use as a key) indicates which orientation is being used for this boundary component (positive numbers indicate the left of the edge, and negative numbers indicate the right of the edge).

ISLAND_EDGE_ID_LIST

SDO_LIST_TYPE

Island edges (if any) in this face. (The SDO_LIST_TYPE type is described in Section 1.6.6.)

ISLAND_NODE_ID_LIST

SDO_LIST_TYPE

Island nodes (if any) in this face. (The SDO_LIST_TYPE type is described in Section 1.6.6.)

MBR_GEOMETRY

SDO_GEOMETRY

Minimum bounding rectangle (MBR) that encloses this face. (This is required, except for the universe face.) The MBR must be stored as an optimized rectangle (a rectangle in which only the lower-left and the upper-right corners are specified). The SDO_TOPO.INITIALIZE_METADATA procedure creates a spatial index on this column.


1.5.4 Relationship Information Table

As you work with topological elements, Spatial automatically maintains information about each object in <topology-name>_RELATION$ tables, where <topology-name> is the name of the topology and there is one such table for each topology. Each row in the table uniquely identifies a topology geometry with respect to its topology geometry layer and topology. Each relationship information table has the columns shown in Table 1-5.

Table 1-5 Columns in the <topology-name>_RELATION$ Table

Column NameData TypeDescription

TG_LAYER_ID

NUMBER

ID number of the topology geometry layer to which the topology geometry belongs

TG_ID

NUMBER

ID number of the topology geometry

TOPO_ID

NUMBER

For a topology that does not have a topology geometry layer hierarchy: ID number of a topological element in the topology geometry

For a topology that has a topology geometry layer hierarchy: Reserved for Oracle use

TOPO_TYPE

NUMBER

For a topology that does not have a topology geometry layer hierarchy: 1 = node, 2 = edge, 3 = face

For a topology that has a topology geometry layer hierarchy: Reserved for Oracle use

TOPO_ATTRIBUTE

VARCHAR2

Reserved for Oracle use


1.5.5 History Information Table

The history information table for a topology contains information about editing operations that are not recorded in other information tables. Thus, the history information table is not a comprehensive record of topology modifications. Instead, it contains rows for node, edge, or face editing operations only when one or more feature tables are associated with the topology and any of the following conditions are met:

  • An existing face or edge is split as a result of the operation.

  • A single face or edge is created by merging two faces or two edges as a result of the operation.

Spatial automatically maintains information about these operations in <topology-name>_HISTORY$ tables, where <topology-name> is the name of the topology and there is one such table for each topology. Each row in the table uniquely identifies an editing operation on a topological element, although an editing operation (such as using the SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY function) can add multiple rows. (Topology editing is discussed in Chapter 2.) Each history information table has the columns shown in Table 1-6.

Table 1-6 Columns in the <topology-name>_HISTORY$ Table

Column NameData TypeDescription

TOPO_TX_ID

NUMBER

ID number of the transaction that was started by a call to the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure or to the loadWindow or loadTopology Java method. Each transaction can consist of several editing operations. You can get the transaction ID number for the current updatable TopoMap object by calling the SDO_TOPO_MAP.GET_TOPO_TRANSACTION_ID function.

TOPO_SEQUENCE

NUMBER

Sequence number assigned to an editing operation within the transaction

TOPOLOGY

VARCHAR2

ID of the topology containing the objects being edited

TOPO_ID

NUMBER

ID number of a topological element in the topology geometry

TOPO_TYPE

NUMBER

Type of topological element: 1 = node, 2 = edge, 3 = face

TOPO_OP

VARCHAR2

Type of editing operation that was performed on the topological element: I for insert or D for delete

PARENT_ID

NUMBER

For an insert operation, the ID of the parent topological element from which the current topological element is derived; for a delete operation, the ID of the resulting topological element


Consider the following examples:

  • Adding a node to break edge E2, generating edge E3: The TOPO_ID value of the new edge is the ID of E3, the TOPO_TYPE value is 2, the PARENT_ID value is the ID of E2, and the TOPO_OP value is I.

  • Deleting a node to merge edges E6 and E7, resulting in E7: The TOPO_ID value is the ID of E6, the TOPO_TYPE value is 2, the PARENT_ID value is the ID of E7, and the TOPO_OP value is D.

To further illustrate the effect of editing operations on the history information table, a test procedure was created to perform various editing operations on a simple topology, and to examine the effect on the history information table for the topology. The procedure performed these main steps:

  1. It created and initialized a non-geodetic topology with a universe face, and added a line feature layer and an area feature layer to the topology.

  2. It created a rectangular area by adding four isolated nodes and four edges connecting the isolated nodes. This caused a face (consisting of the rectangle) to be created, and it caused one row to be added to the history information table: an insert operation for the new face, whose parent is the universe face.

    The following statement shows the history information table row added by this insertion:

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
     
    1 row selected.
    
  3. It split the rectangular face into two smaller rectangular faces (side-by-side) by adding two nodes and a vertical edge connecting these nodes, which caused two edges (the top and bottom edges) and the face to be split. Three rows were added to the history information table: an insert operation for each of the two new edges (with the parent of each new edge being the existing edge that was split), and an insert operation for the new face (whose parent is the original rectangular face that was split).

    The following statement shows the history information table rows added thus far. The rows added by this step are shown in bold:

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
             6          2 I            2
             7          2 I            4
             2          3 I            1
     
    4 rows selected.
    
  4. It added a diagonal edge to small rectangular face on the left (using the existing nodes), and it removed the vertical edge that was added in Step 3. Two rows were added to the history information table: an insert operation for the new face created as a result of the edge addition (with the parent of each new face being the small rectangular face on the left that was split), and a delete operation as a result of the edge removal (with the resulting face taking its topological object ID from one of the "parent" faces that were merged).

    The following statement shows the history information table rows added thus far. The rows added by this step are shown in bold:

    SELECT topo_id, topo_type, topo_op, parent_id
      FROM hist_test_history$ ORDER BY topo_tx_id, topo_sequence, topology;
     
       TOPO_ID  TOPO_TYPE TOP  PARENT_ID
    ---------- ---------- --- ----------
             1          3 I           -1
             6          2 I            2
             7          2 I            4
             2          3 I            1
             3          3 I            2
             1          3 D            2
     
    6 rows selected.
    

1.6 Topology Data Types

The main data type associated with the topology data model is SDO_TOPO_GEOMETRY, which describes a topology geometry. The SDO_TOPO_GEOMETRY type has several constructors and member functions. This section describes the topology model types, constructors, and member functions.

1.6.1 SDO_TOPO_GEOMETRY Type

The description of a topology geometry is stored in a single row, in a single column of object type SDO_TOPO_GEOMETRY in a user-defined table. The object type SDO_TOPO_GEOMETRY is defined as:

CREATE TYPE sdo_topo_geometry AS OBJECT
  (tg_type      NUMBER,
   tg_id        NUMBER,
   tg_layer_id  NUMBER,
   topology_id  NUMBER);

The SDO_TOPO_GEOMETRY type has the attributes shown in Table 1-7.

Table 1-7 SDO_TOPO_GEOMETRY Type Attributes

AttributeExplanation

TG_TYPE

Type of topology geometry: 1 = point or multipoint, 2 = line string or multiline string, 3 = polygon or multipolygon, 4 = heterogeneous collection

TG_ID

Unique ID number (generated by Spatial) for the topology geometry

TG_LAYER_ID

ID number for the topology geometry layer to which the topology geometry belongs. (This number is generated by Spatial, and it is unique within the topology geometry layer.)

TOPOLOGY_ID

Unique ID number (generated by Spatial) for the topology


Each topology geometry in a topology is uniquely identified by the combination of its TG_ID and TG_LAYER_ID values.

You can use an attribute name in a query on an object of SDO_TOPO_GEOMETRY. Example 1-3 shows SELECT statements that query each attribute of the FEATURE column of the CITY_STREETS table, which is defined in Example 1-12 in Section 1.12.

Example 1-3 SDO_TOPO_GEOMETRY Attributes in Queries

SELECT s.feature.tg_type FROM city_streets s;
SELECT s.feature.tg_id FROM city_streets s;
SELECT s.feature.tg_layer_id FROM city_streets s;
SELECT s.feature.topology_id FROM city_streets s;

1.6.2 SDO_TOPO_GEOMETRY Constructors

The SDO_TOPO_GEOMETRY type has constructors for inserting and updating topology geometry objects. The constructors can be classified into two types, depending on the kind of objects they use:

  • Constructors that specify the lowest-level topological elements (nodes, edges, and faces). These constructors have at least one attribute of type SDO_TOPO_OBJECT_ARRAY and no attributes of type SDO_TGL_OBJECT_ARRAY.

  • Constructors that specify elements in the child level. These constructors have at least one attribute of type SDO_TGL_OBJECT_ARRAY and no attributes of type SDO_TOPO_OBJECT_ARRAY.

To insert and update topology geometry objects when the topology does not have a topology geometry layer hierarchy or when the operation affects the lowest level (level 0) in the hierarchy, you must use constructors that specify the lowest-level topological elements (nodes, edges, and faces). (Topology geometry layer hierarchy is explained in Section 1.4.)

To insert and update topology geometry objects when the topology has a topology geometry layer hierarchy and the operation affects a level other than the lowest in the hierarchy, you can use either or both types of constructor. That is, for each topology geometry object to be inserted or updated, you can use either of the following:

  • To insert and update a topology geometry object consisting of the lowest-level topological elements (for example, to create a tract from faces), use the format that has at least one attribute of type SDO_TOPO_OBJECT_ARRAY and no attributes of type SDO_TGL_OBJECT_ARRAY.

  • To insert and update a topology geometry object consisting of features at the next lower level (for example, create a tract from block groups), use the format that has at least one attribute of type SDO_TGL_OBJECT_ARRAY and no attributes of type SDO_TOPO_OBJECT_ARRAY.

This section describes the available SDO_TOPO_GEOMETRY constructors.


Note:

An additional SDO_TOPO_GEOMETRY constructor with the same attributes as the type definition (tg_type, tg_id, tg_layer_id, topology_id) is for Oracle internal use only.

1.6.2.1 Constructors for Insert Operations: Specifying Topological Elements

The SDO_TOPO_GEOMETRY type has the following constructors for insert operations in which you specify topological elements (faces, nodes, or edges). You must use one of these formats to create new topology geometry objects when the topology does not have a topology geometry layer hierarchy or when the operation affects the lowest level (level 0) in the hierarchy, and you can use one of these formats to create new topology geometry objects when the operation affects a level higher than level 0 in the hierarchy:

SDO_TOPO_GEOMETRY (topology     VARCHAR2,
                   tg_type      NUMBER,
                   tg_layer_id  NUMBER,
                   topo_ids     SDO_TOPO_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology      VARCHAR2,
                   table_name    VARCHAR2,
                   column_name   VARCHAR2,
                   tg_type       NUMBER,
                   topo_ids      SDO_TOPO_OBJECT_ARRAY)

The SDO_TOPO_OBJECT_ARRAY type is defined as a VARRAY of SDO_TOPO_OBJECT objects.

The SDO_TOPO_OBJECT type has the following two attributes:

(topo_id NUMBER, topo_type NUMBER)

The TG_TYPE and TOPO_IDS attribute values must be within the range of values from the <topology-name>_RELATION$ table (described in Section 1.5.4) for the specified topology.

Example 1-4 shows two SDO_TOPO_GEOMETRY constructors, one in each format. Each constructor inserts a topology geometry into the LAND_PARCELS table, which is defined in Example 1-12 in Section 1.12.

Example 1-4 INSERT Using Constructor with SDO_TOPO_OBJECT_ARRAY

INSERT INTO land_parcels VALUES ('P1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);

INSERT INTO land_parcels VALUES ('P1A', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    'LAND_PARCELS', -- Table name
    'FEATURE', -- Column name
    3, -- Topology geometry type (polygon/multipolygon)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);

1.6.2.2 Constructors for Insert Operations: Specifying Lower-Level Features

The SDO_TOPO_GEOMETRY type has the following constructors for insert operations in which you specify features in the next lower level of the hierarchy. You can use one of these formats to create new topology geometry objects when the operation affects a level higher than level 0 in the hierarchy:

SDO_TOPO_GEOMETRY (topology     VARCHAR2,
                   tg_type      NUMBER,
                   tg_layer_id  NUMBER,
                   topo_ids     SDO_TGL_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology      VARCHAR2,
                   table_name    VARCHAR2,
                   column_name   VARCHAR2,
                   tg_type       NUMBER,
                   topo_ids      SDO_TGL_OBJECT_ARRAY)

The SDO_TGL_OBJECT_ARRAY type is defined as a VARRAY of SDO_TGL_OBJECT objects.

The SDO_TGL_OBJECT type has the following two attributes:

(tgl_id NUMBER, tg_id NUMBER)

Example 1-5 shows an SDO_TOPO_GEOMETRY constructor that inserts a row into the BLOCK_GROUPS table, which is the feature table for the Block Groups level in the topology geometry layer hierarchy. The Block Groups level is the parent of the Land Parcels level at the bottom of the hierarchy.

Example 1-5 INSERT Using Constructor with SDO_TGL_OBJECT_ARRAY

INSERT INTO block_groups VALUES ('BG1', -- Feature name
  SDO_TOPO_GEOMETRY('LAND_USE_HIER',
    3, -- Topology geometry type (polygon/multipolygon)
    2, -- TG_LAYER_ID for block groups (from ALL_SDO_TOPO_METADATA)
    SDO_TGL_OBJECT_ARRAY (
      SDO_TGL_OBJECT (1, 1), -- land parcel ID = 1
      SDO_TGL_OBJECT (1, 2))) -- land parcel ID = 2
);

1.6.2.3 Constructors for Update Operations: Specifying Topological Elements

The SDO_TOPO_GEOMETRY type has the following constructors for update operations in which you specify topological elements (faces, nodes, or edges). You must use one of these formats to update topology geometry objects when the topology does not have a topology geometry layer hierarchy or when the operation affects the lowest level (level 0) in the hierarchy, and you can use one of these formats to update topology geometry objects when the operation affects a level higher than level 0 in the hierarchy:

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   tg_type          NUMBER,
                   tg_layer_id      NUMBER,
                   add_topo_ids     SDO_TOPO_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TOPO_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   table_name       VARCHAR2,
                   column_name      VARCHAR2,
                   tg_type          NUMBER,
                   add_topo_ids     SDO_TOPO_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TOPO_OBJECT_ARRAY)

For example, you could use one of these constructor formats to add an edge to a linear feature or to remove an obsolete edge from a feature.

The SDO_TOPO_OBJECT_ARRAY type definition and the requirements for the TG_TYPE and TOPO_IDS attribute values are as described in Section 1.6.2.1.

You can specify values for both the ADD_TOPO_IDS and DELETE_TOPO_IDS attributes, or you can specify values for one attribute and specify the other as null; however, you cannot specify null values for both ADD_TOPO_IDS and DELETE_TOPO_IDS.

Example 1-6 shows two SDO_TOPO_GEOMETRY constructors, one in each format. Each constructor removes two faces from the CITY_DATA topology in the LAND_PARCELS table, which is defined in Example 1-12 in Section 1.12.

Example 1-6 UPDATE Using Constructor with SDO_TOPO_OBJECT_ARRAY

UPDATE land_parcels l SET l.feature = SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    NULL, -- No topological elements to be added
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
WHERE l.feature_name = 'P1';
 
UPDATE land_parcels l SET l.feature = SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    'LAND_PARCELS', -- Table name
    'FEATURE', -- Column name
    3, -- Topology geometry type (polygon/multipolygon)
    NULL, -- No topological elements to be added
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
WHERE l.feature_name = 'P1A';

1.6.2.4 Constructors for Update Operations: Specifying Lower-Level Features

The SDO_TOPO_GEOMETRY type has the following constructors for update operations in which you specify features in the next lower level of the hierarchy. You can use one of these formats to update topology geometry objects when the operation affects a level higher than level 0 in the hierarchy:

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   tg_type          NUMBER,
                   tg_layer_id      NUMBER,
                   add_topo_ids     SDO_TGL_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TGL_OBJECT_ARRAY)

SDO_TOPO_GEOMETRY (topology         VARCHAR2,
                   table_name       VARCHAR2,
                   column_name      VARCHAR2,
                   tg_type          NUMBER,
                   add_topo_ids     SDO_TGL_OBJECT_ARRAY,
                   delete_topo_ids  SDO_TGL_OBJECT_ARRAY)

For example, you could use one of these constructor formats to add an edge to a linear feature or to remove an obsolete edge from a feature.

The SDO_TGL_OBJECT_ARRAY type definition and the requirements for its attribute values are as described in Section 1.6.2.2.

You can specify values for both the ADD_TOPO_IDS and DELETE_TOPO_IDS attributes, or you can specify values for one attribute and specify the other as null; however, you cannot specify null values for both ADD_TOPO_IDS and DELETE_TOPO_IDS.

Example 1-7 shows two SDO_TOPO_GEOMETRY constructors, one in each format. Each constructor deletes the land parcel with the ID value of 2 from a feature (named BG1 in the first format and BG1A in the second format, though each feature has the same definition) from the CITY_DATA topology in the BLOCK_GROUPS table, which is the feature table for the Block Groups level in the topology geometry layer hierarchy. The Block Groups level is the parent of the Land Parcels level at the bottom of the hierarchy.

Example 1-7 UPDATE Using Constructor with SDO_TGL_OBJECT_ARRAY

UPDATE block_groups b SET b.feature = SDO_TOPO_GEOMETRY(
  'LAND_USE_HIER',
  3, -- Topology geometry type (polygon/multipolygon)
  2, -- TG_LAYER_ID for block groups (from ALL_SDO_TOPO_METADATA)
  null, -- No IDs to add
  SDO_TGL_OBJECT_ARRAY (
    SDO_TGL_OBJECT (1, 2)) -- land parcel ID = 2
  )
WHERE b.feature_name = 'BG1';
 
UPDATE block_groups b SET b.feature = SDO_TOPO_GEOMETRY(
  'LAND_USE_HIER',
  'BLOCK_GROUPS', -- Feature table
  'FEATURE', -- Feature column
  3, -- Topology geometry type (polygon/multipolygon)
  null, -- No IDs to add
  SDO_TGL_OBJECT_ARRAY (
    SDO_TGL_OBJECT (1, 2)) -- land parcel ID = 2
  )
WHERE b.feature_name = 'BG1A';

1.6.3 GET_GEOMETRY Member Function

The SDO_TOPO_GEOMETRY type has a member function GET_GEOMETRY, which you can use to return the SDO_GEOMETRY object for the topology geometry object.

Example 1-8 uses the GET_GEOMETRY member function to return the SDO_GEOMETRY object for the topology geometry object associated with the land parcel named P1.

Example 1-8 GET_GEOMETRY Member Function

SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
FEATURE_NAME                                                                    
------------------------------                                                  
L.FEATURE.GET_GEOMETRY()(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO,
--------------------------------------------------------------------------------
P1                                                                              
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 3, 1), SDO_ORDINATE_ARRAY(
21, 14, 21, 22, 9, 22, 9, 14, 9, 6, 21, 6, 21, 14)) 

1.6.4 GET_TGL_OBJECTS Member Function

The SDO_TOPO_GEOMETRY type has a member function GET_TGL_OBJECTS, which you can use to return the SDO_TOPO_OBJECT_ARRAY object for a topology geometry object in a geometry layer with a hierarchy level greater than 0 (zero) in a topology with a topology geometry layer hierarchy. (If the layer is at hierarchy level 0 or is in a topology that does not have a topology geometry layer hierarchy, this method returns a null value.)

The SDO_TGL_OBJECT_ARRAY type is described in Section 1.6.2.2.

Example 1-9 uses the GET_TGL_OBJECTS member function to return the SDO_TOPO_OBJECT_ARRAY object for the topology geometry object associated with the block group named BG2.

Example 1-9 GET_TGL_OBJECTS Member Function

SELECT bg.feature_name, bg.feature.get_tgl_objects()
  FROM block_groups bg WHERE bg.feature_name = 'BG2';
 
FEATURE_NAME                                                                    
------------------------------                                                  
BG.FEATURE.GET_TGL_OBJECTS()(TGL_ID, TG_ID)                                     
--------------------------------------------------------------------------------
BG2                                                                             
SDO_TGL_OBJECT_ARRAY(SDO_TGL_OBJECT(1, 3), SDO_TGL_OBJECT(1, 4))

1.6.5 GET_TOPO_ELEMENTS Member Function

The SDO_TOPO_GEOMETRY type has a member function GET_TOPO_ELEMENTS, which you can use to return the SDO_TOPO_OBJECT_ARRAY object for the topology geometry object.

The SDO_TOPO_OBJECT_ARRAY type is described in Section 1.6.2.1.

Example 1-8 uses the GET_TOPO_ELEMENTS member function to return the SDO_TOPO_OBJECT_ARRAY object for the topology geometry object associated with the land parcel named P1.

Example 1-10 GET_TOPO_ELEMENTS Member Function

SELECT l.feature_name, l.feature.get_topo_elements()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
FEATURE_NAME                                                                    
------------------------------                                                  
L.FEATURE.GET_TOPO_ELEMENTS()(TOPO_ID, TOPO_TYPE)                               
--------------------------------------------------------------------------------
P1                                                                              
SDO_TOPO_OBJECT_ARRAY(SDO_TOPO_OBJECT(3, 3), SDO_TOPO_OBJECT(6, 3))

1.6.6 SDO_LIST_TYPE Type

The SDO_LIST_TYPE type is used to store the EDGE_ID values of island edges and NODE_ID values of island nodes in a face. The SDO_LIST_TYPE type is defined as:

CREATE TYPE sdo_list_type as VARRAY(2147483647) OF NUMBER;

1.6.7 SDO_EDGE_ARRAY and SDO_NUMBER_ARRAY Types

The SDO_EDGE_ARRAY type is used to specify the coordinates of attached edges affected by a node move operation. The SDO_EDGE_ARRAY type is defined as:

CREATE TYPE sdo_edge_array as VARRAY(1000000) OF MDSYS.SDO_NUMBER_ARRAY;

The SDO_NUMBER_ARRAY type is a general-purpose type used by Spatial for arrays. The SDO_NUMBER_ARRAY type is defined as:

CREATE TYPE sdo_number_array as VARRAY(1048576) OF NUMBER;

1.7 Topology Metadata Views

There are two sets of topology metadata views for each schema (user): xxx_SDO_TOPO_INFO and xxx_SDO_TOPO_METADATA, where xxx can be USER or ALL. These views are read-only to users; they are created and maintained by Spatial.

The xxx_SDO_TOPO_METADATA views contain the most detailed information, and each xxx_SDO_TOPO_INFO view contains a subset of the information in its corresponding xxx_SDO_TOPO_METADATA view.

1.7.1 xxx_SDO_TOPO_INFO Views

The following views contain basic information about topologies:

  • USER_SDO_TOPO_INFO contains topology information for all feature tables owned by the user.

  • ALL_SDO_TOPO_INFO contains topology information for all feature tables on which the user has SELECT permission.

The USER_SDO_TOPO_INFO and ALL_SDO_TOPO_INFO views contain the same columns, as shown Table 1-8. (The columns are listed in their order in the view definition.)

Table 1-8 Columns in the xxx_SDO_TOPO_INFO Views

Column NameData TypePurpose

OWNER

VARCHAR2

Owner of the topology

TOPOLOGY

VARCHAR2

Name of the topology

TOPOLOGY_ID

NUMBER

ID number of the topology

TOLERANCE

NUMBER

Tolerance value associated with topology geometries in the topology. (Tolerance is explained in Section 1.2.1.)

SRID

NUMBER

Coordinate system (spatial reference system) associated with all topology geometry layers in the topology. Is null if no coordinate system is associated; otherwise, it contains a value from the SRID column of the MDSYS.CS_SRS table (described in Oracle Spatial Developer's Guide).

TABLE_SCHEMA

VARCHAR2

Name of the schema that owns the table containing the topology geometry layer column

TABLE_NAME

VARCHAR2

Name of the table containing the topology geometry layer column

COLUMN_NAME

VARCHAR2

Name of the column containing the topology geometry layer data

TG_LAYER_ID

NUMBER

ID number of the topology geometry layer

TG_LAYER_TYPE

VARCHAR2

Contains one of the following: POINT, LINE, CURVE, POLYGON, or COLLECTION. (LINE and CURVE have the same meaning.)

TG_LAYER_LEVEL

NUMBER

Hierarchy level number of this topology geometry layer. (Topology geometry layer hierarchy is explained in Section 1.4.)

CHILD_LAYER_ID

NUMBER

ID number of the topology geometry layer that is the child layer of this layer in the topology geometry layer hierarchy. Null if this layer has no child layer or if the topology does not have a topology geometry layer hierarchy. (Topology geometry layer hierarchy is explained in Section 1.4.)

DIGITS_RIGHT_OF_DECIMAL

NUMBER

Number of digits permitted to the right of the decimal point in the expression of any coordinate position when features are added to an existing topology. All incoming features (those passed as arguments to the addLinearGeometry, addPolygonGeometry, or addPointGeometry method in the Java API or the equivalent PL/SQL subprograms) are automatically snapped (truncated) to the number of digits right of the decimal. Default: 16.


1.7.2 xxx_SDO_TOPO_METADATA Views

The following views contain detailed information about topologies:

  • USER_SDO_TOPO_METADATA contains topology information for all tables owned by the user.

  • ALL_SDO_TOPO_METADATA contains topology information for all tables on which the user has SELECT permission.

The USER_SDO_TOPO_METADATA and ALL_SDO_TOPO_METADATA views contain the same columns, as shown Table 1-9. (The columns are listed in their order in the view definition.)

Table 1-9 Columns in the xxx_SDO_TOPO_METADATA Views

Column NameData TypePurpose

OWNER

VARCHAR2

Owner of the topology

TOPOLOGY

VARCHAR2

Name of the topology

TOPOLOGY_ID

NUMBER

ID number of the topology

TOLERANCE

NUMBER

Tolerance value associated with topology geometries in the topology. (Tolerance is explained in Section 1.2.1.)

SRID

NUMBER

Coordinate system (spatial reference system) associated with all topology geometry layers in the topology. Is null if no coordinate system is associated; otherwise, contains a value from the SRID column of the MDSYS.CS_SRS table (described in Oracle Spatial Developer's Guide).

TABLE_SCHEMA

VARCHAR2

Name of the schema that owns the table containing the topology geometry layer column

TABLE_NAME

VARCHAR2

Name of the table containing the topology geometry layer column

COLUMN_NAME

VARCHAR2

Name of the column containing the topology geometry layer data

TG_LAYER_ID

NUMBER

ID number of the topology geometry layer

TG_LAYER_TYPE

VARCHAR2

Contains one of the following: POINT, LINE, CURVE, POLYGON, or COLLECTION. (LINE and CURVE have the same meaning.)

TG_LAYER_LEVEL

NUMBER

Hierarchy level number of this topology geometry layer. (Topology geometry layer hierarchy is explained in Section 1.4.)

CHILD_LAYER_ID

NUMBER

ID number of the topology geometry layer that is the child layer of this layer in the topology geometry layer hierarchy. Null if this layer has no child layer or if the topology does not have a geometry layer hierarchy. (Topology geometry layer hierarchy is explained in Section 1.4.)

NODE_SEQUENCE

VARCHAR2

Name of the sequence containing the next available node ID number

EDGE_SEQUENCE

VARCHAR2

Name of the sequence containing the next available edge ID number

FACE_SEQUENCE

VARCHAR2

Name of the sequence containing the next available face ID number

TG_SEQUENCE

VARCHAR2

Name of the sequence containing the next available topology geometry ID number

DIGITS_RIGHT_OF_DECIMAL

NUMBER

Number of digits permitted to the right of the decimal point in the expression of any coordinate position when features are added to an existing topology. All incoming features (those passed as arguments to the addLinearGeometry, addPolygonGeometry, or addPointGeometry method in the Java API or the equivalent PL/SQL subprograms) are automatically snapped (truncated) to the number of digits right of the decimal. Default: 16


1.8 Topology Application Programming Interface

The topology data model application programming interface (API) consists of the following:

  • PL/SQL functions and procedures in the SDO_TOPO package (described in Chapter 3) and the SDO_TOPO_MAP package (described in Chapter 4)

  • PL/SQL topology operators (described in Section 1.8.1)

  • Java API (described in Section 1.8.2)

1.8.1 Topology Operators

With the topology data model PL/SQL API, you can use the Oracle Spatial operators, except for the following:

  • SDO_RELATE (but you can use the SDO_RELATE convenience operators that do not use the mask parameter)

  • SDO_NN

  • SDO_NN_DISTANCE

  • SDO_WITHIN_DISTANCE

To use spatial operators with the topology data model, you must understand the usage and reference information about Spatial operators, which are documented in Oracle Spatial Developer's Guide. This section describes only additional information or differences that apply to using spatial operators with topologies. Otherwise, unless this section specifies otherwise, the operator-related information in Oracle Spatial Developer's Guide applies to the use of operators with topology data.

When you use spatial operators with topologies, the formats of the first two parameters can be any one of the following:

  • Two topology geometry objects (type SDO_TOPO_GEOMETRY)

    For example, the following statement finds all city streets features that have any interaction with a land parcel feature named P3. (This example uses definitions and data from Section 1.12.1.)

    SELECT c.feature_name FROM city_streets c, land_parcels l
      WHERE l.feature_name = 'P3' AND
        SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1 
    
  • A topology geometry object (type SDO_TOPO_GEOMETRY) as the first parameter and a spatial geometry (type SDO_GEOMETRY) as the second parameter

    For example, the following statement finds all city streets features that have any interaction with a geometry object that happens to be a polygon identical to the boundary of the land parcel feature named P3. (This example uses definitions and data from Section 1.12.2.)

    SELECT c.feature_name FROM city_streets c
      WHERE SDO_ANYINTERACT (c.feature,
        SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
          SDO_ORDINATE_ARRAY(35,6, 47,6, 47,14, 47,22, 35,22, 35,14, 35,6))) = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1
    
  • A topology geometry object (type SDO_TOPO_GEOMETRY) as the first parameter and a topology object array object (type SDO_TOPO_OBJECT_ARRAY) as the second parameter

    For example, the following statement finds all city streets features that have any interaction with an SDO_TOPO_OBJECT_ARRAY object that happens to be identical to the land parcel feature named P3. (This example uses definitions and data from Section 1.12.2.)

    SELECT c.feature_name FROM city_streets c WHERE
      SDO_ANYINTERACT (c.feature,
       SDO_TOPO_OBJECT_ARRAY (SDO_TOPO_OBJECT (5, 3), SDO_TOPO_OBJECT (8, 3)))
       = 'TRUE';
     
    FEATURE_NAME                                                                    
    ------------------------------                                                  
    R1
    

Example 1-11 shows different topology operators checking for a specific relationship between city streets features and the land parcel named P3. The first statement shows the SDO_FILTER operator, and the remaining statements show the SDO_RELATE convenience operators that include the "mask" in the operator name. With the convenience operators in this example, only SDO_ANYINTERACT, SDO_OVERLAPBDYINTERSECT, and SDO_OVERLAPS return any resulting feature data. (As Figure 1-3 in Section 1.3.1 shows, the only street feature to have any interaction with land parcel P3 is R1.) All statements in Example 1-11 use the format where the first two parameters are topology geometry objects.

Example 1-11 Topology Operators

-- SDO_FILTER
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_FILTER (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
-- SDO_RELATE convenience operators
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_CONTAINS (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_COVEREDBY (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_COVERS (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_EQUAL (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_INSIDE (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_ON (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPBDYINTERSECT (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPBDYDISJOINT (c.feature, l.feature) = 'TRUE';
 
no rows selected
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_OVERLAPS (c.feature, l.feature) = 'TRUE';
 
FEATURE_NAME                                                                    
------------------------------                                                  
R1                                                                              
 
SELECT c.feature_name FROM city_streets c, land_parcels l
  WHERE l.feature_name = 'P3' AND
    SDO_TOUCH (c.feature, l.feature) = 'TRUE';
 
no rows selected

See also the usage notes for the SDO_TOPO.RELATE function in Chapter 3.

1.8.2 Topology Data Model Java Interface

The Java client interface for the topology data model consists of the following classes:

  • TopoMap: class that stores edges, nodes, and faces, and provides methods for adding and deleting elements while maintaining topological consistency both in the cache and in the underlying database tables

  • Edge: class for an edge

  • Face: class for a face

  • Node: class for a node

  • Point2DD: class for a point

  • CompGeom: class for static computational geometry methods

  • InvalidTopoOperationException: class for the invalid topology operation exception

  • TopoValidationException: class for the topology validation failure exception

  • TopoEntityNotFoundException: class for the entity not found exception

  • TopoDataException: class for the invalid input exception

For detailed reference information about the topology data model classes, as well as some usage information about the Java API, see the Javadoc-generated API documentation in Oracle Spatial Java API Reference.

The Spatial Java class libraries are in .jar files under the <ORACLE_HOME>/md/jlib/ directory.

1.9 Exporting and Importing Topology Data

You can export a topology from one database and import it into a new topology with the same name, structures, and data in another database, as long as the target database does not already contain a topology with the same name as the exported topology. To export topology data from one database and import it into another database, follow the steps in this section.


Note:

The steps are required regardless of whether the topology data is transported using transportable tablespaces. (For detailed information about transportable tablespaces and transporting tablespaces to other databases, see Oracle Database Administrator's Guide.)

In the database with the topology data to be exported, perform the following actions:

  1. Connect to the database as the owner of the topology.

  2. Execute the SDO_TOPO.PREPARE_FOR_EXPORT procedure (documented in Chapter 3), to create the topology export information table, with a name in the format <topology-name>_EXP$. (This table contains the same columns as the USER_SDO_TOPO_INFO and ALL_SDO_TOPO_INFO views. These columns are described in Table 1-8 in Section 1.7.1.)

    For example, preparing the sample CITY_DATA topology for export creates the CITY_DATA_EXP$ table.

  3. Export all tables related to the topology, including the feature tables and the <topology-name>_EDGE$, <topology-name>_FACE$, <topology-name>_HISTORY$, <topology-name>_NODE$, <topology-name>_RELATION$, and <topology-name>_EXP$ tables. The names of feature tables (if they exist) are stored in the topology metadata.

    This creates a file with the extension .dmp (for example, city_data.dmp).

In the database into which to import the topology data, perform the following actions:

  1. Connect to the target database, that is, the database in which to create a topology with the same name, structures, and data as the topology exported from the source database. Connect as the user for the schema that is to own the topology to be created.

  2. Ensure that the target database does not already contain a topology with the same name as the topology in the .dmp file.

  3. Import the tables from the .dmp file that you created when you exported the topology data. Specify the indexes=N option.

  4. If you have imported the topology tables into a different schema than the one used for the topology in the source database, update the values in the OWNER and TABLE_SCHEMA columns in all rows of the <topology-name>_EXP$ table to reflect the table owner and schema names in the current (target) database.

  5. Execute the SDO_TOPO.INITIALIZE_AFTER_IMPORT procedure, which creates the topology and performs other operations, as necessary, to make the topology ready for use.

1.10 Cross-Schema Topology Usage and Editing

This section contains requirements and guidelines for using and editing topologies when multiple database users (schemas) are involved.

1.10.1 Cross-Schema Topology Usage

The following considerations apply when one user owns a topology and another user owns a topology geometry layer table. In the following, assume that user A owns the CITY_DATA topology and that user B owns the CITY_STREETS topology geometry layer table.

  • The owner of the topology must create the topology and initialize the metadata. In this example, user A must perform these actions.

  • Only the owner of a topology can add layers to or delete layers from the topology. Therefore, if you add a table owned by another user to a topology, or when you remove such a table from the topology, you must qualify the table name with the schema name. For example, user A could add the CITY_STREETS table owned by user B to the CITY_DATA topology with the following statement:

    EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'B.CITY_STREETS', 'FEATURE', 'LINE');
    

    User A could delete the CITY_STREETS table owned by user B from the CITY_DATA topology with the following statement:

    EXECUTE SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER('CITY_DATA', 'B.CITY_STREETS', 'FEATURE');
    
  • The owner of the topology should grant the SELECT privilege on the node, edge, and face information tables to the owner of the topology geometry layer table. For example, user A should grant the SELECT privilege on the CITY_DATA_NODE$, CITY_DATA_EDGE$, and CITY_DATA_FACE$ tables to user B.

  • The owner of the topology geometry layer table should grant the SELECT and INDEX privileges on that table to the owner of the topology. For example, user B should grant the SELECT and INDEX privileges on the CITY_STREETS table to user A.

    The owner of the topology geometry layer table should also grant appropriate privileges to other users that need to access the table. For read-only access, grant the SELECT privilege on the table to a user; for read/write access, grant the INSERT, SELECT, and UPDATE privileges.

1.10.2 Cross-Schema Topology Editing

The following considerations apply when one user owns a topology and another user wants to edit the topology. In the following, assume that user A owns the CITY_DATA topology and that user B wants to edit that topology.

  • The owner of the topology should grant the following privileges to users who can edit the topology: INSERT, SELECT, and UPDATE on the node, edge, face, and relationship information tables, and SELECT on the node, edge, and face sequences used to generate ID numbers for the topology primitives. For example, user A could grant the following privileges to user B, where the table names end with $ and the sequence names end with _S:

    GRANT insert,select,update ON city_data_node$ TO b;
    GRANT insert,select,update ON city_data_edge$ TO b;
    GRANT insert,select,update ON city_data_face$ TO b;
    GRANT insert,select,update ON city_data_relation$ TO b;
    GRANT select ON city_data_node_s TO b;
    GRANT select ON city_data_edge_s TO b;
    GRANT select ON city_data_face_s TO b;
    
  • When a user who does not own the topology edits that topology, the owner's schema name should be specified with the topology name in functions and procedures that accept the topology name as an input parameter. For example, user B should specify the topology as A.CITY_DATA, not just CITY_DATA.

For information about editing topologies, see Chapter 2.

1.11 Function-Based Indexes Not Supported

You cannot create a function-based index on a column of type SDO_TOPO_GEOMETRY. (Function-based indexes are explained in Oracle Database Advanced Application Developer's Guide and Oracle Database Administrator's Guide.)

1.12 Topology Examples (PL/SQL)

This section presents simplified PL/SQL examples that perform topology data model operations. The examples refer to concepts that are explained in this chapter. They use SDO_TOPO and SDO_TOPO_MAP functions and procedures, which are documented in Chapter 3 and Chapter 4, and the SDO_ANYINTERACT topology operator (see Section 1.8.1).

Both examples are based on the "city data" topology shown in Figure 1-1 in Section 1.2, and the features shown in Figure 1-3 in Section 1.3.1. However, the topologies created are not identical, because the topology built from Spatial geometries (Example 1-13) does not contain all the edges, nodes, and faces that are defined for the topology build from topology data (Example 1-12).

1.12.1 Topology Built from Topology Data

Example 1-12 uses a topology built from edge, node, and face data.

Example 1-12 Topology Built from Topology Data

------------------------------
-- Main steps for using the topology data model with a topology
-- built from edge, node, and face data
------------------------------
-- 1. Create a topology.
-- 2. Load (normally bulk-load) topology data (node, edge, and face tables).
-- 3. Create feature tables.
-- 4. Associate feature tables with the topology.
-- 5. Initialize topology metadata.
-- 6. Load feature tables using the SDO_TOPO_GEOMETRY constructor.
-- 7. Query the data.
-- 8. Optionally, edit data using the PL/SQL or Java API.
 
-- 1. Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('CITY_DATA', 0.00005);
 
-- 2. Load topology data (node, edge, and face tables).
--  Use INSERT statements here instead of a bulk-load utility.
 
-- 2A. Insert data into <topology_name>_EDGE$ table.
 
-- E1
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(1, 1, 1, 1, 1, -1, -1, 1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(8,30, 16,30, 16,38, 3,38, 3,30, 8,30)));
-- E2
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(2, 2, 2, 3, -3, -2, -2, 2, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 31,30, 31,40, 17,40, 17,30, 25,30)));
-- E3
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(3, 2, 3, -3, 2, 2, 3, 2, 2,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 25,35)));
-- E4
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(4, 5, 6, -5, -4, 4, 5, -1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(36,38, 38,35, 41,34, 42,33, 45,32, 47,28, 50,28, 52,32,
57,33)));
-- E5
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(5, 7, 6, -4, -5, 5, 4, -1, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(41,40, 45,40, 47,42, 62,41, 61,38, 59,39, 57,36,
57,33)));
-- E6
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(6, 16, 17, 7, 21, -21, 19, -1, 3,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,22, 21,22)));
-- E7
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(7, 17, 18, 8, 6, -19, 17, -1, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,22, 35,22)));
-- E8
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(8, 18, 19, -15, 7, -17, 15, -1, 5,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,22, 47,22)));
-- E9
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(9, 15, 14, 19, -21, -22, 20, 3, 6,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 21,14)));
-- E10
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(10, 13, 14, -20, 18, 17, -19, 7, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 21,14)));
-- E11
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(11, 13, 12, 15, -17, -18, 16, 5, 8,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 47,14)));
-- E12
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(12, 8, 9, 20, -22, 22, -13, 6, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,6, 21,6)));
-- E13
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(13, 9, 10, 18, -20, -12, -14, 7, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,6, 35,6)));
-- E14
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(14, 10, 11, 16, -18, -13, -16, 8, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,6, 47,6)));
-- E15
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(15, 12, 19, -8, 11, -16, 8, 5, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(47,14, 47,22)));
-- E16
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(16, 11, 12, -11, 14, -14, -15, 8, -1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(47,6, 47,14)));
-- E17
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(17, 13, 18, -7, -10, 11, -8, 4, 5,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,14, 35,22)));
-- E18
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(18, 10, 13, 10, 13, 14, -11, 7, 8,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(35,6, 35,14)));
-- E19
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(19, 14, 17, -6, 9, -10, -7, 3, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,14, 21,22)));
-- E20
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(20, 9, 14, -9, 12, 13, 10, 6, 7,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(21,6, 21,14)));
-- E21
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(21, 15, 16, 6, 22, 9, -6, -1, 3,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 9,22)));
-- E22
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(22, 8, 15, 21, -12, 12, -9, -1, 6,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,6, 9,14)));
-- E25
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(25, 21, 22, -25, -25, 25, 25, 1, 1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,35, 13,35)));
-- E26
INSERT INTO city_data_edge$ (edge_id, start_node_id, end_node_id, 
    next_left_edge_id, prev_left_edge_id, next_right_edge_id, 
    prev_right_edge_id, left_face_id, right_face_id, geometry)
 VALUES(26, 20, 20, 26, 26, -26, -26, 9, 1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(4,31, 7,31, 7,34, 4,34, 4,31)));
 
-- 2B. Insert data into <topology_name>_NODE$ table.
 
-- N1
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(1, 1, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,30,NULL), NULL, NULL));
-- N2
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(2, 2, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(25,30,NULL), NULL, NULL));
-- N3
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(3, -3, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(25,35,NULL), NULL, NULL));
-- N4
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(4, NULL, 2,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(20,37,NULL), NULL, NULL));
-- N5
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(5, 4, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(36,38,NULL), NULL, NULL));
-- N6
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(6, -4, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(57,33,NULL), NULL, NULL));
-- N7
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(7, 5, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(41,40,NULL), NULL, NULL));
-- N8
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(8, 12, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,6,NULL), NULL, NULL));
-- N9
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(9, 20, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,6,NULL), NULL, NULL));
-- N10
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(10, 18, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,6,NULL), NULL, NULL));
-- N11
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(11, -14, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,6,NULL), NULL, NULL));
-- N12
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(12, 15, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,14,NULL), NULL, NULL));
-- N13
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(13, 17, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,14,NULL), NULL, NULL));
-- N14
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(14, 19, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,14,NULL), NULL, NULL));
-- N15
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(15, 21, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,14,NULL), NULL, NULL));
-- N16
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(16, 6, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,22,NULL), NULL, NULL));
-- N17
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(17, 7, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,22,NULL), NULL, NULL));
-- N18
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(18, 8, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,22,NULL), NULL, NULL));
-- N19
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(19, -15, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(47,22,NULL), NULL, NULL));
-- N20
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(20, 26, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(4,31,NULL), NULL, NULL));
-- N21
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(21, 25, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,35,NULL), NULL, NULL));
-- N22
INSERT INTO city_data_node$ (node_id, edge_id, face_id, geometry) 
 VALUES(22, -25, NULL,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(13,35,NULL), NULL, NULL));
 
-- 2C. Insert data into <topology_name>_FACE$ table.
 
-- F0 (id = -1, not 0)
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(-1, NULL, SDO_LIST_TYPE(-1, -2, 4, 6), 
   SDO_LIST_TYPE(), NULL);
-- F1
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(1, 1, SDO_LIST_TYPE(25, -26), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(3,30, 15,38)));
-- F2
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(2, 2, SDO_LIST_TYPE(), SDO_LIST_TYPE(4),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(17,30, 31,40)));
-- F3
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(3, 19, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(9,14, 21,22)));
-- F4
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(4, 17, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(21,14, 35,22)));
-- F5
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(5, 15, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(35,14, 47,22)));
-- F6
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(6, 20, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(9,6, 21,14)));
-- F7
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(7, 10, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(21,6, 35,14)));
-- F8
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(8, 16, SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(35,6, 47,14)));
-- F9
INSERT INTO city_data_face$ (face_id, boundary_edge_id, 
    island_edge_id_list, island_node_id_list, mbr_geometry) 
 VALUES(9,26,SDO_LIST_TYPE(), SDO_LIST_TYPE(),
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(4,31, 7,34)));
 
-- 3. Create feature tables.
 
CREATE TABLE land_parcels ( -- Land parcels (selected faces)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE city_streets ( -- City streets (selected edges)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE traffic_signs ( -- Traffic signs (selected nodes)
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- 4. Associate feature tables with the topology.
--    Add the three topology geometry layers to the CITY_DATA topology.
--    Any order is OK.
 
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS','FEATURE', 'POLYGON');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'TRAFFIC_SIGNS','FEATURE', 'POINT');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'CITY_STREETS', 'FEATURE','LINE');
 
--  As a result, Spatial generates a unique TG_LAYER_ID for each layer in 
--  the topology metadata (USER/ALL_SDO_TOPO_METADATA).
 
-- 5. Initialize topology metadata.
EXECUTE SDO_TOPO.INITIALIZE_METADATA('CITY_DATA');
 
-- 6. Load feature tables using the SDO_TOPO_GEOMETRY constructor.
 
-- Each topology feature can consist of one or more objects (face, edge, node)
-- of an appropriate type. For example, a land parcel can consist of one face,
-- or two or more faces, as specified in the SDO_TOPO_OBJECT_ARRAY.
 
-- There are typically fewer features than there are faces, nodes, and edges.
-- In this example, the only features are these:
-- Area features (land parcels): P1, P2, P3, P4, P5
-- Point features (traffic signs): S1, S2, S3, S4
-- Linear features (roads/streets): R1, R2, R3, R4

-- 6A. Load LAND_PARCELS table.
 
-- P1
INSERT INTO land_parcels VALUES ('P1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 3), -- face_id = 3
      SDO_TOPO_OBJECT (6, 3))) -- face_id = 6
);
-- P2
INSERT INTO land_parcels VALUES ('P2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 3), -- face_id = 4
      SDO_TOPO_OBJECT (7, 3))) -- face_id = 7
);
-- P3
INSERT INTO land_parcels VALUES ('P3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (5, 3), -- face_id = 5
      SDO_TOPO_OBJECT (8, 3))) -- face_id = 8
);
-- P4
INSERT INTO land_parcels VALUES ('P4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (2, 3))) -- face_id = 2
);
-- P5 (Includes F1, but not F9.)
INSERT INTO land_parcels VALUES ('P5', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    3, -- Topology geometry type (polygon/multipolygon)
    1, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (1, 3))) -- face_id = 1
);
 
-- 6B. Load TRAFFIC_SIGNS table.
 
-- S1
INSERT INTO traffic_signs VALUES ('S1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (14, 1))) -- node_id = 14
);
-- S2
INSERT INTO traffic_signs VALUES ('S2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (13, 1))) -- node_id = 13
);
-- S3
INSERT INTO traffic_signs VALUES ('S3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (6, 1))) -- node_id = 6
);
-- S4
INSERT INTO traffic_signs VALUES ('S4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    1, -- Topology geometry type (point)
    2, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 1))) -- node_id = 4
);
 
-- 6C. Load CITY_STREETS table.
-- (Note: "R" in feature names is for "Road", because "S" is used for signs.)
 
-- R1
INSERT INTO city_streets VALUES ('R1', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (9, 2),
      SDO_TOPO_OBJECT (-10, 2),
      SDO_TOPO_OBJECT (11, 2))) -- edge_ids = 9, -10, 11
);
-- R2
INSERT INTO city_streets VALUES ('R2', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (4, 2),
      SDO_TOPO_OBJECT (-5, 2))) -- edge_ids = 4, -5
);
-- R3
INSERT INTO city_streets VALUES ('R3', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (25, 2))) -- edge_id = 25
);
-- R4
INSERT INTO city_streets VALUES ('R4', -- Feature name
  SDO_TOPO_GEOMETRY(
    'CITY_DATA', -- Topology name
    2, -- Topology geometry type (line string)
    3, -- TG_LAYER_ID for this topology (from ALL_SDO_TOPO_METADATA)
    SDO_TOPO_OBJECT_ARRAY (
      SDO_TOPO_OBJECT (3, 2))) -- edge_id = 3
);
 
-- 7. Query the data.
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM land_parcels a;
 
/* Window is city_streets */
SELECT  a.feature_name, b.feature_name
  FROM city_streets b,
     land_parcels a
  WHERE  b.feature_name like 'R%' AND 
     sdo_anyinteract(a.feature, b.feature) = 'TRUE'
  ORDER BY b.feature_name, a.feature_name;
 
-- Find all streets that have any interaction with land parcel P3.
-- (Should return only R1.)
SELECT c.feature_name FROM city_streets c, land_parcels l 
  WHERE l.feature_name = 'P3' AND
   SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
-- Find all land parcels that have any interaction with traffic sign S1.
-- (Should return P1 and P2.)
SELECT l.feature_name FROM land_parcels l, traffic_signs t 
  WHERE t.feature_name = 'S1' AND
   SDO_ANYINTERACT (l.feature, t.feature) = 'TRUE';
 
-- Get the geometry for land parcel P1.
SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
-- Get the boundary of face with face_id 3.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3) FROM DUAL;
 
-- Get the topological elements for land parcel P2.
-- CITY_DATA layer, land parcels (tg_ layer_id = 1), parcel P2 (tg_id = 2)
SELECT SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA', 1, 2) FROM DUAL;

1.12.2 Topology Built from Spatial Geometries

Example 1-13 uses a topology built from Oracle Spatial geometry data.

Example 1-13 Topology Built from Spatial Geometries

------------------------------
-- Main steps for using the topology data model with a topology
-- built from Spatial geometry data
------------------------------
-- 1. Create the topology.
-- 2. Insert the universe face (F0). (id = -1, not 0)
-- 3. Create feature tables.
-- 4. Associate feature tables with the topology.
-- 5. Create a TopoMap object and load the whole topology into 
--     cache for updating.
-- 6. Load feature tables, inserting data from the spatial tables and 
--     using SDO_TOPO_MAP.CREATE_FEATURE.
-- 7. Initialize topology metadata.
-- 8. Query the data.
-- 9. Optionally, edit the data using the PL/SQL or Java API.
 
-- Preliminary work for this example (things normally done to use
-- data with Oracle Spatial): 
-- * Create the spatial tables.
-- * Update the Spatial metadata (USER_SDO_GEOM_METADATA).
-- * Load data into the spatial tables.
-- * Validate the spatial data (validate the layers).
-- * Create the spatial indexes.
 
-- Create spatial tables of geometry features: names and geometries.
 
CREATE TABLE city_streets_geom ( -- City streets/roads
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
CREATE TABLE traffic_signs_geom ( -- Traffic signs
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
CREATE TABLE land_parcels_geom ( -- Land parcels
  name VARCHAR2(30) PRIMARY KEY,
  geometry SDO_GEOMETRY);
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'CITY_STREETS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'TRAFFIC_SIGNS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'LAND_PARCELS_GEOM',
    'GEOMETRY',
    SDO_DIM_ARRAY(
      SDO_DIM_ELEMENT('X', 0, 65, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 45, 0.005)
      ),
    NULL -- SRID
  );
 
-- Load these tables (names and geometries for city streets/roads,
-- traffic signs, and land parcels).
 
-- Insert data into city street line geometries.
 
-- R1 
INSERT INTO city_streets_geom VALUES('R1',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,14, 21,14, 35,14, 47,14)));
 
-- R2
INSERT INTO city_streets_geom VALUES('R2',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(36,38, 38,35, 41,34, 42,33, 45,32, 47,28, 50,28, 52,32,
57,33, 57,36, 59,39, 61,38, 62,41, 47,42, 45,40, 41,40)));
 
-- R3
INSERT INTO city_streets_geom VALUES('R3',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(9,35, 13,35)));
 
-- R4
INSERT INTO city_streets_geom VALUES('R4',
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,30, 25,35)));
 
-- Insert data into traffic sign point geometries.
 
-- S1
INSERT INTO traffic_signs_geom VALUES('S1',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(21,14,NULL), NULL, NULL));
 
-- S2
INSERT INTO traffic_signs_geom VALUES('S2',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(35,14,NULL), NULL, NULL));
 
-- S3
INSERT INTO traffic_signs_geom VALUES('S3',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(57,33,NULL), NULL, NULL));
 
-- S4
INSERT INTO traffic_signs_geom VALUES('S4',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(20,37,NULL), NULL, NULL));
 
-- Insert data into land parcel polygon geometries.
 
-- P1
INSERT INTO land_parcels_geom VALUES('P1',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), 
    SDO_ORDINATE_ARRAY(9,6, 21,6, 21,14, 21,22, 9,22, 9,14, 9,6)));
 
-- P2
INSERT INTO land_parcels_geom VALUES('P2',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(21,6, 35,6, 35,14, 35,22, 21,22, 21,14, 21,6)));
 
-- P3
INSERT INTO land_parcels_geom VALUES('P3',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(35,6, 47,6, 47,14, 47,22, 35,22, 35,14, 35,6)));
 
-- P4
INSERT INTO land_parcels_geom VALUES('P4',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(17,30, 31,30, 31,40, 17,40, 17,30)));
 
-- P5 (polygon with a hole; exterior ring and one interior ring)
INSERT INTO land_parcels_geom VALUES('P5',
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 11,2003,1), 
      SDO_ORDINATE_ARRAY(3,30, 16,30, 16,38, 3,38, 3,30, 4,31, 4,34, 7,34, 7,31, 4,31)));
 
-- Validate the layers.
create table val_results (sdo_rowid ROWID, result VARCHAR2(2000));
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('CITY_STREETS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
truncate table val_results;
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('TRAFFIC_SIGNS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
truncate table val_results;
call SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('LAND_PARCELS_GEOM','GEOMETRY','VAL_RESULTS');
SELECT * from val_results;
drop table val_results;
 
-- Create the spatial indexes.
CREATE INDEX city_streets_geom_idx ON city_streets_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX traffic_signs_geom_idx ON traffic_signs_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX land_parcels_geom_idx ON land_parcels_geom(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
 
-- Start the main steps for using the topology data model with a
-- topology built from Spatial geometry data.
 
-- 1. Create the topology. (Null SRID in this example.)
EXECUTE SDO_TOPO.CREATE_TOPOLOGY('CITY_DATA', 0.00005);
 
-- 2. Insert the universe face (F0). (id = -1, not 0)
INSERT INTO CITY_DATA_FACE$ values (
  -1, NULL, SDO_LIST_TYPE(), SDO_LIST_TYPE(), NULL);
 
COMMIT;
 
-- 3. Create feature tables.
 
CREATE TABLE city_streets ( -- City streets/roads
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE traffic_signs ( -- Traffic signs
  feature_name VARCHAR2(30) PRIMARY KAEY,
  feature SDO_TOPO_GEOMETRY);
 
CREATE TABLE land_parcels ( -- Land parcels
  feature_name VARCHAR2(30) PRIMARY KEY,
  feature SDO_TOPO_GEOMETRY);
 
-- 4. Associate feature tables with the topology.
--    Add the three topology geometry layers to the CITY_DATA topology.
--    Any order is OK.
 
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'CITY_STREETS', 'FEATURE','LINE');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'TRAFFIC_SIGNS','FEATURE', 'POINT');
EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS','FEATURE', 'POLYGON');
 
--  As a result, Spatial generates a unique TG_LAYER_ID for each layer in 
--  the topology metadata (USER/ALL_SDO_TOPO_METADATA).
 
-- 5. Create a TopoMap object and load the whole topology into cache for updating.
 
EXECUTE SDO_TOPO_MAP.CREATE_TOPO_MAP('CITY_DATA', 'CITY_DATA_TOPOMAP');
EXECUTE SDO_TOPO_MAP.LOAD_TOPO_MAP('CITY_DATA_TOPOMAP', 'true');
 
-- 6. Load feature tables, inserting data from the spatial tables and 
--     using SDO_TOPO_MAP.CREATE_FEATURE.
 
BEGIN
  FOR street_rec IN (SELECT name, geometry FROM city_streets_geom) LOOP
   INSERT INTO city_streets VALUES(street_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'CITY_STREETS', 'FEATURE',
         street_rec.geometry));
  END LOOP;
 
  FOR sign_rec IN (SELECT name, geometry FROM traffic_signs_geom) LOOP
   INSERT INTO traffic_signs VALUES(sign_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'TRAFFIC_SIGNS', 'FEATURE',
         sign_rec.geometry));
  END LOOP;
 
  FOR parcel_rec IN (SELECT name, geometry FROM land_parcels_geom) LOOP
   INSERT INTO land_parcels VALUES(parcel_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'LAND_PARCELS', 'FEATURE',
         parcel_rec.geometry));
  END LOOP;
END;
/
 
CALL SDO_TOPO_MAP.COMMIT_TOPO_MAP();
CALL SDO_TOPO_MAP.DROP_TOPO_MAP('CITY_DATA_TOPOMAP');
 
-- 7. Initialize topology metadata.
EXECUTE SDO_TOPO.INITIALIZE_METADATA('CITY_DATA');
 
-- 8. Query the data.
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM land_parcels a;
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM city_streets a;
 
SELECT a.feature_name, a.feature.tg_id, a.feature.get_geometry()
FROM traffic_signs a;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id), face_id
FROM city_data_face$;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id), face_id
FROM city_data_face$;
 
SELECT sdo_topo.get_face_boundary('CITY_DATA', face_id, 'TRUE'), face_id
FROM city_data_face$;
 
-- Get topological elements.
SELECT a.FEATURE_NAME,
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM land_parcels a;
 
SELECT a.FEATURE_NAME, 
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM city_streets a;
 
SELECT a.FEATURE_NAME, 
 sdo_topo.get_topo_objects('CITY_DATA', a.feature.TG_LAYER_ID, a.feature.TG_ID)
FROM traffic_signs a;
 
SELECT sdo_topo.get_topo_objects('CITY_DATA', sdo_geometry(2003,null, null,
       sdo_elem_info_array(1,1003,3),
        sdo_ordinate_array(1,1, 20,20)))
        FROM DUAL;
 
SELECT sdo_topo.get_topo_objects('CITY_DATA', sdo_geometry(2003,null, null,
       sdo_elem_info_array(1,1003,3),
        sdo_ordinate_array(17,30, 31,40)))
        FROM DUAL;
 
-- Find all city streets interacting with a query window.
SELECT c.feature_name FROM city_streets c WHERE
  SDO_ANYINTERACT(
    c.feature,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1, 1003, 3),
      SDO_ORDINATE_ARRAY(5,5, 30,40)))
= 'TRUE';
 
-- Find all streets that have any interaction with land parcel P3.
-- (Should return only R1.)
SELECT c.feature_name FROM city_streets c, land_parcels l 
  WHERE l.feature_name = 'P3' AND
   SDO_ANYINTERACT (c.feature, l.feature) = 'TRUE';
 
-- Find all land parcels that have any interaction with traffic sign S1.
-- (Should return P1 and P2.)
SELECT l.feature_name FROM land_parcels l, traffic_signs t 
  WHERE t.feature_name = 'S1' AND
   SDO_ANYINTERACT (l.feature, t.feature) = 'TRUE';
 
-- Get the geometry for land parcel P1.
SELECT l.feature_name, l.feature.get_geometry()
  FROM land_parcels l WHERE l.feature_name = 'P1';
 
-- Query SDO_TOPO_GEOMETRY attributes,
SELECT s.feature.tg_type FROM city_streets s;
SELECT s.feature.tg_id FROM city_streets s;
SELECT s.feature.tg_layer_id FROM city_streets s;
SELECT s.feature.topology_id FROM city_streets s;
 
-- Topology-specific functions
 
-- Get the boundary of face with face_id 3.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3) FROM DUAL;
-- Try 'TRUE' as third parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 3, 'TRUE') FROM DUAL;
-- Get the boundary of face with face_id 2.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 2) FROM DUAL;
-- Try 'TRUE' as third parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 2, 'TRUE') FROM DUAL;
-- Get the boundary of face with face_id 1.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1) FROM DUAL;
-- Specify 'TRUE' for the all_edges parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1, 'TRUE') FROM DUAL;
 
-- CITY_DATA layer, land parcels (tg_ layer_id = 1), parcel P2 (tg_id = 2)
SELECT SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA', 1, 2) FROM DUAL;
 
-- 10. Optionally, edit the data using the PL/SQL or Java API.

1.13 README File for Spatial and Related Features

A README.txt file supplements the information in the following manuals: Oracle Spatial Developer's Guide, Oracle Spatial GeoRaster Developer's Guide, and Oracle Spatial Topology and Network Data Models Developer's Guide (this manual). This file is located at:

$ORACLE_HOME/md/doc/README.txt
PKǷܘPK ;A$OEBPS/img_text/topo_editing_java.htm+ Description of the illustration topo_editing_java.eps

This is a text description of Figure 2-2, "Editing Topologies Using the TopoMap Object Cache (Java API)". It illustrates the process for editing a topology using the Java API to create and manage a TopoMap object cache, as explained in text after the illustration.

PK\gPK ;AOEBPS/img_text/add_edge.htmx Description of the illustration add_edge.eps

This is a text description of Figure 2-11, "Adding a Non-Isolated Edge". It illustrates the addition of non-isolated edge E7, as explained in text before and after the illustration.

PK#'}xPK ;AOEBPS/img_text/delete_edge.htm| Description of the illustration delete_edge.eps

This is a text description of Figure 2-13, "Removing a Non-Isolated Edge". It illustrates the removal of non-isolated edge E7, as explained in text before and after the illustration.

PK=.|PK ;AOEBPS/img_text/add_node_2.htm Description of the illustration add_node_2.eps

This is a text description of Figure 2-4, "Effect of is_new_shape_point Value on Adding a Node". It illustrates the addition of a non-isolated node, with the result depending on the value of the is_new_shape_point parameter of the SDO_TOPO_MAP.ADD_NODE function, as explained in text after the illustration.

PKPK ;AOEBPS/img_text/subpaths.htm( Description of the illustration subpaths.eps

This is a text description of Figure 5-2, "Path and Subpaths". It illustrates a path (reference path) and a subpath of that path. The start and end points of each subpath are defined relative to link indexes on the path, as explained in text before and after the illustration.

PKT;PK ;A OEBPS/img_text/feat_topo_rel.htmX Description of the illustration feat_topo_rel.eps

This is a text description of Figure 1-5, "Mapping Between Feature Tables and Topology Tables". It illustrates the mapping between feature tables and topology tables, as explained in text before and after the illustration.

PKK8PK ;AOEBPS/img_text/topo_xy_axes.htm Description of the illustration topo_xy_axes.eps

This is a text description of Figure 1-2, "Simplified Topology, with Grid Lines and Unit Numbers". It adds a grid with an x-axis and y-axis to the previous illustration of nodes (points), edges (line segments), and faces (polygons) in a topology, as explained in text before the illustration.

PK dPK ;A%OEBPS/img_text/topo_editing_plsql.htm& Description of the illustration topo_editing_plsql.eps

This is a text description of Figure 2-1, "Editing Topologies Using the TopoMap Object Cache (PL/SQL API)". It illustrates the process for editing a topology using the PL/SQL API to create and manage a TopoMap object cache, as explained in text after the illustration.

PK<PK ;AOEBPS/img_text/move_edge.htm> Description of the illustration move_edge.eps

This is a text description of Figure 2-12, "Moving a Non-Isolated Edge". It illustrates the movement of non-isolated edge E7, as explained in text before and after the illustration.

The topology consists of two adjacent rectangular faces, F1 and F3, separated by edge E7. Face F1 is bounded by edges E1, E7, E5, and E6; and face F3 is bounded by edges E2, E3, E4, and E7.

PK^x8C>PK ;AOEBPS/img_text/net_sdo.htmh Description of the illustration net_sdo.eps

This is a text description of Figure 5-4, "Simple Spatial (SDO) Network". It illustrates the nodes and links in a very simple spatial (SDO, not LRS) network, as explained in text before and after the illustration.

PK{˜PK ;AOEBPS/img_text/load_window.htmY Description of the illustration load_window.eps

This is a text description of Figure 4-1, "Loading Topological Elements into a Window". It illustrates a topology and a window for loading. The window boundary is shown as a dashed line. The text before and after the illustration explains the criteria used to determine which objects are loaded; the text also lists the objects that are loaded, and briefly explains why specified objects are not loaded.

PKU^YPK ;A!OEBPS/img_text/net_log_simple.htmv Description of the illustration net_log_simple.eps

This is a text description of Figure 5-5, "Simple Logical Network". It illustrates the nodes and links in a very simple logical network, as explained in text before and after the illustration.

PKeG֎PK ;AOEBPS/img_text/net_roads.htm0 Description of the illustration net_roads.eps

This is a text description of Figure 5-6, "Roads and Road Segments for Spatial (LRS) Network Example". It illustrates the roads (routes) and the road segment geometries for the spatial network management example, as explained in text before and after the illustration.

PK*PK ;AOEBPS/img_text/edge_table.htmI Description of the illustration edge_table.eps

This is a text description of Figure 1-6, "Nodes, Edges, and Faces". It shows nodes, edges, and faces that can be used to illustrate the relationships among the various ID columns in the edge information table, as explained in text before and after the illustration. The main edges are E4, going left to right between nodes N1 and N2, and E8, going right to left between nodes N4 and N3.

PK :NIPK ;AOEBPS/img_text/topo_hier.htmy Description of the illustration topo_hier.eps

This is a text description of Figure 1-4, "Topology Geometry Layer Hierarchy". It illustrates a topology hierarchy with five levels, as explained in text before the illustration. The Land Parcels topology geometry layer (level 0) is the lowest level of the hierarchy. Its parent is the Block Groups layer (level 1), whose parent is the Tracts layer (level 2), whose parent is the Counties layer (level 3), whose parent is the States layer (level 4).

PKj&KPK ;AOEBPS/img_text/move_node_2b.htm3 Description of the illustration move_node_2b.eps

This is a text description of Figure 2-6, "Topology After Moving a Non-Isolated Node". It illustrates the topology after two cases of the movement of node N1 (without and with reshaping of attached edges), as explained in text before and after the illustration.

PKPK ;AOEBPS/img_text/ndm_nyc.htm7 Description of the illustration ndm_nyc.gif

This is a text description of Figure 5-1, "New York City Nodes and Links". It illustrates nodes and links from New York City network data, as shown in the graphical user interface of the unsupported Network Editor tool, which is briefly described in Section 5.14.

The left side of the Network Editor window displays the longitude and latitude coordinates represented by the mouse pointer position, along with some network information (name, category, and so on) on the left. The middle and right area of the Network Editor window contains a representation of nodes and links.

PKl!YK<7PK ;A&OEBPS/img_text/topo_node_edge_face.htm^ Description of the illustration topo_node_edge_face.eps

This is a text description of Figure 1-1, "Simplified Topology". It illustrates nodes (points), edges (line segments), and faces (polygons) in a topology, as explained in text before and after the illustration.

PKPdPK ;AOEBPS/img_text/delete_node.htmw Description of the illustration delete_node.eps

This is a text description of Figure 2-9, "Removing a Non-Isolated Node". It illustrates the removal of non-isolated node N1 from an edge, as explained in text before and after the illustration.

PK?8&PK ;AOEBPS/img_text/net_hier2.htm! Description of the illustration net_hier2.eps

This is a text description of Figure 5-7, "Nodes and Links for Logical Network Example". It illustrates the nodes and links in a logical hierarchical network, as explained in text before and after the illustration. (Figure 5-7, "Nodes and Links for Logical Network Example" is essentially the same as Figure 5-3, "Network Hierarchy", which is used in Section 5.5 and is explained in that section.)

PKUWPK ;AOEBPS/img_text/add_node.htm~ Description of the illustration add_node.eps

This is a text description of Figure 2-3, "Adding a Non-Isolated Node". It illustrates the addition of a non-isolated node on an edge, as explained in text before and after the illustration.

PK3|PK ;A OEBPS/img_text/topo_features.html Description of the illustration topo_features.eps

This is a text description of Figure 1-3, "Features in a Topology". It illustrates features for a topology, as explained in text before and after the illustration.

PKT| qlPK ;A%OEBPS/img_text/node_moves_several.htm Description of the illustration node_moves_several.eps

This is a text description of Figure 2-8, "Topology for Node Movement Examples". It illustrates a topology before several attempted movements of node N1. The text after the illustration explains whether or not the operation would be allowed for each attempted move of node N1 to points P1, P2, P3, and P4.

The topology includes a polygon and point P4, which is outside the polygon. Edges E3 and E1 go across the polygon, dividing it into faces F1 (above) and F2 (below), and these edges meet at node N1. Points P1 and P2 are on face F1, point P3 and isolated node N2 are on face F2, and point P4 is outside the polygon. Edge E2 extends from node N1 into face F1, edge E4 extends from node N1 into face F2, and edge E5 extends from an unspecified point on the perimeter of the polygon into face F1.

PKPK ;AOEBPS/img_text/net_hier.htmm Description of the illustration net_hier.eps

This is a text description of Figure 5-3, "Network Hierarchy". It illustrates a network hierarchy with two levels, as explained in text before and after the illustration.

PKjHrmPK ;AOEBPS/img_text/move_node_1.htm4 Description of the illustration move_node_1.eps

This is a text description of Figure 2-5, "Topology Before Moving a Non-Isolated Node". It illustrates the topology before the movement of node N1, as explained in text before the illustration.

The topology is a 5-sided polygon bounded by edges E1, E2, E5, E7, and E10. Node N1 is in the middle of the polygon, and is attached to edges E3, E4, E6, E8, and E9.

PKve94PK ;AOEBPS/img_text/flip_node.htm_ Description of the illustration flip_node.eps

This is a text description of Figure 2-7, "Node Move Is Not Allowed". It illustrates a case of a node movement that would not be allowed, as explained in text before the illustration.

The topology consists of an isolated face F1 within face F2. Face F1 consists of nodes N1, N2, and N3 connected to form a triangle. Before the flip, node N1 is above the long edge of the triangle; and after the proposed but disallowed flip, node N1 would have been below the long edge.

PK?PK ;A(OEBPS/img_text/delete_obsolete_nodes.htm= Description of the illustration delete_obsolete_nodes.eps

This is a text description of Figure 2-10, "Removing Obsolete Nodes". It illustrates the removal of obsolete nodes from a topology, as explained in text before and after the illustration. In this case, only one node (N2) is removed, because the other nodes do not satisfy all criteria for obsolete nodes.

In the top part of the illustration (Before Removing Obsolete Nodes), edge E1 is between nodes N1 and N2, and edge E2 is between nodes N2 and N3. In the bottom part of the illustration (After Removing Obsolete Nodes), edge E1 is between nodes N1 and N3, and edge E2 does not exist because it has been removed.

PK|B=PK ;AOEBPS/sdo_prtnet.htmC Network Data Model

Part II

Network Data Model

This document has two main parts:

  • Part I provides conceptual, usage, and reference information about the topology data model of Oracle Spatial.

  • Part II provides conceptual, usage, and reference information about the network data model of Oracle Spatial.

Part II contains the following chapters:

PKOFPK ;AOEBPS/sdo_net_concepts.htm Network Data Model Overview

5 Network Data Model Overview

This chapter explains the concepts and operations related to the Oracle Spatial network data model. It assumes that you are familiar with the main Oracle Spatial concepts, data types, and operations, as documented in Oracle Spatial Developer's Guide:

Although this chapter discusses some network-related terms as they relate to Oracle Spatial, it assumes that you are familiar with basic network data modeling concepts.

This chapter contains the following major sections:

5.1 Introduction to Network Modeling

In many applications, capabilities or objects are modeled as nodes and links in a network. The network model contains logical information such as connectivity relationships among nodes and links, directions of links, and costs of nodes and links. With logical network information, you can analyze a network and answer questions, many of them related to path computing and tracing. For example, for a biochemical pathway, you can find all possible reaction paths between two chemical compounds; or for a road network, you can find the following information:

  • What is the shortest (distance) or fastest (travel time) path between two cities?

  • What is the closest hotel to a specific airport, and how can I get there?

In additional to logical network information, spatial information such as node locations and link geometries can be associated with the network. This information can help you to model the logical information (such as the cost of a route, because its physical length can be directly computed from its spatial representation).

The Spatial network data model can be used for large, complex networks. For example, Figure 5-1 shows New York City nodes and links, which have been defined using the network data model, displayed using the Network Editor demo tool (described in Section 5.14).

Figure 5-1 New York City Nodes and Links

Description of Figure 5-1 follows
Description of "Figure 5-1 New York City Nodes and Links"

The generic data model and network analysis capability can model and analyze many kinds of network applications in addition to traditional geographical information systems (GIS). For example, in biochemistry, applications may need to model reaction pathway networks for living organisms; and in the pharmaceutical industry, applications that model the drug discovery process may need to model protein-protein interaction.

The network modeling capabilities of Spatial include schema objects and an application programming interface (API). The schema objects include metadata and network tables. The API includes a server-side PL/SQL API (the SDO_NET and SDO_NET_MEM packages) for creating, managing, editing, and analyzing networks in the database, and a middle-tier (or client-side) Java API for network editing and analysis.

5.2 Main Steps in Using the Network Data Model

This section summarizes the main steps for working with the network data model in Oracle Spatial. It refers to important concepts, structures, and operations that are described in detail in other sections.

There are two basic approaches to creating a network:

  • Let Spatial perform most operations, using procedures with names in the form CREATE_<network-type>_NETWORK. (See Section 5.2.1.)

  • Perform the operations yourself: create the necessary network tables and update the network metadata. (See Section 5.2.2.)

With each approach, you must insert the network data into the network tables. You can then use the network data model PL/SQL and Java application programming interfaces (APIs) to update the network and perform other operations. (The PL/SQL and Java APIs are described in Section 5.11.)

5.2.1 Letting Spatial Perform Most Operations

To create a network by letting Spatial perform most of the necessary operations, follow these steps:

  1. Create the network using a procedure with a name in the form CREATE_<network-type>_NETWORK, where <network-type> reflects the type of network that you want to create:

    Each of these procedures creates the necessary network data model tables (described in Section 5.9) and inserts a row with the appropriate network metadata information into the xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

    Each procedure has two formats: one format creates all network data model tables using default names for the tables and certain columns, and other format lets you specify names for the tables and certain columns. The default names for the network data model tables are <network-name>_NODE$, <network-name>_LINK$, <network-name>_PATH$, and <network-name>_PLINK$. The default name for cost columns in the network data model tables is COST, and the default name for geometry columns is GEOMETRY.

  2. Insert data into the node and link tables, and if necessary into the path and path-link tables. (The node, link, path, and path-link tables are described in Section 5.9.)

  3. Validate the network, using the SDO_NET.VALIDATE_NETWORK function.

  4. For a spatial (SDO or LRS) network, insert the appropriate information into the USER_SDO_GEOM_METADATA view, and create spatial indexes on the geometry columns.

    If you plan to use a view as a node, link, or path table, you must specify the view name for the TABLE_NAME column value when you insert information about the node, link, or path table in the USER_SDO_GEOM_METADATA view.

5.2.2 Performing the Operations Yourself

To create a network by performing the necessary operations yourself, follow these steps:

  1. Create the node table, using the SDO_NET.CREATE_NODE_TABLE procedure. (The node table is described in Section 5.9.1.)

  2. Insert data into the node table.

  3. Create the link table, using the SDO_NET.CREATE_LINK_TABLE procedure. (The link table is described in Section 5.9.2).

  4. Insert data into the link table.

  5. Optionally, create the path table, using the SDO_NET.CREATE_PATH_TABLE procedure. (The path table is described in Section 5.9.3).

  6. If you created the path table, create the path-link table, using the SDO_NET.CREATE_PATH_LINK_TABLE procedure. (The path-link table is described in Section 5.9.4).

  7. If you created the path table and if you want to create paths, insert data into the table.

  8. If you inserted data into the path table, insert the appropriate rows into the path-link table.

  9. Insert a row into the USER_SDO_NETWORK_METADATA view with information about the network. (The USER_SDO_NETWORK_METADATA view is described in Section 5.10.1.)

    If you plan to use a view as a node, link, path, or path-link table, you must specify the view name for the relevant columns when you insert information about the network in the USER_SDO_NETWORK_METADATA view.

  10. For a spatial (SDO or LRS) network, insert the appropriate information into the USER_SDO_GEOM_METADATA view, and create spatial indexes on the geometry columns.

    If you plan to use a view as a node, link, or path table, you must specify the view name for the TABLE_NAME column value when you insert information about the node, link, or path table in the USER_SDO_GEOM_METADATA view.

  11. Validate the network, using the SDO_NET.VALIDATE_NETWORK function.

You can change the sequence of some of these steps. For example, you can create both the node and link tables first, and then insert data into each one; and you can insert the row into the USER_SDO_NETWORK_METADATA view before you create the node and link tables.

5.3 Network Data Model Concepts

A network is a type of mathematical graph that captures relationships between objects using connectivity. The connectivity may or may not be based on spatial proximity. For example, if two towns are on opposite sides of a lake, the shortest path based on spatial proximity (a straight line across the middle of the lake) is not relevant if you want to drive from one town to the other. Instead, to find the shortest driving distance, you need connectivity information about roads and intersections and about the "cost" of individual links.

A network consists of a set of nodes and links. Each link (sometimes also called an edge or a segment) specifies two nodes.

A network can be directed (that is, by default, the start and end nodes determine link direction) or undirected (that is, links can be traversed in either direction).

The following are some key terms related to the network data model:

  • A node represents an object of interest. An isolated node is a node that is not included in any links. (A non-isolated node will become isolated if all links that include that node are deleted.)

  • A link represents a relationship between two nodes. Within a directed network, any link can be undirected (that is, able to be traversed either from the start node to the end node or from the end node to the start node) or directed (that is, able to be traversed only from the start node to the end node). Within an undirected network, all links are undirected.

  • A path is an alternating sequence of nodes and links, beginning and ending with nodes, and usually with no nodes and links appearing more than once. (Repeating nodes and links within a path are permitted, but are rare in most network applications.)

  • A subpath is partial path along a path, created either as a result of a network analysis operation or explicitly by a user. Subpaths are explained and illustrated in Section 5.3.1.

  • A logical network contains connectivity information but no geometric information. This is the model used for network analysis. A logical network can be treated as a directed graph or undirected graph, depending on the application.

  • A spatial network contains both connectivity information and geometric information. In a spatial network, the nodes and links are SDO_GEOMETRY geometry objects without LRS information (an SDO network) or with LRS information (an LRS network), or SDO_TOPO_GEOMETRY objects (a topology geometry network).

    In an LRS network, each node includes a geometry ID value and a measure value, and each link includes a geometry ID value and start and end measure values; and the geometry ID value in each case refers to an SDO_GEOMETRY object with LRS information. A spatial network can be directed or undirected, depending on the application.

  • A feature is an object of interest in a network application that is associated with a node or link. For example, in a transportation network, features include exits and intersections (mapped to nodes), and highways and streets (mapped to links).

  • Cost is a non-negative numeric attribute that can be associated with links or nodes for computing the minimum cost path, which is the path that has the minimum total cost from a start node to an end node. You can specify a single cost factor, such as driving time or driving distance for links, in the network metadata, and network analytical functions that examine cost will use this specified cost factor.

  • Duration is a non-negative numeric attribute that can be associated with links or nodes to specify a duration value for the link or node. The duration value can indicate a number of minutes or any other user-determined significance. You can specify a single duration factor, such as driving time for links, in the network metadata; however, if you use duration instead of cost to indicate elapsed time, network analytical functions that examine cost will not consider the specified duration factor.

  • State is a string attribute, either ACTIVE or INACTIVE, that is associated with links or nodes to specify whether or not a link or node will be considered by network analysis functions. For example, if the state of a node is INACTIVE, any links from or to that node are ignored in the computation of the shortest path between two nodes. The state is ACTIVE by default when a link or node is created, but you can set the state INACTIVE.

  • Type is a string attribute that can be associated with links or nodes to specify a user-defined value for the type of a link or a node.

  • Temporary links, nodes, and paths exist only in a network memory object, and are not written to the database when the network memory object is written. For example, during a network analysis and editing session you might create temporary nodes to represent street addresses for shortest-path computations, but not save these temporary nodes when you save the results of editing operations.

  • Reachable nodes are all nodes that can be reached from a given node. Reaching nodes are all nodes that can reach a given node.

  • The degree of a node is the number of links to (that is, incident upon) the node. The in-degree is the number of inbound links, and the out-degree is the number of outbound links.

  • A connected component is a group of network nodes that are directly or indirectly connected. If node A can reach node B, they must belong to the same connected component. If two nodes are not connected, it is concluded that there is no possible path between them. This information can be used as a filter to avoid unnecessary path computations.

  • A spanning tree of a connected graph is a tree (that is, a graph with no cycles) that connects all nodes of the graph. (The directions of links are ignored in a spanning tree.) The minimum cost spanning tree is the spanning tree that connects all nodes and has the minimum total cost.

  • A partitioned network is a network that contains multiple partitions. Partitioning a large network enables only the necessary partitions to be loaded on demand into memory, thus providing better overall performance.

    Network partitions are sub-networks, each covering a subset of nodes and links of the entire network. Network partitions are the basic processing units for load on demand analysis. They are created by assigning every node in the network to only one partition ID. Network partition information is stored in a partition table.

  • Load on demand (load on demand analysis) is an approach that divides large networks into manageable partitions and only loads needed partitions during analysis, thus removing memory limitation as a consideration and providing better overall performance.

  • Partition BLOBs are binary representations for network partitions. They provide faster partition loading time. They are stored in a partition BLOB table.

  • The load on demand partition cache is an in-memory placeholder for network partitions loaded into memory during network analysis. You can configure the partition cache.

  • User-defined data is the information (not related to connectivity) that users want to associate with a network representation. User-defined data can be defined at the node, link, path, and subpath level, and is stored in columns in the node, link, path, and subpath tables.

5.3.1 Subpaths

A subpath is partial path along a path, created either as a result of a network analysis operation or explicitly by a user. The start and end points of a subpath are defined as link indexes and the percentage of the distance from the previous node in the path, as shown in Figure 5-2.

Figure 5-2 Path and Subpaths

Description of Figure 5-2 follows
Description of "Figure 5-2 Path and Subpaths"

A subpath refers to an existing path (the reference path) using the following parameters:

  • Reference path ID: the path ID of the reference path.

  • Start link index: the start link index on the reference path. (Link index 0 refers to the link between the first and second nodes on the path.) In Figure 5-2, link index 0 is the start link index.

  • Start percentage: the percentage of the distance along the start link for the start node of the subpath. In Figure 5-2, the subpath starts at 65 percent of the distance between the start and end of link index 0.

  • End link index: the end link index on the reference path. In Figure 5-2, link index 6 is the end link index.

  • End percentage: the percentage of the distance along the end link for the end node of the subpath. In Figure 5-2, the subpath ends at 50 percent of the distance between the start and end of link index 6.

5.4 Network Applications

Networks are used in applications to find how different objects are connected to each other. The connectivity is often expressed in terms of adjacency and path relationships. Two nodes are adjacent if they are connected by a link. There are often several paths between any two given nodes, and you may want to find the path with the minimum cost.

This section describes some typical examples of different kinds of network applications.

5.4.1 Road Network Example

In a typical road network, the intersections of roads are nodes and the road segments between two intersections are links. The spatial representation of a road is not inherently related to the nodes and links in the network. For example, a shape point in the spatial representation of a road (reflecting a sharp turn in the road) is not a node in the network if that shape point is not associated with an intersection; and a single spatial object may make up several links in a network (such as a straight segment intersected by three crossing roads). An important operation with a road network is to find the path from a start point to an end point, minimizing either the travel time or distance. There may be additional constraints on the path computation, such as having the path go through a particular landmark or avoid a particular intersection.

5.4.2 Train (Subway) Network Example

The subway network of any major city is probably best modeled as a logical network, assuming that precise spatial representation of the stops and track lines is unimportant. In such a network, all stops on the system constitute the nodes of the network, and a link is the connection between two stops if a train travels directly between these two stops. Important operations with a train network include finding all stations that can be reached from a specified station, finding the number of stops between two specified stations, and finding the travel time between two stations.

5.4.3 Utility Network Example

Utility networks, such as power line or cable networks, must often be configured to minimize the cost. An important operation with a utility network is to determine the connections among nodes, using minimum cost spanning tree algorithms, to provide the required quality of service at the minimum cost. Another important operation is reachability analysis, so that, for example, if a station in a water network is shut down, you know which areas will be affected.

5.4.4 Biochemical Network Example

Biochemical processes can be modeled as biochemical networks to represent reactions and regulations in living organisms. For example, metabolic pathways are networks involved in enzymatic reactions, while regulatory pathways represent protein-protein interactions. In this example, a pathway is a network; genes, proteins, and chemical compounds are nodes; and reactions among nodes are links. Important operations for a biochemical network include computing paths and the degrees of nodes.

5.5 Network Hierarchy

Some network applications require representations at different levels of abstraction. For example, two major processes might be represented as nodes with a link between them at the highest level of abstraction, and each major process might have several subordinate processes that are represented as nodes and links at the next level down.

A network hierarchy enables you to represent a network with multiple levels of abstraction by assigning a hierarchy level to each node. (Links are not assigned a hierarchy level, and links can be between nodes in the same hierarchy level or in different levels.) The lowest (most detailed) level in the hierarchy is level 1, and successive higher levels are numbered 2, 3, and so on.

Nodes at adjacent levels of a network hierarchy have parent-child relationships. Each node at the higher level can be the parent node for one or more nodes at the lower level. Each node at the lower level can be a child node of one node at the higher level. Sibling nodes are nodes that have the same parent node.

Links can also have parent-child relationships. However, because links are not assigned to a hierarchy level, there is not necessarily a relationship between link parent-child relationships and network hierarchy levels. Sibling links are links that have the same parent link.

Figure 5-3 shows a simple hierarchical network, in which there are two levels.

Figure 5-3 Network Hierarchy

Description of Figure 5-3 follows
Description of "Figure 5-3 Network Hierarchy"

As shown in Figure 5-3:

  • The top level (level 2) contains two nodes. Each node is the parent node of several nodes in the bottom level. The link between the nodes in the top level is the parent link of two links between nodes in the bottom level.

  • The bottom level (level 1) shows the nodes that make up each node in the top level. It also shows the links between nodes that are child nodes of each parent node in the top level, and two links between nodes that have different parent nodes.

  • The links between nodes in the bottom level that have different parent nodes are shown with dark connecting lines. These links are child links of the single link between the nodes in the top level in the hierarchy. (However, these two links in the bottom level could also be defined as not being child links of any parent link between nodes in a higher level.)

  • The parent-child relationships between each parent node and link and its child nodes and links are shown with dashed lines with arrowheads at both ends.

Although it is not shown in Figure 5-3, links can cross hierarchy levels. For example, a link could be defined between a node in the top level and any node in the bottom level. In this case, there would not be a parent-child relationship between the links.

5.6 Network Constraints

Network constraints are restrictions defined on network analysis computations. For example, a network constraint might list a series of prohibited turns in a roads network due to one-way streets and "No Left Turn" signs, with each prohibited turn represented as a pair of links (a start link and an end link onto which a turn cannot be made from the start link). As another example, a network constraint might require that driving routes must not include toll roads or must not include expressways.

To create a network constraint, you must create a Java class that implements the constraint, and you must register the constraint by using the SDO_NET.REGISTER_CONSTRAINT procedure. To apply a network constraint to a network analysis operation, specify the constraint using the constraint parameter with the appropriate SDO_NET_MEM subprogram.

Examples of Java classes to implement network constraints are provided in the network data model demo files, which are described in Section 5.14. For example, the ProhibitedTurns.java file creates a network constraint that defines a series of prohibited turns, and it then returns the shortest path between two nodes, first without applying the constraint and then applying the constraint.

5.7 Network Analysis Using Load on Demand

Load on demand means that during network analysis, a network partition is not loaded into memory until the analysis has reached this partition while exploring the network. With load on demand, Oracle Spatial performs most partitioning and loading operations automatically, and this usually results in more efficient memory utilization with very large networks.

Load on demand analysis involves the following major steps: network creation, network partition, partition cache configuration, and network analysis.

  1. Create the network, using one of the approaches described in Section 5.2.

  2. Partition the network using the SDO_NET.SPATIAL_PARTITION procedure, as explained in Section 5.7.1.

  3. Optionally, generate partition BLOBs, as explained in Section 5.7.2.

  4. Configure the load on demand environment, including the partition cache, as explained in Section 5.7.3.

  5. Analyze the network, as explained in Section 5.7.4.


Note:

Load on demand analysis also works with nonpartitioned networks by treating the entire network as one partition. For a small network, there may be no performance benefit in partitioning it, in which case you can skip the partitioning but still use load on demand APIs.

For examples of performing load on demand network analysis and configuring the partition cache, see Section 5.13.5.

Additional examples of partitioning and load on demand analysis are included on the Oracle Database Examples media (see Oracle Database Examples Installation Guide). For more information about network data model example and demo files, see Section 5.14.

5.7.1 Partitioning a Network

You can partition a network using the SDO_NET.SPATIAL_PARTITION procedure, specifying the maximum number of nodes in each partition. The partition result is stored in a partition table, which is automatically generated, and partition metadata information is inserted into the network metadata. (As an alternative to using the procedure, you can partition a network by creating and populating a partition table.) You can use other SDO_NET subprograms to query the partitioning metadata.

A good partition strategy is to minimize the number of links between partitions, which reduces the number of partitions that need to be loaded and the probable number of times that the same partitions need to be reloaded. Moreover, partitions that are too small require excessive loading and unloading of partitions during analysis.

The recommended maximum number of nodes per partition, assuming 1 GB of memory, is between 5,000 and 10,000. You can tune the number and see what is best for your applications, considering the available memory, type of analysis, and network size. You should also consider configuring the partition caching size.

5.7.2 Generating Partition BLOBs

To enhance the performance of network loading, you can optionally store partitions as BLOBs in a network partition BLOB table. This information needs to be stored in the network metadata view in order to take advantage of faster partition loading time. Note that if a network or partition information is updated, the partition BLOBs need to be regenerated as well.

A partition BLOB is a binary stream of data containing the network partition information, such as number of nodes, number of links, properties of each node, properties of each link, and so on. If a partition BLOB exists, Spatial uses it to read information during the load operation, rather than performing time-consuming database queries.

To generate partition BLOBs, use the SDO_NET.GENERATE_PARTITION_BLOBS procedure. The partition BLOBs and their metadata are stored in the partition BLOB table, which is described in Section 5.9.7.

5.7.3 Configuring the Partition Cache

Before you perform network analysis, you can configure the network partition cache to optimize performance, by modifying an XML configuration file to override the default configuration. You can specify the following:

  • Cache size: the maximum number of nodes in partition cache

  • Partitions source: from network tables or partition BLOBs

  • Resident partitions: IDs of partitions that will not be flushed out of the cache, but will stay in memory once they are loaded

  • Cache flushing policy: class name of the CachingHandler implementation

    The default caching policy is LeastRecentlyUsed, which flushes out the oldest partition out of memory when the cache is full. You can specify other caching policies by implementing the CachingHandler interface.

A copy of the default load on demand configuration file is included in the supplementary documentation, described in Section 5.14.

5.7.4 Analyzing the Network

After you have created and partitioned the network, and optionally configured the partition cache, you can issue analysis queries. Analysis results are returned in Java representation or XML responses, depending on whether you used the Java or XML API. For details, see the load on demand (LOD) Javadoc and XML schemas (the latter described in Section 5.14).

You can write the analysis results to the database using the load on demand Java API.

5.7.5 Using Link Levels for Priority Modeling

Although the load on demand approach reduces the effect of memory limitations in analyzing large networks, analysis operations still can sometimes be very slow. For example, shortest path analysis of two nodes diagonally across the entire network is likely to require traversing almost every link in the network, and this will take a significant amount of time for a network with more than, for example, two million nodes.

To further reduce network analysis time, you can perform analysis on different link levels. Link level is a positive integer assigned to a link indicating the level of preference of this link. The higher the link level, the higher the preference. For example, a road network may consist of two link levels, level 1 for local roads and level 2 for highways. During network analysis, highways are preferred to local roads, and the minimum link level is 1. (If no link level is assigned to a link, the default link level of 1 is used for the link.)

Link levels have an implicit inheritance property, which means that a network at higher link levels must be a subnetwork of a network at a lower link level. That is, link level 2 is a subnetwork of link level 1, link level 3 is a subnetwork of link level 2, and so on.

You can specify a link level when you load a network or a partition, which causes links at that level and higher levels to be loaded. Using the road network example, with link level 1 for local roads and link level 2 for highways, specifying link level 1 on a load operation loads links at link levels 1 and 2 (that is, local roads and highways), but specifying link level 2 on a load operation loads only the highways links. If you wanted to perform analysis using only highways links, you could optimize the performance by specifying link level 2 for the load operation.

5.7.6 Precomputed Analysis Results

Some analysis operations, such as connected component analysis, can be time consuming. To improve run-time performance, you can call the SDO_NET.FIND_CONNECTED_COMPONENTS procedure, which computes the connected components in the network and stores the results in the connected component table, which is described Section 5.9.8.

At run time, before calling shortest path analysis or reachability analysis, you can check whether the nodes of interest belong to the same connected component by querying the connected component table. If precomputed component information does not exist, it may take a long time for shortest path and reachability analysis to discover that two nodes are, in fact, not connected.

5.8 Network Editing and Analysis Using the In-Memory Approach


Note:

The in-memory approach will be deprecated in the next release of Spatial, and future development will enhance the load on demand approach, which is described in Section 5.7. You are encouraged use the load on demand approach whenever possible.

This section describes how to perform network editing and analysis operations using a network memory object, which is a cache in virtual memory. You can load a network or a hierarchy level in a network into a network memory object, perform operations on network objects in the memory object, and then either discard any changes or write the changes to the network in the database.

Multiple network memory objects can exist at a time for a specified network, but only one can be updatable; any others must be read-only. For better performance, if you plan to use the network memory object only to retrieve information or to perform network analysis operations, make the network memory object read-only (that is, specify allow_updates=>'FALSE' with the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure).

To work with a network memory object, you can use either the PL/SQL API (specifically, the SDO_NET_MEM package) or the Java API. Both APIs are introduced in Section 5.11.

In the network data model PL/SQL API, the subprograms in the SDO_NET package operate on the network in the database, and the subprograms in the SDO_NET_MEM package operate on the network memory object in the cache. For some network editing operations (such as adding a node, link, or path), you can use either an SDO_NET or SDO_NET_MEM procedure; however, if you are performing a large number of editing operations, using the cache (SDO_NET_MEM procedures) offers better performance. Most network operations, though, can be performed only by a subprogram in the SDO_NET or SDO_NET_MEM package, and in these cases your decision about whether to use a network memory object depends on your specific needs.

Example 5-1 uses a network memory object to add a new node and a new link to an existing network, perform a shortest path analysis, print the analysis results, and save the changes and analysis results in the database. These steps assume that a logical network named XYZ_NETWORK has already been created and populated using the statements shown in Example 5-5 in Section 5.13.4.

Example 5-1 Using a Network Memory Object for Editing and Analysis (PL/SQL)

DECLARE
  path_id     NUMBER;
  res_numeric NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN 
-- Create a network memory object in the user session for the 
-- logical network named XYZ_NETWORK. This creates a network 
-- object and reads all metadata, nodes, links, and paths in 
-- the network, and it allows for updates to be performed.
sdo_net_mem.network_manager.read_network(net_mem=>'XYZ_NETWORK', 
  allow_updates=>'TRUE');
 
-- Add a node with ID=901, and set its name to N901 and cost to 5.
sdo_net_mem.network.add_node(net_mem=>'XYZ_NETWORK', node_id=>901,
  node_name=>'N901', external_network_id=>0, external_node_id=>0);
sdo_net_mem.node.set_cost(net_mem=>'XYZ_NETWORK', node_id=>901, cost=>5);
 
-- Add a link with ID=9901, name=N901N1, cost=20 from node N901 to node N1.
sdo_net_mem.network.add_link(net_mem=>'XYZ_NETWORK', link_id=>9901, 
  link_name=>'N901N1', start_node_id=>901, end_node_id=>101, cost=>20);
 
-- Perform a shortest path analysis from node N1 to node N5.
path_id := sdo_net_mem.network_manager.shortest_path('XYZ_NETWORK', 101, 105);
DBMS_OUTPUT.PUT_LINE('The ID of the shortest path from N1 to N5 is: ' || path_id);
 
-- List the properties of the path: cost, nodes, and links.
res_numeric := sdo_net_mem.path.get_cost('XYZ_NETWORK', path_id);
DBMS_OUTPUT.PUT_LINE('The cost of this path is: ' || res_numeric);
res_array:= sdo_net_mem.path.get_node_ids('XYZ_NETWORK', path_id);
DBMS_OUTPUT.PUT('This path has the following nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
res_array:= sdo_net_mem.path.get_link_ids('XYZ_NETWORK', path_id);
DBMS_OUTPUT.PUT('This path has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- Add the path to the network memory object.
sdo_net_mem.network.add_path(net_mem=>'XYZ_NETWORK', path_id=>path_id);
 
-- Write changes to the database and commit changes.
sdo_net_mem.network_manager.write_network(net_mem=>'XYZ_NETWORK');
 
-- Drop the network memory object.
sdo_net_mem.network_manager.drop_network(net_mem=>'XYZ_NETWORK');
 
END;
/
The ID of the shortest path from N1 to N5 is: 1
The cost of this path is: 50
This path has the following nodes: 101 103 104 105
This path has the following links: 1102 1104 1105

5.9 Network Data Model Tables

The connectivity information for a spatial network is stored in two tables: a node table and a link table. In addition, path information can be stored in a path table and a path-link table. You can have Spatial create these tables automatically when you create the network using a CREATE_<network-type>_NETWORK procedure; or you can create these tables using the SDO_NET.CREATE_NODE_TABLE, SDO_NET.CREATE_LINK_TABLE, SDO_NET.CREATE_PATH_TABLE, and SDO_NET.CREATE_PATH_LINK_TABLE procedures.

These tables contain columns with predefined names, and you must not change any of the predefined column names; however, you can add columns to the tables by using the ALTER TABLE statement with the ADD COLUMN clause. For example, although each link and path table is created with a single COST column, you can create additional columns and associate them with other comparable attributes. Thus, to assign a driving time, scenic appeal rating, and a danger rating to each link, you could use the COST column for driving time, add columns for SCENIC_APPEAL and DANGER to the link table, and populate all three columns with values to be interpreted by applications.

The following considerations apply to schema, table, and column names that are stored in any Oracle Spatial metadata views. For example, these considerations apply to the names of node, link, path, and path-link tables, and to the names of any columns in these tables that are stored in the network metadata views described in Section 5.10.

  • The name must contain only letters, numbers, and underscores. For example, the name cannot contain a space ( ), an apostrophe ('), a quotation mark ("), or a comma (,).

  • All letters in the names are converted to uppercase before the names are stored in metadata views or before the tables are accessed. This conversion also applies to any schema name specified with the table name.

5.9.1 Node Table

Each network has a node table that can contain the columns described in Table 5-1. (The specific columns depend on the network type and whether the network is hierarchical or not.)

Table 5-1 Node Table Columns

Column NameData TypeDescription

NODE_ID

NUMBER

ID number that uniquely identifies this node within the network

NODE_NAME

VARCHAR2(32)

Name of the node

NODE_TYPE

VARCHAR2(24)

User-defined string to identify the node type

ACTIVE

VARCHAR2(1)

Contains Y if the node is active (visible in the network), or N if the node is not active.

PARTITION_ID

NUMBER

(Not used. Instead, node and partition relationships are stored in the partition table, which is described in Section 5.9.6.)

<node_geometry_column>, or GEOM_ID and MEASURE

SDO_GEOMETRY, or SDO_TOPO_GEOMETRY, or NUMBER

For a spatial (SDO, non-LRS) network, the SDO_GEOMETRY object associated with the node

For a spatial topology network, the SDO_TOPO_GEOMETRY object associated with the node

For a spatial LRS network, GEOM_ID and MEASURE column values (both of type NUMBER) for the geometry objects associated with the node

For a logical network, this column is not used.

For a spatial SDO or topology network, the actual column name is either a default name or what you specified as the geom_column parameter value in the call to the SDO_NET.CREATE_NODE_TABLE procedure.

<node_cost_column>

NUMBER

Cost value to be associated with the node, for use by applications that use the network. The actual column name is either a default name or what you specified as the cost_column parameter value in the call to the SDO_NET.CREATE_NODE_TABLE procedure. The cost value can represent anything you want, for example, the toll to be paid at a toll booth.

HIERARCHY_LEVEL

NUMBER

For hierarchical networks only: number indicating the level in the network hierarchy for this node. (Section 5.5 explains network hierarchy.)

PARENT_NODE_ID

NUMBER

For hierarchical networks only: node ID of the parent node of this node. (Section 5.5 explains network hierarchy.)


5.9.2 Link Table

Each network has a link table that contains the columns described in Table 5-2.

Table 5-2 Link Table Columns

Column NameData TypeDescription

LINK_ID

NUMBER

ID number that uniquely identifies this link within the network

LINK_NAME

VARCHAR2(32)

Name of the link

START_NODE_ID

NUMBER

Node ID of the node that starts the link

END_NODE_ID

NUMBER

Node ID of the node that ends the link

LINK_TYPE

VARCHAR2(24)

User-defined string to identify the link type

ACTIVE

VARCHAR2(1)

Contains Y if the link is active (visible in the network), or N if the link is not active.

LINK_LEVEL

NUMBER

Priority level for the link; used for network analysis, so that links with higher priority levels can be considered first in computing a path

<link_geometry_column>; or GEOM_ID, START_MEASURE, and END_MEASURE

SDO_GEOMETRY, or SDO_TOPO_GEOMETRY, or NUMBER

For a spatial (SDO, non-LRS) network, the SDO_GEOMETRY object associated with the link

For a spatial topology network, the SDO_TOPO_GEOMETRY object associated with the link

For a spatial LRS network, GEOM_ID, START_MEASURE, and END_MEASURE column values (all of type NUMBER) for the geometry objects associated with the link

For a logical network, this column is not used.

For a spatial SDO or topology network, the actual column name is either a default name or what you specified as the geom_column parameter value in the call to the SDO_NET.CREATE_LINK_TABLE procedure.

<link_cost_column>

NUMBER

Cost value to be associated with the link, for use by applications that use the network. The actual column name is either a default name or what you specified as the cost_column parameter value in the call to the SDO_NET.CREATE_LINK_TABLE procedure. The cost value can represent anything you want, for example, the estimated driving time for the link.

PARENT_LINK_ID

NUMBER

For hierarchical networks only: link ID of the parent link of this link. (Section 5.5 explains parent-child relationships in a network hierarchy.)

BIDIRECTED

VARCHAR2(1)

For directed networks only: contains Y if the link is undirected (that is, can be traversed either from the start node to the end node or from the end node to the start node), or N if the link is directed (in one direction only, from the start node to the end node).


5.9.3 Path Table

Each network can have a path table. A path is an ordered sequence of links, and is usually created as a result of network analysis. A path table provides a way to store the result of this analysis. For each path table, you must create an associated path-link table (described in Section 5.9.4). Each path table contains the columns described in Table 5-3.

Table 5-3 Path Table Columns

Column NameData TypeDescription

PATH_ID

NUMBER

ID number that uniquely identifies this path within the network

PATH_NAME

VARCHAR2(32)

Name of the path

PATH_TYPE

VARCHAR2(24)

User-defined string to identify the path type

START_NODE_ID

NUMBER

Node ID of the node that starts the first link in the path

END_NODE_ID

NUMBER

Node ID of the node that ends the last link in the path

COST

NUMBER

Cost value to be associated with the path, for use by applications that use the network. The cost value can represent anything you want, for example, the estimated driving time for the path.

SIMPLE

VARCHAR2(1)

Contains Y if the path is a simple path, or N if the path is a complex path. In a simple path, the links form an ordered list that can be traversed from the start node to the end node with each link visited once. In a complex path, there are multiple options for going from the start node to the end node.

<path_geometry_column>

SDO_GEOMETRY

For all network types except logical, the geometry object associated with the path. The actual column name is either a default name or what you specified as the geom_column parameter value in the call to the SDO_NET.CREATE_PATH_TABLE procedure.

For a logical network, this column is not used.


5.9.4 Path-Link Table

For each path table (described in Section 5.9.3), you must create a path-link table. Each row in the path-link table uniquely identifies a link within a path in a network; that is, each combination of PATH_ID, LINK_ID, and SEQ_NO values must be unique within the network. The order of rows in the path-link table is not significant. Each path-link table contains the columns described in Table 5-4.

Table 5-4 Path-Link Table Columns

Column NameData TypeDescription

PATH_ID

NUMBER

ID number of the path in the network

LINK_ID

NUMBER

ID number of the link in the network

SEQ_NO

NUMBER

Unique sequence number of the link in the path. (The sequence numbers start at 1.) Sequence numbers allow paths to contain repeating nodes and links.


5.9.5 Subpath Table

Each path can have one or more associated subpaths, and information about all subpaths in a network is stored in the subpath table. A subpath is a partial path along a path, as explained in Section 5.3. The subpath table contains the columns described in Table 5-5.

Table 5-5 Subpath Table Columns

Column NameData TypeDescription

SUBPATH_ID

NUMBER

ID number that uniquely identifies this subpath within the reference path

SUBPATH_NAME

VARCHAR2(32)

Name of the subpath

SUBPATH_TYPE

VARCHAR2(24)

User-defined string to identify the subpath type

REFERENCE_PATH_ID

NUMBER

Path ID number of the path that contains this subpath

START_LINK_INDEX

NUMBER

Link ID of the link used to define the start of the subpath. For example, in Figure 5-2 in Section 5.3, the START_LINK_INDEX is 0, and the START_PERCENTAGE is 0.65.

END_LINK_INDEX

NUMBER

Link ID of the link used to define the end of the subpath. For example, in Figure 5-2 in Section 5.3, the END_LINK_INDEX is 6, and the END_PERCENTAGE is 0.5.

START_PERCENTAGE

NUMBER

Percentage of the distance between START_LINK_INDEX and the next link in the path, representing the start point of the subpath. Can be a positive or negative number. For example, in Figure 5-2 in Section 5.3, the START_LINK_INDEX is 0, and the START_PERCENTAGE is 0.65. ("Percentage" values in this case are expressed as between 0 and 1.0, so 0.65 is 65 percent.)

END_PERCENTAGE

NUMBER

Percentage of the distance between END_LINK_INDEX and the next link in the path, representing the end point of the subpath. Can be a positive or negative number. For example, in Figure 5-2 in Section 5.3, the END_LINK_INDEX is 6, and the END_PERCENTAGE is 0.5. ("Percentage" values in this case are expressed as between 0 and 1.0, so 0.5 is 50 percent.)

COST

NUMBER

Cost value to be associated with the subpath, for use by applications that use the network. The cost value can represent anything you want, for example, the estimated driving time for the path.

GEOM

SDO_GEOMETRY

For all network types except logical, the geometry object associated with the subpath. The actual column name is either a default name or what you specified as the geom_column parameter value in the call to the SDO_NET.CREATE_SUBPATH_TABLE procedure.

For a logical network, this column is not used.


5.9.6 Partition Table

Each partitioned network has a partition table. For information about partitioned networks, see Section 5.7. Each partition table contains the columns described in Table 5-6.

Table 5-6 Partition Table Columns

Column NameData TypeDescription

NODE_ID

NUMBER

ID number of the node

PARTITION_ID

NUMBER

ID number of the partition. Must be unique within the network.

LINK_LEVEL

NUMBER

Link level (Link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.)


5.9.7 Partition BLOB Table

Each partitioned network can have a partition BLOB table, which stores binary large object (BLOB) representations for each combination of link level and partition ID in the network. Having BLOB representations of partitions enables better performance for network load on demand analysis operations. To create the partition BLOB table, use the SDO_NET.GENERATE_PARTITION_BLOBS procedure, where you specify the partition BLOB table name as one of the parameters. For information about partitioned networks, see Section 5.7.


Note:

You should never directly modify the partition BLOB table. This table is automatically updated as a result of calls to the SDO_NET.GENERATE_PARTITION_BLOBS and SDO_NET.GENERATE_PARTITION_BLOB procedures.

Each partition table contains the columns described in Table 5-7.

Table 5-7 Partition BLOB Table Columns

Column NameData TypeDescription

LINK_LEVEL

VARCHAR2(32)

Link level (Link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.)

PARTITION_ID

NUMBER

ID number of the partition

BLOB

BLOB

Binary large object (BLOB) representing the specified link level within the specified partition

NUM_INODES

NUMBER

Number of internal nodes in the BLOB (that is, total number of nodes in the BLOB)

NUM_ENODES

NUMBER

Number of external nodes. An external node is a node that is outside the BLOB, but is one end of a link in which the other node is inside the BLOB.

NUM_ILINKS

NUMBER

Number of internal links in the BLOB (that is, links completely inside the BLOB)

NUM_ELINKS

NUMBER

Number of external links. An external link is a link in which one node is internal (inside the BLOB) and one node is external (outside the BLOB).

NUM_INLINKS

NUMBER

Number of incoming links. An incoming link is an external link in which the start node is outside the BLOB and the end node is inside the BLOB.

NUM_OUTLINKS

NUMBER

Number of outgoing links. An outgoing link is an external link in which the start node is inside the BLOB and the end node is outside the BLOB.

USER_DATA_INCLUDED

VARCHAR2(1)

Contains Y if the BLOB can include user data, or N if the BLOB cannot include user data.


5.9.8 Connected Component Table

Each network can have a connected component table, which stores the component ID for each node. Nodes of the same connected component have the same component ID. Having this information in the table enables better performance for many network analysis operations. To create the connected component table, and to update the contents of the table at any time afterwards, use the SDO_NET.FIND_CONNECTED_COMPONENTS procedure, where you specify the connected component table name as one of the parameters. For more information about using the precomputed information about connected components, see Section 5.7.6.

Each connected component table contains the columns described in Table 5-8.

Table 5-8 Connected Component Table Columns

Column NameData TypeDescription

LINK_LEVEL

NUMBER

Link level of the component assignment. (Link level reflects the priority level for the link, and is used for network analysis, so that links with higher priority levels can be considered first in computing a path.)

NODE_ID

NUMBER

ID number of the node from which to compute all other components that are reachable.

COMPONENT_ID

NUMBER

ID number of a component that is reachable from the specified node.


5.10 Network Data Model Metadata Views

There is a set of network metadata views for each schema (user): xxx_SDO_NETWORK_METADATA, where xxx can be USER or ALL. These views are created by Spatial.

5.10.1 xxx_SDO_NETWORK_METADATA Views

The following views contain information about networks:

  • USER_SDO_NETWORK_METADATA contains information about all networks owned by the user.

  • ALL_SDO_NETWORK_METADATA contains information about all networks on which the user has SELECT permission.

If you create a network using one of the CREATE_<network-type>_NETWORK procedures, the information in these views is automatically updated to reflect the new network; otherwise, you must insert information about the network into the USER_SDO_NETWORK_METADATA view.

The USER_SDO_NETWORK_METADATA and ALL_SDO_NETWORK_METADATA views contain the same columns, as shown Table 5-9, except that the USER_SDO_NETWORK_METADATA view does not contain the OWNER column. (The columns are listed in their order in the view definition.)

Table 5-9 Columns in the xxx_SDO_NETWORK_METADATA Views

Column NameData TypePurpose

OWNER

VARCHAR2(32)

Owner of the network (ALL_SDO_NETWORK_METADATA view only)

NETWORK

VARCHAR2(24)

Name of the network

NETWORK_ID

NUMBER

ID number of the network; assigned by Spatial

NETWORK_CATEGORY

VARCHAR2(12)

Contains SPATIAL if the network nodes and links are associated with spatial geometries; contains LOGICAL if the network nodes and links are not associated with spatial geometries. A value of LOGICAL causes the network data model PL/SQL and Java APIs to ignore any spatial attributes of nodes, links, and paths.

GEOMETRY_TYPE

VARCHAR2(24)

If NETWORK_CATEGORY is SPATIAL, contains a value indicating the geometry type of nodes and links: SDO_GEOMETRY for non-LRS SDO_GEOMETRY objects, LRS_GEOMETRY for LRS SDO_GEOMETRY objects, TOPO_GEOMETRY for SDO_TOPO_GEOMETRY objects.

NETWORK_TYPE

VARCHAR2(24)

User-defined string to identify the network type.

NO_OF_HIERARCHY_LEVELS

NUMBER

Number of levels in the network hierarchy. Contains 1 if there is no hierarchy. (See Section 5.5 for information about network hierarchy.)

NO_OF_PARTITIONS

NUMBER

(Not currently used)

LRS_TABLE_NAME

VARCHAR2(32)

If GEOMETRY_TYPE is SDO_GEOMETRY, contains the name of the table containing geometries associated with nodes.

LRS_GEOM_COLUMN

VARCHAR2(32)

If LRS_TABLE_NAME contains a table name, identifies the geometry column in that table.

NODE_TABLE_NAME</p>

VARCHAR2(32)

If GEOMETRY_TYPE is SDO_GEOMETRY, contains the name of the table containing geometries associated with nodes. (The node table is described in Section 5.9.1.)

NODE_GEOM_COLUMN

VARCHAR2(32)

If NODE_TABLE_NAME contains a table name, identifies the geometry column in that table.

NODE_COST_COLUMN

VARCHAR2(1024)

If NODE_TABLE_NAME contains a table name, identifies the cost column in that table, or a PL/SQL function to compute the cost value.

NODE_PARTITION_COLUMN

VARCHAR2(32)

(Not currently used).

NODE_DURATION_COLUMN

VARCHAR2(32)

If NODE_TABLE_NAME contains a table name, identifies the optional duration column in that table. This column can contain a numeric value that has any user-defined significance, such as a number of minutes associated with the node.

LINK_TABLE_NAME

VARCHAR2(32)

If GEOMETRY_TYPE is SDO_GEOMETRY, contains the name of the table containing geometries associated with links. (The link table is described in Section 5.9.2.)

LINK_GEOM_COLUMN

VARCHAR2(32)

If LINK_TABLE_NAME contains a table name, identifies the geometry column in that table.

LINK_DIRECTION

VARCHAR2(12)

Contains a value indicating the type for all links in the network: UNDIRECTED or DIRECTED.

LINK_COST_COLUMN

VARCHAR2(1024)

If LINK_TABLE_NAME contains a table name, identifies the optional numeric column containing a cost value for each link, or a PL/SQL function to compute the cost value.

LINK_PARTITION_COLUMN

VARCHAR2(32)

(Not currently used)

LINK_DURATION_COLUMN

VARCHAR2(32)

If LINK_TABLE_NAME contains a table name, identifies the optional duration column in that table. This column can contain a numeric value that has any user-defined significance, such as a number of minutes associated with the link.

PATH_TABLE_NAME

VARCHAR2(32)

Contains the name of an optional table containing information about paths. (The path table is described in Section 5.9.3.)

PATH_GEOM_COLUMN

VARCHAR2(32)

If PATH_TABLE_NAME is associated with a spatial network, identifies the geometry column in that table.

PATH_LINK_TABLE_NAME

VARCHAR2(32)

Contains the name of an optional table containing information about links for each path. (The path-link table is described in Section 5.9.4.)

SUBPATH_TABLE_NAME

VARCHAR2(32)

Contains the name of an optional table containing information about subpaths. (The subpath table is described in Section 5.9.5.)

SUBPATH_GEOM_COLUMN

VARCHAR2(32)

If SUBPATH_TABLE_NAME is associated with a spatial network, identifies the geometry column in that table.

PARTITION_TABLE_NAME

VARCHAR2(32)

For a partitioned network: the name of the partition table. (The partition table is described in Section 5.9.6.

PARTITION_BLOB_TABLE_NAME

VARCHAR2(32)

For a partitioned network for which any partition BLOBs have been generated: the name of the partition BLOB table. (The partition BLOB table is described in Section 5.9.7.

COMPONENT_TABLE_NAME

VARCHAR2(32)

The name of the table containing information about precomputed connected components, as explained in Section 5.7.6. (The connected component table is described in Section 5.9.8.)

NODE_LEVEL_TABLE_NAME

VARCHAR2(32)

The name of the table containing information about node levels in a hierarchical network. Specify this table as the node_level_table_name parameter with the SDO_NET.GENERATE_NODE_LEVELS procedure.

TOPOLOGY

VARCHAR2(32)

For a spatial network containing SDO_TOPO_GEOMETRY objects (creating using the SDO_NET.CREATE_TOPO_NETWORK procedure), contains the name of the topology.

USER_DEFINED_DATA

VARCHAR2(1)

Contains Y if the network contains user-defined data; contains N if the network does not contain user-defined data.

EXTERNAL_REFERENCES

VARCHAR2(1)

(Not currently used)


5.10.2 xxx_SDO_NETWORK_CONSTRAINTS Views

The following views contain information about network constraints (described in Section 5.6):

  • USER_SDO_NETWORK_CONSTRAINTS contains information about all network constraints owned by the user.

  • ALL_SDO_NETWORK_CONSTRAINTS contains information about all network constraints on which the user has SELECT permission.

These views are automatically maintained by the SDO_NET.REGISTER_CONSTRAINT and SDO_NET.DEREGISTER_CONSTRAINT procedures. You should not directly modify the contents of these views.

The USER_SDO_NETWORK_CONSTRAINTS and ALL_SDO_NETWORK_CONSTRAINTS views contain the same columns, as shown Table 5-10, except that the USER_SDO_NETWORK_CONSTRAINTS view does not contain the OWNER column. (The columns are listed in their order in the view definition.)

Table 5-10 Columns in the xxx_SDO_NETWORK_CONSTRAINTS Views

Column NameData TypePurpose

OWNER

VARCHAR2(32)

Owner of the network constraint (ALL_SDO_NETWORK_CONSTRAINTS view only)

CONSTRAINT

VARCHAR2(32)

Name of the network constraint

DESCRIPTION

VARCHAR2(200)

Descriptive information about the network constraint, such as its purpose and any usage notes

CLASS_NAME

VARCHAR2(4000)

Name of the Java class that implements the network constraint

CLASS

BINARY FILE LOB

The Java class that implements the network constraint


5.10.3 xxx_SDO_NETWORK_USER_DATA Views

The following views contain information about network user-defined data, which is the information (not related to connectivity) that users want to associate with a network representation:

  • USER_SDO_NETWORK_USER_DATA contains information about all network user-defined data owned by the user.

  • ALL_SDO_NETWORK_USER_DATA contains information about all network user-defined data on which the user has SELECT permission.

The USER_SDO_NETWORK_USER_DATA and ALL_SDO_NETWORK_USER_DATA views contain the same columns, as shown Table 5-10, except that the USER_SDO_NETWORK_USER_DATA view does not contain the OWNER column. (The columns are listed in their order in the view definition.)

Table 5-11 Columns in the xxx_SDO_NETWORK_USER_DATA Views

Column NameData TypePurpose

OWNER

VARCHAR2(32)

Owner of the network constraint (ALL_SDO_NETWORK_CONSTRAINTS view only)

NETWORK

VARCHAR2(32)

Name of the network

TABLE_TYPE

VARCHAR2(12)

Type of the table containing the user-defined data: NODE, LINK, PATH, or SUBPATH

DATA_NAME

VARCHAR2(32)

Name of column containing the user-defined data

DATA_TYPE

VARCHAR2(12)

Data type of the user-defined data: VARCHAR2, INTEGER, NUMBER, DATE, TIMESTAMP, or SDO_GEOMETRY

DATA_LENGTH

NUMBER(38)

If DATA_TYPE is VARCHAR2, the length of the user-defined data


To use user-defined data, you must set the USER_DEFINED_DATA column value to Y in the appropriate xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

For an example of using user-defined data, see Section 5.13.6.

5.11 Network Data Model Application Programming Interface

The Oracle Spatial network data model includes two client application programming interfaces (APIs): a PL/SQL interface provided by the SDO_NET and SDO_NET_MEM packages and a Java interface. Both interfaces let you create and update network data, and perform network analysis. It is recommended that you use only PL/SQL or SQL to populate network tables and to create indexes, and that you use either PL/SQL or Java for application development.

The following performance considerations apply to the PL/SQL and Java APIs:

  • If you plan to analyze or edit only nonspatial aspects of a spatial network, you can get better performance by setting the NETWORK_CATEGORY column value to LOGICAL in the USER_SDO_NETWORK_METADATA view (described in Section 5.10.1) before performing the analysis or editing, and then changing the value back to SPATIAL afterward.

    For example, you could use this technique when finding the shortest path between two nodes, because the shortest-path computation considers cost values. However, you could not use this technique when setting the spatial geometry object or the end measure value for a link.

  • If you do not plan to modify any network objects (that is, if you plan to perform only network analysis operations or to retrieve network information), you can get better performance by creating the network memory object as read-only (that is, by specifying that updates are not allowed).

5.11.1 Network Data Model PL/SQL Interface

The SDO_NET package provides subprograms for creating, accessing, and managing networks on a database server. The SDO_NET_MEM package, which implements capabilities available through the Java API, provides subprograms for editing network objects and performing network analysis using a cache object called a network memory object. Example 5-4 in Section 5.13 shows the use of SDO_NET functions and procedures. Section 5.8 explains how to use a network memory object, and it contains Example 5-1, which uses SDO_NET_MEM functions and procedures.

The SDO_NET subprograms can be grouped into the following logical categories:

For reference information about each SDO_NET function and procedure, see Chapter 6.

The SDO_NET_MEM subprograms are grouped according to their associated object-related class in the oracle.spatial.network interface or class. You must specify a prefix after SDO_NET_MEM for each program, depending on its associated class (for example, SDO_NET_MEM.NETWORK_MANAGER.CREATE_LOGICAL_NETWORK, SDO_NET_MEM.NETWORK.ADD_NODE, and SDO_NET_MEM.NODE.GET_COST).


Note:

Although this manual refers to "the SDO_NET_MEM package," all subprograms except one are actually implemented as methods of several object types. Thus, they are not listed by the statement DESCRIBE SDO_NET_MEM. Instead, you can use the DESCRIBE statements listed in Table 7-1 in Chapter 7 to see the subprograms in each grouping; however, because they are member functions and procedures in an object type, the subprograms in each grouping will not be listed in alphabetical order in the DESCRIBE statement output.

The SDO_NET_MEM subprogram groupings are as follows:

  • SDO_NET_MEM.NETWORK_MANAGER subprograms are related to the oracle.spatial.network.NetworkManager Java class. They enable you to create and drop network memory objects and to perform network analysis.

  • SDO_NET_MEM.NETWORK subprograms are related to the oracle.spatial.network.Network Java interface. They enable you to add and delete nodes, links, and paths.

  • SDO_NET_MEM.NODE subprograms are related to the oracle.spatial.network.Node Java interface. They enable you to get and set attributes for nodes.

  • SDO_NET_MEM.LINK subprograms are related to the oracle.spatial.network.Link Java interface. They enable you to get and set attributes for links.

  • SDO_NET_MEM.PATH subprograms are related to the oracle.spatial.network.Path Java interface. They enable you to get and set attributes for paths.

The associations between SDO_NET_MEM subprograms and methods of the Java API are not necessarily exact. In some cases, a PL/SQL subprogram may combine operations and options from several methods. In addition, some Java methods do not have PL/SQL counterparts. Thus, the Usage Notes for subprograms state only that the function or procedure is analogous to a specific Java method, to indicate a logical relationship between the two. For detailed information about a specific Java method and others that may be related, see the Javadoc-generated API documentation (briefly explained in Section 5.11.2).

For reference information about each SDO_NET_MEM function and procedure, see Chapter 7.

5.11.2 Network Data Model Java Interface

The network data model Java interface includes the in-memory interface and the load on demand interface. Complete reference information about these interfaces is provided in Oracle Spatial Java API Reference. The classes of the in-memory Java interface are in the oracle.spatial.network package. The classes of the load on demand Java interface are in the oracle.spatial.network.lod package and its subpackages.

The Spatial Java class libraries are in .jar files under the <ORACLE_HOME>/md/jlib/ directory.

5.11.2.1 Network Metadata and Data Management

You can use the Java API to perform network metadata and data management operations such as the following:

  • Insert, delete, and modify node and link data

  • Load a network from a database

  • Store a network in a database

  • Store network metadata in a database

  • Modify network metadata attributes

5.11.2.2 Network Analysis Using the In-Memory Approach

You can use the oracle.spatial.network.NetworkManager class to perform network analysis operations, such as the following, using the in-memory approach:

  • Shortest path: typical transitive closure problems in graph theory. Given a start and an end node, find the shortest path.

  • Minimum cost spanning tree: Given an undirected graph, find the minimum cost tree that connects all nodes.

  • Reachability: Given a node, find all nodes that can reach that node, or find all nodes that can be reached by that node.

  • Within-cost analysis: Given a target node and a cost, find all nodes that can be reached by the target node within the given cost.

  • Nearest-neighbors analysis: Given a target node and number of neighbors, find the neighbor nodes and their costs to go to the given target node.

  • All paths between two nodes: Given two nodes, find all possible paths between them.

  • TSP ("traveling salesman problem" or "traveling salesperson problem") analysis: Given a set of nodes, find the most efficient (lowest-cost or shortest distance) path that visits all nodes, and optionally require that the start and end nodes be the same.

5.11.2.3 Network Analysis Using the Load on Demand Approach

You can use the oracle.spatial.network.lod.NetworkAnalyst class to perform network analysis operations, such as the following, using the load on demand approach:

  • Shortest path: typical transitive closure problems in graph theory. Given a start and an end node, find the shortest path.

  • Reachability: Given a node, find all nodes that can reach that node, or find all nodes that can be reached by that node.

  • Within-cost analysis: Given a target node and a cost, find all nodes that can be reached by the target node within the given cost.

  • Nearest-neighbors analysis: Given a target node and number of neighbors, find the neighbor nodes and their costs to go to the given target node.

  • Dynamic data input: Create and use a NetworkUpdate object with network update information.

  • User-defined link and node cost calculators: Define the method for computing the cost of a link or a node.

5.12 Cross-Schema Network Access

If database users other than the network owner need to read a network into memory, you need to do one of the following:

  • For each non-owner user, qualify the network tables with the schema of the network owner in the USER_SDO_NETWORK_METADATA view, as explained in Section 5.12.1.

  • For each non-owner user, create views on the network data model tables and update the USER_SDO_NETWORK_METADATA view, as explained in Section 5.12.2.

The second approach requires the extra step of creating views, but the views provide you with flexibility in controlling the parts of the network that are accessible. Each view can provide access to all of the network, or it can use a WHERE clause to provide access to just one or more parts (for example, WHERE STATE_CODE='NY' to restrict the view users to rows for New York) .

Consider the following example scenario:

  • User1 creates (and thus owns) Network1.

  • User2 attempts to call the SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK procedure to read Network1, but receives an error. The error occurs even though User2 has the appropriate privileges on the network data model tables for Network1.

To work around this problem, you must use the approach in either Section 5.12.1, "Cross-Schema Access by Specifying Owner in Network Metadata" or Section 5.12.2, "Cross-Schema Access by Using Views".

5.12.1 Cross-Schema Access by Specifying Owner in Network Metadata

To enable a non-owner user (with suitable privileges) to access a network, you can specify the network owner in the network metadata. For each non-owner user that will be permitted to access the network, follow these steps:

  1. Ensure that the user has SELECT access to the necessary network data model tables. If the user does not have this access, connect as the network owner and grant it. For example, connect as User1 and execute the following statements:

    GRANT select ON network1_node$ TO user2;
    GRANT select ON network1_link$ TO user2;
    GRANT select ON network1_path$ TO user2;
    GRANT select ON network1_plink$ TO user2;
    
  2. Connect as the non-owner user. For example, connect as User2.

  3. Use the schema name of the network owner to qualify the network data model tables for the network in the USER_SDO_NETWORK_METADATA view (explained in Section 5.10.1). For example, if the network is not already defined in this view, enter the following while connected as User2:

    INSERT INTO user_sdo_network_metadata 
      (network, network_category, geometry_type, 
       node_table_name,node_geom_column,
       link_table_name, link_geom_column, link_direction,
       path_table_name, path_geom_column,
       path_link_table_name)
    VALUES
      ('NETWORK1','SPATIAL', 'SDO_GEOMETRY',
       'USER1.NETWORK1_NODE$', 'GEOMETRY',
       'USER1.NETWORK1_LINK$', 'GEOMETRY', 'DIRECTED',
       'USER1.NETWORK1_PATH$', 'GEOMETRY',
       'USER1.NETWORK1_PLINK$');
    

    If the network is already defined in this view, update the definition to qualify each table name with the schema name. For example:

    UPDATE USER_SDO_NETWORK_METADATA
      SET node_table_name = 'USER1.NETWORK1_NODE$',
          link_table_name = 'USER1.NETWORK1_LINK$',
          path_table_name = 'USER1.NETWORK1_PATH$',
          path_link_table_name = 'USER1.NETWORK1_PLINK$'
      WHERE network = 'NETWORK1';
    

In this scenario, User2 can now read NETWORK1 into memory.

5.12.2 Cross-Schema Access by Using Views

To enable a non-owner user (with suitable privileges) to access a network, or specific parts of a network, you can create views. For each non-owner user that will be permitted to access the network, follow these steps:

  1. Ensure that the user has SELECT access to the necessary network data model tables. If the user does not have this access, connect as the network owner and grant it. For example, connect as User1 and execute the following statements:

    GRANT select ON network1_node$ TO user2;
    GRANT select ON network1_link$ TO user2;
    GRANT select ON network1_path$ TO user2;
    GRANT select ON network1_plink$ TO user2;
    
  2. Connect as the non-owner user. For example, connect as User2.

  3. Create a view on each of the necessary network data model nodes, with each view selecting all columns in the associated table. Qualify the table name with the schema name of the network owner. For example, while connected as User2:

    CREATE VIEW network1_node$ AS select * from user1.network1_node$;
    CREATE VIEW network1_link$ AS select * from user1.network1_link$;
    CREATE VIEW network1_path$ AS select * from user1.network1_path$;
    CREATE VIEW network1_plink$ AS select * from user1.network1_plink$;
    

    Note:

    Although this example shows views that include all data in the underlying tables, you can restrict the parts of the network that are available by using a WHERE clause in each view definition (for example, WHERE STATE_CODE='NY').

  4. Add a row specifying the newly created views to the USER_SDO_NETWORK_METADATA view (explained in Section 5.10.1). For example, while connected as User2:

    INSERT INTO user_sdo_network_metadata 
      (network, network_category, geometry_type, 
       node_table_name,node_geom_column,
       link_table_name, link_geom_column, link_direction,
       path_table_name, path_geom_column,
       path_link_table_name)
    VALUES
      ('NETWORK1','SPATIAL', 'SDO_GEOMETRY',
       'NETWORK1_NODE$', 'GEOMETRY',
       'NETWORK1_LINK$', 'GEOMETRY', 'DIRECTED',
       'NETWORK1_PATH$', 'GEOMETRY',
       'NETWORK1_PLINK$');
    

In this scenario, User2 can now read into memory those parts of NETWORK1 that are available through the views that were created.

5.13 Network Examples

This section presents several network data model examples. Most are simplified examples. All examples use the PL/SQL API, and some also use other APIs. This section includes the following subsections:

The examples refer to concepts that are explained in this chapter, and they use PL/SQL functions and procedures documented in Chapter 6.

5.13.1 Simple Spatial (SDO) Network Example (PL/SQL)

This section presents an example of a very simple spatial (SDO, not LRS) network that contains three nodes and a link between each node. The network is illustrated in Figure 5-4.

Figure 5-4 Simple Spatial (SDO) Network

Description of Figure 5-4 follows
Description of "Figure 5-4 Simple Spatial (SDO) Network"

As shown in Figure 5-4, node N1 is at point 1,1, node N2 is at point 15,1, and node N3 is at point 9,4. Link L1 is a straight line connecting nodes N1 and N2, link L2 is a straight line connecting nodes N2 and N3, and link L3 is a straight line connecting nodes N3 and N1. There are no other nodes or shape points on any of the links.

Example 5-2 does the following:

  • In a call to the SDO_NET.CREATE_SDO_NETWORK procedure, creates the SDO_NET1 directed network; creates the SDO_NET1_NODE$, SDO_NET1_LINK$, SDO_NET1_PATH$, and SDO_NET1_PLINK$ tables; and updates the xxx_SDO_NETWORK_METADATA views. All geometry columns are named GEOMETRY. Both the node and link tables contain a cost column named COST.

  • Populates the node, link, path, and path-link tables. It inserts three rows into the node table, three rows into the link table, two rows into the path table, and four rows into the path-link table.

  • Updates the Oracle Spatial metadata, and creates spatial indexes on the GEOMETRY columns of the node and link tables. (These actions are not specifically related to network management, but that are necessary if applications are to benefit from spatial indexing on these geometry columns.)

Example 5-2 does not show the use of many SDO_NET functions and procedures; these are included in Example 5-4 in Section 5.13.3.

Example 5-2 Simple Spatial (SDO) Network Example (PL/SQL)

-- Create the SDO_NET1 directed network. Also creates the SDO_NET1_NODE$, 
-- SDO_NET1_LINK$, SDO_NET1_PATH$, SDO_NET1_PLINK$ tables, and updates 
-- USER_SDO_NETWORK_METADATA. All geometry columns are named GEOMETRY. 
-- Both the node and link tables contain a cost column named COST. 
EXECUTE SDO_NET.CREATE_SDO_NETWORK('SDO_NET1', 1, TRUE, TRUE);
 
-- Populate the SDO_NET1_NODE$ table.
-- N1
INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost)
  VALUES(1, 'N1', 'Y',
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1,1,NULL), NULL, NULL),
    5);
-- N2
INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost)
  VALUES(2, 'N2', 'Y',
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(15,1,NULL), NULL, NULL),
    8);
-- N3
INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost)
  VALUES(3, 'N3', 'Y',
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,4,NULL), NULL, NULL),
    4);
 
-- Populate the SDO_NET1_LINK$ table.
-- L1
INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, geometry, cost, bidirected)
  VALUES(1, 'L1', 1, 2, 'Y',
    SDO_GEOMETRY(2002, NULL, NULL, 
      SDO_ELEM_INFO_ARRAY(1,2,1), 
        SDO_ORDINATE_ARRAY(1,1, 15,1)),
    14, 'Y');
-- L2
INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, geometry, cost, bidirected)
   VALUES(2, 'L2', 2, 3, 'Y',
    SDO_GEOMETRY(2002, NULL, NULL, 
      SDO_ELEM_INFO_ARRAY(1,2,1), 
        SDO_ORDINATE_ARRAY(15,1, 9,4)),
    10, 'Y');
-- L3
INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, geometry, cost, bidirected)
  VALUES(3, 'L3', 3, 1, 'Y',
    SDO_GEOMETRY(2002, NULL, NULL, 
      SDO_ELEM_INFO_ARRAY(1,2,1), 
        SDO_ORDINATE_ARRAY(9,4, 1,1)),
    10, 'Y');
 
-- Do not populate the SDO_NET1_PATH$ and SDO_NET1_PLINK$ tables now.
-- Do this only when you need to create any paths.
 
---------------------------------------------------------------------------
-- REMAINING STEPS NEEDED TO USE SPATIAL INDEXES --
---------------------------------------------------------------------------
-- Update the USER_SDO_GEOM_METADATA view. This is required before the
-- spatial index can be created. Do this only once for each layer
-- (that is, table-column combination).

INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'SDO_NET1_NODE$',
    'GEOMETRY',
    SDO_DIM_ARRAY(   -- 20X20 grid
      SDO_DIM_ELEMENT('X', 0, 20, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
       ),
    NULL   -- SRID (spatial reference system, also called coordinate system)
  );
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
    'SDO_NET1_LINK$',
    'GEOMETRY',
    SDO_DIM_ARRAY(   -- 20X20 grid
      SDO_DIM_ELEMENT('X', 0, 20, 0.005),
      SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
       ),
    NULL   -- SRID (spatial reference system, also called coordinate system)
  );
 
-- Create the spatial indexes
CREATE INDEX sdo_net1_nodes_idx ON sdo_net1_node$(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX sdo_net1_links_idx ON sdo_net1_link$(geometry)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;

5.13.2 Simple Logical Network Example (PL/SQL)

This section presents an example of a very simple logical network that contains three nodes and a link between the nodes. The network is illustrated in Figure 5-5.

Figure 5-5 Simple Logical Network

Description of Figure 5-5 follows
Description of "Figure 5-5 Simple Logical Network"

As shown in Figure 5-5, link L1 is a straight line connecting nodes N1 and N2, link L2 is a straight line connecting nodes N2 and N3, and link L3 is a straight line connecting nodes N3 and N1. There are no other nodes on any of the links.

Example 5-3 calls the SDO_NET.CREATE_LOGICAL_NETWORK procedure, which does the following: creates the LOG_NET1 directed network; creates the LOG_NET1_NODE$, LOG_NET1_LINK$, LOG_NET1_PATH$, and LOG_NET1_PLINK$ tables; and updates the xxx_SDO_NETWORK_METADATA views. Both the node and link tables contain a cost column named COST. (Because this is a logical network, there are no geometry columns.) The example also populates the node and link tables.

Example 5-3 does not show the use of many SDO_NET functions and procedures; these are included in the logical hierarchical network example (Example 5-5) in Section 5.13.4.

Example 5-3 Simple Logical Network Example (PL/SQL)

-- Creates the LOG_NET1 directed logical network. Also creates the
-- LOG_NET1_NODE$, LOG_NET1_LINK$, LOG_NET1_PATH$,
-- and LOG_NET1_PLINK$ tables, and updates USER_SDO_NETWORK_METADATA.
-- Both the node and link tables contain a cost column named COST. 
EXECUTE SDO_NET.CREATE_LOGICAL_NETWORK('LOG_NET1', 1, TRUE, TRUE);
 
-- Populate the LOG_NET1_NODE$ table.
-- N1
INSERT INTO log_net1_node$ (node_id, node_name, active, cost)
  VALUES (1, 'N1', 'Y', 2);
-- N2
INSERT INTO log_net1_node$ (node_id, node_name, active, cost)
  VALUES (2, 'N2', 'Y', 3);
-- N3
INSERT INTO log_net1_node$ (node_id, node_name, active, cost)
  VALUES (3, 'N3', 'Y', 2);
 
-- Populate the LOG_NET1_LINK$ table.
-- L1
INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, link_level, cost)
  VALUES (1, 'L1', 1, 2, 'Y', 1, 10);
-- L2
INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, link_level, cost)
  VALUES (2, 'L2', 2, 3, 'Y', 1, 7);
-- L3
INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id,
     active, link_level, cost)
  VALUES (3, 'L3', 3, 1, 'Y', 1, 8);
 
-- Do not populate the LOG_NET1_PATH$ and LOG_NET1_PLINK$ tables now.
-- Do this only when you need to create any paths.

5.13.3 Spatial (LRS) Network Example (PL/SQL)

This section presents an example of a spatial (LRS) network that uses the roads (routes) illustrated in Figure 5-6. Each road is built from individual line segments (associated with links) taken from one or more road segment geometries, which are also shown in the figure.

Figure 5-6 Roads and Road Segments for Spatial (LRS) Network Example

Description of Figure 5-6 follows
Description of "Figure 5-6 Roads and Road Segments for Spatial (LRS) Network Example"

As shown in Figure 5-6:

  • Route1 starts at point 2,2 and ends at point 5,14. It has the following nodes: N1, N2, N3, N4, N5, N6, and N7. It has the following links: R1L1, R1L2, R1L3, R1L4, R1L5, and R1L6.

  • Route2 starts at point 8,4 and ends at point 8,13. It has the following nodes: N3, N6, and N8. It has the following links: R2L1 and R2L2.

  • Route3 starts at point 12,10 and ends at point 5,14. It has the following nodes: N5, N8, and N7. It has the following links: R3L1 and R3L2.

  • The four road segment geometries are shown individually on the right side of the figure. (The points on each segment are labeled with their associated node names, to clarify how each segment geometry fits into the illustration on the left side.)

Example 5-4 does the following:

  • Creates a table to hold the road segment geometries.

  • Inserts four road segment geometries into the table.

  • Inserts the spatial metadata into the USER_SDO_GEOM_METADATA view.

  • Creates a spatial index on the geometry column in the ROAD_SEGMENTS table.

  • Creates and populates the node table.

  • Creates and populates the link table.

  • Creates and populates the path table and path-link table, for possible future use. (Before an application can use paths, you must populate these two tables.)

  • Inserts network metadata into the USER_SDO_NETWORK_METADATA view.

  • Uses various SDO_NET and SDO_NET_MEM functions and procedures.

Example 5-4 Spatial (LRS) Network Example (PL/SQL)

---------------------------------------------------------------------------
-- CREATE AND POPULATE TABLE --
---------------------------------------------------------------------------
-- Create a table for road segments. Use LRS.
CREATE TABLE road_segments (
  segment_id  NUMBER PRIMARY KEY,
  segment_name  VARCHAR2(32),
  segment_geom  SDO_GEOMETRY, 
  geom_id NUMBER);
 
-- Populate the table with road segments.
INSERT INTO road_segments VALUES(
  1,
  'Segment1',
  SDO_GEOMETRY(
    3302,  -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
    SDO_ORDINATE_ARRAY(
      2,2,0,   -- Starting point - Node1; 0 is measure from start.
      2,4,2,   -- Node2; 2 is measure from start. 
      8,4,8,   -- Node3; 8 is measure from start. 
      12,4,12) -- Node4; 12 is measure from start. 
  ), 1001
);
 
INSERT INTO road_segments VALUES(
  2,
  'Segment2',
  SDO_GEOMETRY(
    3302,  -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
    SDO_ORDINATE_ARRAY(
      8,4,0,   -- Node3; 0 is measure from start. 
      8,10,6,  -- Node6; 6 is measure from start. 
      8,13,9)  -- Ending point - Node8; 9 is measure from start.
  ), 1002
);
 
INSERT INTO road_segments VALUES(
  3,
  'Segment3',
  SDO_GEOMETRY(
    3302,  -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
    SDO_ORDINATE_ARRAY(
      12,4,0,     -- Node4; 0 is measure from start.
      12,10,6,    -- Node5; 6 is measure from start. 
      8,13,11,    -- Node8; 11 is measure from start. 
      5,14,14.16) -- Ending point - Node7; 14.16 is measure from start.
  ), 1003
);
 
INSERT INTO road_segments VALUES(
  4,
  'Segment4',
  SDO_GEOMETRY(
    3302,  -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments
    SDO_ORDINATE_ARRAY(
      12,10,0, -- Node5; 0 is measure from start.
      8,10,4,  -- Node6; 4 is measure from start.  
      5,14,9)  -- Ending point - Node7; 9 is measure from start.
  ), 1004
);
 
---------------------------------------------------------------------------
-- UPDATE THE SPATIAL METADATA --
---------------------------------------------------------------------------
-- Update the USER_SDO_GEOM_METADATA view. This is required before the
-- spatial index can be created. Do this only once for each layer
-- (that is, table-column combination; here: road_segment and segment_geom).
INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
  'ROAD_SEGMENTS',
  'SEGMENT_GEOM',
  SDO_DIM_ARRAY(   -- 20X20 grid
    SDO_DIM_ELEMENT('X', 0, 20, 0.005),
    SDO_DIM_ELEMENT('Y', 0, 20, 0.005),
    SDO_DIM_ELEMENT('M', 0, 20, 0.005) -- Measure dimension
     ),
  NULL   -- SRID (spatial reference system, also called coordinate system)
);
 
-------------------------------------------------------------------
-- CREATE THE SPATIAL INDEX --
-------------------------------------------------------------------
CREATE INDEX road_segments_idx ON road_segments(segment_geom)
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
  
--------------------------------
-- USE SDO_NET SUBPROGRAMS
--------------------------------
 
-- This procedure does not use the CREATE_LRS_NETWORK procedure. Instead,
-- the user creates the network tables and populates the network metadata view.
-- Basic steps:
-- 1. Create and populate the node table.
-- 2. Create and populate the link table.
-- 3. Create the path table and paths and links table (for possible 
--    future use, before which they will need to be populated).
-- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA).
--    Note: Can be done before or after Steps 1-3.
-- 5. Use various SDO_NET functions and procedures.
-- 6. Use SDO_NET_MEM functions and procedures for analysis and editing.
 
-- 1. Create and populate the node table.
EXECUTE SDO_NET.CREATE_NODE_TABLE('ROADS_NODES', 'LRS_GEOMETRY', 'NODE_GEOMETRY', 'COST', 1);
 
-- Populate the node table.
 
-- N1
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) 
  VALUES (1, 'N1', 'Y', 1001, 0);
 
-- N2
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (2, 'N2', 'Y', 1001, 2);
 
-- N3
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (3, 'N3', 'Y', 1001, 8);
 
-- N4
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (4, 'N4', 'Y', 1001, 12);
 
-- N5
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (5, 'N5', 'Y', 1004, 0);
 
-- N6
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (6, 'N6', 'Y', 1002, 6);
 
-- N7
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (7, 'N7', 'Y', 1004, 9);
 
-- N8
INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure)
  VALUES (8, 'N8', 'Y', 1002, 9);
 
-- 2. Create and populate the link table.
EXECUTE SDO_NET.CREATE_LINK_TABLE('ROADS_LINKS', 'LRS_GEOMETRY', 'LINK_GEOMETRY', 'COST', 1);
 
-- Populate the link table.
 
-- Route1, Link1
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, 
   cost, geom_id, start_measure, end_measure)
VALUES (101, 'R1L1', 1, 2, 'Y', 3, 1001, 0, 2);
 
-- Route1, Link2
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, 
   cost, geom_id, start_measure, end_measure)
VALUES (102, 'R1L2', 2, 3, 'Y', 15, 1001, 2, 8);
 
 -- Route1, Link3
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (103, 'R1L3', 3, 4, 'Y', 10, 1001, 8, 12);
 
-- Route1, Link4
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (104, 'R1L4', 4, 5, 'Y', 15, 1003, 0, 6);
 
-- Route1, Link5
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (105, 'R1L5', 5, 6, 'Y', 10, 1004, 0, 4);
 
-- Route1, Link6
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (106, 'R1L6', 6, 7, 'Y', 7, 1004, 4, 9);
 
-- Route2, Link1 (cost = 30, a slow drive)
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (201, 'R2L1', 3, 6, 'Y', 30, 1002, 0, 6);
 
-- Route2, Link2
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (202, 'R2L2', 6, 8, 'Y', 5, 1002, 6, 9);
 
-- Route3, Link1
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (301, 'R3L1', 5, 8, 'Y', 5, 1003, 6, 11);
 
-- Route3, Link2
INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active,
   cost, geom_id, start_measure, end_measure)
VALUES (302, 'R3L2', 8, 7, 'Y', 5, 1003, 11, 14.16);
 
-- 3. Create the path table (to store created paths) and the path-link 
--    table (to store links for each path) for possible future use,
--    before which they will need to be populated.
EXECUTE SDO_NET.CREATE_PATH_TABLE('ROADS_PATHS', 'PATH_GEOMETRY');
EXECUTE SDO_NET.CREATE_PATH_LINK_TABLE('ROADS_PATHS_LINKS');
 
-- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA).
 
INSERT INTO user_sdo_network_metadata 
    (NETWORK,
     NETWORK_CATEGORY,
     GEOMETRY_TYPE,
     NETWORK_TYPE,
     NO_OF_HIERARCHY_LEVELS,
     NO_OF_PARTITIONS,
     LRS_TABLE_NAME,
     LRS_GEOM_COLUMN,
     NODE_TABLE_NAME,
     NODE_GEOM_COLUMN,
     NODE_COST_COLUMN,
     LINK_TABLE_NAME,
     LINK_GEOM_COLUMN,
     LINK_DIRECTION,
     LINK_COST_COLUMN,
     PATH_TABLE_NAME,
     PATH_GEOM_COLUMN,
     PATH_LINK_TABLE_NAME)
  VALUES (
    'ROADS_NETWORK',  -- Network name
    'SPATIAL',  -- Network category
    'LRS_GEOMETRY',  -- Geometry type
    'Roadways',  -- Network type (user-defined)
    1,  -- No. of levels in hierarchy
    1,  -- No. of partitions
    'ROAD_SEGMENTS',   -- LRS table name
    'SEGMENT_GEOM' ,  -- LRS geometry column
    'ROADS_NODES',  -- Node table name
    'NODE_GEOMETRY',  -- Node geometry column
    'COST',  -- Node cost column
    'ROADS_LINKS',  -- Link table name
    'LINK_GEOMETRY',  -- Link geometry column
    'DIRECTED',  -- Link direction
    'COST',  -- Link cost column
    'ROADS_PATHS',  -- Path table name
    'PATH_GEOMETRY',  -- Path geometry column
    'ROADS_PATHS_LINKS'  -- Paths and links table
    );
 
-- 5. Use various SDO_NET functions and procedures.
 
-- Validate the network.
SELECT SDO_NET.VALIDATE_NETWORK('ROADS_NETWORK') FROM DUAL;
 
-- Validate parts or aspects of the network.
SELECT SDO_NET.VALIDATE_LINK_SCHEMA('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_LRS_SCHEMA('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_NODE_SCHEMA('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_PATH_SCHEMA('ROADS_NETWORK') FROM DUAL;
 
-- Retrieve various information (GET_xxx and some other functions).
SELECT SDO_NET.GET_CHILD_LINKS('ROADS_NETWORK', 101) FROM DUAL;
SELECT SDO_NET.GET_CHILD_NODES('ROADS_NETWORK', 1) FROM DUAL;
SELECT SDO_NET.GET_GEOMETRY_TYPE('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_IN_LINKS('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_INVALID_LINKS('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_INVALID_NODES('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_INVALID_PATHS('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_ISOLATED_NODES('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_COST_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_DIRECTION('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL;
SELECT SDO_NET.GET_LINK_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LRS_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LRS_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL;
SELECT SDO_NET.GET_LRS_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_LRS_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NETWORK_CATEGORY('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NETWORK_ID('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NETWORK_NAME(3) FROM DUAL;
SELECT SDO_NET.GET_NETWORK_TYPE('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_LINKS('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_NODES('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NODE_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_NODE_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_NODE_IN_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_NODE_OUT_DEGREE('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_NODE_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NODE_COST_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NODE_HIERARCHY_LEVEL('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_OUT_LINKS('ROADS_NETWORK', 3) FROM DUAL;
SELECT SDO_NET.GET_PATH_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_PATH_TABLE_NAME('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_COMPLEX('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_HIERARCHICAL('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_LOGICAL('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_SIMPLE('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_SPATIAL('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.LRS_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.NETWORK_EXISTS('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.SDO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
SELECT SDO_NET.TOPO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL;
 
-- Copy a network.
EXECUTE SDO_NET.COPY_NETWORK('ROADS_NETWORK', 'ROADS_NETWORK2');
 
-- Create a trigger.
EXECUTE SDO_NET.CREATE_DELETE_TRIGGER('ROADS_NETWORK');
 
-- 6. Use SDO_NET_MEM functions and procedures for analysis and editing.
 
-- Network analysis and other operations (SDO_NET_MEM.NETWORK_MANAGER)
 
DECLARE
  net_mem    VARCHAR2(100);
  res_string VARCHAR2(1000);
 
  cost        NUMBER;
  res_numeric NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
  indx1        NUMBER;
  var1_numeric NUMBER;
  var1_array   SDO_NUMBER_ARRAY;
 
BEGIN
 
net_mem := 'ROADS_NETWORK';
  
-- Read in the network.
SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK(net_mem, 'TRUE');
 
-- Validate the network.
res_string := SDO_NET_MEM.NETWORK_MANAGER.VALIDATE_NETWORK_SCHEMA(net_mem);
DBMS_OUTPUT.PUT_LINE('Is network ' || net_mem || ' valid? ' || res_string);
  
res_string := SDO_NET_MEM.NETWORK_MANAGER.LIST_NETWORKS;
DBMS_OUTPUT.PUT_LINE('The current in-memory network(s) is/are: ' || res_string);
 
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS(net_mem);
DBMS_OUTPUT.PUT_LINE('The number of connected components is: ' || res_numeric);
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.MCST_LINK(net_mem);
DBMS_OUTPUT.PUT('Network ' || net_mem || ' has the following MCST links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHABLE_NODES(net_mem,1);
DBMS_OUTPUT.PUT_LINE('Reachable nodes from 1: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(net_mem,6,3);
DBMS_OUTPUT.PUT_LINE('Path IDs to the nearest 3 neighbors of node 6 are: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', which contains links: ');
  var1_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);
    FOR indx1 IN var1_array.FIRST..var1_array.LAST
    LOOP
      var1_numeric := var1_array(indx1);
      DBMS_OUTPUT.PUT(var1_numeric || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(net_mem,6,3);
DBMS_OUTPUT.PUT_LINE('Path IDs to the nearest 3 neighbors of node 6 are: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', whose end node is: ');
  var1_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, res_numeric);
  DBMS_OUTPUT.PUT(var1_numeric);
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
  
res_string := SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE(net_mem,1,5);
DBMS_OUTPUT.PUT_LINE('Can node 1 reach node 5? ' || res_string);
  
res_array := SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS(net_mem,1,5,10,200,5);
DBMS_OUTPUT.PUT_LINE('For each path from node 1 to node 5: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric ||
                       ' has the following properties: ');
  cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
  res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_array(indx));  
  DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);       
END LOOP;
   
DBMS_OUTPUT.PUT_LINE(' ');
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(net_mem,1,5);
DBMS_OUTPUT.PUT_LINE('The shortest path from node 1 to node 5 is path ID: ' || res_numeric);
 
DBMS_OUTPUT.PUT_LINE('The following are characteristics of this shortest path: ');
cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' has cost: ' || cost);
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_numeric);  
DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);  
 
DBMS_OUTPUT.PUT_LINE(' ');
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH_DIJKSTRA(net_mem,1,5);
DBMS_OUTPUT.PUT_LINE('The shortest Dijkstra path from node 1 to node 5 is ' || res_numeric);
 
DBMS_OUTPUT.PUT_LINE('The following are characteristics of this shortest path: ');
cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_numeric);  
DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);  
    
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
  
res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.WITHIN_COST(net_mem,2,20);
DBMS_OUTPUT.PUT('Path IDs to nodes within cost of 40 from node 2: ');
DBMS_OUTPUT.PUT_LINE(' ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', whose end node is: ');
  var1_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, res_numeric);
  DBMS_OUTPUT.PUT(var1_numeric);
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
 
END;  
/
 
-- Link editing (SDO_NET_MEM.LINK)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  res_geom    SDO_GEOMETRY;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'ROADS_NETWORK';
  
-- GET_COST
res_numeric := SDO_NET_MEM.LINK.GET_COST(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The cost of link 104 is: ' || res_numeric);
 
-- GET_END_MEASURE
res_numeric := SDO_NET_MEM.LINK.GET_END_MEASURE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The end measure of link 104 is: ' || res_numeric);
 
-- GET_END_NODE_ID
res_numeric := SDO_NET_MEM.LINK.GET_END_NODE_ID(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The end node of link 104 is: ' || res_numeric);
 
-- GET_GEOM_ID
res_numeric := SDO_NET_MEM.LINK.GET_GEOM_ID(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The geometry ID of link 104 is: ' || res_numeric);
 
-- GET_GEOMETRY
res_geom := SDO_NET_MEM.LINK.GET_GEOMETRY(net_mem, 104);
 
-- GET_NAME
res_string := SDO_NET_MEM.LINK.GET_NAME(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The name of link 104 is: ' || res_string);
 
-- GET_START_MEASURE
res_numeric := SDO_NET_MEM.LINK.GET_START_MEASURE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The start measure of link 104 is: ' || res_numeric);
 
-- GET_START_NODE_ID
res_numeric := SDO_NET_MEM.LINK.GET_START_NODE_ID(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The start node of link 104 is: ' || res_numeric);
 
-- GET_STATE
res_string := SDO_NET_MEM.LINK.GET_STATE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('The state of link 104 is: ' || res_string);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.LINK.IS_ACTIVE(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('Is link 104 active?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.LINK.IS_LOGICAL(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('Is link 104 a logical link?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.LINK.IS_TEMPORARY(net_mem, 104);
DBMS_OUTPUT.PUT_LINE('Is link 104 temporary?: ' || res_string);
 
-- SET_COST
-- Set the cost of link 302 to 6.
SDO_NET_MEM.LINK.SET_COST(net_mem, 302, 6);
 
-- SET_MEASURE
-- Set the measure value of link 302 as from 111 to 114.16.
SDO_NET_MEM.LINK.SET_MEASURE(net_mem, 302, 111, 114.16);
 
-- SET_NAME
-- Set the name of link 302 to 'My favorite link'.
SDO_NET_MEM.LINK.SET_NAME(net_mem, 302, 'My favorite link');
 
-- SET_STATE
-- Set the state of link 302 to 'INACTIVE'.
SDO_NET_MEM.LINK.SET_STATE(net_mem, 302, 'INACTIVE');
-- GET_STATE
res_string := SDO_NET_MEM.LINK.GET_STATE(net_mem, 302);
DBMS_OUTPUT.PUT_LINE('The state of link 302 is: ' || res_string);
 
-- SET_TYPE
-- Set the type of link 302 to 'Normal street'.
SDO_NET_MEM.LINK.SET_TYPE(net_mem, 302, 'Normal street');
-- GET_TYPE
res_string := SDO_NET_MEM.LINK.GET_TYPE(net_mem, 302);
DBMS_OUTPUT.PUT_LINE('The type of link 302 is: ' || res_string);
 
END;  
/
 
-- Node editing (SDO_NET_MEM.NODE)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  res_geom    SDO_GEOMETRY;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'ROADS_NETWORK';
  
-- GET_COMPONENT_NO
res_numeric := SDO_NET_MEM.NODE.GET_COMPONENT_NO(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The component number of node 3 is: ' || res_numeric);
 
-- GET_COST
res_numeric := SDO_NET_MEM.NODE.GET_COST(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The cost of node 3 is: ' || res_numeric);
 
-- GET_GEOM_ID
res_numeric := SDO_NET_MEM.NODE.GET_GEOM_ID(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The geometry ID of node 3 is: ' || res_numeric);
 
-- GET_GEOMETRY
res_geom := SDO_NET_MEM.NODE.GET_GEOMETRY(net_mem, 3);
 
-- GET_IN_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_IN_LINK_IDS(net_mem, 3);
DBMS_OUTPUT.PUT('Node 3 has the following inbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_INCIDENT_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_INCIDENT_LINK_IDS(net_mem, 3);
DBMS_OUTPUT.PUT('Node 3 has the following incident links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_MEASURE
res_numeric := SDO_NET_MEM.NODE.GET_MEASURE(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The measure value of node 3 is: ' || res_numeric);
 
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The name of node 3 is: ' || res_string);
 
-- GET_OUT_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_OUT_LINK_IDS(net_mem, 3);
DBMS_OUTPUT.PUT('Node 3 has the following outbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_STATE
res_string := SDO_NET_MEM.NODE.GET_STATE(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('The state of node 3 is: ' || res_string);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.NODE.IS_ACTIVE(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('Is node 3 active?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.NODE.IS_LOGICAL(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('Is node 3 a logical node?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.NODE.IS_TEMPORARY(net_mem, 3);
DBMS_OUTPUT.PUT_LINE('Is node 3 temporary?: ' || res_string);
 
-- LINK_EXISTS
res_string := SDO_NET_MEM.NODE.LINK_EXISTS(net_mem, 3, 4);
DBMS_OUTPUT.PUT_LINE('Does a link exist between nodes 3 and 4?: ' || res_string);
 
-- MAKE_TEMPORARY
-- Make node 7 temporary.
SDO_NET_MEM.NODE.MAKE_TEMPORARY(net_mem, 7);
 
-- SET_COMPONENT_NO
-- Set the component number of node 7 to 987.
SDO_NET_MEM.NODE.SET_COMPONENT_NO(net_mem, 7, 987);
 
-- SET_COST
-- Set the cost of node 7 to 40.
SDO_NET_MEM.NODE.SET_COST(net_mem, 7, 40);
 
-- SET_GEOM_ID
-- Set the geometry ID of node 7 to 99.
SDO_NET_MEM.NODE.SET_GEOM_ID(net_mem, 7, 99);
 
-- SET_MEASURE
-- Set the measure value of node 7 to 30.
SDO_NET_MEM.NODE.SET_MEASURE(net_mem, 7, 30);
 
-- SET_NAME
-- Set the name of node 7 to 'My favorite node'.
SDO_NET_MEM.NODE.SET_NAME(net_mem, 7, 'My favorite node');
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME(net_mem, 7);
DBMS_OUTPUT.PUT_LINE('The name of node 7 is: ' || res_string);
 
-- SET_STATE
-- Set the state of node 7 to 'INACTIVE'.
SDO_NET_MEM.NODE.SET_STATE(net_mem, 7, 'INACTIVE');
-- GET_STATE
res_string := SDO_NET_MEM.NODE.GET_STATE(net_mem, 7);
DBMS_OUTPUT.PUT_LINE('The state of node 7 is: ' || res_string);
 
-- SET_TYPE
-- Set the type of node 7 to 'Historic site'.
SDO_NET_MEM.NODE.SET_TYPE(net_mem, 7, 'Historic site');
-- GET_TYPE
res_string := SDO_NET_MEM.NODE.GET_TYPE(net_mem, 7);
DBMS_OUTPUT.PUT_LINE('The type of node 7 is: ' || res_string);
 
END;  
/
 
-- Path editing (SDO_NET_MEM.PATH)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  res_geom    SDO_GEOMETRY;
  path_id     NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'ROADS_NETWORK';
  
-- Create a path for use with subsequent statements. Here, it is
-- the shortest path between nodes 1 (N1) and 5 (N5).
path_id := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(net_mem,1,5);
DBMS_OUTPUT.PUT_LINE('The shortest path between nodes 1 and 5 is: ' || path_id);
 
-- GET_LINK_IDS
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Path ' || path_id || ' has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_COST
res_numeric := SDO_NET_MEM.PATH.GET_COST(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The cost of path ' || path_id || ' is: ' || res_numeric);
 
-- GET_END_NODE_ID
res_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The end node ID of path ' || path_id || ' is: ' || res_numeric);
 
-- GET_GEOMETRY
res_geom := SDO_NET_MEM.PATH.GET_GEOMETRY(net_mem, path_id);
-- doesn't work DBMS_OUTPUT.PUT_LINE('The geometry of path ' || path_id || ' is: ' || res_geom);
 
-- GET_LINK_IDS
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Path ' || path_id || ' has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_NAME
res_string := SDO_NET_MEM.PATH.GET_NAME(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The name of path ' || path_id || ' is: ' || res_string);
 
-- GET_NO_OF_LINKS
res_numeric := SDO_NET_MEM.PATH.GET_NO_OF_LINKS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The number of links in path ' || path_id || ' is: ' || res_numeric);
 
-- GET_NODE_IDS
res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT('Path ' || path_id || ' has the following nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_START_NODE_ID
res_numeric := SDO_NET_MEM.PATH.GET_START_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The start node ID of path ' || path_id || ' is: ' || res_numeric);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.PATH.IS_ACTIVE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' active?: ' || res_string);
 
-- IS_CLOSED
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' closed?: ' || res_string);
 
-- IS_CONNECTED
res_string := SDO_NET_MEM.PATH.IS_CONNECTED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' connected?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.PATH.IS_LOGICAL(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a logical path?: ' || res_string);
 
-- IS_SIMPLE
res_string := SDO_NET_MEM.PATH.IS_SIMPLE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a simple path?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.PATH.IS_TEMPORARY(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' temporary?: ' || res_string);
 
-- SET_NAME
-- Set the name of path to 'My favorite path'.
SDO_NET_MEM.PATH.SET_NAME(net_mem, path_id, 'My favorite path');
-- GET_NAME
res_string := SDO_NET_MEM.PATH.GET_NAME(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The name of path ' || path_id || ' is: ' || res_string);
 
-- SET_TYPE
-- Set the type of the path to 'Scenic'.
SDO_NET_MEM.PATH.SET_TYPE(net_mem, path_id, 'Scenic');
-- GET_TYPE
res_string := SDO_NET_MEM.PATH.GET_TYPE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The type of path ' || path_id || ' is: ' || res_string);
 
-- SET_PATH_ID
-- Set (change) the path ID of the path to 6789.
SDO_NET_MEM.PATH.SET_PATH_ID(net_mem, path_id, 6789);
 
END;  
/

5.13.4 Logical Hierarchical Network Example (PL/SQL)

This section presents an example of a logical network that contains the nodes and links illustrated in Figure 5-7. Because it is a logical network, there are no spatial geometries associated with it. (Figure 5-7 is essentially the same as Figure 5-3 in Section 5.5, but with the nodes and links labeled.)

Figure 5-7 Nodes and Links for Logical Network Example

Description of Figure 5-7 follows
Description of "Figure 5-7 Nodes and Links for Logical Network Example"

As shown in Figure 5-7:

  • The network is hierarchical, with two levels. The top level (level 2) consists of two nodes (HN1 and HN2), and the remaining nodes and links are in the bottom level (level 1) of the hierarchy.

  • Each node in level 1 is a child node of one of the nodes in level 2. Node HN1 has the following child nodes: N1, N2, N3, N4, N5, and N6. Node HN2 has the following child nodes: N7, N8, N9, N10, N11, N12, N13, and N14.

  • One link (HN1HN2) links nodes HN1 and HN2, and two links (N5N8 and N6N7) are child links of parent link HN1HN2. Note, however, that links are not associated with a specific network hierarchy level.

Example 5-5 does the following:

  • Creates and populates the node table.

  • Creates and populates the link table.

  • Creates and populates the path table and path-link table, for possible future use. (Before an application can use paths, you must populate these two tables.)

  • Inserts network metadata into the USER_SDO_NETWORK_METADATA view.

  • Uses various SDO_NET functions and procedures.

  • Uses SDO_NET_MEM functions and procedures for analysis and editing.

Example 5-5 Logical Network Example (PL/SQL)

-- Basic steps:
-- 1. Create and populate the node table.
-- 2. Create and populate the link table.
-- 3. Create the path table and paths and links table (for possible 
--    future use, before which they will need to be populated).
-- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA).
--    Note: Can be done before or after Steps 1-3.
-- 5. Use various SDO_NET functions and procedures.
-- 6. Use SDO_NET_MEM functions and procedures for analysis and editing.
 
-- 1. Create and populate the node table.
EXECUTE SDO_NET.CREATE_NODE_TABLE('XYZ_NODES', NULL, NULL, NULL, 2);
 
-- Populate the node table, starting with the highest level in the hierarchy.
 
-- HN1 (Hierarchy level=2, highest in this network)
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level)
  VALUES (1, 'HN1', 'Y', 2);
 
-- HN2 (Hierarchy level=2, highest in this network)
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level)
  VALUES (2, 'HN2', 'Y', 2);
 
-- N1 (Hierarchy level 1, parent node ID = 1 for N1 through N6)
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (101, 'N1', 'Y', 1, 1);
 
-- N2 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (102, 'N2', 'Y', 1, 1);
 
-- N3 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (103, 'N3', 'Y', 1, 1);
 
-- N4 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (104, 'N4', 'Y', 1, 1);
 
-- N5 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (105, 'N5', 'Y', 1, 1);
 
-- N6 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (106, 'N6', 'Y', 1, 1);
 
-- N7 (Hierarchy level 1, parent node ID = 2 for N7 through N14)
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (107, 'N7', 'Y', 1, 2);
 
-- N8 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (108, 'N8', 'Y', 1, 2);
 
-- N9 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (109, 'N9', 'Y', 1, 2);
 
-- N10 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (110, 'N10', 'Y', 1, 2);
 
-- N11 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (111, 'N11', 'Y', 1, 2);
 
-- N12 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (112, 'N12', 'Y', 1, 2);
 
-- N13 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (113, 'N13', 'Y', 1, 2);
 
-- N14 
INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, 
     parent_node_id)
  VALUES (114, 'N14', 'Y', 1, 2);
 
-- 2. Create and populate the link table.
EXECUTE SDO_NET.CREATE_LINK_TABLE('XYZ_LINKS', NULL, NULL, 'COST', 2);
 
-- Populate the link table.
 
-- HN1HN2 (single link in highest hierarchy level: link level = 2)
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level)
  VALUES (1001, 'HN1HN2', 1, 2, 'Y', 2);
 
-- For remaining links, link level = 1 and cost (10, 20, or 30) varies among links.
-- N1N2
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1101, 'N1N2', 101, 102, 'Y', 1, 10);
 
-- N1N3
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1102, 'N1N3', 101, 103, 'Y', 1, 20);
 
-- N2N3
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1103, 'N2N3', 102, 103, 'Y', 1, 30);
 
-- N3N4
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1104, 'N3N4', 103, 104, 'Y', 1, 10);
 
-- N4N5
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1105, 'N4N5', 104, 105, 'Y', 1, 20);
 
-- N4N6
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1106, 'N4N6', 104, 106, 'Y', 1, 30);
 
-- N5N6
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1107, 'N5N6', 105, 106, 'Y', 1, 10);
 
-- N5N8 (child of the higher-level link: parent ID = 1001)
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost, parent_link_id)
  VALUES (1108, 'N5N8', 105, 108, 'Y', 1, 20, 1001);
 
-- N6N7 (child of the higher-level link: parent ID = 1001)
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost, parent_link_id)
  VALUES (1109, 'N6N7', 106, 107, 'Y', 1, 30, 1001);
 
-- N7N8
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1110, 'N7N8', 107, 108, 'Y', 1, 10);
 
-- N7N9
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1111, 'N7N9', 107, 109, 'Y', 1, 20);
 
-- N8N9
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1112, 'N8N9', 108, 109, 'Y', 1, 30);
 
-- N9N10
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1113, 'N9N10', 109, 110, 'Y', 1, 30);
 
-- N9N13
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1114, 'N9N13', 109, 113, 'Y', 1, 10);
 
-- N10N11
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1115, 'N10N11', 110, 111, 'Y', 1, 20);
 
-- N11N12
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1116, 'N11N12', 111, 112, 'Y', 1, 30);
 
-- N12N13
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1117, 'N12N13', 112, 113, 'Y', 1, 10);
 
-- N12N14
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1118, 'N12N14', 112, 114, 'Y', 1, 20);
 
-- N13N14
INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, 
     link_level, cost)
  VALUES (1119, 'N13N14', 113, 114, 'Y', 1, 30);
 
-- 3. Create the path table (to store created paths) and the path-link 
--    table (to store links for each path) for possible future use,
--    before which they will need to be populated.
EXECUTE SDO_NET.CREATE_PATH_TABLE('XYZ_PATHS', NULL);
EXECUTE SDO_NET.CREATE_PATH_LINK_TABLE('XYZ_PATHS_LINKS');
 
-- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA).
 
INSERT INTO user_sdo_network_metadata 
    (NETWORK,
     NETWORK_CATEGORY,
     NO_OF_HIERARCHY_LEVELS,
     NO_OF_PARTITIONS,
     NODE_TABLE_NAME,
     LINK_TABLE_NAME,
     LINK_DIRECTION,
     LINK_COST_COLUMN,
     PATH_TABLE_NAME,
     PATH_LINK_TABLE_NAME)
  VALUES (
    'XYZ_NETWORK',  -- Network name
    'LOGICAL',   -- Network category
    2,  -- No. of levels in hierarchy
    1,  -- No. of partitions
    'XYZ_NODES',  -- Node table name
    'XYZ_LINKS',  -- Link table name
    'BIDIRECTED',  -- Link direction
    'COST',  -- Link cost column
    'XYZ_PATHS',  -- Path table name
    'XYZ_PATHS_LINKS'  -- Path-link table name
  );
 
-- 5. Use various SDO_NET functions and procedures.
 
-- Validate the network.
SELECT SDO_NET.VALIDATE_NETWORK('XYZ_NETWORK') FROM DUAL;
 
-- Validate parts or aspects of the network.
SELECT SDO_NET.VALIDATE_LINK_SCHEMA('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_LRS_SCHEMA('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_NODE_SCHEMA('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.VALIDATE_PATH_SCHEMA('XYZ_NETWORK') FROM DUAL;
 
-- Retrieve various information (GET_xxx and some other functions).
SELECT SDO_NET.GET_CHILD_LINKS('XYZ_NETWORK', 1001) FROM DUAL;
SELECT SDO_NET.GET_CHILD_NODES('XYZ_NETWORK', 1) FROM DUAL;
SELECT SDO_NET.GET_CHILD_NODES('XYZ_NETWORK', 2) FROM DUAL;
SELECT SDO_NET.GET_IN_LINKS('XYZ_NETWORK', 104) FROM DUAL;
SELECT SDO_NET.GET_LINK_COST_COLUMN('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_DIRECTION('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_LINK_TABLE_NAME('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NETWORK_TYPE('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_LINKS('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NO_OF_NODES('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.GET_NODE_DEGREE('XYZ_NETWORK', 104) FROM DUAL;
SELECT SDO_NET.GET_NODE_IN_DEGREE('XYZ_NETWORK', 104) FROM DUAL;
SELECT SDO_NET.GET_NODE_OUT_DEGREE('XYZ_NETWORK', 104) FROM DUAL;
SELECT SDO_NET.GET_OUT_LINKS('XYZ_NETWORK', 104) FROM DUAL;
SELECT SDO_NET.GET_PATH_TABLE_NAME('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_HIERARCHICAL('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_LOGICAL('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.IS_SPATIAL('XYZ_NETWORK') FROM DUAL;
SELECT SDO_NET.NETWORK_EXISTS('XYZ_NETWORK') FROM DUAL;
 
-- Copy a network.
EXECUTE SDO_NET.COPY_NETWORK('XYZ_NETWORK', 'XYZ_NETWORK2');
 
-- Create a trigger.
EXECUTE SDO_NET.CREATE_DELETE_TRIGGER('XYZ_NETWORK');
 
-- 6. Use SDO_NET_MEM functions and procedures for analysis and editing.
 
-- Network analysis and other operations (SDO_NET_MEM.NETWORK_MANAGER)
 
DECLARE
  net_mem    VARCHAR2(100);
  res_string VARCHAR2(1000);
 
  cost        NUMBER;
  res_numeric NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
  indx1        NUMBER;
  var1_numeric NUMBER;
  var1_array   SDO_NUMBER_ARRAY;
 
BEGIN
 
net_mem := 'XYZ_NETWORK';
  
-- Read in the network.
SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK(net_mem, 'TRUE');
 
-- Validate the network.
res_string := SDO_NET_MEM.NETWORK_MANAGER.VALIDATE_NETWORK_SCHEMA(net_mem);
DBMS_OUTPUT.PUT_LINE('Is network ' || net_mem || ' valid? ' || res_string);
  
res_string := SDO_NET_MEM.NETWORK_MANAGER.LIST_NETWORKS;
DBMS_OUTPUT.PUT_LINE('The current in-memory network(s) is/are: ' || res_string);
 
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.FIND_CONNECTED_COMPONENTS(net_mem);
DBMS_OUTPUT.PUT_LINE('The number of connected components is: ' || res_numeric);
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.MCST_LINK(net_mem);
DBMS_OUTPUT.PUT('Network ' || net_mem || ' has the following MCST links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHABLE_NODES(net_mem,101);
DBMS_OUTPUT.PUT_LINE('Reachable nodes from 101: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.FIND_REACHING_NODES(net_mem,101);
DBMS_OUTPUT.PUT_LINE('Nodes from which 101 can be reached: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
  
res_array := SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(net_mem,101,3);
DBMS_OUTPUT.PUT_LINE('Path IDs to the nearest 3 neighbors of node 101 are: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', which contains links: ');
  var1_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);
    FOR indx1 IN var1_array.FIRST..var1_array.LAST
    LOOP
      var1_numeric := var1_array(indx1);
      DBMS_OUTPUT.PUT(var1_numeric || ' ');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.NEAREST_NEIGHBORS(net_mem,101,3);
DBMS_OUTPUT.PUT_LINE('Path IDs to the nearest 3 neighbors of node 101 are: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', whose end node is: ');
  var1_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, res_numeric);
  DBMS_OUTPUT.PUT(var1_numeric);
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
  
res_string := SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('Can node 101 reach node 105? ' || res_string);
  
res_array := SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS(net_mem,101,105,10,200,5);
DBMS_OUTPUT.PUT_LINE('For each path from node 101 to node 105: ');
FOR inv}dx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric ||
                       ' has the following properties: ');
  cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
  DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
  res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_array(indx));  
  DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);       
END LOOP;
   
DBMS_OUTPUT.PUT_LINE(' ');
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('The shortest path from node 101 to node 105 is path ID: ' || res_numeric);
 
DBMS_OUTPUT.PUT_LINE('The following are characteristics of this shortest path: ');
cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' has cost: ' || cost);
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_numeric);  
DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);  
 
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
DBMS_OUTPUT.PUT_LINE(' ');
res_numeric := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH_DIJKSTRA(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('The shortest Dijkstra path from node 101 to node 105 is ' || res_numeric);
 
DBMS_OUTPUT.PUT_LINE('The following are characteristics of this shortest path: ');
cost := SDO_NET_MEM.PATH.GET_COST(net_mem, res_numeric);
DBMS_OUTPUT.PUT_LINE('Path ' || res_numeric || ' cost: ' || cost);
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, res_numeric);  
DBMS_OUTPUT.PUT_LINE('Is path ' || res_numeric || ' closed? ' || res_string);  
 
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
  
res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, res_numeric);   
DBMS_OUTPUT.PUT('Path ' || res_numeric || ' has nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
res_array := SDO_NET_MEM.NETWORK_MANAGER.WITHIN_COST(net_mem,102,100);
DBMS_OUTPUT.PUT('Shortest path IDs to nodes within cost of 100 from node 102: ');
DBMS_OUTPUT.PUT_LINE(' ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  res_numeric := res_array(indx);
  DBMS_OUTPUT.PUT(res_numeric || ', whose end node is: ');
  var1_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, res_numeric);
  DBMS_OUTPUT.PUT(var1_numeric);
  DBMS_OUTPUT.PUT_LINE(' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' '); 
 
END;  
/
 
-- Link editing (SDO_NET_MEM.LINK)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'XYZ_NETWORK';
  
-- Read in the network.
-- SDO_NET_MEM.NETWORK_MANAGER.READ_NETWORK(net_mem, 'TRUE');
 
-- GET_CHILD_LINKS
res_array := SDO_NET_MEM.LINK.GET_CHILD_LINKS(net_mem, 1001);
DBMS_OUTPUT.PUT('Link 1001 has the following child links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_COST
res_numeric := SDO_NET_MEM.LINK.GET_COST(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The cost of link 1104 is: ' || res_numeric);
 
-- GET_END_NODE_ID
res_numeric := SDO_NET_MEM.LINK.GET_END_NODE_ID(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The end node of link 1104 is: ' || res_numeric);
 
-- GET_LEVEL
res_numeric := SDO_NET_MEM.LINK.GET_LEVEL(net_mem, 1001);
DBMS_OUTPUT.PUT_LINE('The hierarchy level of link 1001 is: ' || res_numeric);
 
-- GET_NAME
res_string := SDO_NET_MEM.LINK.GET_NAME(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The name of link 1104 is: ' || res_string);
 
-- GET_PARENT_LINK_ID
res_numeric := SDO_NET_MEM.LINK.GET_PARENT_LINK_ID(net_mem, 1108);
DBMS_OUTPUT.PUT_LINE('The parent link of link 1108 is: ' || res_numeric);
 
-- GET_SIBLING_LINK_IDS
res_array := SDO_NET_MEM.LINK.GET_SIBLING_LINK_IDS(net_mem, 1108);
DBMS_OUTPUT.PUT('Link 1108 has the following sibling links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');

-- GET_START_NODE_ID
res_numeric := SDO_NET_MEM.LINK.GET_START_NODE_ID(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The start node of link 1104 is: ' || res_numeric);
 
-- GET_STATE
res_string := SDO_NET_MEM.LINK.GET_STATE(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('The state of link 1104 is: ' || res_string);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.LINK.IS_ACTIVE(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 active?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.LINK.IS_LOGICAL(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 a logical link?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.LINK.IS_TEMPORARY(net_mem, 1104);
DBMS_OUTPUT.PUT_LINE('Is link 1104 temporary?: ' || res_string);
 
-- SET_COST
-- Set the cost of link 1119 to 40.
SDO_NET_MEM.LINK.SET_COST(net_mem, 1119, 40);
 
-- SET_END_NODE
-- Set the end node of link 1119 to 109 (N9).
SDO_NET_MEM.LINK.SET_END_NODE(net_mem, 1119, 109);
 
-- SET_LEVEL
-- Set the hierarchy level of link 1119 to 2.
SDO_NET_MEM.LINK.SET_LEVEL(net_mem, 1119, 2);
 
-- SET_NAME
-- Set the name of link 1119 to 'My favorite link'.
SDO_NET_MEM.LINK.SET_NAME(net_mem, 1119, 'My favorite link');
 
-- SET_PARENT_LINK
-- Make link 1001 the parent of link 1119.
SDO_NET_MEM.LINK.SET_PARENT_LINK(net_mem, 1119, 1001);
 
-- SET_START_NODE
-- Set the start node of link 1119 to 110 (N10).
SDO_NET_MEM.LINK.SET_START_NODE(net_mem, 1119, 110);
 
-- SET_STATE
-- Set the state of link 1119 to 'INACTIVE'.
SDO_NET_MEM.LINK.SET_STATE(net_mem, 1119, 'INACTIVE');
-- GET_STATE
res_string := SDO_NET_MEM.LINK.GET_STATE(net_mem, 1119);
DBMS_OUTPUT.PUT_LINE('The state of link 1119 is: ' || res_string);
 
-- SET_TYPE
-- Set the type of link 1119 to 'Associative'.
SDO_NET_MEM.LINK.SET_TYPE(net_mem, 1119, 'Associative');
-- GET_TYPE
res_string := SDO_NET_MEM.LINK.GET_TYPE(net_mem, 1119);
DBMS_OUTPUT.PUT_LINE('The type of link 1119 is: ' || res_string);
 
END;  
/
 
-- Node editing (SDO_NET_MEM.NODE)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'XYZ_NETWORK';
  
-- GET_ADJACENT_NODE_IDS
res_array := SDO_NET_MEM.NODE.GET_ADJACENT_NODE_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following adjacent nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');

-- GET_CHILD_NODE_IDS
res_array := SDO_NET_MEM.NODE.GET_CHILD_NODE_IDS(net_mem, 1);
DBMS_OUTPUT.PUT('Node 1 has the following child nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_COMPONENT_NO
res_numeric := SDO_NET_MEM.NODE.GET_COMPONENT_NO(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The component number of node 103 is: ' || res_numeric);
 
-- GET_COST
res_numeric := SDO_NET_MEM.NODE.GET_COST(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The cost of node 103 is: ' || res_numeric);
 
-- GET_HIERARCHY_LEVEL
res_numeric := SDO_NET_MEM.NODE.GET_HIERARCHY_LEVEL(net_mem, 1);
DBMS_OUTPUT.PUT_LINE('The hierarchy level of node 1 is: ' || res_numeric);
 
-- GET_IN_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_IN_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following inbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_INCIDENT_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_INCIDENT_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following incident links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The name of node 103 is: ' || res_string);
 
-- GET_OUT_LINK_IDS
res_array := SDO_NET_MEM.NODE.GET_OUT_LINK_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following outbound links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_PARENT_NODE_ID
res_numeric := SDO_NET_MEM.NODE.GET_PARENT_NODE_ID(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The parent node of node 103 is: ' || res_numeric);
 
-- GET_SIBLING_NODE_IDS
res_array := SDO_NET_MEM.NODE.GET_SIBLING_NODE_IDS(net_mem, 103);
DBMS_OUTPUT.PUT('Node 103 has the following sibling nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');

-- GET_STATE
res_string := SDO_NET_MEM.NODE.GET_STATE(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('The state of node 103 is: ' || res_string);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.NODE.IS_ACTIVE(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 active?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.NODE.IS_LOGICAL(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 a logical node?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.NODE.IS_TEMPORARY(net_mem, 103);
DBMS_OUTPUT.PUT_LINE('Is node 103 temporary?: ' || res_string);
 
-- LINK_EXISTS
res_string := SDO_NET_MEM.NODE.LINK_EXISTS(net_mem, 103, 104);
DBMS_OUTPUT.PUT_LINE('Does a link exist between nodes 103 and 104?: ' || res_string);
 
-- MAKE_TEMPORARY
-- Make node 114 temporary.
SDO_NET_MEM.NODE.MAKE_TEMPORARY(net_mem, 114);
 
-- SET_COMPONENT_NO
-- Set the component number of node 114 to 987.
SDO_NET_MEM.NODE.SET_COMPONENT_NO(net_mem, 114, 987);
 
-- SET_COST
-- Set the cost of node 114 to 40.
SDO_NET_MEM.NODE.SET_COST(net_mem, 114, 40);
 
-- SET_HIERARCHY_LEVEL
-- Set the hierarchy level of node 1 to 2.
SDO_NET_MEM.NODE.SET_HIERARCHY_LEVEL(net_mem, 1, 2);
 
-- SET_NAME
-- Set the name of node 114 to 'My favorite node'.
SDO_NET_MEM.NODE.SET_NAME(net_mem, 114, 'My favorite node');
-- GET_NAME
res_string := SDO_NET_MEM.NODE.GET_NAME(net_mem, 114);
DBMS_OUTPUT.PUT_LINE('The name of node 114 is: ' || res_string);
 
-- SET_PARENT_NODE
-- Make node 1 the parent of node 114.
SDO_NET_MEM.NODE.SET_PARENT_NODE(net_mem, 114, 1);
 
-- SET_STATE
-- Set the state of node 111 to 'INACTIVE'.
SDO_NET_MEM.NODE.SET_STATE(net_mem, 111, 'INACTIVE');
-- GET_STATE
res_string := SDO_NET_MEM.NODE.GET_STATE(net_mem, 111);
DBMS_OUTPUT.PUT_LINE('The state of node 111 is: ' || res_string);
 
-- SET_TYPE
-- Set the type of node 114 to 'Research'.
SDO_NET_MEM.NODE.SET_TYPE(net_mem, 114, 'Research');
-- GET_TYPE
res_string := SDO_NET_MEM.NODE.GET_TYPE(net_mem, 114);
DBMS_OUTPUT.PUT_LINE('The type of node 114 is: ' || res_string);
 
END;  
/
 
-- Path editing (SDO_NET_MEM.PATH)
 
DECLARE
  net_mem     VARCHAR2(32);
  res_string  VARCHAR2(100);
  res_numeric NUMBER;
  path_id     NUMBER;
  res_array   SDO_NUMBER_ARRAY;
  indx        NUMBER;
 
BEGIN
 
net_mem := 'XYZ_NETWORK';
  
-- Create a path for use with subsequent statements. Here, it is
-- the shortest path between nodes 101 (N1) and 105 (N5).
path_id := SDO_NET_MEM.NETWORK_MANAGER.SHORTEST_PATH(net_mem,101,105);
DBMS_OUTPUT.PUT_LINE('The shortest path between nodes 101 and 105 is: ' || path_id);
 
-- GET_LINK_IDS
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Path ' || path_id || ' has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_COST
res_numeric := SDO_NET_MEM.PATH.GET_COST(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The cost of path ' || path_id || ' is: ' || res_numeric);
 
-- GET_END_NODE_ID
res_numeric := SDO_NET_MEM.PATH.GET_END_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The end node ID of path ' || path_id || ' is: ' || res_numeric);
 
-- GET_LINK_IDS
res_array := SDO_NET_MEM.PATH.GET_LINK_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Path ' || path_id || ' has the following links: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_NO_OF_LINKS
res_numeric := SDO_NET_MEM.PATH.GET_NO_OF_LINKS(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The number of links in path ' || path_id || ' is: ' || res_numeric);
 
-- GET_NODE_IDS
res_array := SDO_NET_MEM.PATH.GET_NODE_IDS(net_mem, path_id);
DBMS_OUTPUT.PUT('Path ' || path_id || ' has the following nodes: ');
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
  DBMS_OUTPUT.PUT(res_array(indx) || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
 
-- GET_START_NODE_ID
res_numeric := SDO_NET_MEM.PATH.GET_START_NODE_ID(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The start node ID of path ' || path_id || ' is: ' || res_numeric);
 
-- IS_ACTIVE
res_string := SDO_NET_MEM.PATH.IS_ACTIVE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' active?: ' || res_string);
 
-- IS_CLOSED
res_string := SDO_NET_MEM.PATH.IS_CLOSED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' closed?: ' || res_string);
 
-- IS_CONNECTED
res_string := SDO_NET_MEM.PATH.IS_CONNECTED(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' connected?: ' || res_string);
 
-- IS_LOGICAL
res_string := SDO_NET_MEM.PATH.IS_LOGICAL(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a logical path?: ' || res_string);
 
-- IS_SIMPLE
res_string := SDO_NET_MEM.PATH.IS_SIMPLE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' a simple path?: ' || res_string);
 
-- IS_TEMPORARY
res_string := SDO_NET_MEM.PATH.IS_TEMPORARY(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('Is path ' || path_id || ' temporary?: ' || res_string);
 
-- SET_NAME
-- Set the name of path to 'My favorite path'.
SDO_NET_MEM.PATH.SET_NAME(net_mem, path_id, 'My favorite path');
-- GET_NAME
res_string := SDO_NET_MEM.PATH.GET_NAME(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The name of path ' || path_id || ' is: ' || res_string);
 
-- SET_TYPE
-- Set the type of the path to 'Logical connections'.
SDO_NET_MEM.PATH.SET_TYPE(net_mem, path_id, 'Logical connections');
-- GET_TYPE
res_string := SDO_NET_MEM.PATH.GET_TYPE(net_mem, path_id);
DBMS_OUTPUT.PUT_LINE('The type of path ' || path_id || ' is: ' || res_string);
 
-- SET_PATH_ID
-- Set (change) the path ID of the path to 6789.
SDO_NET_MEM.PATH.SET_PATH_ID(net_mem, path_id, 6789);
 
-- Get maximum link, node, path, subpath IDs.
SELECT SDO_NET_MEM.NETWORK.GET_MAX_LINK_ID(net_mem) 
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum link ID = ' || res_numeric);
SELECT SDO_NET_MEM.NETWORK.GET_MAX_NODE_ID(net_mem)   
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum node ID = ' || res_numeric);
SELECT SDO_NET_MEM.NETWORK.GET_MAX_PATH_ID(net_mem)
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum path ID = ' || res_numeric);
SELECT SDO_NET_MEM.NETWORK.GET_MAX_SUBPATH_ID(net_mem)
  INTO res_numeric FROM DUAL;
DBMS_OUTPUT.PUT_LINE('Maximum subpath ID = ' || res_numeric);

END;  
/

5.13.5 Partitioning and Load on Demand Analysis Examples (PL/SQL, XML, and Java)

This section presents examples of partitioning a network, including related operations, and performing load on demand network analysis. The examples illustrate concepts and techniques explained in Section 5.7.

Example 5-6 partitions a spatial network named NYC_NET. (Assume that this network already exists and its metadata, node, and link tables are populated.)

Example 5-6 Partitioning a Spatial Network

exec sdo_net.spatial_partition(
  network->'NYC_NET', -- network name
  partition_table_name->'NYC_PART$', -- partition table name
  max_num_nodes->5000, -- max. number of nodes per partition
  log_loc->'MDDIR', -- partition log directory
  log_file->'nyc_part.log', --partition log file name
  open_mode->'w', -- partition log file open mode
  link_level->1); -- link level

Example 5-7 generates partition BLOBs for the network.

Example 5-7 Generating Partition BLOBs

exec sdo_net.generate_partition_blobs(
  network->'NYC_NET', ,-- network name
  link_level ->1, -- link level
  partition_blob_table_name->'NYC_PBLOB$', -- partition blob table name
  includeUserdata->FALSE, -- include user data in partition blobs?
  log_loc->'MYDIR',  -- partition log directory
  log_file->'nyc_part.log', --partition log file name
  open_mode->'a'); -- partition log file open mode

Example 5-6 and Example 5-7 generate the necessary partition tables for the NYC_NET network. After executing these examples, you can check the .log file for the current status or any errors encountered during partitioning or BLOB generation.

Example 5-8 shows the XML for configuring the load on demand environment, including the partition cache.

Example 5-8 Configuring the Load on Demand Environment, Including Partition Cache

<?xml version="1.0" encoding="UTF-8" ?>
<LODConfigs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.oracle.com/spatial/network/lodLODConfigs.xsd"
     xmlns="http://www.oracle.com/spatial/network/lod">
  <!-- default configuration for networks not configured -->
  <defaultLODConfig>
    <LODConfig>
      <readPartitionFromBlob>false</readPartitionFromBlob>
      <partitionBlobTranslator>oracle.spatial.network.lod.PartitionBlobTranslator11g</partitionBlobTranslator>
      <userDataIO>oracle.spatial.network.lod.LODUserDataIOSDO</userDataIO>
      <cachingPolicy>
        <linkLevelCachingPolicy>
          <linkLevel>1</linkLevel>
          <maxNodes>500000</maxNodes>
          <residentPartitions>-1</residentPartitions>
          <flushRule>oracle.spatial.network.lod.LRUCachingHandler</flushRule>
        </linkLevelCachingPolicy>
      </cachingPolicy>
    </LODConfig>
  </defaultLODConfig>
  …
  <networkLODConfig>
    <!-- network to be configured -->
    <networkName> NYC_NET </networkName>
    <LODConfig>
       <!- read partitions from partition table or from partition blob table -->
      <readPartitionFromBlob>true</readPartitionFromBlob>
      <partitionBlobTranslator>oracle.spatial.network.lod.PartitionBlobTranslator11g</partitionBlobTranslator>
      <userDataIO>oracle.spatial.network.lod.LODUserDataIOSDO</userDataIO>
      <cachingPolicy>
        <linkLevelCachingPolicy>
          <linkLevel>1</linkLevel>
          <!-- Maximum number of nodes allowed in cache -->
          <maxNodes>500000</maxNodes>
          <!-- resident partitions -->
          <residentPartitions>-1</residentPartitions>
          <flushRule>oracle.spatial.network.lod.LRUCachingHandler</flushRule>
        </linkLevelCachingPolicy>
        <linkLevelCachingPolicy>
          <linkLevel>2</linkLevel>
          <maxNodes>500000</maxNodes>
          <residentPartitions>*</residentPartitions>
          <flushRule>oracle.spatial.network.lod.LRUCachingHandler</flushRule>
        </linkLevelCachingPolicy>
      </cachingPolicy>
    </LODConfig>
  </networkLODConfig>
</LODConfigs>

Example 5-9 and Example 5-10 show the Java and PL/SQL APIs, respectively, for reloading the load on demand configuration.

Example 5-9 Reloading the Load on Demand Configuration (Java API)

InputStream config = ClassLoader.getSystemResourceAsStream(
                     "netlodcfg.xml");
LODNetworkManager.getConfigManager().loadConfig(config);

Example 5-10 Reloading the Load on Demand Configuration (PL/SQL API)

EXECUTE SDO_NET.LOAD_CONFIG('WORK_DIR', 'netlodcfg.xml');

Example 5-11 returns the estimated size in bytes for a specified network partition.

Example 5-11 Getting Estimated Partition Size

SELECT SDO_NET.GET_PARTITION_SIZE (
  NETWORK->'NYC_NET',
  PARTITION_ID->1,
  LINK_LEVEL ->1,
  INCLUDE_USER_DATA->'FALSE',
  INCLUDE_SPATIAL_DATA->'TRUE') FROM DUAL;

Example 5-12 uses the load on demand Java API (oracle.spatial.network.lod) to issue a shortest-path query on a network.

Example 5-12 Network Analysis: Shortest Path (LOD Java API)

Connection conn = LODNetworkManager.getConnection(dbUrl, dbUser, dbPassword);
// get LOD network IO Adapter
String networkName = “NYC_NET”;
NetworkIO reader = LODNetworkManager.getCachedNetworkIO(conn, networkName, networkName, null);
// get analysis module
NetworkAnalyst analyst = LODNetworkManager.getNetworkAnalyst(reader);
// compute the shortest path
LogicalSubPath path = analyst.shortestPathDijkstra(new PointOnNet(startNodeId),
      new PointOnNet(endNodeId), null);
// print path result
PrintUtility.print(System.out, path, false, 0, 0);
. . .

Example 5-13 uses the XML API (oracle.spatial.network.xml) to issue a shortest-path query on a network. It includes the request and the response.

Example 5-13 Network Analysis: Shortest Path (XML API)

<?xml version="1.0" encoding="UTF-8"?>
<ndm:networkAnalysisRequest
    xmlns:ndm="http://xmlns.oracle.com/spatial/network"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:gml="http://www.opengis.net/gml">
  <ndm:networkName>NYC_NET</ndm:networkName>
  <ndm:shortestPath>
    <ndm:startPoint>
      <ndm:nodeID>65</ndm:nodeID>
    </ndm:startPoint>
    <ndm:endPoint>
      <ndm:nodeID>115</ndm:nodeID>
    </ndm:endPoint>
    <ndm:subPathRequestParameter>
      <ndm:isFullPath> true </ndm:isFullPath>
      <ndm:startLinkIndex> true </ndm:startLinkIndex>
      <ndm:startPercentage> true </ndm:startPercentage>
      <ndm:endLinkIndex> true </ndm:endLinkIndex>
      <ndm:endPercentage> true </ndm:endPercentage>
      <ndm:geometry>false</ndm:geometry>
    <ndm:pathRequestParameter>
      <ndm:cost> true </ndm:cost>
      <ndm:isSimple> true </ndm:isSimple>
      <ndm:startNodeID>true</ndm:startNodeID>
      <ndm:endNodeID>true</ndm:endNodeID>
      <ndm:noOfLinks>true</ndm:noOfLinks>
      <ndm:linksRequestParameter>
        <ndm:onlyLinkID>true</ndm:onlyLinkID>
      </ndm:linksRequestParameter>
      <ndm:nodesRequestParameter>
        <ndm:onlyNodeID>true</ndm:onlyNodeID>
      </ndm:nodesRequestParameter>
      <ndm:geometry>true</ndm:geometry>
    </ndm:pathRequestParameter>
    </ndm:subPathRequestParameter>
  </ndm:shortestPath>
</ndm:networkAnalysisRequest>
 
<?xml version = '1.0' encoding = 'UTF-8'?>
<ndm:networkAnalysisResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ndm="http://xmlns.oracle.com/spatial/network" xmlns:gml="http://www.opengis.net/gml">
  <ndm:networkName>NYC_NET</ndm:networkName>
  <ndm:shortestPath>
    <ndm:subPathResponse>
      <ndm:isFullPath>true</ndm:isFullPath>
      <ndm:startLinkIndex>0</ndm:startLinkIndex>
      <ndm:startPercentage>0.0</ndm:startPercentage>
      <ndm:endLinkIndex>17</ndm:endLinkIndex>
      <ndm:endPercentage>1.0</ndm:endPercentage>
      <ndm:pathResponse>
        <ndm:cost>6173.212694405703</ndm:cost>
        <ndm:isSimple>true</ndm:isSimple>
        <ndm:startNodeID>65</ndm:startNodeID>
        <ndm:endNodeID>115</ndm:endNodeID>
        <ndm:noOfLinks>18</ndm:noOfLinks>
        <ndm:linkIDs>145477046 145477044 145477042 145477039 145476926 145476930 145480892 145480891 145476873 145476871 145477023 145489019 145489020 145476851 145488986 145488987 145476913 145476905         
        </ndm:linkIDs>
        <ndm:nodeIDs>65 64 60 57 58 61 71 70 73 87 97 95 91 101 102 104 117 120 115 
        </ndm:nodeIDs>
        <ndm:geometry>
          <gml:LineString>
            <gml:coordinates>-71.707462,43.555262 -71.707521,43.555601…
            </gml:coordinates>
          </gml:LineString>
        </ndm:geometry>
      </ndm:pathResponse>
    </ndm:subPathResponse>
  </ndm:shortestPath>
</ndm:networkAnalysisResponse>

Additional examples of using load on demand analysis with partitioned networks are included in the demo files, described in Section 5.14.

5.13.6 User-Defined Data Example (PL/SQL and Java)

This section presents an example of using network user-defined data, which is the information (not related to connectivity) that users want to associate with a network representation. The USER_SDO_NETWORK_USER_DATA and ALL_SDO_NETWORK_USER_DATA metadata views (described in Section 5.10.3) contain information about user-defined data.

To use user-defined data, you must set the USER_DEFINED_DATA column value to Y in the appropriate xxx_SDO_NETWORK_METADATA views (described in Section 5.10.1).

Example 5-14 inserts link-related user-defined data into the network metadata.

Example 5-14 Inserting User-Defined Data into Network Metadata

-- Insert link user data named 'interaction' of 
-- type varchar2 (50) in network 'bi_test'.
--'interaction' is a column of type varchar2(50) in the link table of network 'bi_test'.
 
insert into user_sdo_network_user_data (network,table_type,data_name,data_type,data_length) values                                      ('bi_test','LINK','interaction','VARCHAR2',50) ;
 
-- insert link user data named 'PROB' of type Number.
--'PROB' is a column of type NUMBER in the link table of network 'bi_test'.
 
insert into user_sdo_network_user_data (network,table_type,data_name,data_type) values ('bi_test','LINK','PROB','NUMBER') ;

After a network or network partition is loaded, user-defined data is available in Java representations. You can access user-defined data through the getUserData and setUserData methods for the Node, Link, Path, and SubPath interfaces. For example:

String interaction = (String)link.getUserData(“interaction”);
double prob = ((Double)link.getUserData(“Prob”)).doubleValue();

5.14 Network Data Model Tutorial and Other Resources

https://spatial.samplecode.oracle.com/servlets/ProjectProcess?pageID=0Zl7oV on the Oracle Technology Network provides valuable resources to help you get started with the network data model (NDM), especially the load-on-demand (LOD) feature. The resources on this page include the following:

  • An NDM tutorial outlines the steps to set up and configure a network, and to conduct the analysis. It also includes:

    • A Web application that demonstrates how to use Oracle Maps to display analysis results

    • Sample code

    You can download the tutorial from a link at the bottom of that page.

  • An NDM white paper ("A Load-On-Demand Approach to Handling Large Networks in the Oracle Spatial Network Data Model") provides detailed explanations and examples.

  • The NDM Editor for 11gR2, provided as a demo intended for small and medium-size networks, is a graphical tool to view, browse, and navigate through data that is stored in the network data model. You can also use this tool to perform analysis on networks (shortest path, nearest neighbor, minimum cost spanning tree, and so on), and to add and delete nodes, links, and paths.

5.15 README File for Spatial and Related Features

A README.txt file supplements the information in the following manuals: Oracle Spatial Developer's Guide, Oracle Spatial GeoRaster Developer's Guide, and Oracle Spatial Topology and Network Data Models Developer's Guide (this manual). This file is located at:

$ORACLE_HOME/md/doc/README.txt
PKfRh&}v}PK ;A OEBPS/toc.ncx Oracle® Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2) Cover Table of Contents List of Examples List of Figures List of Tables Oracle Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2) Preface What's New in the Topology and Network Data Models? Topology Data Model Topology Data Model Overview Editing Topologies SDO_TOPO Package Subprograms SDO_TOPO_MAP Package Subprograms Network Data Model Network Data Model Overview SDO_NET Package Subprograms SDO_NET_MEM Package Subprograms Index Copyright PKxKPK ;AOEBPS/topol_newfeat.htm$N What's New in the Topology and Network Data Models?

What's New in the Topology and Network Data Models?

This section describes new and changed features for Oracle Spatial topology and network data models for Oracle Database Release 11.

Release 11.2 Changes

This section describes new and changed features of the Oracle Spatial topology and network data models for Oracle Database 11g Release 1 (11.1).

New Network Analysis Functions in the Java API

The NetworkAnalyst class in oracle.spatial.network.lod contains many new methods. This class is the single entry point to all the network analysis operations supported by the network data model load on demand (LOD) approach to analysis. The new methods include the following:

  • Hierarchical shortest path analysis (NetworkAnalyst.shortestPathHierarchical) supports hierarchical shortest path analysis for networks with multiple link levels.

  • Shortest path A* analysis(NetworkAnalyst.shortestPathAStar) supports the A* shortest path algorithm with a user-defined heuristic cost function. It provides better performance than the Dijkstra algorithm because fewer nodes are explored.

  • Network buffer zones (NetworkAnalyst.networkBuffer), also called zones of influence, operation on networks. Includes coverage and cost information.

  • TSP ("traveling salesman problem" or "traveling salesperson problem") analysis (NetworkAnalyst.tsp) supports the minimum cost tour that includes all given nodes. Supports both closed and open tours (start and/or end are fixed).

  • Minimum cost spanning tree analysis (NetworkAnalyst.mcst) finds the links with the sum of minimum link costs to connect all nodes.

  • Minimum cost polygon generation (NetworkAnalyst.withinCostPolygon) provides a spatial representation (polygon) based on the minimum cost network coverage. For example, the Drive Time polygon is one such representation when travel time is used as link cost.

  • K shortest paths analysis (NetworkAnalyst.kShortestPaths) finds the k shortest paths between two nodes.

Reference information (Javadoc) on all supported packages and classes is in Oracle Spatial Java API Reference. The network data model Java API is introduced in Section 5.11.2.

Power Law (Scale-Free) Network Partitioning

The new SDO_NET.LOGICAL_POWERLAW_PARTITION procedure (documented in Chapter 6) partitions a logical power law (also called scale-free) network, and stores the information in the partition table. (In a power law network, the node degree values contain the power law information.)

New Functions for Spatial Networks

The following new functions are available for use with spatial (including LRS) networks:

  • SDO_NET.GET_PERCENTAGE returns the percentage of the distance along a link's line string geometry of a point geometry.

  • SDO_NET.GET_PT returns the point geometry that is a specified percentage of the distance along a link's line string geometry.

These functions are documented in Chapter 6.

Other New Subprograms

SDO_NET.GENERATE_NODE_LEVELS (documented in Chapter 6) generates node levels for a specified hierarchical (multilevel) network, and stores the information in a table.

Changes to Existing Subprograms

Significant changes to existing subprograms (documented in Chapter 6) include the following:

Network Metadata View Changes

The NODE_LEVEL_TABLE_NAME column is added to the USER_SDO_NETWORK_METADATA and ALL_SDO_NETWORK_METADATA views, which are described in Section 5.10.1.

Release 11.1 Changes

This section describes new and changed features of the Oracle Spatial topology and network data models for Oracle Database 11g Release 1 (11.1).

Load on Demand Analysis and Network Partitioning

To perform network analysis, you now have the option of partitioning the network and having needed partitions automatically loaded on demand during network analysis. This approach supplements the previous in-memory approach for network editing and analysis.


Note:

The in-memory approach will be deprecated in the next release of Spatial. Future development will enhance the load on demand approach, which you are encouraged use instead of the in-memory approach.

With the load on demand approach, you first partition the network into partitions of manageable size, and you use the load on demand Java API to perform analysis, which automatically loads and unloads needed partitions during analysis. This approach enables Spatial to perform network analysis on very large networks without memory limitation becoming a significant factor.

Load on demand analysis and network partitioning are described in Section 5.7.

Subpaths

A subpath is partial path along a path, created either as a result of a network analysis operation or explicitly by a user. The start and end points of a subpath are defined as link indexes and the percentage of the distance to the next node in the path. Subpaths are explained and illustrated in Section 5.3.1.

User Data Support

You can define your own data in the user data metadata view, and Spatial will manage the user data as well as the connectivity information. Each user data entry is stored as a column in node, link, path, and subpath tables. Spatial currently supports simple data types such as VARCHAR2, INTEGER, NUMBER, and SDO_GEOMETRY.

See the information about the include_user_data parameter for the SDO_NET.GENERATE_PARTITION_BLOB, SDO_NET.GENERATE_PARTITION_BLOBS, and SDO_NET.GET_PARTITION_SIZE subprograms.

XML API for Network Analysis

You can use the network data model XML API to perform network analysis. Web service requests are supported through Oracle Spatial Web services, which are described in Oracle Spatial Developer's Guide.

The XML schema of the network data model XML API is described in the following:

$ORACLE_HOME/md/doc/sdondmxml.zip
PKr$$PK ;AOEBPS/content.opf%8 Oracle® Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2) en-US E11831-04 Oracle Corporation Oracle Corporation Oracle® Spatial Topology and Network Data Models Developer's Guide, 11g Release 2 (11.2) 2011-07-29T23:03:51Z Provides usage and reference information about the topology data model and network data model capabilities of Oracle Spatial. PKn*8%8PK ;A OEBPS/lof.htmm List of Figures PK?prmPK ;AOEBPS/dcommon/prodbig.gif GIF87a!!!)))111BBBZZZsss{{ZRRcZZ!!1!91)JB9B9)kkcJJB991ssc絽Zcc!!{祽BZc!9B!c{!)c{9{Z{{cZB1)sJk{{Z{kBsZJ91)Z{!{BcsRsBc{9ZZk甽kBkR!BZ9c)JJc{!))BZks{BcR{JsBk9k)Zck!!BZ1k!ZcRBZcZJkBk1Z9c!R!c9kZRZRBZ9{99!R1{99R{1!1)c1J)1B!BJRkk{ƽ絵ތkk絵RRs{{{{JJsssBBkkk!!9ss{{ZZssccJJZZRRccRRZZ))cBBJJ99JJ!!c11991199Z11!c!!))Z!!!1BRck{)!cJBkZRZ,HP)XRÇEZ֬4jJ0 @ "8pYҴESY3CƊ@*U:lY0_0#  5tX1E: C_xޘeKTV%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Z5/t bS($ `Dǂ7Tg4*-ƫ8@$x =qh(o^4[7zծ-;UR!PNVz66h)[ELrɜ/$wrDZg;_c]V4V%ѦW qN6I'VSVf&-P7h)Y3>e֮W{Nş A`uGk~ydt\ۜV~h>𭮩SO-[HJ;dmE9>UNXv#Aeom!A@(K<7 77c<ٷ9ݞ15@+U??mp|~Lmnң|K7 ozm;[ dq@QYWcag]E7dtT5m7O--}2L ֤㼰L $0? PTz (KĺpcHH AA4EG[qo,sA*H2AG9yᵷX$/$0UE$xs@QYzotfoMPGkt\3*K]wGӧl[7y0#ѹ084(7zwp]ɝA GRO<6\K0DF dOhJ*gvgdH$F U(O]O+[U"ߌg2:zMմfݮ4Br%*8%I.QU9//വA.H,x$ƩxAn/u6 m$H2' 0zZԢvqX]wk&vMDlppAXnquoeZ\h.cevF9R0}Sg;_gojl|sVG #a=.Ug#KimrӆhN{O?eo;%}ssg޽D[kjN{7yrg۹J<9PM7ÛW)!yYTȹoAd w@Ҽeq56{ rk p dFFqOR7U|CO -I1$r@eTfo <C'C?IT&UlDFp(ƛzs[M$Ue_BGyz]?ͨz΀j6-¥낦Kvl#*H(j?4 1s6C5ԃ*o;%5w:ύm# caViA8:t:*?ֽt>,T {w?±k+h'cRW]uMsw\Oi&gR>ܡVVd=va;~adLvO8W?yk\fc~7lݞ~Q4?x޳q=ܚf'F@jhPt],g}+i_3n3/;cq(xfWyiVW 2gv\7 S?YN>O[>Oonϗsߊ|%^M5Ԁ'l%Np@|=q5{V()+䑌+wW<#[> ե][ΰhvBy' p3|!i3]o;EHY`W]o+aGFjǎfK=/Fe+6ϸ2T ۺCյ~'|ngMxvWBN ,HY\MJ'VI4Y}̀fٓV;A%<$8\ _/..fא,H%8 jEE]G,xOú:aIG=N==C²訨Û/ {1y6bv+%$ύښhmy\0ݸHM1q[bh;ky1۴N1M)Asȿ*k~>Q-tا,BXh!w `ttmKi +xi,U(' z E~$­ĺߍ5 [PyZ'f6˝ța(Ѩy 2+ֵx?\|GTn!E}%,yT8 G=Uru>Mj 4xKaBW%3C𦗥})V{CO$@6" NhmCۿG\~ wR𖝫9KH {vi?,InQInQtyZ襠+4Uq@4'\yRHU 3B|]^(k hwiCPHa#OR7U9<- hdF"`0H0}3rYZZk}P3cd-@ZXvz/+$W3n;ռ'p[lgp((((((((((((((.]@s&UCnd\:GSkkO^7KI<9 = cagYgaiy rI8Q$5]J Y4LO,!#v*zu]P&>\jW owrtX7s 㓒y&^O+D/D~K<{$>vFdv]E^S Y1#`2+>7Ú} \jRrEvP=DžkZx{=F.<miwUWJ43S6Ka *y>LO,!#v*zu]mAuK2Ⱥ%v_,s$]clQ@ѭulI :qU,;9, 1"6#*x8 €<!g&* G]\-O$MCp6+vH>ëXo`Wlf2UwD$A'8: oLUy4QAHkb<_= ?xcDK\dKYNbc'NXfOOL&D%ic; Yxl~UQԇZ uH4M6-@9KTYK6wg'''<֥QErzOTmOXc#JIp:n2y,Kk`@+(I"q+3N>[}d[7m`Õ @<acoiqv$0vdpV( { h~(,{{H0\y6! ۨ =NK;H.dgHʞPc:}wPr3]? xRէ@|yfb0# US F>J|:n+ȗsmD6UHrkx_^젴 jܴőwĹL0C'پ&f᧻Kշ`^'W+6=fmSKԦ[veBVڊsh_"3+ hPy;,>/r1^y5/)ӯdWVYc`P0W~ԑ@U^Wwpahn[\+*>Ʈ 8I m3OG-Y7 +7z (]G~<{jIs[BV!wvB~#`[-S4o'X=Te8;@̀ RX ExH| !??|>׏Z~i͎xY5kI, T}c:*?ֽ>\=HxWt|n";cGVl' G⿎)MBTD@ݪvاrU=+J}3L6EtQ'$$j|h*玼koogIK#9J(Pc[;yo|?ST_*ˌcH B?0̟?Nѷ !\x]SG +Gs. 8 THܑʜ^7ºIdlLDs(3b(5|A >$DaIdLML(X*lrI#n~ic\v:hMĚ͸Ul`c J3{j &oU7}:J:PxRGci-跶hQ:rb cMw'>h>(Wt۽J84[olȁwʹ|1Lx_o]ȳo:\]bfVl. <:J+;']L0DٕsoV>|?_?ıA2:֥88P6FG .핇I/n-.^9#b"b#A5\xW_)> xxOuF^&9$b+2rg{յ(tmTY +y.$X,U$ zI}.|]4d= T僬dg+]Ji @DGc;b|4/(xjM_7vW7g7Nc  0n1}/^'wã~FB.|J喧=tM^T|wF[r*e߂+^ 5!jvwS![}TVsJ|CI^^oL!_Iu4ϴJXrp\~}wn|I]V};ÒJEg lo]?(`čK70=ow:xQ=f,f|K*"˹ePw }Og'kuо7#MS#uyZ襮 ޙy[-; -*G'$ɯ΅8׼sƷ$#50y )Xm@ʚ^3O뺔\썧]0eS悻W;P/_wQEQEQEQEQEQEQEQEQEQEQEQE1Ѷx3d|~epHI;YG<YеKEEr6*It#>T<ΥEHMXȅXF%G@VLrwֽoy5ilϻKɐXшV9/~n+: 廎ɁXLTrNy@1G׵Ei`70 `'#lNU2 ŏs:2.l &i {;?v8rEjk?/yiZUc,I$umq€ |+."ӬPԅp8E8r2;q_ .%"F [rI'5앇 i3ю$#h(ɵ8ǂ|&|ͪiwznR#(RQNrq?W4OwZil{X0rrwT>xRmsයn.lC+NVUwnO Gmg4ls[YAw2x$WҶ4=`-m"X ̀brI$@2xW[W/KK*D Ʋ@ @z5[Ӭ̺hTKnP%BHO[%n 2DҶ)OUz1Jmnx(6 v2J8߯/IVY~6]TvsU2FxHHH#t(K` 1pGOw!uXma/]>TPpp0@q,QSݝB[:A@eFkԞ%X-ӌ3# w m^ݟ|9iI<< r@ձ@?: *OꏎiOŰ}C<ˈ .H*ǡei<Ӽa,cP6FQR$a9t#w/,;9, 1"6#*x8 €#ҵ[sK˘l|RFr<8"N_ѱj9m/@h%FfIY;qҰl}<*IU RћӊxWB𥙵,oP`7967dg_[374=nOkiuT 0P16ő9=ŏ~ n5+I-`N^Gt+?'Ԁnxχz녖jZz b W9q@9ƈ<sKBby.aFLx+A*?|9QHM\>]w8P3s3]eQEQEQEQEQEQEQEQEQEQEQEQEW]/4mgz_58g$fu-%Bw+swTC~W('>(?.핌.&lV8,@Q@Q@Q@Q@mKY-Ʃ]N]LҰ_*#Xqk((((()uxSt@CfR/dP zPQEQEQ^Go#Aז`e_&03akϡ|uYSŚ4Yb(9ӒWxX4hi"9Cc3|N{((?4[cwI>ݬN#PEmKY-Ʃ]N]LҰ_*#Xqh(((Sqxr YA{ϳ9.K/EzlQ^}~!blm!#bI!SQ\6xSza 5MT~Y=((((((((((((%O`%O`/Y u+M9mdou3*i'K6'ݷJ29I 8]q@㗉RGF]Pȥ7631 ~ yڷڤt/>TcA@|IvSWEsZ;ve JV 'F bݮ[GϗH]J)g':߉%GōV+)ckXDuQq mF>ENĽv.OĶzk|_Ovlr0B6B4s@D{M|cȐGt#Ir0O 0wZ c J.Nv=5?hw쵴| cH<xKOSO⿚ Os;?<9 F!{w$1RwmTHb5cƚm5 R_C&)X731 *Syvv5[߆1w`#D^Wu*x=8# c3è-%]jS 2x$𠳀 #<v+J3++>#χ$NKx qe~E,eqݍَL,3hZ_/IDgv;exA>|q|)> ih່҇ ұ Px!ncY[}}|:pW30!~}U#tp;tV}g],}j+3TmL( fCԞJ(Uxş.>~Ku-$t V(rI( /3I}u}oC gs:FPN<-rQ}PA$cvkC]k7)⫶l#M*%$6-rIeA Y~%ԦѼ+Oee5k %K"QRhZ߇[~iϕvnp38&ì]H^o#F@`IgѬvڌ)K$2v;FoZZ M_Hi4Vgh]y5~Wc]K87tῈv%8̟g< P:umJ7\Zii,"vq&pOʼzV_,,W6vZZǥ&`FlNp2I?I|$Ht.UG=HmKY-Ʃ]N]LҰ_*#Xqk/:O.'gNPKN=+g'dQPυx%ws9gXW͜a8QzTO[Xz4mG_,NsӖJ qQNꯪKkdi`1t%qF@#WğYɭ~6 2i; Gp8]F8$P**MWUOS7+Q'$kg'dQP}G\i~ ֟/ueÌ98*T7)Oi7`Mv#=!gc%*kgcWѭ{}OOuҭ dJ0H6O" [{J$DԌA(<7? iXKtH$2nJT9Z@4}F=F;*ʲ;Hc'=k(%O`%O`t>,T {x|Y`Z Vez}zlWU 'Hݍ^7?Ok8-NWа,#$A q2xOÿLxXѮN]A ~fTk\]x4$1fv1)$$;6_ /..cKXOޔrzrR< $_ K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@o3xFdgGH21f(A: s sװQ@?[7n{%5` :qaWqE uo 3\nhӵ6\J䎘 sD@x:ψo4>\Lg>R `@9(#־j1տKJYX}X8|zWz/k%2{ \q2sQ@Gzg0|A{Ȍ#H Hcoj--PyYRĞ09jQ@Ï¿Ɠ:|#Qn773kH:wa["k) ̙\ͻ7 +<W7/q|N%[)KԖXqpÿi}3fagkk\C n'j, dp]ESմuKi y-h ԩ#  ]Z+]ʋ4Rʝ rs]߃sjPP&H,r0zd]7gZhvO%;sǵlP=WJ43S6Ka +iO4>Z{lݴX 8q3^Eq~oc=RYSԵmj q c;GP Uň =s&_P|ig5q}((;oKx_iΥΊL l,WOe9Ç[-񞫯o.%I܅!pB'F+("@TP0%P㟄y:Ie2dz6 PxιM(O|9Tv-kSdW]8GN \>t!{kM2rx#& (%s}qνU=Ii?7 ;< O붹|+D]s޻ (on]6y<;Oz> |; C}4Vͭ'; e<2)#FMvPJ%_5{Oīe#:)pz?K0~nw>x4msV2qvP> F-f}#]iKaH*ι2HP+E^ޙaOMeX :wBNs=ﶒkwvP*G^׼/{xR`{vmF,x# t#wP+Ooygvglvǥpq ס&"&2lmJ vHW{J(W/ Yj!g{nnnE*`p ᖗk:Ko勷hfL IP?w xXmZZI:[IpP>P:,ׂLֱDD pDʪam%C ugzUI46P;nXQ\9^4 giۋ coȿq{Ǿ+<+="5[`}bm Ex~_{5۽+^#HGDm8$ҽIԡtkRdX/m㸍d0WP3hy_yLJ(RK{p;\n$ds3P|L9c]!m9anf:q# `k9<[h_i*pyu?汥 ua5~VӲһzmcfy|34& cX`;hoǞ+\gDk71H@9ڬGJ+'EW_4PFpWͶόw] Ow%ƭr|Xܬ{U.2'vqS;ž WٶH5+QKn=="xRnMR HgmQJFs=+jEE^@TmϯAh4"lsL9` Z6*w9=sZυtRcYlc(g@ qk$](<RAEP|EWO)YYr 3؝M⏈,Qixs*_*XBmNecE<9<]9 HRFx zƹowibԚ&4) wVI<q r |cq wҵ ÃW#>ep?)V"my2^En3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<_u/VZ2n#r4G# =qoaIݺb+Cv;]a؏BpA;Vx;T84[qr;ua0R:( KcX0N⌥KI)[3.{}>Z_^!7M2Ub.0N]}Ew ԭ~,D`.m3k v?1#S^y \GE۹=Te{9x>/Ѿ >)VO{dmK-Zc՟>4il~QO=6{#njX1lǴ@ 8|!MCga6kH݄R]YK y鹱]ǃ|!}ọRV޹j<TD7H r~/wFмI&w dE,6XV.nӍďy|HԵ87Ƌat\- 0$_?p~3#k{[iN~`6pwTo .OKZ J[.$&[ҬuυGsgqڤ?FR~ wC[An}۷p-A;^psk^2wpY[D/-)UԜ=;ť><\ff'v=I.x@zωu_843 &BĈF<`wy+D6goiRZ޲)kưyZ<|3r!p#TEx#s=zGOZA[/uu#خUGA įVyG_c ^o5w8E mWxH+_N-Wdwq)| gk8Gw?MYi OL"0Vzc?O5 `_^ӤMZ)L?*&;tkIPKxX 7p[' 6!J#O<5`_߀1xGIռUXϷ̋fX0`r֧)sF-.(VBN/7>sų+7̀ʆzֆkyc2QEEq6d3nUr[~OҼ@gՙ ˩L`/H[h۞H9=QCS}|.:w~Ǭ_[u]O4ϴ8zW ׵o>˭fV7[!\*r?@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP=7ItkvK˴vJ[dg EQEQEQEQE^S Y1#`2*H +{x$qơU 8IEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQMEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEPKWMPK ;AOEBPS/dcommon/contbig.gif`GIF87a!!!111999BBBJJJRRRccckkksss{{{skk{{ZRRRJJƽ{sZRJRJB91)kcZB9)sskZRJ1޽ƽ{{ssskkkcƵZZRccZRRJJJB{BB9991ssckkZccR))!RRB!!JJ1))99!11ƌ)1R)k֔)s1RZJR{BJs9R1J!11J1J9k{csZk!1J!)cBR9J1B)91B!cRs{!)s!){1B!k!s!{ksksckckZc9B)1!)!)BJ9B1919έƌ!!)JJcZZ{!!!1RR{JJsBBkJJ{!!9BB{1!!J9)!!Z!!c1!!kR!!s9Z!BckJs)19!!c!!ZRZ,H rrxB(Kh" DժuICiи@S z$G3TTʖ&7!f b`D 0!A  k,>SO[!\ *_t  Exr%*_}!#U #4 & ֩3|b]L ]t b+Da&R_2lEٱZ`aC)/яmvUkS r(-iPE Vv_{z GLt\2s!F A#葡JY r|AA,hB}q|B`du }00(䡆<pb,G+oB C0p/x$…– ]7 @2HFc ) @AD \0 LHG',(A` `@SC)_" PH`}Y+_|1.K8pAKMA @?3҄$[JPA)+NH I ,@8G0/@R T,`pF8Ѓ)$^$ DDTDlA@ s;PKPK ;AOEBPS/dcommon/darbbook.cssPKPK ;A!OEBPS/dcommon/O_signature_clr.JPG"(JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?O '~MQ$Vz;OlJi8L%\]UFjޙ%ԯS;rA]5ފ<׈]j7Ouyq$z'TQuw7Ŀ KX߁M2=S'TQt?.5w'97;~pq=" ~k?`'9q6 E|yayM^Om'fkC&<5x' ?A?Zx'jß={=SßM gVC.5+Hd֪xc^)Җufz{Cީ|D Vkznq|+Xa+{50rx{|OG.OϞ~f/ xxX[2H )c+#jpUOZYX\=SG ߨC|K@;_߆'e?LT?]:?>w ڔ`D^So~xo[Ӡ3i7B:Q8 Vc-ďoi:FM292~y_*_闱YN\Fr=xZ3鳎OwW_QEzW~c]REeaSM}}Hӏ4&.E]u=gMѠ+mF`rNn$w9gMa꺢nTuhf2Xv>އ a(Û6߭?<=>z'TQuw7Ŀ KX߁M2=S'TQt?.5Kko\.8S$TOX߀Gw?Zx汴X)C7~.i6(Щ=+4{mGӭ¸-]&'t_kV*I<1)4thtIsqpQJ+> \m^[aJ5)ny:4o&QEnyAEPEEss 72,PDۢ׃K W{Wjr+wگ iM/;pd?~&?@;7E4gv8 $l'z'TQuw7Ŀ Gֱ=ɿ&G?. iR(5W*$|?w᫼gkmIbHe/_t>tg%y.l}N5[]+Mk0ĠeHdPrsst'UiC,y8`V%9ZIia|ܪvi מYG,o}+kk{YbyIeb*sAtի82zWoEK5z*o-eo;n(P u-I)4Š(HQEQEQEQEhz(X/Đ?}Bk˩ ݏrk0]4>8XzV? }6$}d^F>nU K ?Bտk_9׾x~w'ߞ  uDŽtL ؈5c-E/"|_Oo.IH쐍=i*Iw5(ںw?t5s.)+tQ2dUt5Vĺ.jZ"@IRrZƅY4ߡ_;}ų(KyQf1Aǵt?sZg+?F5_oQR&Dg߿]6FuRD u>ڿxl7?IT8'shj^=.=J1rj1Wl$얲cPx;E,p$֟ˏkw qg"45(ǛkV/=+ũ)bYl~K#˝J_כ5&\F'I#8/|wʾ_Xj Q:os^T1.M_|TO.;?_  jF?g N 8nA2F%i =qW,G=5OU u8]Rq?wr'˻S+۾.ܼ 87Q^elo/T*?L|ۚ<%<,/v_OKs B5f/29n0=zqQq(ª=VX@*J(э(f5qJN_EVǞQEOuoѕOuoa5}gO?:߂8Wא|cڽ~]N&O( (<]>͠@VQ=^~U ̴m&\խ5i:}|}r~9՝f}_>'vVֲ$~^f30^in{\_.O F8to}?${φ|#x^#^n~w=~k~?'KRtO.㌡h![3Zu*ٷճ(ԟ]z_/W1(ԟ]v~g|Yq<ז0 ; b8֮s,w9\?uEyStKaª@\,)) (!EPEPEPEPEPzѧts{v>C/"N6`d*J2gGӧWqBq_1ZuΓ\X]r?=Ey88Mp&pKtO-"wR2 K^-Z< \c>V0^@O7x2WFjs<׻kZ(<Т(OFw/6$1[:ޯԯ#q~4|,LVPem=@=YLUxӃV}AUbcUB.Ds5*kٸAeG>PJxt͝ b88?*$~@ׯD VkraiJs}Q.20x&mXξ,Z]“A-J#`+-E/"<]\a'tZGy.(|lދ~gMK OZdxDŽU9T6ϯ^<Ϡt5CZ]].t۫S=s`ڳ%8iVK:nqe+#<.T6U>zWoy3^I {F?J~=G}k)K$$;$de8*G Uӟ4Ocºw}|]4=ݣ\x$ʠms?q^ipw\"ȿPs^Z Q_0GڼU.t}ROM[G#]8wٞ ӫ87}Cgw vHȩBM55vof =A_٭`Ygx[6 P,5}>蚊(0(+?>+?> k|TuXq6_ +szk :u_ Z߶Ak_U}Jc2u/1[_»ݸG41-bሬ۴}}Eȹפ_c?5gi @cL\L<68hF_Ih>X4K7UТ sMj =J7CKo>Օ5s:߀t ~ηaٿ?|gdL8+gG%o?x`دOqȱwc¨&TW_V_aI=dpG!wu۞սZ1yL50$(l3(:~'ַo A}a3N*[0ǭ HKQV}G@֜$ 9of$ArNqUOgË05#m?D)^_h//5_/<?4}Jį+GkpG4"$ r| >S4Ђ"S 1%R:ȝ 8;PKPz PK ;AOEBPS/dcommon/feedback.gif7GIF89a'%(hp|fdx?AN5:dfeDGHɾTdQc`g*6DC\?ؘ||{;=E6JUՄfeA= >@,4`H.|`a (Q 9:&[|ځ,4p Y&BDb,!2@, $wPA'ܠǃ@CO~/d.`I @8ArHx9H75j L 3B/` P#qD*s 3A:3,H70P,R@ p!(F oԥ D;"0 ,6QBRɄHhI@@VDLCk8@NBBL2&pClA?DAk%$`I2 #Q+l7 "=&dL&PRSLIP)PɼirqМ'N8[_}w;PK-PK ;AOEBPS/dcommon/booklist.gifGIF89a1޵֥΄kZ{Jk1Rs!BZ)B),@I9Z͓Ca % Dz8Ȁ0FZЌ0P !x8!eL8aWȠFD(~@p+rMS|ӛR$ v "Z:]ZJJEc{*=AP  BiA ']j4$*   & 9q sMiO?jQ = , YFg4.778c&$c%9;PKː5PK ;AOEBPS/dcommon/cpyr.htm1 Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2012, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in prerelease status:

This documentation is in prerelease status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PKN61PK ;AOEBPS/dcommon/masterix.gif.GIF89a1ޜΌscJk1Rs!Bc1J),@IS@0"1 Ѿb$b08PbL,acr B@(fDn Jx11+\%1 p { display: none; } /* Class Selectors */ .ProductTitle { font-family: sans-serif; } .BookTitle { font-family: sans-serif; } .VersionNumber { font-family: sans-serif; } .PrintDate { font-family: sans-serif; font-size: small; } .PartNumber { font-family: sans-serif; font-size: small; } PKeӺ1,PK ;AOEBPS/dcommon/larrow.gif#GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШtpHc`  өb[.64ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPK ;AOEBPS/dcommon/index.gifGIF89a1޵ΥΥ{sc{BZs,@IM" AD B0 3.R~[D"0, ]ШpRNC  /& H&[%7TM/`vS+-+ q D go@" 4o'Uxcxcc&k/ qp zUm(UHDDJBGMԃ;PK(PK ;AOEBPS/dcommon/bookbig.gif +GIF89a$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9B!& Imported from GIF image: bookbig.gif,$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9BH`\Ȑ:pظа"A6DBH,V@Dڹ'G"v Æ ܥ;n;!;>xAܽ[G.\rQC wr}BŊQ A9ᾑ#5Y0VȒj0l-GqF>ZpM rb ;=.ސW-WѻWo ha!}~ْ ; t 53 :\ 4PcD,0 4*_l0K3-`l.j!c Aa|2L4/1C`@@md;(H*80L0L(h*҇҆o#N84pC (xO@ A)J6rVlF r  fry†$r_pl5xhA+@A=F rGU a 1х4s&H Bdzt x#H%Rr (Ѐ7P`#Rщ'x" #0`@~i `HA'Tk?3!$`-A@1l"P LhʖRG&8A`0DcBH sq@AXB4@&yQhPAppxCQ(rBW00@DP1E?@lP1%T` 0 WB~nQ@;PKGC PK ;AOEBPS/dcommon/rarrow.gif/GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШLlԸ NCqWEd)#34vwwpN|0yhX!'+-[F 'n5 H $/14w3% C .90" qF 7&E "D mnB|,c96) I @0BW{ᢦdN p!5"D`0 T 0-]ʜ$;PKJV^PK ;AOEBPS/dcommon/mix.gifkGIF89aZZZBBBJJJkkk999sss!!!111cccֽ{{{RRR)))猌ƭ{s{sks!,@@pH,B$ 8 t:<8 *'ntPP DQ@rIBJLNPTVEMOQUWfj^!  hhG H  kCúk_a Ǥ^ h`B BeH mm  #F` I lpǎ,p B J\Y!T\(dǏ!Gdˆ R53ټ R;iʲ)G=@-xn.4Y BuU(*BL0PX v`[D! | >!/;xP` (Jj"M6 ;PK枰pkPK ;AOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PK ;AOEBPS/dcommon/toc.gifGIF89a1ΥΥ{c{Z{JkJk1Rk,@IK% 0| eJB,K-1i']Bt9dz0&pZ1o'q(؟dQ=3S SZC8db f&3v2@VPsuk2Gsiw`"IzE%< C !.hC IQ 3o?39T ҍ;PKv I PK ;AOEBPS/dcommon/topnav.gifGIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)-'KR$&84 SI) XF P8te NRtHPp;Q%Q@'#rR4P fSQ o0MX[) v + `i9gda/&L9i*1$#"%+ ( E' n7Ȇ(,҅(L@(Q$\x 8=6 'נ9tJ&"[Epljt p#ѣHb :f F`A =l|;&9lDP2ncH R `qtp!dȐYH›+?$4mBA9 i@@ ]@ꃤFxAD*^Ŵ#,(ε  $H}F.xf,BD Z;PK1FAPK ;AOEBPS/dcommon/bp_layout.css# @charset "utf-8"; /* bp_layout.css Copyright 2007, Oracle and/or its affiliates. All rights reserved. */ body { margin: 0ex; padding: 0ex; } h1 { display: none; } #FOOTER { border-top: #0d4988 solid 10px; background-color: inherit; color: #e4edf3; clear: both; } #FOOTER p { font-size: 80%; margin-top: 0em; margin-left: 1em; } #FOOTER a { background-color: inherit; color: gray; } #LEFTCOLUMN { float: left; width: 50%; } #RIGHTCOLUMN { float: right; width: 50%; clear: right; /* IE hack */ } #LEFTCOLUMN div.portlet { margin-left: 2ex; margin-right: 1ex; } #RIGHTCOLUMN div.portlet { margin-left: 1ex; margin-right: 2ex; } div.portlet { margin: 2ex 1ex; padding-left: 0.5em; padding-right: 0.5em; border: 1px #bcc solid; background-color: #f6f6ff; color: black; } div.portlet h2 { margin-top: 0.5ex; margin-bottom: 0ex; font-size: 110%; } div.portlet p { margin-top: 0ex; } div.portlet ul { list-style-type: none; padding-left: 0em; margin-left: 0em; /* IE Hack */ } div.portlet li { text-align: right; } div.portlet li cite { font-style: normal; float: left; } div.portlet li a { margin: 0px 0.2ex; padding: 0px 0.2ex; font-size: 95%; } #NAME { margin: 0em; padding: 0em; position: relative; top: 0.6ex; left: 10px; width: 80%; } #PRODUCT { font-size: 180%; } #LIBRARY { color: #0b3d73; background: inherit; font-size: 180%; font-family: serif; } #RELEASE { position: absolute; top: 28px; font-size: 80%; font-weight: bold; } #TOOLS { list-style-type: none; position: absolute; top: 1ex; right: 2em; margin: 0em; padding: 0em; background: inherit; color: black; } #TOOLS a { background: inherit; color: black; } #NAV { float: left; width: 96%; margin: 3ex 0em 0ex 0em; padding: 2ex 0em 0ex 4%; /* Avoiding horizontal scroll bars. */ list-style-type: none; background: transparent url(../gifs/nav_bg.gif) repeat-x bottom; } #NAV li { float: left; margin: 0ex 0.1em 0ex 0em; padding: 0ex 0em 0ex 0em; } #NAV li a { display: block; margin: 0em; padding: 3px 0.7em; border-top: 1px solid gray; border-right: 1px solid gray; border-bottom: none; border-left: 1px solid gray; background-color: #a6b3c8; color: #333; } #SUBNAV { float: right; width: 96%; margin: 0ex 0em 0ex 0em; padding: 0.1ex 4% 0.2ex 0em; /* Avoiding horizontal scroll bars. */ list-style-type: none; background-color: #0d4988; color: #e4edf3; } #SUBNAV li { float: right; } #SUBNAV li a { display: block; margin: 0em; padding: 0ex 0.5em; background-color: inherit; color: #e4edf3; } #SIMPLESEARCH { position: absolute; top: 5ex; right: 1em; } #CONTENT { clear: both; } #NAV a:hover, #PORTAL_1 #OVERVIEW a, #PORTAL_2 #OVERVIEW a, #PORTAL_3 #OVERVIEW a, #PORTAL_4 #ADMINISTRATION a, #PORTAL_5 #DEVELOPMENT a, #PORTAL_6 #DEVELOPMENT a, #PORTAL_7 #DEVELOPMENT a, #PORTAL_11 #INSTALLATION a, #PORTAL_15 #ADMINISTRATION a, #PORTAL_16 #ADMINISTRATION a { background-color: #0d4988; color: #e4edf3; padding-bottom: 4px; border-color: gray; } #SUBNAV a:hover, #PORTAL_2 #SEARCH a, #PORTAL_3 #BOOKS a, #PORTAL_6 #WAREHOUSING a, #PORTAL_7 #UNSTRUCTURED a, #PORTAL_15 #INTEGRATION a, #PORTAL_16 #GRID a { position: relative; top: 2px; background-color: white; color: #0a4e89; } PK3( # PK ;AOEBPS/dcommon/bookicon.gif:GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ޭ{{ZRRcZZRJJJBB)!!skRB9{sν{skskcZRJ1)!֭ƽ{ZZRccZJJBBB999111)JJ9BB1ZZB!!ﭵBJJ9BB!!))Jk{)1!)BRZJ{BsR!RRJsJ!J{s!JsBkks{RsB{J{c1RBs1ZB{9BJ9JZ!1BJRRs!9R!!9Z9!1)J19JJRk19R1Z)!1B9R1RB!)J!J1R)J119!9J91!9BkksBBJ119BBR!))9!!!JB1JJ!)19BJRZckތ1)1J9B,H*\hp >"p`ƒFF "a"E|ժOC&xCRz OBtX>XE*O>tdqAJ +,WxP!CYpQ HQzDHP)T njJM2ꔀJ2T0d#+I:<жk 'ꤱF AB @@nh Wz' H|-7f\A#yNR5 /PM09u UjćT|q~Yq@&0YZAPa`EzI /$AD Al!AAal 2H@$ PVAB&c*ؠ p @% p-`@b`uBa l&`3Ap8槖X~ vX$Eh`.JhAepA\"Bl, :Hk;PKx[?:PK ;AOEBPS/dcommon/conticon.gif^GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ZRR޽{{ssskkkcccZ991ccRZZBBJJZck)19ZcsBJZ19J!k{k)Z1RZs1!B)!J91{k{)J!B!B911)k{cs!1s!9)s!9!B!k)k1c!)Z!R{9BJcckZZcBBJ99B119{{!!)BBRBBZ!))999R99Z!!999c1!9!)19B1)!B9R,  oua\h2SYPa aowwxYi 9SwyyxxyYSd $'^qYȵYvh ч,/?g{н.J5fe{ڶyY#%/}‚e,Z|pAܠ `KYx,ĉ&@iX9|`p ]lR1khٜ'E 6ÅB0J;t X b RP(*MÄ!2cLhPC <0Ⴁ  $4!B 6lHC%<1e H 4p" L`P!/,m*1F`#D0D^!AO@..(``_؅QWK>_*OY0J@pw'tVh;PKp*c^PK ;AOEBPS/dcommon/blafdoc.cssL@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.10.7 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; } h2 { font-size: 152%; font-weight: bold; } h3 { font-size: 139%; font-weight: bold; } h4 { font-size: 126%; font-weight: bold; } h5 { font-size: 113%; font-weight: bold; display: inline; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #e00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #e00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKʍPK ;AOEBPS/dcommon/rightnav.gif&GIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)- $CҠҀ ! D1 #:aS( c4B0 AC8 ְ9!%MLj Z * ctypJBa H t>#Sb(clhUԂ̗4DztSԙ9ZQҀEPEPEPEPEPEPEPM=iԍP Gii c*yF 1׆@\&o!QY00_rlgV;)DGhCq7~..p&1c:u֫{fI>fJL$}BBP?JRWc<^j+χ5b[hֿ- 5_j?POkeQ^hֿ1L^ H ?Qi?z?+_xɔŪ\썽O]χ>)xxV/s)e6MI7*ߊޛv֗2J,;~E4yi3[nI`Ѱe9@zXF*W +]7QJ$$=&`a۾?]N T䏟'X)Ɣkf:j |>NBWzYx0t!* _KkoTZ?K Gc+UyڹgNuh^iSo5{\ܹ3Yos}.>if FqR5\/TӮ#]HS0DKu{($"2xִ{SBJ8=}Y=.|Tsц2UЫ%.InaegKo z ݎ3ֹxxwM&2S%';+I',kW&-"_¿_ Vq^ܫ6pfT2RV A^6RKetto^[{w\jPZ@ޢN4/XN#\42j\(z'j =~-I#:q[Eh|X:sp* bifp$TspZ-}NM*B-bb&*xUr#*$M|QWY ~p~- fTED6O.#$m+t$˙H"Gk=t9r娮Y? CzE[/*-{c*[w~o_?%ƔxZ:/5𨴟q}/]22p qD\H"K]ZMKR&\C3zĽ[PJm]AS)Ia^km M@dК)fT[ijW*hnu Ͳiw/bkExG£@f?Zu.s0(<`0ֹoxOaDx\zT-^ѧʧ_1+CP/p[w 9~U^[U<[tĽwPv[yzD1W='u$Oeak[^ |Gk2xv#2?¹TkSݕ| rݞ[Vi _Kz*{\c(Ck_܏|?u jVڔ6f t?3nmZ6f%QAjJf9Rq _j7Z-y.pG$Xb]0')[_k;$̭?&"0FOew7 z-cIX岛;$u=\an$ zmrILu uٞ% _1xcUW%dtÀx885Y^gn;}ӭ)場QEQ@Q@Q@Q@Q@Q@!4xPm3w*]b`F_931˜[ן+(> E ly;<;MF-qst+}DH @YKlLmؤciN<|]IU)Lw(8t9FS(=>og<\Z~u_+X1ylsj'eՃ*U3`C!N9Q_WܱhKc93^ua>H ƕGk=8~e#_?{ǀe-[2ٔ7;=&K挑5zsLdx(e8#{1wS+ΝVkXq9>&yஏh$zq^0~/j@:/«Vnce$$uoPp}MC{$-akH@ɫ1O !8R9s5ԦYmϧ'OUṡ5T,!Ԛ+s#1Veo=[)g>#< s)ƽُA^䠮ωFUj(ǩ|N3Jڷ睁ϱuږZYGOTsI<&drav?A^_f׻B$,O__ԿC`it{6>G׈C~&$y؎v1q9Sc1fH[ѽ>,gG'0'@Vw,BO [#>ﱺg5ΒFVD%Yr:O5 Tu+O멃]ی38Ze}R&ѝ_xzc1DXgس;<,_,{ƽY'AS#oF.M#~cBuEx7G+Y)(5q+GCV;qF+CLQ)qEC&6z𿊘z}?&w=+)??&\g{;V??׻xGœdٿ׼-Nc')3K]N)iLTӿCdb7Q^a N sd>Fz[0S^s'Zi 77D}kWus ab~~H(>.fif9,~|Jk;YN3H8Y(t6Q݉k͇_÷Z+2߄&[ +Tr^藺97~c܎=[f1RrBǓ^kEMhxYVm<[џ6| kqbѱ| YA{G8p?\UM7Z66 g1U1igU69 u5Pƪ:VVZC=[@ҹ¨$kSmɳО\vFz~i3^a Osŧυ9Q}_3 όO{/wgoet39 vO2ea;Ύ7$U#?k+Ek&dpzbӱ+TaB0gN{[N7Gי}U7&@?>Fz~E!a@s ?'67XxO*!?qi]֏TQN@tI+\^s8l0)2k!!iW8F$(yOּT.k,/#1:}8uT˾+5=O/`IW G֯b.-<= HOm;~so~hW5+kS8s.zwE| ?4ӿw/K N 9?j(#0UT` Wzw}:_*9m>󑓀F?ELzv=8q:=WgJ`nDr Zе<ֹ](Q@Q@Q@Q@Q@Q@Q@Q@ 'IdC0EYJVcMty_~u+Sw-aO n<[YJgL#6i g5ЖDZ14cʝ!!\/M}/_AYR__>oC? _?7_G#RERW쏞KB}JxGSkǕA pƱơP m]hwB7U$Zq M95"3q1ioATߚ{g.t uu2k=;h#YB= fgS :TdLԃ!44mFK{Hrd^7oz|BVr<{)6AXգV»|>*/hS܏z͆OM=Εq (s|s׊LKQI :9NJ)P+!ʣoAF>+=@I}"x/}۠1aנc¹4emC:>p_xWKX` >R3_S½èųp3޺u3N e یbmͺ<_ mnݮ1Op?Gm)Qb%N585'%Ahs\6yw!"&Ɨ._wk)}GP;Z!#\"< *oƾ\)}N>"լ/~]Lg}pBG X?<zZ#x69S=6) jzx=y9O&>+e!!? ?s~k5Gʏ)?*ce7Ox~k5􇔾Q/e7/Ԑ#3OgNC0] ;_FiRl>Q.g>!%k#ú:Kn'&}?U@\pџPtp)v<{_i}Oվֲ3XIYIx~b<D?(=_JXH=bbi=Oh?_ C_O)}oW쏜? %Ƶ;-RYFi`wۭ{ϖZMtQ$"c_+ԃx1*0b;ԕ݋ESQEQEQEQEQEQEQEQEQEQZ(1F)h1K@XLRE&9P (bf{RӨ&)PEPEPbԴPGKZ(iإbn(:A%S0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((PKje88PK ;AOEBPS/dcommon/help.gif!GIF89a1εֵ֜֜{kZsBc{,@ )sƠTQ$8(4ʔ%ŌCK$A HP`$h8ŒSd+ɡ\ H@%' 6M HO3SJM /:Zi[7 \( R9r ERI%  N=aq   qƦs *q-n/Sqj D XZ;PKއ{&!PK ;AOEBPS/sdo_topo_editing.htm Editing Topologies

2 Editing Topologies

This chapter explains how to edit node and edge data in a topology. The operations include adding, moving, and removing nodes and edges, and updating the coordinates of an edge.

This chapter explains two approaches to editing topology data, and it explains why one approach (creating and using a special cache) is better in most cases. It also describes the behavior and implications of some major types of editing operations. It contains the following major sections:

The explanations in this chapter refer mainly to the PL/SQL application programming interface (API) provided in the MDSYS.SDO_TOPO_MAP package, which is documented in Chapter 4. However, you can also perform topology editing operations using the client-side Java API, which is introduced in Section 1.8.2 and is explained in the Javadoc-generated documentation.

To edit topology data, always use the PL/SQL or Java API. Do not try to perform editing operations by directly modifying the node, edge, or face information tables.

For cross-schema topology editing considerations, see Section 1.10.2.

2.1 Approaches for Editing Topology Data

Whenever you need to edit a topology, you can use PL/SQL or Java API. In both cases, Oracle Spatial uses an in-memory topology cache, specifically, a TopoMap object (described in Section 2.1.1):

  • If you use the PL/SQL API, you can either explicitly create and use the cache or allow Spatial to create and use the cache automatically.

  • If you use the Java API, you must explicitly create and use the cache.

Allowing Spatial to create and manage the cache automatically is simpler, because it involves fewer steps than creating and using a cache. However, because allowing Spatial to create and manage the cache involves more database activity and disk accesses, it is less efficient when you need to edit more than a few topological elements.

2.1.1 TopoMap Objects

A TopoMap object is associated with an in-memory cache that is associated with a topology. If you explicitly create and use a cache for editing a topology, you must create a TopoMap object to be associated with a topology, load all or some of the topology into the cache, edit objects, periodically update the topology to write changes to the database, commit the changes made in the cache, and clear the cache.

Although this approach involves more steps than allowing Spatial to create and use the cache automatically, it is much faster and more efficient for most topology editing sessions, which typically affect hundreds or thousands of topological elements. It is the approach shown in most explanations and illustrations.

A TopoMap object can be updatable or read-only, depending on the value of the allow_updates parameter when you call the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure:

  • With a read-only TopoMap object, topological elements (primitives) are loaded but not locked.

  • With an updatable TopoMap object, topological elements (primitives) are loaded and locked. If you specified a rectangular window for an updatable TopoMap object, you can edit only those topological elements inside the specified window. (The TopoMap object may also contain locked topological elements that you cannot edit directly, but that Oracle Spatial can modify indirectly as needed.)

    For more information about what occurs when you use an updatable TopoMap object, see the Usage Notes for the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure.

The following procedures set an updatable TopoMap object to be read-only:

Within a user session at any given time, there can be no more than one updatable TopoMap object. However, multiple different user sessions can work with updatable TopoMap objects based on the same topology, as long as their editing windows do not contain any topological elements that are in any other updatable TopoMap objects. There can be multiple read-only TopoMap objects within and across user sessions.

Two or more users can edit a topology at the same time as long as their editing windows (specified in the call to the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure) do not overlap.

2.1.2 Specifying the Editing Approach with the Topology Parameter

For many SDO_TOPO_MAP package functions and procedures that edit topologies, such as SDO_TOPO_MAP.ADD_NODE or SDO_TOPO_MAP.MOVE_EDGE, you indicate the approach you are using for editing by specifying either a topology name or a null value for the first parameter, which is named topology:

  • If you specify a topology name, Spatial checks to see if an updatable TopoMap object already exists in the user session; and if one does not exist, Spatial creates an internal TopoMap object, uses that cache to perform the editing operation, commits the change (or rolls back changes to the savepoint at the beginning of the process if an exception occurred), and deletes the TopoMap object. (If an updatable TopoMap object already exists, an exception is raised.) For example, the following statement removes the node with node ID value 99 from the MY_TOPO topology:

    CALL SDO_TOPO_MAP.REMOVE_NODE('MY_TOPO', 99);
    
  • If you specify a null value, Spatial checks to see if an updatable TopoMap object already exists in the user session; and if one does exist, Spatial performs the operation in the TopoMap object's cache. (If no updatable TopoMap object exists, an exception is raised.) For example, the following statement removes the node with node ID value 99 from the current updatable TopoMap object:

    CALL SDO_TOPO_MAP.REMOVE_NODE(null, 99);
    

2.1.3 Using GET_xxx Topology Functions

Some SDO_TOPO_MAP package functions that get information about topologies have topology and topo_map as their first two parameters. Examples of such functions are SDO_TOPO_MAP.GET_EDGE_COORDS and SDO_TOPO_MAP.GET_NODE_STAR. To use these functions, specify a valid value for one parameter and a null value for the other parameter, as follows:

  • If you specify a valid topology parameter value, Spatial retrieves the information for the specified topology. It creates an internal TopoMap object, uses that cache to perform the operation, and deletes the TopoMap object. For example, the following statement returns the edge coordinates of the edge with an ID value of 1 from the CITY_DATA topology:

    SELECT SDO_TOPO_MAP.GET_EDGE_COORDS('CITY_DATA', null, 1) FROM DUAL;
    
  • If you specify a null topology parameter value and a valid topo_map parameter value, Spatial uses the specified TopoMap object (which can be updatable or read-only) to retrieve the information for the specified topology. For example, the following statement returns the edge coordinates of the edge with an ID value of 1 from the CITY_DATA_TOPOMAP TopoMap object:

    SELECT SDO_TOPO_MAP.GET_EDGE_COORDS(null, 'CITY_DATA_TOPOMAP', 1) FROM DUAL;
    
  • If you specify a null or invalid value for both the topology and topo_map parameters, an exception is raised.

Some SDO_TOPO_MAP package functions that get information about topology editing operations have no parameters. Examples of such functions are SDO_TOPO_MAP.GET_FACE_ADDITIONS and SDO_TOPO_MAP.GET_NODE_CHANGES. These functions use the current updatable TopoMap object. If no updatable TopoMap object exists, an exception is raised. For example, the following statement returns an SDO_NUMBER_ARRAY object (described in Section 1.6.7) with the node ID values of nodes that have been added to the current updatable TopoMap object:

SELECT SDO_TOPO_MAP.GET_NODE_ADDITIONS FROM DUAL;

2.1.4 Process for Editing Using Cache Explicitly (PL/SQL API)

Figure 2-1 shows the recommended process for editing topological elements using the PL/SQL API and explicitly using a TopoMap object and its associated cache.

Figure 2-1 Editing Topologies Using the TopoMap Object Cache (PL/SQL API)

Description of Figure 2-1 follows
Description of "Figure 2-1 Editing Topologies Using the TopoMap Object Cache (PL/SQL API)"

As Figure 2-1 shows, the basic sequence is as follows:

  1. Create the TopoMap object, using the SDO_TOPO_MAP.CREATE_TOPO_MAP procedure.

    This creates an in-memory cache for editing objects associated with the specified topology.

  2. Load the entire topology or a rectangular window from the topology into the TopoMap object cache for update, using the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure.

    You can specify that in-memory R-tree indexes be built on the edges and faces that are being loaded. These indexes use some memory resources and take some time to create and periodically rebuild; however, they significantly improve performance if you edit a large number of topological elements in the session. (They can also improve performance for queries that use a read-only TopoMap object.)

  3. Perform a number of topology editing operations (for example, add 1000 nodes).

    Periodically, validate the cache by calling the SDO_TOPO_MAP.VALIDATE_TOPO_MAP function.

    You can rebuild existing in-memory R-tree indexes on edges and faces in the TopoMap object, or create new indexes if none exist, by using the SDO_TOPO_MAP.CREATE_EDGE_INDEX and SDO_TOPO_MAP.CREATE_FACE_INDEX procedures. For best index performance, these indexes should be rebuilt periodically when you are editing a large number of topological elements.

    If you want to discard edits made in the cache, call the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure. This procedure fails if there are any uncommitted updates; otherwise, it clears the data in the cache and sets the cache to be read-only.

  4. Update the topology by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.

  5. Repeat Steps 3 and 4 (editing objects, validating the cache, rebuilding the R-tree indexes, and updating the topology) as often as needed, until you have finished the topology editing operations.

  6. Commit the topology changes by calling the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure. (The SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure automatically performs the actions of the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure before it commits the changes.) After the commit operation, the cache is made read-only (that is, it is no longer updatable). However, if you want to perform further editing operations using the same TopoMap object, you can load it again and use it (that is, repeat Steps 2 through 5, clearing the cache first if necessary).

    To perform further editing operations, clear the TopoMap object cache by calling the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure, and then go to Step 2.

    If you want to discard all uncommitted topology changes, you can call the SDO_TOPO_MAP.ROLLBACK_TOPO_MAP procedure at any time. After the rollback operation, the cache is cleared.

  7. Remove the TopoMap object by calling the SDO_TOPO_MAP.DROP_TOPO_MAP procedure.

    This procedure removes the TopoMap object and frees any resources that it had used. (If you forget to drop the TopoMap object, it will automatically be dropped when the user session ends.) This procedure also rolls back any topology changes in the cache that have not been committed.

    If the application terminates abnormally, all uncommitted changes to the database will be discarded.

If you plan to perform a very large number of topology editing operations, you can divide the operations among several editing sessions, each of which performs Steps 1 through 7 in the preceding list.

2.1.5 Process for Editing Using the Java API

Figure 2-2 shows the recommended process for editing topological elements using the client-side Java API, which is introduced in Section 1.8.2 and is explained in the Javadoc-generated documentation. The Java API requires that you create and manage a TopoMap object and its associated cache.

Figure 2-2 Editing Topologies Using the TopoMap Object Cache (Java API)

Description of Figure 2-2 follows
Description of "Figure 2-2 Editing Topologies Using the TopoMap Object Cache (Java API)"

As Figure 2-2 shows, the basic sequence is as follows:

  1. Create the TopoMap object, using a constructor of the TopoMap class, specifying a topology and a database connection.

    This creates an in-memory cache for editing objects associated with the specified topology.

  2. Load the entire topology or a rectangular window from the topology into the TopoMap object cache for update, using the loadTopology or loadWindow method of the TopoMap class.

    You can specify that in-memory R-tree indexes be built on the edge and edge face that are being affected. These indexes use some memory resources and take some time to create and periodically rebuild; however, they significantly improve performance if you edit a large number of topological elements during the database connection.

  3. Perform a number of topology editing operations (for example, add 1000 nodes), and update the topology by calling the updateTopology method of the TopoMap class.

    Periodically, validate the cache by calling the validateCache method of the TopoMap class.

    If you caused in-memory R-tree indexes to be created when you loaded the TopoMap object (in Step 2), you can periodically (for example, after each addition of 100 nodes) rebuild the indexes by calling the createEdgeIndex and createFaceIndex methods of the TopoMap class. For best index performance, these indexes should be rebuilt periodically when you are editing a large number of topological elements.

    If you do not want to update the topology but instead want to discard edits made in the cache since the last update, call the clearCache method of the TopoMap class. The clearCache method fails if there are any uncommitted updates; otherwise, it clears the data in the cache and sets the cache to be read-only.

  4. Update the topology by calling the updateTopology method of the TopoMap class.

  5. Repeat Steps 3 and 4 (editing objects, validating the cache, rebuilding the R-tree indexes, and updating the topology) as often as needed, until you have finished the topology editing operations.

  6. Commit the topology changes by calling the commitDB method of the TopoMap class. (The commitDB method automatically calls the updateTopology method before it commits the changes.) After the commit operation, the cache is made read-only (that is, it is no longer updatable). However, if you want to perform further editing operations using the same TopoMap object, you can load it again and use it (that is, repeat Steps 2 through 5, clearing the cache first if necessary).

    To perform further editing operations, clear the TopoMap object cache by calling the clearCache method of the TopoMap class, and then go to Step 2.

    If you want to discard all uncommitted topology changes, you can call the rollbackDB method of the TopoMap class at any time. After the rollback operation, the cache is cleared.

  7. Remove the TopoMap object by setting the TopoMap object to null, which makes the object available for garbage collection and frees any resources that it had used. (If you forget to remove the TopoMap object, it will automatically be garbage collected when the application ends.)

    If the application terminates abnormally, all uncommitted changes to the database will be discarded.

If you plan to perform a very large number of topology editing operations, you can divide the operations among several editing sessions, each of which performs Steps 1 through 7 in the preceding list.

2.1.6 Error Handling for Topology Editing

This section discusses the following conditions:

  • Input parameter errors

  • All exceptions

2.1.6.1 Input Parameter Errors

When an SDO_TOPO_MAP PL/SQL subprogram or a public method in the TopoMap Java class is called, it validates the values of the input parameters, and it uses or creates a TopoMap object to perform the editing or read-only operation. Whenever there is an input error, an oracle.spatial.topo.TopoDataException exception is thrown. Other errors may occur when the underlying TopoMap object performs an operation.

If the method is called from SQL or PL/SQL, the caller gets the following error message:

ORA-29532: Java call terminated by uncaught Java exception:
<specific error message text>

The following PL/SQL example shows how you can handle a TopoDataException exception:

DECLARE
  topo_data_error EXCEPTION;
  PRAGMA EXCEPTION_INIT(topo_data_error, -29532);
BEGIN
  sdo_topo_map.create_topo_map(null, null, 100, 100, 100);
EXCEPTION
  WHEN topo_data_error THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;/
 

The preceding example generates the following output:

ORA-29532: Java call terminated by uncaught Java exception:oracle.spatial.topo.TopoDataException: invalid TopoMap name

2.1.6.2 All Exceptions

The following actions are performed automatically when any exception occurs in a call to any of the following SDO_TOPO_MAP PL/SQL subprograms or their associated methods in the TopoMap Java class: SDO_TOPO_MAP.ADD_EDGE (addEdge), SDO_TOPO_MAP.ADD_ISOLATED_NODE (addIsolatedNode), SDO_TOPO_MAP.ADD_LOOP (addLoop), SDO_TOPO_MAP.ADD_NODE (addNode), SDO_TOPO_MAP.ADD_POINT_GEOMETRY (addPointGeometry), SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY (addPolygonGeometry), SDO_TOPO_MAP.CHANGE_EDGE_COORDS (changeEdgeCoords), SDO_TOPO_MAP.MOVE_ISOLATED_NODE (moveIsolatedNode), SDO_TOPO_MAP.MOVE_NODE (moveNode), SDO_TOPO_MAP.MOVE_EDGE (moveEdge), SDO_TOPO_MAP.REMOVE_EDGE (removeEdge), SDO_TOPO_MAP.REMOVE_NODE (removeNode), and SDO_TOPO_MAP.UPDATE_TOPO_MAP (updateTopology).

  • The transaction is rolled back.

  • The TopoMap object cache is cleared.

  • The TopoMap object is made read-only.

2.2 Performing Operations on Nodes

This section contains sections that describe the effects of adding, moving, and removing nodes, and that explain how to perform these operations using the PL/SQL API.

2.2.1 Adding a Node

Adding a non-isolated node adds the node to an edge at a point that is currently on the edge. This operation also splits the edge, causing the original edge to be divided into two edges. Spatial automatically adjusts the definition of the original edge and creates a new edge (assigning it an ID value that is unique among edges in the topology).

To add a non-isolated node, use the SDO_TOPO_MAP.ADD_NODE function. To add an isolated node, use the SDO_TOPO_MAP.ADD_ISOLATED_NODE function.

Figure 2-3 shows the addition of a node (N3) on edge E1.

Figure 2-3 Adding a Non-Isolated Node

Description of Figure 2-3 follows
Description of "Figure 2-3 Adding a Non-Isolated Node"

As a result of the operation shown in Figure 2-3:

  • Edge E1 is redefined to be between the original edge's start point and the point at the added node (N3).

  • Edge E2 is created. Its start point is the point at node N3, and its end point is the end point of the original edge.

  • If any linear features were defined on the original edge, they are automatically redefined to be on both resulting edges, the edge is split, and a record is added to the history information table (explained in Section 1.5.5) for the topology. For example, if a street named Main Street had been defined on the original edge E1 in Figure 2-3, then after the addition of node N3, Main Street would be defined on both edges E1 and E2.

Figure 2-4 shows a more complicated example of adding a node, where the result depends on whether or not the added node is a new shape point of the original edge (that is, on the value of the is_new_shape_point parameter to the SDO_TOPO_MAP.ADD_NODE function).

Figure 2-4 Effect of is_new_shape_point Value on Adding a Node

Description of Figure 2-4 follows
Description of "Figure 2-4 Effect of is_new_shape_point Value on Adding a Node"

In Figure 2-4:

  • In the top part of the figure, the original edge (E1) starts at node N1, ends at node N2, and has two intermediate shape points.

  • In the middle part of the figure, a new node (N3) is added that is not a shape point of the original edge, but instead is a new shape point (that is, is_new_shape_point=>'TRUE'). The new node is added at the location specified with the point parameter, and is added after the vertex specified in the coord_index parameter (in this case, coord_index=>1 to indicate after the first vertex). The new node becomes the end node for edge E1 and the start node for the new edge E2, which ends at node N2.

  • In the bottom part of the figure, a new node (N3) is added that is a shape point of the original edge, and is thus not a new shape point (that is, is_new_shape_point=>'FALSE'). Because it is not a new shape point, the node is added at the vertex specified with the coord_index parameter (in this case, coord_index=>2). As in the middle part of the figure, the new node becomes the end node for edge E1 and the start node for the new edge E2, which ends at node N2.

2.2.2 Moving a Node

Moving a non-isolated node to a new position causes the ends of all edges that are attached to the node to move with the node. You must specify the vertices for all edges affected by the moving of the node; each point (start or end) that is attached to the node must have the same coordinates as the new location of the node, and the other end points (not the moved node) of each affected edge must remain the same.

To move a non-isolated node, use the SDO_TOPO_MAP.MOVE_NODE procedure. To move an isolated node, use the SDO_TOPO_MAP.MOVE_ISOLATED_NODE procedure.

Figure 2-5 shows the original topology before node N1 is moved.

Figure 2-5 Topology Before Moving a Non-Isolated Node

Description of Figure 2-5 follows
Description of "Figure 2-5 Topology Before Moving a Non-Isolated Node"

Figure 2-6 shows two cases of the original topology after node N1 is moved. In one case, no reshaping occurs; that is, all edges affected by the movement are specified as straight lines. In the other case, reshaping occurs; that is, one or more affected edges are specified as line segments with multiple vertices.

Figure 2-6 Topology After Moving a Non-Isolated Node

Description of Figure 2-6 follows
Description of "Figure 2-6 Topology After Moving a Non-Isolated Node"

In both cases shown in Figure 2-6:

  • The topology does not change. That is, the number of nodes, edges, and faces does not change, and the relationships (such as adjacency and connectivity) among the nodes, edges, and faces do not change.

  • All features defined on the nodes, edges, and faces retain their definitions.

Any isolated nodes and edges might remain in the same face or be moved to a different face as a result of a move operation on a non-isolated node. The SDO_TOPO_MAP.MOVE_NODE procedure has two output parameters, moved_iso_nodes and moved_iso_edges, that store the ID numbers of any isolated nodes and edges that were moved to a different face as a result of the operation.

A node cannot be moved if, as a result of the move, any of the following would happen:

  • Any edges attached to the node would intersect any other edge. For example, assume that the original topology shown in Figure 2-6 had included anotheCr edge E20 that passed just above and to the right of node N1. If the movement of node N1 would cause edge E3, E4, E6, E8, or E9 to intersect edge E20, the move operation is not performed.

  • The node would be moved to a face that does not currently bound the node. For example, if the movement of node N1 would place it outside the original topology shown in Figure 2-6, the move operation is not performed.

  • The node would be moved to the opposite side of an isolated face. This is not allowed because the move would change the topology by changing one or more of the following: the relationship or ordering of edges around the face, and the left and right face for each edge. Figure 2-7 shows a node movement (flipping node N1 from one side of isolated face F1 to the other side) that would not be allowed.

    Figure 2-7 Node Move Is Not Allowed

    Description of Figure 2-7 follows
    Description of "Figure 2-7 Node Move Is Not Allowed"

2.2.2.1 Additional Examples of Allowed and Disallowed Node Moves

This section provides additional examples of node movement operations that are either allowed or not allowed. All refer to the topology shown in Figure 2-8.

Figure 2-8 Topology for Node Movement Examples

Description of Figure 2-8 follows
Description of "Figure 2-8 Topology for Node Movement Examples"

In the topology shown in Figure 2-8:

  • Attempts will be made to move node N1 to points P1, P2, P3, and P4. (These points are locations but are not existing nodes.)

  • The edges have no shape points, either before or after the move operation.

  • New vertices are specified for the edges E1, E2, E3, and E4, but the ID values of the start and end points for the edges remain the same.

When the following node move operations are attempted using the topology shown in Figure 2-8, the following results occur:

  • Moving node N1 to point P1: Not allowed, because one or more of the four attached edges would intersect edge E5. (Edge E3 would definitely intersect edge E5 if the move were allowed.)

  • Moving node N1 to point P2: Allowed.

  • Moving node N1 to point P3: Allowed. However, this operation causes the isolated node N2 to change from face F2 to face F1, and this might cause the application to want to roll back or disallow the movement of node N1. Similarly, if the movement of a node would cause any isolated edges or faces to change from one face to another, the application might want to roll back or disallow the node move operation.

  • Moving node N1 to point P4: Not allowed, because the node must be moved to a point in a face that bounds the original (current) position of the node.

2.2.3 Removing a Node

You can remove individual nodes (isolated or non-isolated), as explained in this section, and you can remove all obsolete nodes in a topology, as explained in Section 2.2.4.

Removing a non-isolated node deletes the node and merges the edges that were attached to the node into a single edge. (Spatial applies complex rules, which are not documented, to determine the ID value and direction of the resulting edge.)

To remove a non-isolated or isolated node, use the SDO_TOPO_MAP.REMOVE_NODE procedure.

Figure 2-9 shows the removal of a node (N1) that is attached to edges E1 and E2.

Figure 2-9 Removing a Non-Isolated Node

Description of Figure 2-9 follows
Description of "Figure 2-9 Removing a Non-Isolated Node"

As a result of the operation shown in Figure 2-9:

  • Edge E1 is redefined to consist of the line segments that had represented the original edges E1 and E2.

  • Edge E2 is deleted.

  • If any linear features were defined on both original edges, they are automatically redefined to be on the resulting edge, and a record is added to the history information table (explained in Section 1.5.5) for the topology. For example, if a street named Main Street had been defined on the original edges E1 and E2 in Figure 2-9, then after the removal of node N1, Main Street would be defined on edge E1.

A node cannot be removed if one or more of the following are true:

  • A point feature is defined on the node. For example, if a point feature named Metropolitan Art Museum had been defined on node N1 in Figure 2-9, node N1 cannot be removed. Before you can remove the node in this case, you must remove the definition of any point features on the node.

  • A linear feature defined on either original edge is not also defined on both edges. For example, if a linear feature named Main Street had been defined on edge E1 but not edge E2 in Figure 2-9, node N1 cannot be removed.

2.2.4 Removing Obsolete Nodes

An obsolete node is a node that is connected to only two distinct edges, is not assigned to any point feature, and does not serve as the demarcation between different linear features. Obsolete nodes can result when the SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY function is used repeatedly to build a topology, or when edges have been removed during editing operations, leaving some unnecessary nodes. Therefore, it is recommended that you use the SDO_TOPO_MAP.REMOVE_OBSOLETE_NODES procedure to remove obsolete nodes in such cases.

Spatial automatically updates the appropriate entries in the <topology-name>_NODE$ and <topology-name>_EDGE$ tables, and in the <topology-name>_FACE$ table if necessary.

Figure 2-10 shows the removal of obsolete nodes in a simple topology. In this topology, node N1 has a point feature named Art Museum defined on it, and node N3 has a point feature named Town Hall defined on it. Edges E1, E2, and E3 have a linear feature named Main Street defined on them, and edge E4 has a linear feature named First Avenue defined on it.

Figure 2-10 Removing Obsolete Nodes

Description of Figure 2-10 follows
Description of "Figure 2-10 Removing Obsolete Nodes"

In Figure 2-10, the only node removed is N2, because only that node satisfies all the criteria for an obsolete node. As for the other nodes:

  • N1 is connected to only one edge (E1), and it has a point feature defined on it (Art Museum).

  • N3 has a point feature defined on it (Town Hall).

  • N4 is the demarcation between two different linear features (Main Street and First Avenue).

  • N5 is connected to only one edge (E4).

  • Node N6 is an isolated node (not connected to any edges).

Also as a result of the operation shown in Figure 2-10, edge E2 was removed as a result of the removal of node N2.

2.3 Performing Operations on Edges

This section describes the effects of adding, moving, removing, and updating edges, and explains how to perform these operations using the PL/SQL API.

2.3.1 Adding an Edge

Adding a non-isolated edge adds the edge to a face. It also splits the face, causing the original face to be divided into two faces. Spatial automatically adjusts the definition of the original face and creates a new face (assigning it an ID value that is unique among faces in the topology).

To add an edge, use the SDO_TOPO_MAP.ADD_EDGE procedure. You must specify existing nodes as the start and end nodes of the added edge.

Figure 2-11 shows the addition of an edge (E7) between nodes N3 and N5 on face F3.

Figure 2-11 Adding a Non-Isolated Edge

Description of Figure 2-11 follows
Description of "Figure 2-11 Adding a Non-Isolated Edge"

As a result of the operation shown in Figure 2-11, face F3 is redefined to be two faces, F1 and F3. (Spatial applies complex rules, which are not documented, to determine the ID values of the resulting faces.)

Any polygon features that were defined on the original face are automatically redefined to be on both resulting faces. For example, if a park named Walden State Park had been defined on the original face F3 in Figure 2-11, then after the addition of edge E7, Walden State Park would be defined on both faces F1 and F3.

2.3.2 Moving an Edge

Moving a non-isolated edge keeps the start or end point of the edge in the same position and moves the other of those two points to another existing node position. You must specify the source node (location before the move of the node to be moved), the target node (location after the move of the node being moved), and the vertices for the moved edge.

To move an edge, use the SDO_TOPO_MAP.MOVE_EDGE procedure.

Figure 2-12 shows the movement of edge E7, which was originally between nodes N3 and N5, to be between nodes N2 and N5.

Figure 2-12 Moving a Non-Isolated Edge

Description of Figure 2-12 follows
Description of "Figure 2-12 Moving a Non-Isolated Edge"

As a result of the operation shown in Figure 2-12, faces F1 and F3 are automatically redefined to reflect the coordinates of their edges, including the new coordinates for edge E7.

Any isolated nodes and edges might remain in the same face or be moved to a different face as a result of a move operation on a non-isolated edge. The SDO_TOPO_MAP.MOVE_EDGE procedure has two output parameters, moved_iso_nodes and moved_iso_edges, that store the ID numbers of any isolated nodes and edges that were moved to a different face as a result of the operation.

An edge cannot be moved if, as a result of the move, any of the following would happen:

  • The moved edge would intersect any other edge. For example, assume that the topology before the move, as shown in Figure 2-12, had included another edge (E10) that was between nodes N3 and N4. In this case, the movement of edge E7 would cause it to intersect edge E10, and therefore the move operation is not performed.

  • The node would be moved to a face that does not currently bound the edge. For example, if the movement of edge E7 would place its terminating point at a node outside the faces shown in Figure 2-12 (F1 and F3), the move operation is not performed.

2.3.3 Removing an Edge

Removing a non-isolated edge deletes the edge and merges the faces that bounded the edge. (Spatial applies complex rules, which are not documented, to determine the ID value of the resulting face.)

To remove an edge, use the SDO_TOPO_MAP.REMOVE_EDGE procedure.

Figure 2-13 shows the removal of an edge (E7) that is bounded by faces F1 and F3.

Figure 2-13 Removing a Non-Isolated Edge

Description of Figure 2-13 follows
Description of "Figure 2-13 Removing a Non-Isolated Edge"

As a result of the operation shown in Figure 2-13:

  • Face F1 is redefined to consist of the area of the original faces F1 and F3.

  • Face F3 is deleted.

  • The start and end nodes of the deleted edge (nodes N3 and N5) are not removed.

Any polygon features that were defined on both original faces are automatically redefined to be on the resulting face. For example, if a park named Adams Park had been defined on the original faces F1 and F3 in Figure 2-13, then after the removal of edge E7, Adams Park would be defined on face F1.

A non-isolated edge cannot be removed if one or more of the following are true:

  • A linear feature is defined on the edge. For example, if a linear feature named Main Street had been defined on edge E7 in Figure 2-13, edge E7 cannot be removed. Before you can remove the edge in this case, you must remove the definition of any linear features on the edge.

  • A polygon feature defined on either original face is not also defined on both faces. For example, if a linear feature named Adams Park had been defined on face F1 but not face F3 in Figure 2-13, edge E7 cannot be removed.

2.3.4 Updating an Edge

Updating an isolated edge means changing one or more coordinates of the edge, but without changing the start point and end point.

To update an edge, use the SDO_TOPO_MAP.CHANGE_EDGE_COORDS procedure.

Any isolated nodes and edges might remain in the same face or be moved to a different face as a result of an update operation on a non-isolated edge. The SDO_TOPO_MAP.CHANGE_EDGE_COORDS procedure has two output parameters, moved_iso_nodes and moved_iso_edges, that store the ID numbers of any isolated nodes and edges that were moved to a different face as a result of the operation.

An edge cannot be updated if, as a result of the operation, it would intersect any other edge. See the Usage Notes for the SDO_TOPO_MAP.CHANGE_EDGE_COORDS procedure for more information about updating an edge.

PK*$PK ;A OEBPS/toc.htm Table of Contents

Contents

List of Examples

List of Figures

List of Tables

Title and Copyright Information

Preface

What's New in the Topology and Network Data Models?

Part I Topology Data Model

1 Topology Data Model Overview

2 Editing Topologies

3 SDO_TOPO Package Subprograms

4 SDO_TOPO_MAP Package Subprograms

Part II Network Data Model

5 Network Data Model Overview

6 SDO_NET Package Subprograms

7 SDO_NET_MEM Package Subprograms

Index

PK&PK ;AOEBPS/sdo_topo_map_ref.htm SDO_TOPO_MAP Package Subprograms

4 SDO_TOPO_MAP Package Subprograms

The MDSYS.SDO_TOPO_MAP package contains subprograms (functions and procedures) that constitute part of the PL/SQL application programming interface (API) for the Spatial topology data model. This package contains subprograms related to editing topologies. These subprograms use a TopoMap object, either one that you previously created or that Spatial creates implicitly.

To use the subprograms in this chapter, you must understand the conceptual information about topology in Chapter 1, as well as the information about editing topologies in Chapter 2.

The rest of this chapter provides reference information about the SDO_TOPO_MAP subprograms, listed in alphabetical order.


SDO_TOPO_MAP.ADD_EDGE

Format

SDO_TOPO_MAP.ADD_EDGE(

     topology IN VARCHAR2,

     node_id1 IN NUMBER,

     node_id2 IN NUMBER,

     geom IN SDO_GEOMETRY

     ) RETURN NUMBER;

Description

Adds an edge to a topology, and returns the edge ID of the added edge.

Parameters

topology

Name of the topology to which to add the edge, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

node_id1

Node ID of the start node for the edge to be added.

node_id2

Node ID of the end node for the edge to be added.

geom

SDO_GEOMETRY object (line or contiguous line string geometry) representing the edge to be added.

Usage Notes

Spatial automatically assigns an edge ID to the added edge. If topology is not null, the appropriate entry is inserted in the <topology-name>_EDGE$ table; and if the addition of the edge affects the face information table, the appropriate entries in the <topology-name>_FACE$ table are updated. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

If node_id1 and node_id2 are the same value, a loop edge is created.

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addEdge method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds an edge connecting node N3 to node N4 in the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.ADD_EDGE(null, 3, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(25,35, 20,37)))
  INTO :res_number;
 
Call completed.
 
SQL> PRINT res_number;
 
RES_NUMBER                                                                      
----------                                                                      
        29 

SDO_TOPO_MAP.ADD_ISOLATED_NODE

Format

SDO_TOPO_MAP.ADD_ISOLATED_NODE(

     topology IN VARCHAR2,

     face_id IN NUMBER,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.ADD_ISOLATED_NODE(

     topology IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.ADD_ISOLATED_NODE(

     topology IN VARCHAR2,

     face_id IN NUMBER,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.ADD_ISOLATED_NODE(

     topology IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Adds an isolated node (that is, an island node) to a topology, and returns the node ID of the added isolated node.

Parameters

topology

Name of the topology to which to add the isolated node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

face_id

Face ID of the face on which the isolated node is to be added. (An exception is raised if the specified point is not on the specified face.)

point

SDO_GEOMETRY object (point geometry) representing the isolated node to be added.

x

X-axis value of the point representing the isolated node to be added.

y

Y-axis value of the point representing the isolated node to be added.

Usage Notes

Spatial automatically assigns a node ID to the added node. If topology is not null, the appropriate entry is inserted in the <topology-name>_NODE$ table, and the <topology-name>_FACE$ table is updated to include an entry for the added isolated node. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

If you know the ID of the face on which the isolated node is to be added, you can specify the face_id parameter. If you specify this parameter, there are two benefits:

  • Validation: The function checks to see if the point is on the specified face, and raises an exception if it is not. Otherwise, the function checks to see if the point is on any face in the topology, and raises an exception if it is not.

  • Performance: The function checks only if the point is on the specified face. Otherwise, it checks potentially all faces in the topology to see if the point is on any face.

To add a non-isolated node, use the SDO_TOPO_MAP.ADD_NODE function.

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addIsolatedNode method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds an isolated node to the right of isolated node N4 on face F2, and it returns the node ID of the added node. It uses the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

DECLARE
  result_num NUMBER;
BEGIN
result_num := SDO_TOPO_MAP.ADD_ISOLATED_NODE(null, 2,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(22,37,NULL), NULL, NULL));
DBMS_OUTPUT.PUT_LINE('Result = ' || result_num);
END;
/
Result = 24                                                                     
 
PL/SQL procedure successfully completed.

SDO_TOPO_MAP.ADD_LINEAR_GEOMETRY

Format

SDO_TOPO_MAP.ADD_LINEAR_GEOMETRY(

     topology IN VARCHAR2,

     curve IN SDO_GEOMETRY

     ) RETURN SDO_NUMBER_ARRAY;

or

SDO_TOPO_MAP.ADD_LINEAR_GEOMETRY(

     topology IN VARCHAR2,

     coords IN SDO_NUMBER_ARRAY

     ) RETURN SDO_NUMBER_ARRAY;

Description

Adds a linear (line string or multiline string) geometry to the topology, inserting edges and nodes as necessary based on the full intersection of the geometry with the edges and nodes in the topology graph, and an array of the edge IDs of the inserted and shared edges in sequence from the start to the end of the geometry.

Parameters

topology

Name of the topology to which to add the edge or edges, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

curve

SDO_GEOMETRY object (curve or line string geometry) representing the edge or edges to be added.

coords

SDO_NUMBER_ARRAY object specifying the coordinates of the edge or edges to be added.

Usage Notes

This function creates at least one new edge, and more edges if necessary. For example, if the line string geometry intersects an existing edge, two edges are created for the added line string, and the existing edge (the one being intersected) is divided into two edges. If topology is not null, Spatial automatically updates the <topology-name>_EDGE$ table as needed. (If topology is null, you can update this table at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

This function returns an array of the edge IDs of the inserted and shared edges in sequence from the start to the end of the geometry. If a segment in the added geometry overlaps an existing edge in the topology, the sign of the returned edge depends on the directions of the added segment and the existing edge: if the direction of the existing edge is the same as the linear geometry, the returned edge element is positive; if the direction of the existing edge is the opposite of the linear geometry, the returned edge element is negative.

An exception is raised if the object in the curve or coords parameter contains any line segments that run together (overlap) in any manner; however, the line segments can cross at one or more points.

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addLinearGeometry method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds an edge representing a specified line string geometry, and it returns the edge ID of the added edge. It uses the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.ADD_LINEAR_GEOMETRY(null,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1),
    SDO_ORDINATE_ARRAY(50,10, 55,10, 57,11)))
FROM DUAL;
 
SDO_TOPO_MAP.ADD_LINEAR_GEOMETRY(NULL,SDO_GEOMETRY(2002,NULL,NULL,SDO_ELEM_INFO_
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(31)

SDO_TOPO_MAP.ADD_LOOP

Format

SDO_TOPO_MAP.ADD_LOOP(

     topology IN VARCHAR2,

     node_id IN NUMBER,

     geom IN SDO_GEOMETRY

     ) RETURN NUMBER;

Description

Adds an edge that loops and connects to the same node, and returns the edge ID of the added edge.

Parameters

topology

Name of the topology to which to add the edge, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

node_id

Node ID of the node to which to add the edge that will start and end at this node.

geom

SDO_GEOMETRY object (line string geometry) representing the edge to be added. The start and end points of the line string must be the same point representing node_id.

Usage Notes

This function creates a new edge, as well as a new face consisting of the interior of the loop. If the edge is added at an isolated node, the edge is an isolated edge. If topology is not null, Spatial automatically updates the <topology-name>_EDGE$ and <topology-name>_FACE$ tables as needed. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addLoop method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds an edge loop starting and ending at node N4, and it returns the edge ID of the added edge. It uses the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.ADD_LOOP(null, 4,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(20,37, 20,39, 25,39, 20,37)))
  INTO :res_number;
 
Call completed.
 
SQL> PRINT res_number;
 
RES_NUMBER                                                                      
----------                                                                      
        30 

SDO_TOPO_MAP.ADD_NODE

Format

SDO_TOPO_MAP.ADD_NODE(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     point IN SDO_GEOMETRY,

     coord_index IN NUMBER,

     is_new_shape_point IN VARCHAR2

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.ADD_NODE(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     x IN NUMBER,

     y IN NUMBER,

     coord_index IN NUMBER,

     is_new_shape_point IN VARCHAR2

     ) RETURN NUMBER;

Description

Adds a non-isolated node to a topology to split an existing edge, and returns the node ID of the added node.

Parameters

topology

Name of the topology to which to add the node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

edge_id

Edge ID of the edge on which the node is to be added.

point

SDO_GEOMETRY object (point geometry) representing the node to be added. The point must be an existing shape point or a new point that breaks a line segment connecting two consecutive shape points.

x

X-axis value of the point representing the node to be added. The point must be an existing shape point or a new point that breaks a line segment connecting two consecutive shape points.

y

Y-axis value of the point representing the node to be added. The point must be an existing shape point or a new point that breaks a line segment connecting two consecutive shape points.

coord_index

The index (position) of the array position in the edge coordinate array on or after which the node is to be added. Each vertex (node or shape point) has a position in the edge coordinate array. The start point (node) is index (position) 0, the first point after the start point is 1, and so on. (However, the coord_index value cannot be the index of the last vertex.) For example, if the edge coordinates are (2,2, 5,2, 8,3) the index of the second vertex (5,2) is 1.

is_new_shape_point

TRUE if the added node is to be a new shape point following the indexed vertex (coord_index value) of the edge; FALSE if the added node is exactly on the indexed vertex.

A value of TRUE lets you add a node at a new point, breaking an edge segment at the coordinates specified in the point parameter or the x and y parameter pair. A value of FALSE causes the coordinates in the point parameter or the x and y parameter pair to be ignored, and causes the node to be added at the existing shape point associated with the coord_index value.

Usage Notes

Spatial automatically assigns a node ID to the added node and creates a new edge. The split piece at the beginning of the old edge is given the edge ID of the old edge. If topology is not null, appropriate entries are inserted in the <topology-name>_NODE$ and <topology-name>_EDGE$ tables. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

To add an isolated node (that is, an island node), use the SDO_TOPO_MAP.ADD_ISOLATED_NODE function.

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addNode method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds a non-isolated node to the right of node N2 on edge E2, and it returns the node ID of the added node. It uses the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

DECLARE
  result_num NUMBER;
BEGIN
result_num := SDO_TOPO_MAP.ADD_NODE(null, 2,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(27,30,NULL), NULL, NULL),
  0, 'TRUE');
DBMS_OUTPUT.PUT_LINE('Result = ' || result_num);
END;
/
Result = 26                                                                     
 
PL/SQL procedure successfully completed.

SDO_TOPO_MAP.ADD_POINT_GEOMETRY

Format

SDO_TOPO_MAP.ADD_POINT_GEOMETRY(

     topology IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.ADD_POINT_GEOMETRY(

     topology IN VARCHAR2,

     coord IN SDO_NUMBER_ARRAY

     ) RETURN NUMBER;

Description

Adds a node representing a specified point geometry or coordinate pair, and returns the node ID of the added node.

Parameters

topology

Name of the topology to which to add the node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

point

SDO_GEOMETRY object (point geometry) representing the node to be added.

coord

SDO_NUMBER_ARRAY object specifying the coordinates of the node to be added.

Usage Notes

If the point coincides with an existing node, no changes are made to the topology. Otherwise, an isolated node or a node splitting an edge is added.

For information about adding and deleting nodes and edges, see Chapter 2.

This function is equivalent to using the addPointGeometry method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds a node representing a specified point geometry, and it returns the node ID of the added node. It uses the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.ADD_POINT_GEOMETRY(null,
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(57,12,NULL), NULL, NULL))
FROM DUAL;
 
SDO_TOPO_MAP.ADD_POINT_GEOMETRY(NULL,SDO_GEOMETRY(2001,NULL,SDO_POINT_TYPE(57,12
--------------------------------------------------------------------------------
                                                                              29

The following example adds a node at the specified coordinates (58, 12), and it returns the node ID of the added node. It uses the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.ADD_POINT_GEOMETRY(null, SDO_NUMBER_ARRAY(58,12))
FROM DUAL;
 
SDO_TOPO_MAP.ADD_POINT_GEOMETRY(NULL,SDO_NUMBER_ARRAY(58,12))                   
-------------------------------------------------------------                   
                                                           30 

SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY

Format

SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY(

     topology IN VARCHAR2,

     polygon IN SDO_GEOMETRY

     ) RETURN SDO_NUMBER_ARRAY;

or

SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY(

     topology IN VARCHAR2,

     coords IN SDO_NUMBER_ARRAY

     ) RETURN SDO_NUMBER_ARRAY;

Description

Adds one or more faces representing a specified polygon geometry, and returns the face ID of each added face.

Parameters

topology

Name of the topology to which to add the face or faces, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

polygon

SDO_GEOMETRY object (polygon or multipolygon geometry) representing the face or faces to be added. Each polygon in the object must have a single exterior ring that can contain any number of interior rings.

coords

SDO_NUMBER_ARRAY object specifying the coordinates of a single polygon geometry representing the face or faces to be added. The vertices of the polygon must be in counterclockwise order, with the last vertex the same as the first vertex.

Usage Notes

This function creates at least one new face, and more faces if necessary. For example, if the polygon geometry intersects an existing face, faces are created for the added polygon, and the existing face (the one being intersected) definition is adjusted. If topology is not null, Spatial automatically updates the <topology-name>_FACE$ table as needed. (If topology is null, you can update this table at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

If the polygon coincides with an existing face, no changes are made to the topology.

For a multipolygon geometry, no exterior ring may overlap any other exterior ring. For example, you cannot add a face representing the following single multipolygon geometry: a park (exterior ring) containing a lake (interior ring) with an island in the lake (exterior ring inside the preceding interior ring).

This function is equivalent to using the addPolygonGeometry method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds a face representing a specified polygon geometry, and it returns and prints the face ID of the added edge. It uses the current updatable TopoMap object.

DECLARE
  res_number_array SDO_NUMBER_ARRAY;
  face_count NUMBER;
  face_ctr NUMBER;
  this_face NUMBER;
BEGIN
res_number_array := SDO_TOPO_MAP.ADD_POLYGON_GEOMETRY(null,
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1),
    SDO_ORDINATE_ARRAY(61,10, 70,10, 70,15, 65,15, 61,10)));
-- DBMS_OUTPUT.PUT_LINE('Result = ' || res_number_array);
-- Print each face associated with the geometry.
face_count := res_number_array.count;
for face_ctr in 1..face_count loop
  this_face := res_number_array(face_ctr);
  dbms_output.put_line ('this face = '|| this_face);
  end loop;  -- printed each face
END;
/
this face = 12 

SDO_TOPO_MAP.CHANGE_EDGE_COORDS

Format

SDO_TOPO_MAP.CHANGE_EDGE_COORDS(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     geom IN SDO_GEOMETRY);

or

SDO_TOPO_MAP.CHANGE_EDGE_COORDS(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     geom IN SDO_GEOMETRY,

     moved_iso_nodes OUT SDO_NUMBER_ARRAY,

     moved_iso_edges OUT SDO_NUMBER_ARRAY,

     allow_iso_moves IN VARCHAR2);

Description

Changes the coordinates and related information about an edge.

Parameters

topology

Name of the topology containing the edge, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

edge_id

Edge ID of the edge whose coordinates are to be changed.

geom

SDO_GEOMETRY object (line or contiguous line string geometry) representing the modified edge. The start and end points of the modified edge must be the same as for the original edge.

moved_iso_nodes

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the node ID values of any isolated nodes that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the node ID values of any isolated nodes that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

moved_iso_edges

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the edge ID values of any isolated edges that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the edge ID values of any isolated edges that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

allow_iso_moves

TRUE causes Spatial to allow an edge coordinates change operation that would cause any isolated nodes or edges to be in a different face, and to adjust the containing face information for such isolated nodes and edges; FALSE causes Spatial not to allow an edge coordinates change operation that would cause any isolated nodes or edges to be in a different face.

If you use the format that does not include the allow_iso_moves parameter, Spatial allows edge move operations that would cause any isolated nodes or edges to be in a different face, and it adjusts the containing face information for such isolated nodes and edges.

Usage Notes

If this procedure modifies a boundary between faces, Spatial automatically performs the following operations and updates the topology data model tables as needed: reassigning island nodes and faces, and adjusting the MBRs of the faces on both sides.

If topology is not null, this procedure modifies the information about the specified edge in the <topology-name>_EDGE$ table (described in Section 1.5.1). (If topology is null, you can update this table at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

You cannot use this procedure to change the start point or the end point, or both, of the specified edge. To do any of these operations, you must delete the edge, delete the node or nodes for the start or end point (or both) to be changed, add the necessary new node or nodes, and add the edge.

For information about editing topological elements, see Chapter 2.

This procedure is equivalent to using the changeEdgeCoords method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example changes the coordinates of edge E1. (It changes only the third point, from 16,38 to 16,39.) It uses the current updatable TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.CHANGE_EDGE_COORDS(null, 1,
  SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),
    SDO_ORDINATE_ARRAY(8,30, 16,30, 16,39, 3,38, 3,30, 8,30)));

SDO_TOPO_MAP.CLEAR_TOPO_MAP

Format

SDO_TOPO_MAP.CLEAR_TOPO_MAP(

     topo_map IN VARCHAR2);

Description

Clears all objects and changes in the cache associated with a TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

Usage Notes

If the TopoMap object is updatable, this procedure changes it to be read-only.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

Contrast this procedure with the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure, which applies the changes in the cache associated with the TopoMap object to the topology. You cannot call the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure if you previously used the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure on the specified TopoMap object.

This procedure is equivalent to using the clearCache method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example clears the cache associated with the TopoMap object named CITY_DATA_TOPOMAP, which is associated with the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.CLEAR_TOPO_MAP('CITY_DATA_TOPOMAP');

SDO_TOPO_MAP.COMMIT_TOPO_MAP

Format

SDO_TOPO_MAP.COMMIT_TOPO_MAP;

Description

Updates the topology to reflect changes made to the current updatable TopoMap object, commits all changes to the database, and makes the TopoMap object read-only.

Parameters

None.

Usage Notes

Use this procedure when you are finished with a batch of edits to a topology and you want to commit all changes to the database. After the commit operation completes, you cannot edit the TopoMap object. To make further edits to the topology, you must either clear the cache (using the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure) or create a new TopoMap object (using the SDO_TOPO_MAP.CREATE_TOPO_MAP procedure), and then load the topology into the TopoMap object for update (using the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure).

Contrast this procedure with the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure, which leaves the TopoMap object available for editing operations and which does not perform a commit operation (and thus does not end the database transaction).

To roll back all TopoMap object changes, use the SDO_TOPO_MAP.ROLLBACK_TOPO_MAP procedure.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

This procedure is equivalent to using the commitDB method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example commits to the database all changes to the current updatable TopoMap object, and prevents further editing of the TopoMap object.

EXECUTE SDO_TOPO_MAP.COMMIT_TOPO_MAP;

SDO_TOPO_MAP.CREATE_EDGE_INDEX

Format

SDO_TOPO_MAP.CREATE_EDGE_INDEX(

     topo_map IN VARCHAR2);

Description

Creates an internal R-tree index (or rebuilds the index if one already exists) on the edges in the cache associated with a TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

Usage Notes

You can cause Spatial to create in-memory R-tree indexes to be built on the edges and faces in the specified TopoMap object. These indexes use some memory resources and take some time to create; however, they significantly improve performance if you edit a large number of topological elements in the session. They can also improve performance for queries that use a read-only TopoMap object. If the TopoMap object is updatable and if you are performing many editing operations, you should probably rebuild the indexes periodically; however, if the TopoMap object will not be updated, create the indexes when or after loading the read-only TopoMap object or after calling the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure.

Compare this procedure with the SDO_TOPO_MAP.CREATE_FACE_INDEX procedure, which creates an internal R-tree index (or rebuilds the index if one already exists) on the faces in the cache associated with a TopoMap object.

This procedure is equivalent to using the createEdgeIndex method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example creates an internal R-tree index (or rebuilds the index if one already exists) on the edges in the cache associated with the TopoMap object named CITY_DATA_TOPOMAP, which is associated with the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.CREATE_EDGE_INDEX('CITY_DATA_TOPOMAP');

SDO_TOPO_MAP.CREATE_FACE_INDEX

Format

SDO_TOPO_MAP.CREATE_FACE_INDEX(

     topo_map IN VARCHAR2);

Description

Creates an internal R-tree index (or rebuilds the index if one already exists) on the faces in the cache associated with a TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

Usage Notes

You can cause Spatial to create in-memory R-tree indexes to be built on the edges and faces in the specified TopoMap object. These indexes use some memory resources and take some time to create; however, they significantly improve performance if you edit a large number of topological elements in the session. They can also improve performance for queries that use a read-only TopoMap object. If the TopoMap object is updatable and if you are performing many editing operations, you should probably rebuild the indexes periodically; however, if the TopoMap object will not be updated, create the indexes when or after loading the read-only TopoMap object or after calling the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure.

Compare this procedure with the SDO_TOPO_MAP.CREATE_EDGE_INDEX procedure, which creates an internal R-tree index (or rebuilds the index if one already exists) on the edges in the cache associated with a TopoMap object.

This procedure is equivalent to using the createFaceIndex method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example creates an internal R-tree index (or rebuilds the index if one already exists) on the faces in the cache associated with the TopoMap object named CITY_DATA_TOPOMAP, which is associated with the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.CREATE_FACE_INDEX('CITY_DATA_TOPOMAP');

SDO_TOPO_MAP.CREATE_FEATURE

Format (no topology geometry layer hierarchy or lowest level in a hierarchy)

SDO_TOPO_MAP.CREATE_FEATURE(

     topology IN VARCHAR2,

     table_name IN VARCHAR2,

     column_name IN VARCHAR2,

     geom IN SDO_GEOMETRY

     ) RETURN SDO_TOPO_GEOMETRY;

Format (parent level in a hierarchy)

SDO_TOPO_MAP.CREATE_FEATURE(

     topology IN VARCHAR2,

     table_name IN VARCHAR2,

     column_name IN VARCHAR2,

     dml_condition IN VARCHAR2

     ) RETURN SDO_TOPO_GEOMETRY;

Description

Creates a feature from Oracle Spatial geometries. (This function is intended to be used for inserting rows into a feature table.)

  • The first format (with the geom parameter and without the dml_condition parameter) is for creating a feature in a topology without a topology geometry layer hierarchy or in the lowest level of a topology with a topology geometry layer hierarchy.

  • The second format (with the dml_condition parameter and without the geom parameter) is for creating a feature in a parent level of a topology with a topology geometry layer hierarchy.

Parameters

topology

Topology having the associated specified feature table and feature column.

table_name

Name of the feature table containing the feature column specified in column_name.

column_name

Name of the feature column (of type SDO_TOPO_GEOMETRY) containing the topology geometries.

geom

Geometry objects.

dml_condition

For topologies with a topology geometry layer hierarchy (described in Section 1.4): DML condition for selecting rows from a child layer to be inserted into a parent layer. Specify the condition in a quoted string, but without the word WHERE. For example, to select only rows where the STATE_ABBR column value is MA, specify the following: 'state_abbr=''MA'''

Usage Notes

This function is used to create features from existing geometries stored in a spatial table. Creating features from existing geometries is one approach to creating topology features; the other approach is to load the topology data into the node, edge, and face information tables. Both approaches are described in Section 1.1, which contains the following subsections:

When you use the first format of this function, you must first create and load an updatable TopoMap object. To create a topology feature or an associated topological element, the function internally calls the addPointGeometry, addLinearGeometry, or addPolygonGeometry method of the updatable TopoMap object, depending on the SDO_GTYPE value of the geometry object, and it calls the updateTopology method of the updatable TopoMap object to write topological elements to the database. If this function is called in an INSERT or UPDATE statement, a feature is created or updated in the feature table. When the function completes, it has the effect of overlaying the geometry onto the topology. (That is, Spatial uses an implicitly created TopoMap object to create a new TopoMap object for each call to this function.)

When you use the second format of this function, you do not need to create an updatable TopoMap object. The function internally collects TG_ID values of features in the child level based on the dml_condition parameter value, and it assembles an SDO_TGL_OBJECT_ARRAY object to create the SDO_GEOMETRY object.

To ensure that this function works correctly with all geometries, use a loop to call the function for each geometry. Do not use this function in a subquery in an INSERT or UPDATE statement, because doing so may cause inconsistencies in the topology, and you may not receive any error or warning messages about the inconsistencies.

An exception is raised if one or more of the following conditions exist:

  • topology, table_name, or column_name does not exist.

  • geom specifies geometry objects of a type inconsistent with the topology geometry layer type. For example, you cannot use line string geometries to create land parcel features.

  • dml_condition is used with a topology that does not have a topology geometry layer hierarchy.

  • The input geometries include any optimized shapes, such as optimized rectangles or circles.

  • A line string or multiline string geometry contains any overlapping line segments.

  • In a multipolygon geometry, an exterior ring overlaps any other exterior ring.

Examples

The following example populates the FEATURE column in the CITY_STREETS, TRAFFIC_SIGNS, and LAND_PARCELS feature tables with all geometries in the GEOMETRY column in the CITY_STREETS_GEOM, TRAFFIC_SIGNS_GEOM, and LAND_PARCELS_GEOM spatial tables, respectively. This example assumes that an updatable TopoMap object has been created and loaded for the CITY_DATA topology. (The example refers to definitions and data from Section 1.12.2.)

BEGIN
  FOR street_rec IN (SELECT name, geometry FROM city_streets_geom) LOOP
   INSERT INTO city_streets VALUES(street_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'CITY_STREETS', 'FEATURE',
         street_rec.geometry));
  END LOOP;
 
  FOR sign_rec IN (SELECT name, geometry FROM traffic_signs_geom) LOOP
   INSERT INTO traffic_signs VALUES(sign_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'TRAFFIC_SIGNS', 'FEATURE',
         sign_rec.geometry));
  END LOOP;
 
  FOR parcel_rec IN (SELECT name, geometry FROM land_parcels_geom) LOOP
   INSERT INTO land_parcels VALUES(parcel_rec.name,
     SDO_TOPO_MAP.CREATE_FEATURE('CITY_DATA', 'LAND_PARCELS', 'FEATURE',
         parcel_rec.geometry));
  END LOOP;
END;
/

The following example creates a topology that has a topology geometry layer hierarchy with two layers: counties and states. The calls to the CREATE_FEATURE function that create parent layer (state) features include the dml_condition parameter (for example, 'p_name=''NH''').

declare
 name varchar2(64);
 cursor c1 is select state_abrv, county from
   counties order by 1, 2;
 stateabrv varchar2(2);
begin
 
 -- Initialize.
 sdo_topo_map.create_topo_map('cnty', 'm2', 10000, 10000, 10000);
 sdo_topo_map.load_topo_map('m2', -180, -90, 180, 90, 'true');
 
 -- Insert one county at a time.
 for cnty_rec in c1 loop
   stateabrv := cnty_rec.state_abrv;
   name := cnty_rec.county;
   insert into cnty_areas select state_abrv || '-' ||county,
     sdo_topo_map.create_feature('CNTY', 'CNTY_AREAS', 'FEATURE', geom) from
     counties where state_abrv=stateabrv and county=name;
 end loop;
 
 -- Roll back topology.
 sdo_topo_map.rollback_topo_map();
 sdo_topo_map.drop_topo_map('m2');
 
 -- Roll back inserts.
 rollback;
 
exception
 when others then
   dbms_output.put_line(SQLERRM);
   sdo_topo_map.rollback_topo_map();
   sdo_topo_map.drop_topo_map('m2');
   rollback;
end;
/
 
-- Add parent feature layer.
--  
--   The following commented out statement can be used to populate the
--     child_layer_id parameter in sdo_topo.add_topo_geometry_layer.
--  
--   select tg_layer_id
--     from user_sdo_topo_info 
--     where TOPOLOGY = 'SC' 
--       and table_name = 'SC_AREAS';
-- 
execute sdo_topo.add_topo_geometry_layer('SC','SC_P_AREAS', 'FEATURE', -
                                      'POLYGON', NULL, child_layer_id => 1);
 
-- Create and insert state features (logically) from county features.
insert into sc_p_areas (f_name, p_name, feature) values ('NH', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''NH'''));
insert into sc_p_areas (f_name, p_name, feature) values ('CT', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''CT'''));
insert into sc_p_areas (f_name, p_name, feature) values ('ME', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''ME'''));
insert into sc_p_areas (f_name, p_name, feature) values ('MA', 'US',
  sdo_topo_map.create_feature('SC','SC_P_AREAS','FEATURE','p_name=''MA'''));
commit;

SDO_TOPO_MAP.CREATE_TOPO_MAP

Format

SDO_TOPO_MAP.CREATE_TOPO_MAP(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     number_of_edges IN NUMBER DEFAULT 100,

     number_of_nodes IN NUMBER DEFAULT 80,

     number_of_faces IN NUMBER DEFAULT 30);

Description

Creates a TopoMap object cache associated with an existing topology.

Parameters

topology

Name of the topology. Must not exceed 20 characters.

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

number_of_edges

An estimate of the maximum number of edges that will be in the TopoMap object at any given time. If you do not specify this parameter, a default value of 100 is used.

number_of_nodes

An estimate of the maximum number of nodes that will be in the TopoMap object at any given time. If you do not specify this parameter, a default value of 80 is used.

number_of_faces

An estimate of the maximum number of faces that will be in the TopoMap object at any given time. If you do not specify this parameter, a default value of 30 is used.

Usage Notes

The number_of_edges, number_of_nodes, and number_of_faces parameters let you improve the performance and memory usage of the procedure when you have a good idea of the approximate number of edges, nodes, or faces (or any combination) that will be placed in the cache associated with the specified TopoMap object. Spatial initially allocates memory cache for the specified or default number of objects of each type, and incrementally increases the allocation later if more objects need to be accommodated.

You can create more than one TopoMap object in a user session; however, there can be no more than one updatable TopoMap object at any given time in a user session.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

Using this procedure is equivalent to calling the constructor of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example creates a TopoMap object named CITY_DATA_TOPOMAP and its associated cache, and it associates the TopoMap object with the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.CREATE_TOPO_MAP('CITY_DATA', 'CITY_DATA_TOPOMAP');

SDO_TOPO_MAP.DROP_TOPO_MAP

Format

SDO_TOPO_MAP.DROP_TOPO_MAP(

     topo_map IN VARCHAR2);

Description

Deletes a TopoMap object from the current user session.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

Usage Notes

This procedure rolls back any uncommitted changes if the TopoMap object is updatable (that is, performs the equivalent of an SDO_TOPO_MAP.ROLLBACK_TOPO_MAP operation). It clears the cache associated with the TopoMap object, and removes the TopoMap object from the session.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

Using this procedure is equivalent to setting the variable of the TopoMap object to a null value in a client-side Java application. (The client-side Java API is described in Section 1.8.2.)

Examples

The following example drops the TopoMap object named CITY_DATA_TOPOMAP. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.DROP_TOPO_MAP('CITY_DATA_TOPOMAP');

SDO_TOPO_MAP.GET_CONTAINING_FACE

Format

SDO_TOPO_MAP.GET_CONTAINING_FACE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.GET_CONTAINING_FACE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Returns the face ID number of the face that contains the specified point.

Parameters

topology

Name of the topology that contains the face and the point, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

point

Geometry object specifying the point.

x

X-axis value of the point.

y

Y-axis value of the point.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function determines, from the faces in the specified TopoMap object (including any island faces), which one face (if any) contains the specified point in its open set, excluding islands. (The open set, excluding islands, of a face consists of all points inside, but not on the boundary of, the face.) If the point is exactly on the boundary of a face, the function returns a value of 0 (zero).

If the entire topology has been loaded into the TopoMap object and if the point is not in any finite face in the cache, this function returns a value of -1 (for the universe face). If a window from the topology has been loaded into the TopoMap object and if the point is not in any finite face in the cache, this function returns a value of -1 (for the universe face) if the point is inside the window and a value of 0 (zero) if the point is outside the window. If neither the entire topology nor a window has been loaded, this function returns 0 (zero).

This function is equivalent to using the getContainingFace method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the face ID number of the face that contains the point at (22, 37) in the CITY_DATA_TOPOMAP TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_CONTAINING_FACE(null, 'CITY_DATA_TOPOMAP',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(22,37,NULL), NULL, NULL))
  FROM DUAL;
 
SDO_TOPO_MAP.GET_CONTAINING_FACE(NULL,'CITY_DATA_TOPOMAP',SDO_GEOMETRY(2001,NULL
--------------------------------------------------------------------------------
                                                                               2

SDO_TOPO_MAP.GET_EDGE_ADDITIONS

Format

SDO_TOPO_MAP.GET_EDGE_ADDITIONS() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of edge ID numbers of edges that have been added to the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the edge ID numbers of edges in the current updatable TopoMap object that have been added since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no additions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getEdgeAdditions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples



The following example returns the edge ID numbers of edges that have been added to the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_EDGE_ADDITIONS FROM DUAL;
 
GET_EDGE_ADDITIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(28, 29, 30, 32)

SDO_TOPO_MAP.GET_EDGE_CHANGES

Format

SDO_TOPO_MAP.GET_EDGE_CHANGES() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of edge ID numbers of edges that have been changed (modified) in the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the edge ID numbers of edges in the current updatable TopoMap object that have been changed since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no changes during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getEdgeChanges method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edge ID numbers of edges that have been changed in the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_EDGE_CHANGES FROM DUAL;
 
GET_EDGE_CHANGES                                                                
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(3, 2, 1) 

SDO_TOPO_MAP.GET_EDGE_COORDS

Format

SDO_TOPO_MAP.GET_EDGE_COORDS(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     edge_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array with the coordinates of the start node, shape points, and end node for the specified edge.

Parameters

topology

Name of the topology that contains the edge, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

edge_id

Edge ID value of the edge.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function is equivalent to using the getEdgeCoords method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the coordinates of the start node, shape points, and end node for the edge whose edge ID value is 1. The returned array contains coordinates for six points. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_EDGE_COORDS(null, 'CITY_DATA_TOPOMAP', 1) FROM DUAL;
 
SDO_TOPO_MAP.GET_EDGE_COORDS(NULL,'CITY_DATA_TOPOMAP',1)                            
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(8, 30, 16, 30, 16, 38, 3, 38, 3, 30, 8, 30)

SDO_TOPO_MAP.GET_EDGE_DELETIONS

Format

SDO_TOPO_MAP.GET_EDGE_DELETIONS() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of edge ID numbers of edges that have been deleted from the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the edge ID numbers of edges in the current updatable TopoMap object that have been deleted since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no deletions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getEdgeDeletions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edge ID numbers of edges that have been deleted from the current updatable TopoMap object. In this case, the return of an empty SDO_NUMBER_ARRAY object indicates that no edges have been deleted.

SELECT SDO_TOPO_MAP.GET_EDGE_DELETIONS FROM DUAL;
 
GET_EDGE_DELETIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY()

SDO_TOPO_MAP.GET_EDGE_NODES

Format

SDO_TOPO_MAP.GET_EDGE_NODES(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     edge_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array with the ID numbers of the start and end nodes on the specified edge.

Parameters

topology

Name of the topology that contains the edge, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

edge_id

Edge ID value of the edge.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

If the edge starts and ends at a node, the ID number of the node is the first and last number in the array.

This function has no exact equivalent method in the TopoMap class of the client-side Java API (described in Section 1.8.2). The getEdge method returns a Java edge object of the oracle.spatial.topo.Edge class.

Examples

The following example returns the ID numbers of the nodes on the edge whose edge ID value is 1. The returned array contains two nodes ID numbers, both of them 1 (for the same node), because the specified edge starts and ends at the node with node ID 1 and has a loop edge. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_EDGE_NODES(null, 'CITY_DATA_TOPOMAP', 1) FROM DUAL;
 
SDO_TOPO_MAP.GET_EDGE_NODES(NULL,'CITY_DATA_TOPOMAP',1)                             
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(1, 1)

SDO_TOPO_MAP.GET_FACE_ADDITIONS

Format

SDO_TOPO_MAP.GET_FACE_ADDITIONS() RETURN SDO_NUMBER_ARRAY

Description

Returns an array of face ID numbers of faces that have been added to the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the face ID numbers of faces in the current updatable TopoMap object that have been added since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no additions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getFaceAdditions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the face ID numbers of faces that have been added to the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_FACE_ADDITIONS FROM DUAL;
 
GET_FACE_ADDITIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(11)

SDO_TOPO_MAP.GET_FACE_CHANGES

Format

SDO_TOPO_MAP.GET_FACE_CHANGES() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of face ID numbers of faces that have been changed (modified) in the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the face ID numbers of faces in the current updatable TopoMap object that have been changed since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no changes during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getFaceChanges method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the face ID numbers of faces that have been changed in the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_FACE_CHANGES FROM DUAL;
 
GET_FACE_CHANGES                                                                
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(2, 1, -1)

SDO_TOPO_MAP.GET_FACE_BOUNDARY

Format

SDO_TOPO_MAP.GET_FACE_BOUNDARY(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     face_id IN NUMBER

     option IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array with the edge ID numbers of the edges that make up the boundary for the specified face.

Parameters

topology

Name of the topology that contains the face, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

face_id

Face ID value of the face.

option

One of the following numbers to indicate an option for computing the boundary: 0 for an external boundary ring without spurs (that is, without doubly traced edges), 1 for external and internal rings without spurs, or 2 for external and internal rings with spurs. A value of 2 returns the full, though possibly degenerate, boundary.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function is equivalent to using the getFaceBoundary method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edges in the external boundary ring without spurs for the face whose face ID value is 3. The returned array contains four edge ID values. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_FACE_BOUNDARY(null, 'CITY_DATA_TOPOMAP', 3, 0) FROM DUAL;
 
SDO_TOPO_MAP.GET_FACE_BOUNDARY(NULL,'CITY_DATA_TOPOMAP',3,0)                    
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(19, 6, 21, 9)

SDO_TOPO_MAP.GET_FACE_DELETIONS

Format

SDO_TOPO_MAP.GET_FACE_DELETIONS() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of face ID numbers of faces that have been deleted from the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the face ID numbers of faces in the current updatable TopoMap object that have been deleted since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no deletions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getFaceDeletions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the face ID numbers of faces that have been deleted from the current updatable TopoMap object. In this case, the return of an empty SDO_NUMBER_ARRAY object indicates that no faces have been deleted.

SELECT SDO_TOPO_MAP.GET_FACE_DELETIONS FROM DUAL;
 
GET_FACE_DELETIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY()

SDO_TOPO_MAP.GET_NEAREST_EDGE

Format

SDO_TOPO_MAP.GET_NEAREST_EDGE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.GET_NEAREST_EDGE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Returns the edge ID number of the edge that is nearest (closest to) the specified point.

Parameters

topology

Name of the topology that contains the edge and the point, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

point

Geometry object specifying the point.

x

X-axis value of the point.

y

Y-axis value of the point.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

The nearest edge is determined from the representation of the topology in the database, using the spatial index. If there are changed, added, or deleted edges in the instance and the database has not been updated to reflect those changes, the result may not reflect the true situation in the TopoMap object cache.

If multiple edges are equally close to the point, any one of the edge ID values is returned. If no edges exist in the topology, this function returns 0 (zero).

This function is equivalent to using the getNearestEdge method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edge ID number of the edge that is closest to the point at (8, 8) in the CITY_DATA_TOPOMAP TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NEAREST_EDGE(null, 'CITY_DATA_TOPOMAP',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,8,NULL), NULL, NULL))
  FROM DUAL;
 
SDO_TOPO_MAP.GET_NEAREST_EDGE(NULL,'CITY_DATA_TOPOMAP',SDO_GEOMETRY(2001,NULL,SD
--------------------------------------------------------------------------------
                                                                              22

SDO_TOPO_MAP.GET_NEAREST_EDGE_IN_CACHE

Format

SDO_TOPO_MAP.GET_NEAREST_EDGE_IN_CACHE(

     topo_map IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.GET_NEAREST_EDGE_IN_CACHE(

     topo_map IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Returns the edge ID number of the edge that, of the edges loaded in the specified TopoMap object, is nearest (closest to) the specified point.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

point

Geometry object specifying the point.

x

X-axis value of the point.

y

Y-axis value of the point.

Usage Notes

If multiple edges are equally close to the point, any one of the edge ID values is returned. If no topology data is loaded or if no edges exist in the cache, this function returns 0 (zero).

This function is equivalent to using the getNearestEdgeInCache method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edge ID number of the edge that is closest to the point at (8, 8) in the CITY_DATA_TOPOMAP TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NEAREST_EDGE_IN_CACHE('CITY_DATA_TOPOMAP',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,8,NULL), NULL, NULL))
  FROM DUAL;
 
SDO_TOPO_MAP.GET_NEAREST_EDGE_IN_CACHE('CITY_DATA_TOPOMAP',SDO_GEOMETRY(2001,NUL
--------------------------------------------------------------------------------
                                                                              22

SDO_TOPO_MAP.GET_NEAREST_NODE

Format

SDO_TOPO_MAP.GET_NEAREST_NODE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.GET_NEAREST_NODE(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID number of the node that is nearest (closest to) the specified point.

Parameters

topology

Name of the topology that contains the node and the point, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

point

Geometry object specifying the point.

x

X-axis value of the point.

y

Y-axis value of the point.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

The nearest node is determined from the representation of the topology in the database, using the spatial index. If there are changed, added, or deleted nodes in the instance and the database has not been updated to reflect those changes, the result may not reflect the true situation in the TopoMap object cache.

If multiple nodes are equally close to the point, any one of the node ID values is returned.

This function is equivalent to using the getNearestNode method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the node ID number of the node that is closest to the point at (8, 8) in the CITY_DATA_TOPOMAP TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NEAREST_NODE(null, 'CITY_DATA_TOPOMAP',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,8,NULL), NULL, NULL))
  FROM DUAL;
 
SDO_TOPO_MAP.GET_NEAREST_NODE(NULL,'CITY_DATA_TOPOMAP',SDO_GEOMETRY(2001,NULL,SD
--------------------------------------------------------------------------------
                                                                               8

SDO_TOPO_MAP.GET_NEAREST_NODE_IN_CACHE

Format

SDO_TOPO_MAP.GET_NEAREST_NODE_IN_CACHE(

     topo_map IN VARCHAR2,

     point IN SDO_GEOMETRY

     ) RETURN NUMBER;

or

SDO_TOPO_MAP.GET_NEAREST_NODE_IN_CACHE(

     topo_map IN VARCHAR2,

     x IN NUMBER,

     y IN NUMBER

     ) RETURN NUMBER;

Description

Returns the node ID number of the node that, of the nodes loaded in the specified TopoMap object, is nearest (closest to) the specified point.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

point

Geometry object specifying the point.

x

X-axis value of the point.

y

Y-axis value of the point.

Usage Notes

If multiple nodes are equally close to the point, any one of the node ID values is returned. If no topology data is loaded or if no nodes exist in the cache, this function returns 0 (zero).

This function is equivalent to using the getNearestNodeInCache method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the node ID number of the node that is closest to the point at (8, 8) in the CITY_DATA_TOPOMAP TopoMap object. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NEAREST_NODE_IN_CACHE('CITY_DATA_TOPOMAP',
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(8,8,NULL), NULL, NULL))
  FROM DUAL;
 
SDO_TOPO_MAP.GET_NEAREST_NODE_IN_CACHE('CITY_DATA_TOPOMAP',SDO_GEOMETRY(2001,NUL
--------------------------------------------------------------------------------
                                                                               8

SDO_TOPO_MAP.GET_NODE_ADDITIONS

Format

SDO_TOPO_MAP.GET_NODE_ADDITIONS() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of node ID numbers of nodes that have been added to the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the node ID numbers of nodes in the current updatable TopoMap object that have been added since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no additions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getNodeAdditions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the node ID numbers of nodes that have been added to the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_NODE_ADDITIONS FROM DUAL;
 
GET_NODE_ADDITIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(24, 25, 26, 27, 28)

SDO_TOPO_MAP.GET_NODE_CHANGES

Format

SDO_TOPO_MAP.GET_NODE_CHANGES() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of node ID numbers of nodes that have been changed (modified) in the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the node ID numbers of nodes in the current updatable TopoMap object that have been changed since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no changes during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getNodeChanges method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the node ID numbers of nodes that have been changed in the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_NODE_CHANGES FROM DUAL;
 
GET_NODE_CHANGES                                                                
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(2, 4) 

SDO_TOPO_MAP.GET_NODE_COORD

Format

SDO_TOPO_MAP.GET_NODE_COORD(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_GEOMETRY;

Description

Returns an SDO_GEOMETRY object with the coordinates of the specified node.

Parameters

topology

Name of the topology that contains the node, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

node_id

Node ID value of the node.

Usage Notes

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function is equivalent to using the getNodeCoord method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns a geometry object with the coordinates of the node whose node ID value is 14. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NODE_COORD(null, 'CITY_DATA_TOPOMAP', 14) FROM DUAL;
 
SDO_TOPO_MAP.GET_NODE_COORD(NULL,'CITY_DATA_TOPOMAP',14)(SDO_GTYPE, SDO_SRID, SD
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 0, SDO_POINT_TYPE(21, 14, NULL), NULL, NULL)

SDO_TOPO_MAP.GET_NODE_DELETIONS

Format

SDO_TOPO_MAP.GET_NODE_DELETIONS() RETURN SDO_NUMBER_ARRAY;

Description

Returns an array of node ID numbers of nodes that have been deleted from the current updatable TopoMap object.

Parameters

None.

Usage Notes

This function returns the node ID numbers of nodes in the current updatable TopoMap object that have been deleted since the object was most recently loaded (using SDO_TOPO_MAP.LOAD_TOPO_MAP), updated (using SDO_TOPO_MAP.UPDATE_TOPO_MAP), cleared (using SDO_TOPO_MAP.CLEAR_TOPO_MAP), committed (using SDO_TOPO_MAP.COMMIT_TOPO_MAP), or rolled back (using SDO_TOPO_MAP.ROLLBACK_TOPO_MAP). If there have been no deletions during that time, the function returns an empty SDO_NUMBER_ARRAY object.

This function is equivalent to using the getNodeDeletions method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the node ID numbers of nodes that have been deleted from the current updatable TopoMap object. In this case, the return of an empty SDO_NUMBER_ARRAY object indicates that no nodes have been deleted.

SELECT SDO_TOPO_MAP.GET_NODE_DELETIONS FROM DUAL;
 
GET_NODE_DELETIONS                                                              
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY()

SDO_TOPO_MAP.GET_NODE_FACE_STAR

Format

SDO_TOPO_MAP.GET_NODE_FACE_STAR(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an SDO_NUMBER_ARRAY object with the face ID numbers, in clockwise order, of the faces that are connected to the specified node.

Parameters

topology

Name of the topology that contains the node, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

node_id

Node ID value of the node.

Usage Notes

The node face star of a node is the faces that are connected to the node. One face is returned for each edge connected to the node. For an isolated node, the containing face is returned. A face may appear more than once in the list.

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function is equivalent to using the getNodeFaceStar method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

To return the node star of a node, use the SDO_TOPO_MAP.GET_NODE_STAR function.

Examples

The following example returns the node face star of the node whose node ID value is 14. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NODE_FACE_STAR(null, 'CITY_DATA_TOPOMAP', 14) FROM DUAL;
 
SDO_TOPO_MAP.GET_NODE_FACE_STAR(NULL,'CITY_DATA_TOPOMAP',14)                    
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(4, 7, 6, 3)

SDO_TOPO_MAP.GET_NODE_STAR

Format

SDO_TOPO_MAP.GET_NODE_STAR(

     topology IN VARCHAR2,

     topo_map IN VARCHAR2,

     node_id IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an SDO_NUMBER_ARRAY object with the edge ID numbers, in clockwise order, of the edges that are connected to the specified node.

Parameters

topology

Name of the topology that contains the node, or a null value, as explained in Section 2.1.3. Must not exceed 20 characters.

topo_map

Name of the TopoMap object, or a null value, as explained in Section 2.1.3. (TopoMap objects are explained in Section 2.1.1.)

node_id

Node ID value of the node.

Usage Notes

The node star of a node is the edges that are connected to the node. A positive edge ID represents an edge for which the node is its start node. A negative edge ID represents an edge for which the node is its end node. If any loops are connected to the node, edges may appear in the list twice with opposite signs.

The topology or topo_map parameter should specify a valid name, as explained in Section 2.1.3.

This function is equivalent to using the getNodeStar method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

To return the node face star of a node, use the SDO_TOPO_MAP.GET_NODE_FACE_STAR function.

Examples

The following example returns the node star of the node whose node ID value is 14. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_NODE_STAR(null, 'CITY_DATA_TOPOMAP', 14) FROM DUAL;
 
SDO_TOPO_MAP.GET_NODE_STAR(NULL,'CITY_DATA_TOPOMAP',14)                             
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(19, -10, -20, -9)

SDO_TOPO_MAP.GET_TOPO_NAME

Format

SDO_TOPO_MAP.GET_TOPO_NAME(

     topo_map IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Returns the name of the topology associated with the specified TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

Usage Notes

This function is equivalent to using the getTopoName method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the name of the topology associated with the TopoMap object named CITY_DATA_TOPOMAP. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.GET_TOPO_NAME('CITY_DATA_TOPOMAP') FROM DUAL;
 
SDO_TOPO_MAP.GET_TOPO_NAME('CITY_DATA_TOPOMAP')                                     
--------------------------------------------------------------------------------
CITY_DATA 

SDO_TOPO_MAP.GET_TOPO_TRANSACTION_ID

Format

SDO_TOPO_MAP.GET_TOPO_TRANSACTION_ID() RETURN NUMBER;

Description

Returns the topology transaction ID number, if data has been loaded into the current updatable TopoMap object.

Parameters

None.

Usage Notes

For each row in the history information table for a topology, the TOPO_TX_ID column contains the topology transaction ID number. The history information table is described in Section 1.5.5.

This function is equivalent to using the getTopoTransactionId method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the topology transaction ID number for the current updatable TopoMap object.

SELECT SDO_TOPO_MAP.GET_TOPO_TRANSACTION_ID FROM DUAL;
 
GET_TOPO_TRANSACTION_ID                                                              
-----------------------
                      1 

SDO_TOPO_MAP.LIST_TOPO_MAPS

Format

SDO_TOPO_MAP.LIST_TOPO_MAPS() RETURN VARCHAR2;

Description

Returns a comma-delimited list of entries for each TopoMap object currently active in the session, or an empty string if there are no currently active TopoMap objects.

Parameters

None.

Usage Notes

Each entry in the comma-delimited list contains the following information: the name of the TopoMap object, the name of the topology associated with the TopoMap object, and either updatable if the TopoMap object can be updated (that is, edited) or read-only if the TopoMap object cannot be updated.

For more information about TopoMap objects, including updatable and read-only status, see Section 2.1.1.

To remove a TopoMap object from the session, use the SDO_TOPO_MAP.DROP_TOPO_MAP procedure.

Examples

The following example lists the Topomap object name, topology name, and whether the object is updatable or read-only for each TopoMap object currently active in the session. (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.LIST_TOPO_MAPS FROM DUAL;
 
LIST_TOPO_MAPS
--------------------------------------------------------------------------------
(CITY_DATA_TOPOMAP, CITY_DATA, updatable)

SDO_TOPO_MAP.LOAD_TOPO_MAP

Format (Function)

SDO_TOPO_MAP.LOAD_TOPO_MAP(

     topo_map IN VARCHAR2,

     allow_updates IN VARCHAR2,

     build_indexes IN VARCHAR2 DEFAULT 'TRUE'

     ) RETURN VARCHAR2;

or

SDO_TOPO_MAP.LOAD_TOPO_MAP(

     topo_map IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     allow_updates IN VARCHAR2,

     build_indexes IN VARCHAR2 DEFAULT 'TRUE'

     ) RETURN VARCHAR2;

Format (Procedure)

SDO_TOPO_MAP.LOAD_TOPO_MAP(

     topo_map IN VARCHAR2,

     allow_updates IN VARCHAR2,

     build_indexes IN VARCHAR2 DEFAULT 'TRUE');'

or

SDO_TOPO_MAP.LOAD_TOPO_MAP(

     topo_map IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     allow_updates IN VARCHAR2,

     build_indexes IN VARCHAR2 DEFAULT 'TRUE');'

Description

Loads the topological elements (primitives) for an entire topology or a window (rectangular portion) of a topology into a TopoMap object. If you use a function format, returns the string TRUE if topological elements were loaded into the cache, and FALSE if no topological elements were loaded into the cache.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

xmin

Lower-left X coordinate value for the window (rectangular portion of the topology) to be loaded.

See the Usage Notes and Figure 4-1 for information about which topological elements are loaded when you specify a window.

ymin

Lower-left Y coordinate value for the window (rectangular portion of the topology) to be loaded.

xmax

Upper-right X coordinate value for the window (rectangular portion of the topology) to be loaded.

ymax

Upper-right Y coordinate value for the window (rectangular portion of the topology) to be loaded.

allow_updates

TRUE makes the TopoMap object updatable; that is, it allows topology editing operations to be performed on the TopoMap object and changes to be written back to the database. FALSE makes the TopoMap object read-only with respect to the database; that is, it allows topology editing operations to be performed on the TopoMap object but does not allow changes to be written back to the database.

Making a TopoMap object updatable causes the topological elements in the TopoMap object to be locked, which means that they cannot be included in an updatable TopoMap object in the session of another database user. (Within any given user session, there can be no more than one updatable TopoMap object active.)

build_indexes

TRUE (the default) builds in-memory R-tree indexes for edge and face data; FALSE does not build in-memory R-tree indexes for edge and face data. The indexes improve the performance of editing operations, especially with large topologies.

Usage Notes

Using a procedure format for loading the TopoMap object is more efficient than using the function format, if you do not need to know if any topological elements were loaded (for example, if the specified topology or rectangular area is empty). Using a function format lets you know if any topological elements were loaded.

You must create the TopoMap object (using the SDO_TOPO_MAP.CREATE_TOPO_MAP procedure) before you load data into it.

You cannot use this function or procedure if the TopoMap object already contains data. If the TopoMap object contains any data, you must do one of the following before calling this function or procedure: commit the changes (using the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure) and clear the cache (using the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure), or roll back the changes (using the SDO_TOPO_MAP.ROLLBACK_TOPO_MAP procedure).

For information about using an in-memory cache to edit topological elements, see Section 2.1.

This function or procedure is equivalent to using the loadTopology or loadWindow method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Every TopoMap object, whether for an entire topology or for a window specified using the xmin, ymin, xmax, and ymax parameters, has a region associated with it. For an updatable TopoMap object, updates are allowed only within this region. (The region might also contain topological elements that you cannot update directly, but that might be modified by Oracle Spatial as needed as a result of your editing operations.)

When a TopoMap object is loaded, all nodes, faces, and edges that intersect the region for the TopoMap object are loaded. When a face is loaded, all edges and nodes that are on the boundary of the face are loaded. When an edge is loaded, the start node and end node of the edge are loaded. Consider the topology and the window (shown by a dashed line) in Figure 4-1.

Figure 4-1 Loading Topological Elements into a Window

Description of Figure 4-1 follows
Description of "Figure 4-1 Loading Topological Elements into a Window"

With the window shown in Figure 4-1:

  • Face F1 is loaded because it partially overlaps the window.

  • The following edges are loaded: E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E16.

    Edge E3 is loaded because it partially overlaps the window.

    Edge E9 is loaded because it bounds a face (F1) that partially overlaps a window.

    Edge E12 is loaded because it is an island edge in a face (F1) that partially overlaps the window.

    Edge E1 is not loaded because it is not associated with any face that interacts with the window.

  • The following nodes are loaded: N2, N5, N6, N7, N8, N9, N10, N11, N12, N16, N19, N20.

    Non-isolated node N2 is loaded because edge E3 is loaded.

    Non-isolated node N12 is loaded because edges E9 and E11 are loaded.

    Isolated node N16 is loaded because it is an isolated (island) node inside a locked face.

Examples

The following example loads all CITY_DATA topology elements into its associated TopoMap object for editing and builds the in-memory R-tree indexes by default. It returns a result indicating that the operation was successful and that some topological elements were loaded into the cache. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.LOAD_TOPO_MAP('CITY_DATA_TOPOMAP', 'TRUE') INTO :res_varchar;
 
Call completed.
 
PRINT res_varchar;
 
RES_VARCHAR
--------------------------------------------------------------------------------
TRUE

SDO_TOPO_MAP.MOVE_EDGE

Format

SDO_TOPO_MAP.MOVE_EDGE(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     s_node_id IN NUMBER,

     t_node_id IN NUMBER,

     edge_coords IN SDO_NUMBER_ARRAY);

or

SDO_TOPO_MAP.MOVE_EDGE(

     topology IN VARCHAR2,

     edge_id IN NUMBER,

     s_node_id IN NUMBER,

     t_node_id IN NUMBER,

     edge_coords IN SDO_NUMBER_ARRAY,

     moved_iso_nodes OUT SDO_NUMBER_ARRAY,

     moved_iso_edges OUT SDO_NUMBER_ARRAY,

     allow_iso_moves IN VARCHAR2);

Description

Moves a non-isolated edge.

Parameters

topology

Name of the topology in which to move the edge, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

edge_id

Edge ID of the edge to be moved.

edge_coords

An array of coordinates of the resulting moved edge, from start point to end point.

s_node_id

Node ID of the source node, which identifies the point (start node or end node of the edge) affected by the move, before the move occurs. For example, if the end point of edge E19 is to be moved from node N17 to node N16, the s_node_id value is the node ID number for node N17.

t_node_id

Node ID of the target node, which identifies the point affected by the move, after the move occurs. For example, if the end point of edge E19 is to be moved from node N17 to node N16, the t_node_id value is the node ID number for node N16.

moved_iso_nodes

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the node ID values of any isolated nodes that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the node ID values of any isolated nodes that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

moved_iso_edges

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the edge ID values of any isolated edges that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the edge ID values of any isolated edges that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

allow_iso_moves

TRUE causes Spatial to allow an edge move operation that would cause any isolated nodes or edges to be in a different face, and to adjust the containing face information for such isolated nodes and edges; FALSE causes Spatial not to allow an edge move operation that would cause any isolated nodes or edges to be in a different face.

If you use the format that does not include the allow_iso_moves parameter, Spatial allows an edge move operation that would cause any isolated nodes or edges to be in a different face, and it adjusts the containing face information for such isolated nodes and edges.

Usage Notes

For information about moving edges, see Section 2.3.2.

This procedure is equivalent to using the moveEdge method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example moves the edge with edge ID value 19, and it displays the edge coordinates before and after the move. The edge move operation moves the end point of the edge from the node with node ID value 17 to the node with node ID value 16. (The edge being moved is E19 in Figure 1-2 in Section 1.2; and the edge is being changed from going vertically up to node N17, to going diagonally up and left to node N16. The example refers to definitions and data from Section 1.12.1.)

-- Get coordinates of edge E19.
SELECT SDO_TOPO_MAP.GET_EDGE_COORDS(null, 'CITY_DATA_TOPOMAP', 19) FROM DUAL;
 
SDO_TOPO_MAP.GET_EDGE_COORDS(NULL,'CITY_DATA_TOPOMAP',19)                           
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(21, 14, 21, 22)                                                
 
-- Move edge E19: from N14 -> N17 to N14 -> N16. The 3rd and 4th parameters
-- identify N17 and N16.
CALL SDO_TOPO_MAP.MOVE_EDGE(null, 19, 17, 16,
  SDO_NUMBER_ARRAY(21,14, 9,22));
 
Call completed.
 
-- Get coordinates of edge E19 after the move.
SELECT SDO_TOPO_MAP.GET_EDGE_COORDS(null, 'CITY_DATA_TOPOMAP', 19) FROM DUAL;
 
SDO_TOPO_MAP.GET_EDGE_COORDS(NULL,'CITY_DATA_TOPOMAP',19)                           
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(21, 14, 9, 22)

SDO_TOPO_MAP.MOVE_ISOLATED_NODE

Format

SDO_TOPO_MAP.MOVE_ISOLATED_NODE(

     topology IN VARCHAR2,

     node_id IN NUMBER,

     point IN SDO_GEOMETRY);

or

SDO_TOPO_MAP.MOVE_ISOLATED_NODE(

     topology IN VARCHAR2,

     node_id IN NUMBER,

     x IN NUMBER,

     y IN NUMBER);

Description

Moves an isolated (island) node.

Parameters

topology

Name of the topology in which to move the node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

node_id

Node ID of the node to be moved.

point

SDO_GEOMETRY object (point geometry) representing the location to which the isolated node is to be moved.

x

X-axis value of the point representing the location to which the isolated node is to be moved.

y

Y-axis value of the point representing the location to which the isolated node is to be moved.

Usage Notes

For information about moving nodes, see Section 2.2.2.

The node must be moved to a location inside the face in which it is currently located. Otherwise, you must delete the node and re-create it.

This procedure is equivalent to using the moveIsolatedNode method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example adds an isolated node and then moves it. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.ADD_ISOLATED_NODE(null, 2, 
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(22,38,NULL), NULL, NULL))
  INTO :res_number;
 
-- Move the just-added isolated node (from 20,38 to 22,39).
CALL SDO_TOPO_MAP.MOVE_ISOLATED_NODE( null, :res_number, 
  SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(22,39,NULL), NULL, NULL));

SDO_TOPO_MAP.MOVE_NODE

Format

SDO_TOPO_MAP.MOVE_NODE(

     topology IN VARCHAR2,

     node_id IN NUMBER,

     edges_coords IN SDO_EDGE_ARRAY);

or

SDO_TOPO_MAP.MOVE_NODE(

     topology IN VARCHAR2,

     node_id IN NUMBER,

     edges_coords IN SDO_EDGE_ARRAY,

     moved_iso_nodes OUT SDO_NUMBER_ARRAY,

     moved_iso_edges OUT SDO_NUMBER_ARRAY,

     allow_iso_moves IN VARCHAR2);

Description

Moves a non-isolated node and its attached edges.

Parameters

topology

Name of the topology in which to move the node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

node_id

Node ID of the node to be moved.

edges_coords

An array of arrays, of type SDO_EDGE_ARRAY (described in Section 1.6.7). Each inner array consists of coordinates of each resulting attached edge, from start point to end point. The outer array consists of the attached edge arrays, starting with the start edge of the node to be moved and proceeding in clockwise order (with the sequence of the edges as would be obtained in a call to the SDO_TOPO_MAP.GET_NODE_STAR function).

The array for each edge must include the start and end points. Any loops that connect twice at the moved node must be specified twice in the array.

moved_iso_nodes

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the node ID values of any isolated nodes that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the node ID values of any isolated nodes that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

moved_iso_edges

Output parameter in which, if the allow_iso_moves parameter value is TRUE, Spatial stores the edge ID values of any isolated edges that have moved to a different face as a result of this procedure. If the allow_iso_moves parameter value is FALSE, Spatial stores the edge ID values of any isolated edges that did not move but that would have moved to a different face if the allow_iso_moves parameter value had been TRUE.

allow_iso_moves

TRUE causes Spatial to allow a node move operation that would cause any isolated nodes or edges to be in a different face, and to adjust the containing face information for such isolated nodes and edges; FALSE causes Spatial not to allow a node move operation that would cause any isolated nodes or edges to be in a different face.

If you use the format that does not include the allow_iso_moves parameter, Spatial allows a node move operation that would cause any isolated nodes or edges to be in a different face, and it adjusts the containing face information for such isolated nodes and edges.

Usage Notes

For information about moving nodes, see Section 2.2.2.

This procedure is equivalent to using the moveNode method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example moves node N3 and adjusts the coordinates of the only attached edge. (The example refers to definitions and data from Section 1.12.1.)

-- Move node N3 to right: from 25,35 to 26,35.
-- E3 is changed from 25,30 -> 25,35 to 25,30 -> 26,35.
CALL SDO_TOPO_MAP.MOVE_NODE(null, 3,
  SDO_EDGE_ARRAY(SDO_NUMBER_ARRAY(25,30, 26,35)));

SDO_TOPO_MAP.REMOVE_EDGE

Format

SDO_TOPO_MAP.REMOVE_EDGE(

     topology IN VARCHAR2,

     edge_id IN NUMBER);

Description

Removes an edge from a topology.

Parameters

topology

Name of the topology from which to remove the edge, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

edge_id

Edge ID of the edge to be removed.

Usage Notes

If topology is not null, Spatial automatically updates the appropriate entries in the <topology-name>_EDGE$ and <topology-name>_FACE$ tables. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

For information about removing an edge from a topology, see Section 2.3.3.

Examples

The following example removes the edge with edge ID value 99 from the current updatable TopoMap object.

CALL SDO_TOPO_MAP.REMOVE_EDGE(null, 99);

SDO_TOPO_MAP.REMOVE_NODE

Format

SDO_TOPO_MAP.REMOVE_NODE(

     topology IN VARCHAR2,

     node_id IN NUMBER);

Description

Removes a node from a topology.

Parameters

topology

Name of the topology from which to remove the node, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

node_id

Node ID of the node to be removed.

Usage Notes

If topology is not null, Spatial automatically updates the appropriate entries in the <topology-name>_NODE$ and <topology-name>_EDGE$ tables, and in the <topology-name>_FACE$ table if necessary. (If topology is null, you can update these tables at any time by calling the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure.)

For information about removing a node from a topology, see Section 2.2.3.

Examples

The following example removes the node with node ID value 500 from the current updatable TopoMap object.

CALL SDO_TOPO_MAP.REMOVE_NODE(null, 500);

SDO_TOPO_MAP.REMOVE_OBSOLETE_NODES

Format

SDO_TOPO_MAP.REMOVE_OBSOLETE_NODES(

     topology IN VARCHAR2);

Description

Removes obsolete nodes from a topology. (Obsolete nodes are explained in Section 2.2.4.)

Parameters

topology

Name of the topology from which to remove obsolete nodes, or null if you are using an updatable TopoMap object (see Section 2.1.2). Must not exceed 20 characters.

Usage Notes

For information about removing obsolete nodes from a topology, see Section 2.2.4.

Examples

The following example removes all obsolete nodes from the current updatable TopoMap object.

CALL SDO_TOPO_MAP.REMOVE_OBSOLETE_NODES(null);

SDO_TOPO_MAP.ROLLBACK_TOPO_MAP

Format

SDO_TOPO_MAP.ROLLBACK_TOPO_MAP;

Description

Rolls back all changes to the database that were made using the current updatable TopoMap object, discards any changes in the object, clears the object's cache structure, and makes the object read-only.

Parameters

None.

Usage Notes

Use this procedure when you are finished with a batch of edits to a topology and you want to discard (that is, not commit) all changes to the database and in the cache. After the rollback operation completes, you cannot edit the TopoMap object. To make further edits to the topology, you can load the topology into the same TopoMap object for update (using the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure), or you can create a new TopoMap object (using the SDO_TOPO_MAP.CREATE_TOPO_MAP procedure) and load the topology into that TopoMap object for update.

To commit all TopoMap object changes, use the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

This procedure is equivalent to using the rollbackDB method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example rolls back from the database all changes associated with the current updatable TopoMap object.

EXECUTE SDO_TOPO_MAP.ROLLBACK_TOPO_MAP;

SDO_TOPO_MAP.SEARCH_EDGE_RTREE_TOPO_MAP

Format

SDO_TOPO_MAP.SEARCH_EDGE_RTREE_TOPO_MAP(

     topo_map IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     capacity IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array with the edge ID numbers of the edges that interact with a specified query window. The query uses the edge R-tree built on the specified TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

xmin

Lower-left X coordinate value for the query window.

ymin

Lower-left Y coordinate value for the query window.

xmax

Upper-right X coordinate value for the query window.

ymax

Upper-right Y coordinate value for the query window.

capacity

Maximum number of edge ID values to be returned. If you specify 0 or a negative number, 100 is used.

Usage Notes

This procedure is equivalent to using the searchEdgeRTree method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the edge ID numbers (up to 200) of edge that interact with a query window whose lower-left corner is at (5,5) and upper-right corner is at (30,40). (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.SEARCH_EDGE_RTREE_TOPO_MAP('CITY_DATA_TOPOMAP', -
  5,5, 30,40, 200) FROM DUAL;
 
SDO_TOPO_MAP.SEARCH_EDGE_RTREE_TOPO_MAP('CITY_DATA_TOPOMAP',5,5,30,40,200)      
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(12, 13, 22, 20, 9, 21, 19, 6, 10, 7, 26, 3, 1, 25, 2)

SDO_TOPO_MAP.SEARCH_FACE_RTREE_TOPO_MAP

Format

SDO_TOPO_MAP.SEARCH_FACE_RTREE_TOPO_MAP(

     topo_map IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     capacity IN NUMBER

     ) RETURN SDO_NUMBER_ARRAY;

Description

Returns an array with the face ID numbers of the faces that interact with a specified query window. The query uses the face R-tree built on the specified TopoMap object.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

xmin

Lower-left X coordinate value for the query window.

ymin

Lower-left Y coordinate value for the query window.

xmax

Upper-right X coordinate value for the query window.

ymax

Upper-right Y coordinate value for the query window.

capacity

Maximum number of face ID values to be returned. If you specify 0 or a negative number, 100 is used.

Usage Notes

This procedure is equivalent to using the searchFaceRTree method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example returns the face ID numbers (up to 200) of faces that interact with a query window whose lower-left corner is at (5,5) and upper-right corner is at (30,40). (The example refers to definitions and data from Section 1.12.1.)

SELECT SDO_TOPO_MAP.SEARCH_FACE_RTREE_TOPO_MAP('CITY_DATA_TOPOMAP', -
  5,5, 30,40, 200) FROM DUAL;
 
SDO_TOPO_MAP.SEARCH_FACE_RTREE_TOPO_MAP('CITY_DATA_TOPOMAP',5,5,30,40,200)      
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(6, 7, 3, 4, 9, 1, 2)

SDO_TOPO_MAP.SET_MAX_MEMORY_SIZE

Format

SDO_TOPO_MAP.SET_MAX_MEMORY_SIZE(

     maxsize IN NUMBER DEFAULT 268435456);

Description

Sets the Java maximum heap size for an application to run in an Oracle Java virtual machine.

Parameters

maxsize

Number of bytes for the Java maximum heap size. The default value is 268435456 (256 MB).

Usage Notes

If you encounter the java.lang.OutOfMemoryError exception, you can use this procedure to increase the maximum heap size.

If you specify a value greater than the system limit, the system limit is used.

Examples

The following example sets the Java maximum heap size to 536870912 (512 MB).

EXECUTE SDO_TOPO_MAP.SET_MAX_MEMORY_SIZE(536870912);

SDO_TOPO_MAP.UPDATE_TOPO_MAP

Format

SDO_TOPO_MAP.UPDATE_TOPO_MAP;

Description

Updates the topology to reflect edits made to the current updatable TopoMap object.

Parameters

None.

Usage Notes

Use this procedure to update the topology periodically during an editing session, as explained in Section 2.1.4. Updates are made, as needed, to the edge, face, and node information tables (described in Section 1.5). The TopoMap object remains open for further editing operations. The updates are not actually committed to the database until you call the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure.

This procedure performs a level-0 validation of the TopoMap object before it updates the topology. (See the explanation of the level parameter for the SDO_TOPO_MAP.VALIDATE_TOPO_MAP function.)

If you caused in-memory R-tree indexes to be created when you loaded the TopoMap object (by specifying or accepting the default value of TRUE for the build_indexes parameter with the SDO_TOPO_MAP.LOAD_TOPO_MAP function or procedure), you can rebuild these indexes by using the SDO_TOPO_MAP.CREATE_EDGE_INDEX and SDO_TOPO_MAP.CREATE_FACE_INDEX procedures. For best index performance, these indexes should be rebuilt periodically when you are editing a large number of topological elements.

Contrast this procedure with the SDO_TOPO_MAP.CLEAR_TOPO_MAP procedure, which clears the cache associated with a specified TopoMap object and makes the object read-only.

To commit all TopoMap object changes, use the SDO_TOPO_MAP.COMMIT_TOPO_MAP procedure.

For information about using an in-memory cache to edit topological elements, see Section 2.1.

This procedure is equivalent to using the updateTopology method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example updates the topology associated with the current updatable TopoMap object to reflect changes made to that object.

EXECUTE SDO_TOPO_MAP.UPDATE_TOPO_MAP;

SDO_TOPO_MAP.VALIDATE_TOPO_MAP

Format

SDO_TOPO_MAP.VALIDATE_TOPO_MAP(

     topo_map IN VARCHAR2,

     level IN NUMBER DEFAULT 1

     ) RETURN VARCHAR2;

Description

Performs a first-order validation of a TopoMap object, and optionally (by default) checks the computational geometry also; returns the string TRUE if the structure of the topological elements in TopoMap object is consistent, and raises an exception if the structure of the topological elements in TopoMap object is not consistent.

Parameters

topo_map

Name of the TopoMap object. (TopoMap objects are explained in Section 2.1.1.)

level

A value of 0 checks for the following conditions as part of a first-order validation:

  • All faces are closed, and none have infinite loops.

  • All previous and next edge pointers are consistent.

  • All edges meet at nodes.

  • Each island node is associated with a face.

  • All edges on a face boundary are associated with the face.

A value of 1 (the default) checks for all conditions associated with a value of 0, plus the following conditions related to computational geometry:

  • Each island is inside the boundary of its associated face.

  • No edge intersects itself or another edge.

  • Start and end coordinates of edges match coordinates of nodes.

  • Node stars are properly ordered geometrically.

Usage Notes

This function checks the consistency of all pointer relationships among edges, nodes, and faces. You can use this function to validate an updatable TopoMap object before you update the topology (using the SDO_TOPO_MAP.UPDATE_TOPO_MAP procedure) or to validate a read-only TopoMap object before issuing queries.

This function uses a tolerance value of 10E-15 for its internal computations, as explained in Section 1.2.1.

This function is equivalent to using the validateCache method of the TopoMap class of the client-side Java API (described in Section 1.8.2).

Examples

The following example validates the topology in the TopoMap object named CITY_DATA_TOPOMAP, and it returns a result indicating that the topology is valid. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.VALIDATE_TOPO_MAP('CITY_DATA_TOPOMAP') INTO :res_varchar;
 
Call completed.
 
PRINT res_varchar;
 
RES_VARCHAR
--------------------------------------------------------------------------------
TRUE

SDO_TOPO_MAP.VALIDATE_TOPOLOGY

Format

SDO_TOPO_MAP.VALIDATE_TOPOLOGY(

     topology IN VARCHAR2,

     ) RETURN VARCHAR2;

or

SDO_TOPO_MAP.VALIDATE_TOPOLOGY(

     topology IN VARCHAR2,

     prevent_updates IN VARCHAR2,

     level IN NUMBER DEFAULT 1

     ) RETURN VARCHAR2;

or

SDO_TOPO_MAP.VALIDATE_TOPOLOGY(

     topology IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER

     ) RETURN VARCHAR2;

or

SDO_TOPO_MAP.VALIDATE_TOPOLOGY(

     topology IN VARCHAR2,

     xmin IN NUMBER,

     ymin IN NUMBER,

     xmax IN NUMBER,

     ymax IN NUMBER,

     prevent_updates IN VARCHAR2,

     level IN NUMBER DEFAULT 1

     ) RETURN VARCHAR2;

Description

Loads an entire topology or a window (rectangular portion) of a topology into a TopoMap object; returns the string TRUE if the structure of the topology is consistent, and raises an exception if the structure of the topology is not consistent.

Parameters

topology

Name of the topology to be validated. Must not exceed 20 characters.

xmin

Lower-left X coordinate value for the window (rectangular portion of the topology) to be validated.

ymin

Lower-left Y coordinate value for the window (rectangular portion of the topology) to be validated.

xmax

Upper-right X coordinate value for the window (rectangular portion of the topology) to be validated.

ymax

Upper-right Y coordinate value for the window (rectangular portion of the topology) to be validated.

prevent_updates

TRUE prevents other users from updating the topology while the validation is being performed; FALSE allows other users to update the topology while the validation is being performed. If you specify FALSE, any topology changes made by other users while the validation is being performed will not be considered by this function and will not affect the result.

level

A value of 0 checks for the following conditions:

  • All faces are closed, and none have infinite loops.

  • All previous and next edge pointers are consistent.

  • All edges meet at nodes.

  • Each island node is associated with a face.

  • All edges on a face boundary are associated with the face.

A value of 1 (the default) checks for all conditions associated with a value of 0, plus the following conditions related to computational geometry:

  • Each island is inside the boundary of its associated face.

  • No edge intersects itself or another edge.

  • Start and end coordinates of edges match coordinates of nodes.

  • Node stars are properly ordered geometrically.

Usage Notes

This function implicitly creates a TopoMap object, and removes the object after the validation is complete. (TopoMap objects are described in Section 2.1.1.)

This function uses a tolerance value of 10E-15 for its internal computations, as explained in Section 1.2.1.

Examples

The following example validates the topology named CITY_DATA, and it returns a result indicating that the topology is valid. (The example refers to definitions and data from Section 1.12.1.)

CALL SDO_TOPO_MAP.VALIDATE_TOPOLOGY('CITY_DATA') INTO :res_varchar;
 
Call completed.
 
PRINT res_varchar;
 
RES_VARCHAR
--------------------------------------------------------------------------------
TRUE
<$!-- Start Footer --> PK/B$PK ;A OEBPS/lot.html List of Tables PKI>q l PK ;AOEBPS/sdo_prttopo.htm Topology Data Model

Part I

Topology Data Model

This document has two main parts:

  • Part I provides conceptual, usage, and reference information about the topology data model of Oracle Spatial.

  • Part II provides conceptual, usage, and reference information about the network data model of Oracle Spatial.

Part I contains the following chapters:

PK>#-"PK ;AOEBPS/sdo_topo_ref.htm SDO_TOPO Package Subprograms

3 SDO_TOPO Package Subprograms

The MDSYS.SDO_TOPO package contains subprograms (functions and procedures) that constitute part of the PL/SQL application programming interface (API) for the Spatial topology data model. This package mainly contains subprograms for creating and managing topologies.

To use the subprograms in this chapter, you must understand the conceptual information about topology in Chapter 1.

Another package, SDO_TOPO_MAP, mainly contains subprograms related to editing topologies. Reference information for the SDO_TOPO_MAP package is in Chapter 4.

The rest of this chapter provides reference information about the SDO_TOPO subprograms, listed in alphabetical order.


SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER

Format

SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER(

     topology IN VARCHAR2,

     table_name IN VARCHAR2,

     column_name IN VARCHAR2,

     topo_geometry_layer_type IN VARCHAR2,

     relation_table_storage IN VARCHAR2 DEFAULT NULL,

     child_layer_id IN NUMBER DEFAULT NULL);

Description

Adds a topology geometry layer to a topology.

Parameters

topology

Topology to which to add the topology geometry layer containing the topology geometries in the specified column. The topology must have been created using the SDO_TOPO.CREATE_TOPOLOGY procedure.

table_name

Name of the topology geometry layer table containing the column specified in column_name.

column_name

Name of the column (of type SDO_TOPO_GEOMETRY) containing the topology geometries in the topology geometry layer to be added to the topology.

topo_geometry_layer_type

Type of topology geometry layer: POINT, LINE, CURVE, POLYGON, or COLLECTION.

relation_table_storage

Physical storage parameters used internally to create the <topology-name>_RELATION$ table (described in Section 1.5.4). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

child_layer_id

Layer ID number of the child topology geometry layer for this layer, if the topology has a topology geometry layer hierarchy. (Topology geometry layer hierarchy is explained in Section 1.4.) If you do not specify this parameter and if the topology has a topology geometry layer hierarchy, the topology geometry layer is added to the lowest level (level 0) of the hierarchy.

If the topology does not have a topology geometry layer hierarchy, do not specify this parameter when adding any of the topology geometry layers.

Usage Notes

The first call to this procedure for a given topology creates the <topology-name>_RELATION$ table, which is described in Section 1.5.4.

This procedure automatically performs a commit operation, and therefore it cannot be rolled back. To delete the topology that you just created, call the SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER procedure.

The procedure creates a spatial index on the spatial features in the topology geometries, and a B-tree index on the combination of tg_type and tg_id in the topology geometries.

Users granted CONNECT and RESOURCE roles must also be granted the CREATE VIEW privilege to call the procedure. This is necessary because effective with Oracle Database 10g Release 2, the CONNECT role privilege reduction feature removed the following privileges from the CONNECT role: CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, ALTER SESSION, CREATE SYNONYM, CREATE TABLE, and CREATE VIEW.

The topology geometry layer table (table_name parameter) cannot be an object table.

An exception is raised if topology, table_name, or column_name does not exist, or if topo_geometry_layer_type is not one of the supported values.

Examples

The following example adds a topology geometry layer to the CITY_DATA topology. The topology geometry layer consists of polygon geometries in the FEATURE column of the LAND_PARCELS table. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.ADD_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS', 'FEATURE', 'POLYGON');

SDO_TOPO.CREATE_TOPOLOGY

Format

SDO_TOPO.CREATE_TOPOLOGY(

     topology IN VARCHAR2,

     tolerance IN NUMBER,

     srid IN NUMBER DEFAULT NULL,

     node_table_storage IN VARCHAR2 DEFAULT NULL,

     edge_table_storage IN VARCHAR2 DEFAULT NULL,

     face_table_storage IN VARCHAR2 DEFAULT NULL,

     history_table_storage IN VARCHAR2 DEFAULT NULL.

     digits_right_of_decimal IN VARCHAR2 DEFAULT 16);

Description

Creates a topology.

Parameters

topology

Name of the topology to be created. Must not exceed 20 characters.

tolerance

Tolerance value associated with topology geometries in the topology. (Tolerance is explained in Section 1.2.1.)

srid

Coordinate system (spatial reference system) associated with all topology geometry layers in the topology. The default is null: no coordinate system is associated; otherwise, it must be a value from the SRID column of the SDO_COORD_REF_SYS table (described in Oracle Spatial Developer's Guide).

node_table_storage

Physical storage parameters used internally to create the <topology-name>_NODE$ table (described in Section 1.5.2). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

edge_table_storage

Physical storage parameters used internally to create the <topology-name>_EDGE$ table (described in Section 1.5.1). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

face_table_storage

Physical storage parameters used internally to create the <topology-name>_FACE$ table (described in Section 1.5.3). Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

history_table_storage

Physical storage parameters used internally to create the <topology-name>_HISTORY$ table (described in Section 1.5.5. Must be a valid string for use with the CREATE TABLE statement. For example: TABLESPACE tbs_3 STORAGE (INITIAL 100K NEXT 200K). If you do not specify this parameter, the default physical storage values are used.

digits_right_of_decimal

The number of digits permitted to the right of the decimal point in the expression of any coordinate position when features are added to an existing topology. All incoming features (those passed as arguments to the addLinearGeometry, addPolygonGeometry, or addPointGeometry method in the Java API or the equivalent PL/SQL subprograms) will be automatically snapped (truncated) to the number of digits right of the decimal that is specified in this parameter. The default is 16.

This value should be set to match the last digit right of the decimal point that is considered valid based on the accuracy of the incoming data. This mechanism is provided to improve the stability of the computational geometry during the feature insertion process, and to minimize the creation of sliver polygons and other undesired results.

Usage Notes

This procedure creates the <topology-name>_EDGE$, <topology-name>_NODE$, <topology-name>_FACE$, and <topology-name>_HISTORY$ tables, which are described in Section 1.5, and it creates B-tree indexes on the primary keys of these tables. This procedure also creates the metadata for the topology.

In the srid parameter, you can specify a geodetic coordinate system; however, all Spatial internal operations on the topology will use Cartesian (not geodetic) arithmetic operations. (Geodetic and non-geodetic coordinate systems are discussed in Oracle Spatial Developer's Guide.)

Node, edge, face, and history tables are created without partitions; however, you can alter any of these tables to make it partitioned. You can also create a partitioned spatial index on a partitioned table, as explained in Oracle Spatial Developer's Guide.

This procedure automatically performs a commit operation, and therefore it cannot be rolled back. To delete the topology that you just created, call the SDO_TOPO.DROP_TOPOLOGY procedure.

An exception is raised if the topology already exists.

Examples

The following example creates a topology named CITY_DATA. The spatial geometries in this topology have a tolerance value of 0.5 and use the WGS 84 coordinate system (longitude and latitude, SRID value 8307). (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.CREATE_TOPOLOGY('CITY_DATA', 0.5, 8307);

SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER

Format

SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER(

     topology IN VARCHAR2,

     table_name IN VARCHAR2,

     column_name IN VARCHAR2);

Description

Deletes a topology geometry layer from a topology.

Parameters

topology

Topology from which to delete the topology geometry layer containing the topology geometries in the specified column. The topology must have been created using the SDO_TOPO.CREATE_TOPOLOGY procedure.

table_name

Name of the table containing the column specified in column_name.

column_name

Name of the column containing the topology geometries in the topology geometry layer to be deleted from the topology.

Usage Notes

This procedure deletes data associated with the specified topology geometry layer from the <topology-name>_RELATION$ table (described in Section 1.5.4). If this procedure is deleting the only remaining topology geometry layer from the topology, it also deletes the <topology-name>_RELATION$ table.

This procedure automatically performs a commit operation, and therefore it cannot be rolled back.

Examples

The following example deletes the topology geometry layer that is based on the geometries in the FEATURE column of the LAND_PARCELS table from the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER('CITY_DATA', 'LAND_PARCELS', 'FEATURE');

SDO_TOPO.DROP_TOPOLOGY

Format

SDO_TOPO.DROP_TOPOLOGY(

     topology IN VARCHAR2);

Description

Deletes a topology.

Parameters

topology

Name of the topology to be deleted. The topology must have been created using the SDO_TOPO.CREATE_TOPOLOGY procedure.

Usage Notes

This procedure deletes the <topology-name>_EDGE$, <topology-name>_NODE$, <topology-name>_FACE$, <topology-name>_NODE$, <topology-name>_RELATION$, and <topology-name>_HISTORY$ tables (described in Section 1.5).

If there are no topology layers associated with the topology, the topology is removed from the Spatial metadata.

This procedure automatically performs a commit operation, and therefore it cannot be rolled back.

A database user that owns a topology cannot be deleted. Therefore, before you can use the DROP USER ... CASCADE statement on a database user that owns a topology, you must connect as that user and execute the SDO_TOPO.DROP_TOPOLOGY procedure.

An exception is raised if the topology contains any topology geometries from any topology geometry layers. If you encounter this exception, delete all topology geometry layers in the topology using the SDO_TOPO.DELETE_TOPO_GEOMETRY_LAYER procedure for each topology geometry layer, and then drop the topology.

Examples

The following example drops the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.DROP_TOPOLOGY('CITY_DATA');

SDO_TOPO.GET_FACE_BOUNDARY

Format

SDO_TOPO.GET_FACE_BOUNDARY(

     topology IN VARCHAR2,

     face_id IN NUMBER,

     all_edges IN VARCHAR2 DEFAULT 'FALSE'

     ) RETURN SDO_LIST_TYPE;

Description

Returns a list of the signed ID numbers of the edges for the specified face.

Parameters

topology

Name of the topology that contains the face. Must not exceed 20 characters.

face_id

Face ID value of the face.

all_edges

TRUE includes all edges that bound the face (that is, that have the face on one or both sides); FALSE (the default) includes only edges that constitute the external boundary of the face. (See the examples for this function.)

Usage Notes

None.

Examples

The following examples return the ID numbers of the edges for the face whose face ID value is 1. The first example accepts the default value of 'FALSE' for the all_edges parameter. The second example specifies 'TRUE' for all_edges, and the list includes the ID numbers of the boundary edge and the two isolated edges on the face. (The examples refer to definitions and data from Section 1.12.)

-- Get the boundary of face with face_id 1.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1) FROM DUAL;
 
SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA',1)                                       
--------------------------------------------------------------------------------
SDO_LIST_TYPE(1)                                                                
 
-- Specify 'TRUE' for the all_edges parameter.
SELECT SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA', 1, 'TRUE') FROM DUAL;
 
SDO_TOPO.GET_FACE_BOUNDARY('CITY_DATA',1,'TRUE')                                
--------------------------------------------------------------------------------
SDO_LIST_TYPE(1, -26, 25)

SDO_TOPO.GET_TOPO_OBJECTS

Format

SDO_TOPO.GET_TOPO_OBJECTS(

     topology IN VARCHAR2,

     geometry IN SDO_GEOMETRY

     ) RETURN SDO_TOPO_OBJECT_ARRAY;

or

SDO_TOPO.GET_TOPO_OBJECTS(

     topology IN VARCHAR2,

     topo_geometry_layer_id IN NUMBER,

     topo_geometry_id IN NUMBER

     ) RETURN SDO_TOPO_OBJECT_ARRAY;

Description

Returns an array of SDO_TOPO_OBJECT objects that interact with a specified geometry object or topology geometry object.

Parameters

topology

Name of the topology. Must not exceed 20 characters.

geometry

Geometry object to be checked.

topo_geometry_layer_id

ID number of the topology geometry layer that contains the topology geometry object to be checked.

topo_geometry_id

ID number of the topology geometry object to be checked.

Usage Notes

The SDO_TOPO_OBJECT_ARRAY data type is described in Section 1.6.2.1.

For a topology that has a topology geometry layer hierarchy, this function works for all levels of the hierarchy, and it always returns the leaf-level (lowest-level) objects. (Topology geometry layer hierarchy is explained in Section 1.4.)

Examples

The following example returns the topology geometry objects that interact with land parcel P2 in the CITY_DATA topology. (The example refers to definitions and data from Section 1.12.1.)

-- CITY_DATA layer, land parcels (topo_geometry_ layer_id = 1), 
-- parcel P2 (topo_geometry_id = 2)
SELECT SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA', 1, 2) FROM DUAL;
 
SDO_TOPO.GET_TOPO_OBJECTS('CITY_DATA',1,2)(TOPO_ID, TOPO_TYPE)                  
--------------------------------------------------------------------------------
SDO_TOPO_OBJECT_ARRAY(SDO_TOPO_OBJECT(9, 1), SDO_TOPO_OBJECT(10, 1), SDO_TOPO_OB
JECT(13, 1), SDO_TOPO_OBJECT(14, 1), SDO_TOPO_OBJECT(17, 1), SDO_TOPO_OBJECT(18,
 1), SDO_TOPO_OBJECT(6, 2), SDO_TOPO_OBJECT(7, 2), SDO_TOPO_OBJECT(8, 2), SDO_TO
PO_OBJECT(9, 2), SDO_TOPO_OBJECT(10, 2), SDO_TOPO_OBJECT(11, 2), SDO_TOPO_OBJECT
(12, 2), SDO_TOPO_OBJECT(13, 2), SDO_TOPO_OBJECT(14, 2), SDO_TOPO_OBJECT(17, 2),
 SDO_TOPO_OBJECT(18, 2), SDO_TOPO_OBJECT(19, 2), SDO_TOPO_OBJECT(20, 2), SDO_TOP
O_OBJECT(-6, 2), SDO_TOPO_OBJECT(-7, 2), SDO_TOPO_OBJECT(-8, 2), SDO_TOPO_OBJECT
(-9, 2), SDO_TOPO_OBJECT(-10, 2), SDO_TOPO_OBJECT(-11, 2), SDO_TOPO_OBJECT(-12, 
2), SDO_TOPO_OBJECT(-13, 2), SDO_TOPO_OBJECT(-14, 2), SDO_TOPO_OBJECT(-17, 2), S
DO_TOPO_OBJECT(-18, 2), SDO_TOPO_OBJECT(-19, 2), SDO_TOPO_OBJECT(-20, 2), SDO_TO
PO_OBJECT(-1, 3), SDO_TOPO_OBJECT(3, 3), SDO_TOPO_OBJECT(4, 3), SDO_TOPO_OBJECT(
5, 3), SDO_TOPO_OBJECT(6, 3), SDO_TOPO_OBJECT(7, 3), SDO_TOPO_OBJECT(8, 3)) 

SDO_TOPO.INITIALIZE_AFTER_IMPORT

Format

SDO_TOPO.INITIALIZE_AFTER_IMPORT(

     topology IN VARCHAR2);

Description

Creates (initializes) a topology that was imported from another database.

Parameters

topology

Name of the topology to be created. The topology must have been exported from a source database.

Usage Notes

This procedure creates the specified topology and all related database structures, adjusts (if necessary) the topology ID values in all feature tables, and creates the feature layers in the correct order.

Before calling this procedure, connect to the database as the user for the schema that is to own the topology to be created.

You must use this procedure after following all other required steps for exporting and importing the topology, as explained in Section 1.9.

Examples

The following example creates the topology named CITY_DATA, using information from the imported tables, including CITY_DATA_EXP$. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.INITIALIZE_AFTER_IMPORT('CITY_DATA');

SDO_TOPO.INITIALIZE_METADATA

Format

SDO_TOPO.INITIALIZE_METADATA(

     topology IN VARCHAR2);

Description

Initializes the topology metadata: sets sequence information for the node, edge, and face tables, and creates (or re-creates) required indexes on these tables.

Parameters

topology

Name of the topology for which to initialize the sequences. The topology must have been created using the SDO_TOPO.CREATE_TOPOLOGY procedure.

Usage Notes

You should run this procedure after loading data into the node, edge, or face tables, to initialize the sequences for these tables with numeric values 2 higher than the highest ID values stored in those tables. This ensures that no attempt is made to reuse the unique ID values in these tables. (The node, edge, and face tables are described in Section 1.5.)

This procedure creates spatial indexes on the geometry or MBR geometry columns in the node, edge, and face tables. If the indexes were dropped before a bulk load operation, running this procedure after the bulk load will re-create these indexes.

Examples

The following example initializes the metadata for the topology named CITY_DATA. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.INITIALIZE_METADATA('CITY_DATA');

SDO_TOPO.PREPARE_FOR_EXPORT

Format

SDO_TOPO.PREPARE_FOR_EXPORT(

     topology IN VARCHAR2);

Description

Prepares a topology to be exported to another database.

Parameters

topology

Name of the topology to be prepared for export. The topology must have been created using the SDO_TOPO.CREATE_TOPOLOGY procedure.

Usage Notes

This procedure prepares the specified topology in the current database (the source database) to be exported to another database (the target database).

This procedure creates a table in the current schema with a table name in the format <topology-name>_EXP$. This table contains the same columns as the USER_SDO_TOPO_INFO and ALL_SDO_TOPO_INFO views. These columns are described in Table 1-8 in Section 1.7.1.

Before calling this procedure, connect to the database as the owner of the topology.

For information about exporting and importing topologies, including the steps to be followed, see Section 1.9.

Examples

The following example prepares the topology named CITY_DATA for export to a target database. (The example refers to definitions and data from Section 1.12.1.)

EXECUTE SDO_TOPO.PREPARE_FOR_EXPORT('CITY_DATA');

SDO_TOPO.RELATE

Format

SDO_TOPO.RELATE(

     geom1 IN SDO_TOPO_GEOMETRY,

     geom2 IN SDO_TOPO_GEOMETRY,

     mask IN VARCHAR2

     ) RETURN VARCHAR2;

or

SDO_TOPO.RELATE(

     feature1 IN SDO_TOPO_GEOMETRY,

     feature2 IN SDO_GEOMETRY,

     mask IN VARCHAR2

     ) RETURN VARCHAR2;

or

SDO_TOPO.RELATE(

     geom IN SDO_TOPO_GEOMETRY,

     topo_elem_array IN SDO_TOPO_OBJECT_ARRAY,

     mask IN VARCHAR2

     ) RETURN VARCHAR2;

Description

Examines two topology geometry objects, or a topology geometry and a spatial geometry, or a topology geometry and a topology object array (SDO_TOPO_OBJECT_ARRAY object), to determine their spatial relationship.

Parameters

geom1

Topology geometry object.

geom2

Topology geometry object.

feature1

Topology geometry object.

feature2

Spatial geometry object.

geom

Topology geometry object.

topo_elem_array

Topology object array (of type SDO_TOPO_OBJECT_ARRAY, which is described in Section 1.6.2.1).

mask

Specifies one or more relationships to check. See the list of keywords in the Usage Notes.

Usage Notes

The topology operators (described in Section 1.8.1) provide better performance than the SDO_TOPO.RELATE function if you are checking a large number of objects; however, if you are checking just two objects or a small number, the SDO_TOPO.RELATE function provides better performance. In addition, sometimes you may need to use the SDO_TOPO.RELATE function instead of a topology operator. For example, you cannot specify the DETERMINE mask keyword with the topology operators.

The following keywords can be specified in the mask parameter to determine the spatial relationship between two objects:

  • ANYINTERACT: Returns TRUE if the objects are not disjoint.

  • CONTAINS: Returns TRUE if the second object is entirely within the first object and the object boundaries do not touch; otherwise, returns FALSE.<m/p>

  • COVEREDBY: Returns TRUE if the first object is entirely within the second object and the object boundaries touch at one or more points; otherwise, returns FALSE.

  • COVERS: Returns TRUE if the second object is entirely within the first object and the boundaries touch in one or more places; otherwise, returns FALSE.

  • DETERMINE: Returns the one relationship keyword that best matches the geometries.

  • DISJOINT: Returns TRUE if the objects have no common boundary or interior points; otherwise, returns FALSE.

  • EQUAL: Returns TRUE if the objects share every point of their boundaries and interior, including any holes in the objects; otherwise, returns FALSE.

  • INSIDE: Returns TRUE if the first object is entirely within the second object and the object boundaries do not touch; otherwise, returns FALSE.

  • ON: Returns TRUE if the boundary and interior of a line (the first object) is completely on the boundary of a polygon (the second object); otherwise, returns FALSE.

  • OVERLAPBDYDISJOINT: Returns TRUE if the objects overlap, but their boundaries do not interact; otherwise, returns FALSE.

  • OVERLAPBDYINTERSECT: Returns TRUE if the objects overlap, and their boundaries intersect in one or more places; otherwise, returns FALSE.

  • TOUCH: Returns TRUE if the two objects share a common boundary point, but no interior points; otherwise, returns FALSE.

Values for mask (except for DETERMINE) can be combined using the logical Boolean operator OR. For example, 'INSIDE + TOUCH' returns the string TRUE or FALSE depending on the outcome of the test.

Examples

The following example finds whether or not the ANYINTERACT relationship exists between each topology geometry object in the CITY_STREETS table and the P3 land parcel (that is, which streets interact with that land parcel). (The example refers to definitions and data from Section 1.12. The output is reformatted for readability.)

SELECT c.feature_name,
  SDO_TOPO.RELATE(c.feature, l.feature, 'anyinteract') Any_Interaction
  FROM city_streets c, land_parcels l WHERE l.feature_name = 'P3';
 
FEATURE_NAME  ANY_INTERACTION                                                                     
------------  ---------------        
R1            TRUE
R2            FALSE                
R3            FALSE                            
R4            FALSE

The following example finds whether or not the ANYINTERACT relationship exists between each topology geometry object in the CITY_STREETS table and an SDO_TOPO_OBJECT_ARRAY object that happens to be identical to the land parcel feature named P3. (This example uses definitions and data from Section 1.12.) The output is identical to that in the preceding example, and is reformatted for readability.

SELECT c.feature_name, 
  SDO_TOPO.RELATE(c.feature,
    SDO_TOPO_OBJECT_ARRAY (SDO_TOPO_OBJECT (5, 3), SDO_TOPO_OBJECT (8, 3)), 
    'anyinteract') Any_Interaction 
  FROM city_streets c, land_parcels l WHERE l.feature_name = 'P3';
 
FEATURE_NAME  ANY_INTERACTION                                                                     
------------  ---------------        
R1            TRUE
R2            FALSE                
R3            FALSE                            
R4            FALSE
PKHPK  ;Aoa,mimetypePK ;A2lg:iTunesMetadata.plistPK ;AYuMETA-INF/container.xmlPK ;A[pTOOEBPS/cover.htmPK ;AOEBPS/title.htmPK ;AξOEBPS/sdo_net_ref.htmPK ;AxOJ OEBPS/loe.htmPK ;AḐ߆TOEBPS/sdo_net_mem_ref.htmPK ;AsOEBPS/preface.htmPK ;A_[J1݆OEBPS/index.htmPK ;A7:'K- OEBPS/img/move_edge.gifPK ;A%%!C OEBPS/img/feat_topo_rel.gifPK ;AmE''!5i OEBPS/img/topo_node_edge_face.gifPK ;Aw捓N OEBPS/img/ndm_nyc.gifPK ;Au $ OEBPS/img/add_node.gifPK ;A5\TO z OEBPS/img/node_moves_several.gifPK ;AsV7 OEBPS/img/flip_node.gifPK ;Aɩ I OEBPS/img/add_node_2.gifPK ;AvT OEBPS/img/subpaths.gifPK ;A4C!!# OEBPS/img/delete_obsolete_nodes.gifPK ;A0G B+ OEBPS/img/delete_node.gifPK ;A\=807 OEBPS/img/add_edge.gifPK ;A!!K OEBPS/img/move_node_2b.gifPK ;A!i|'w'm OEBPS/img/net_hier2.gifPK ;AsQnQ OEBPS/img/topo_xy_axes.gifPK ;A{ L OEBPS/img/move_node_1.gifPK ;AB UQQ OEBPS/img/topo_editing_plsql.gifPK ;AzidG OEBPS/img/topo_hier.gifPK ;Azyb OEBPS/img/net_sdo.gifPK ;AGG;q OEBPS/img/topo_editing_java.gifPK ;Azu% OEBPS/img/topo_features.gifPK ;A~ y  OEBPS/img/edge_table.gifPK ;A>UO OEBPS/img/delete_edge.gifPK ;A-D OEBPS/img/net_hier.gifPK ;A{v OEBPS/img/load_window.gifPK ;AFqc& OEBPS/img/net_log_simple.gifPK ;A2fEE, OEBPS/img/net_roads.gifPK ;AǷܘr OEBPS/sdo_topo_concepts.htmPK ;A\g$ OEBPS/img_text/topo_editing_java.htmPK ;A#'}xOEBPS/img_text/add_edge.htmPK ;A=.|OEBPS/img_text/delete_edge.htmPK ;AvOEBPS/img_text/add_node_2.htmPK ;AT;OEBPS/img_text/subpaths.htmPK ;AK8 OEBPS/img_text/feat_topo_rel.htmPK ;A dOEBPS/img_text/topo_xy_axes.htmPK ;A<%!OEBPS/img_text/topo_editing_plsql.htmPK ;A^x8C>L$OEBPS/img_text/move_edge.htmPK ;A{˜'OEBPS/img_text/net_sdo.htmPK ;AU^Y*OEBPS/img_text/load_window.htmPK ;AeG֎!g.OEBPS/img_text/net_log_simple.htmPK ;A*D1OEBPS/img_text/net_roads.htmPK ;A :NIb4OEBPS/img_text/edge_table.htmPK ;Aj&K7OEBPS/img_text/topo_hier.htmPK ;A;OEBPS/img_text/move_node_2b.htmPK ;Al!YK<7>OEBPS/img_text/ndm_nyc.htmPK ;APd&rCOEBPS/img_text/topo_node_edge_face.htmPK ;A?8&lFOEBPS/img_text/delete_node.htmPK ;AUWEIOEBPS/img_text/net_hier2.htmPK ;A3|rMOEBPS/img_text/add_node.htmPK ;AT| ql APOEBPS/img_text/topo_features.htmPK ;A%SOEBPS/img_text/node_moves_several.htmPK ;AjHrmIXOEBPS/img_text/net_hier.htmPK ;Ave94[OEBPS/img_text/move_node_1.htmPK ;A?^OEBPS/img_text/flip_node.htmPK ;A|B=(xbOEBPS/img_text/delete_obsolete_nodes.htmPK ;AOFgOEBPS/sdo_prtnet.htmPK ;AfRh&}v}oOEBPS/sdo_net_concepts.htmPK ;AxK OEBPS/toc.ncxPK ;Ar$$EOEBPS/topol_newfeat.htmPK ;An*8%8@ OEBPS/content.opfPK ;A?prm XOEBPS/lof.htmPK ;A_ VgOEBPS/dcommon/prodbig.gifPK ;AY@ mOEBPS/dcommon/doclib.gifPK ;AWMoOEBPS/dcommon/oracle-logo.jpgPK ;AOEBPS/dcommon/contbig.gifPK ;AOEBPS/dcommon/darbbook.cssPK ;AMά""!OEBPS/dcommon/O_signature_clr.JPGPK ;APz OEBPS/dcommon/feedbck2.gifPK ;A-]OEBPS/dcommon/feedback.gifPK ;Aː5r"OEBPS/dcommon/booklist.gifPK ;AN61#OEBPS/dcommon/cpyr.htmPK ;A!:3.O6OEBPS/dcommon/masterix.gifPK ;AeӺ1,7OEBPS/dcommon/doccd.cssPK ;A7 @:OEBPS/dcommon/larrow.gifPK ;A#g<OEBPS/dcommon/indxicon.gifPK ;AS'">OEBPS/dcommon/leftnav.gifPK ;Ahu,@@OEBPS/dcommon/uarrow.gifPK ;Al-OJ[COEBPS/dcommon/oracle.gifPK ;A(KOEBPS/dcommon/index.gifPK ;AGC 6MOEBPS/dcommon/bookbig.gifPK ;AJV^VWOEBPS/dcommon/rarrow.gifPK ;A枰pkqYOEBPS/dcommon/mix.gifPK ;Ao"nR M $\OEBPS/dcommon/doccd_epub.jsPK ;Av I fOEBPS/dcommon/toc.gifPK ;A r~$ hOEBPS/dcommon/topnav.gifPK ;A1FAviOEBPS/dcommon/prodicon.gifPK ;A3( # mOEBPS/dcommon/bp_layout.cssPK ;Ax[?:uzOEBPS/dcommon/bookicon.gifPK ;Ap*c^OEBPS/dcommon/conticon.gifPK ;AʍOEBPS/dcommon/blafdoc.cssPK ;A+&OEBPS/dcommon/rightnav.gifPK ;Aje88OEBPS/dcommon/oracle-small.JPGPK ;Aއ{&!ZOEBPS/dcommon/help.gifPK ;A*$OEBPS/sdo_topo_editing.htmPK ;A& 0OEBPS/toc.htmPK ;A/B$2OEBPS/sdo_topo_map_ref.htmPK ;AI>q l OEBPS/lot.htmPK ;A>#-"ǿOEBPS/sdo_prttopo.htmPK ;AH,OEBPS/sdo_topo_ref.htmPKmmW W