针对网络模型的程序包主要有两个:SDO_NET和SDO_NET_MEM。SDO_NET程序包提供了数据库服务器端创建、访问和管理网络的一系列子程序。SDO_NET_MEM程序包通过一个网络内存对象(也叫缓存对象),提供了网络对象编辑和网络分析功能。
(1)SDO_NET可以归纳为以下几个逻辑分组。
(a)创建网络。
sdo_net.create_sdo_network
sdo_net.create_lrs_network
sdo_net.create_topo_network
sdo_net.create_logical_network
(b)拷贝和删除网络。
sdo_net.copy_network
sdo_net.drop_network
(c)创建网络数据表。
sdo_net.create_node_table
sdo_net.create_link_table
sdo_net.create_path_table
sdo_net.create_path_link_table
sdo_net.create_lrs_table
(d)网络对象有效性检验。
sdo_net.validate_network
sdo_net.validate_node_schema
sdo_net.validate_link_schema
sdo_net.validate_path_schema
sdo_net.validate_lrs_schema
(e)信息获取。
sdo_net.get_child_links
sdo_net.get_child_nodes
sdo_net.get_geometry_type
sdo_net.get_in_links
sdo_net.get_link_cost_column
sdo_net.get_link_direction
sdo_net.get_link_geom_column
sdo_net.get_link_geometry
sdo_net.get_link_table_name
sdo_net.get_lrs_geom_column
sdo_net.get_lrs_link_geometry
sdo_net.get_lrs_node_geometry
sdo_net.get_lrs_table_name
sdo_net.get_network_type
sdo_net.get_no_of_hierarchy_levels
sdo_net.get_no_of_links
sdo_net.get_no_of_nodes
sdo_net.get_node_degree
sdo_net.get_node_geom_column
sdo_net.get_node_geometry
sdo_net.get_node_in_degree
sdo_net.get_node_out_degree
sdo_net.get_node_table_name
sdo_net.get_out_links
sdo_net.get_path_geom_column
sdo_net.get_path_table_name
sdo_net.is_hierarchical
sdo_net.is_logical
sdo_net.is_spatial
sdo_net.lrs_geometry_network
sdo_net.network_exists
sdo_net.sdo_geometry_network
sdo_net.topo_geometry_network(www.xing528.com)
(2)SDO_NET_MEM程序包可分为以下几个逻辑分组。
(a)SDO_NET_MEM.NETWORK_MANAGER和ORACLE.SPATIAL.NETWORK.NETWORKMANAGER类相关联。它提供了删除网络内存对象和执行网络分析的功能。
(b)SDO_NET_MEM.NETWORK与ORACLE.SPATIAL.NETWORK.NETWORK类相关联。它提供了添加和删除节点、链路和路径的功能。
(c)SDO_NET_MEM.NODE与ORACLE.SPATIAL.NETWORK.NODE类相关联。它提供了节点属性的获取与设置功能。
在这里不讨论每个过程或函数的详细参数和用法,关于每个函数的详细说明请参考Oracle相关开发说明文档Oracle®Spatial Topology and Network Data Models Developer′s Guide。这里结合示例(在第1章中构建的NDMDEMO),通过演示如何新建网络并进行最短路径分析来说明如何应用这些程序包。代码如下:
在Code_3_7中,显示了如何新建网络。首先删除网络对象,然后删除ROADS网络的节点表、链路表、路径表和路径-链路表,这样做主要是为了防止ROADS网络的相关表已经在数据库中存在了;其次调用sdo_net.create_sdo_network()函数新建空间网络,这样系统会自动帮我们在数据库中新建数据表:roads_node$、roads_link$、roads_path$和roads_plink$;然后把hillsborough_network_node$中的所有节点拷贝到数据表roads_node$中,把hillsborough_network_link$中层次为1的链路拷贝到roads_link$中;最后将元数据插入相应数据表,检查新建网络的有效性。代码如下:
在Code_3_8中显示了如何利用最短路径函数计算两个节点之间的最短路径。步骤为:①代码中设置内存网络缓存大小为512*1024*1024;②列举数据库中的所有网络;③将ROADS网络读入内存;④调用shortest_path()函数计算节点1到节点20之间的最短路径,得到路径ID;⑤输出组成该路径的所有节点ID和链路ID;⑥设置该路径名称,计算其几何对象,并将该路径添加到内存网络中;⑦将内存网络写回数据库,并删掉内存网络对象。其输出结果如下:
ROADS
TRUE
path found:1
Link traversed:
*Link 145477104 57.4599940801886
*Link 145477100 718.206822785963
*Link 145477148 1717.91051954225
*Link 145477099 149.829299163315
*Link 145482380 443.646567644931
*Link 145482379 16.026067601548
*Link 145477034 48.6850306722499
*Link 145477036 1803.35368873608
*Link 145477038 75.2753768316038
*Link 145477040 63.3881526812395
*Link 145477106 553.210368538399
*Link 145477129 980.817115797283
*Link 145477042 281.8928291947
*Link 145477044 745.701102093955
*Link 145477046 37.9646023070001
*Link 145477048 831.428781256439
*Link 145477047 140.823729638124
*Link 145476983 562.794926564542
*Link 145476982 1562.12502548642
*Link 145476956 421.745971789507
Node traversed:
*Node 1 0
*Node 4 0
*Node 16 0
*Node 59 0
*Node 56 0
*Node 54 0
*Node 53 0
*Node 51 0
*Node 42 0
*Node 44 0
*Node 45 0
*Node 48 0
*Node 57 0
*Node 60 0
*Node 64 0
*Node 65 0
*Node 46 0
*Node 40 0
*Node 31 0
*Node 13 0
*Node 20 0
执行后,会发现在数据表roads_path$中多了一行记录,其path_id为1;在数据表roads_plink$中出现了20行数据,记录的是组成该路径的20个顺次链路。至于网络分析的其他函数或过程的使用流程和方法与此类似,在此不再一一讨论。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。