Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取道路交点的几何图形并插入到表中_Sql_Intersection_Oracle Spatial - Fatal编程技术网

Sql 获取道路交点的几何图形并插入到表中

Sql 获取道路交点的几何图形并插入到表中,sql,intersection,oracle-spatial,Sql,Intersection,Oracle Spatial,我需要找到各种道路的交叉点,但每条道路都分为多个路段,因此一条道路有许多记录。我有这个查询,我可以用它来查找几何体,但每个都显示为null。我需要有一个几何体,这样我就可以将它插入到一个记录中 SELECT SDO_GEOM.SDO_INTERSECTION(coll_a.GEOMETRY, coll_b.GEOMETRY, 0.05) FROM OTTAWACOLLECTORS coll_a, OTTAWACOLLECTORS coll_b WHERE coll_a.ROAD_NAME = '

我需要找到各种道路的交叉点,但每条道路都分为多个路段,因此一条道路有许多记录。我有这个查询,我可以用它来查找几何体,但每个都显示为null。我需要有一个几何体,这样我就可以将它插入到一个记录中

SELECT SDO_GEOM.SDO_INTERSECTION(coll_a.GEOMETRY, coll_b.GEOMETRY, 0.05)
FROM OTTAWACOLLECTORS coll_a, OTTAWACOLLECTORS coll_b
WHERE coll_a.ROAD_NAME = 'KENT' AND coll_b.ROAD_NAME = 'METCALFE';

解决这类问题的最有效方法是使用SDO_JOIN()过滤器。它的目的是使用空间索引有效地将空间上的许多对象与许多其他对象进行匹配

我假设您的桌子如下所示:

create table ottawacollectors (
  road_id number,
  segment_id number,
  road_name varchar2(30),
  geometry sdo_geometry,
  primary key (road_id, segment_id)
);
它包含路段。每个路段由道路标识符和路段标识符标识

以下内容将创建新的表格交叉点,每个交叉点包含一行,即当两个路段相互作用时。交点作为几何点计算。每行包含每条路段的标识符(道路标识符和路段标识符)以及每条道路的名称

create table intersections as
select a.road_id road_id_1, a.segment_id segment_id_1, a.road_name road_name_1,
       b.road_id road_id_2, b.segment_id segment_id_2, b.road_name road_name_2,       
       sdo_geom.sdo_intersection (
         a.geometry, b.geometry, 0.05
       ) intersection_point
from  ottawacollectors a,
      ottawacollectors b,
      table (
        sdo_join(
          'OTTAWACOLLECTORS','GEOMETRY',
          'OTTAWACOLLECTORS','GEOMETRY',
          'MASK=ANYINTERACT'
        )
      ) j  
where a.rowid = j.rowid1
and   b.rowid = j.rowid2
and   j.rowid1 > j.rowid2;
一些解释:

  • SDO_JOIN()
    是一个“表”函数。它采用两个输入表的名称(表名和几何体列的名称)和匹配条件-此处为“ANYINTERACT”,表示任何类型的交互:段可以交叉或只是相互接触
  • 它返回元素的VARRAY,其中每个元素包含一对rowid(表中行的物理标识符),称为ROWID1和ROWID2,它们指向一对相互作用的路段
  • TABLE()
    构造函数强制转换该数组,使其看起来像一个常规表,从而使其易于嵌入到关系查询中。该“虚拟”表在查询中称为J
  • 查询还会读取
    OTTAWACOLLECTORS
    表两次(如示例中所示)。它将它们与
    TABLE()
    结果连接起来:
    J.ROWID1=A.ROWID和J.ROWID2=B.ROWID
  • J.ROWID1>J.ROWID2
    过滤器用于消除不需要的结果。假设路段A和B相交。SDO_JOIN将返回4个组合:(A,B),但也返回(B,A)以及(A,A)和(B,B),因为一个段显然与其自身相交!比较rowid的目的是只保留(A,B)或(B,A)中的一个
  • 选择列表包括两个线段的完整标识符、它们的名称以及它们的交点(使用
    SDO_GEOM.SDO_intersection()
    计算,如示例中所示)
  • 最后将结果写入一个表中

请注意,此查询不会立即返回结果:可能需要几分钟才能完成,这取决于需要处理的路段数量,当然也取决于运行它的硬件。如果您在Oracle 12c(12.1.0.1或12.1.0.2)上运行它,并且您拥有Oracle Spatial的适当许可证,那么请确保已启用向量性能加速器选项。

-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式已被正确的ANSI
JOIN
语法所取代它的用途是不推荐的,所以我对你的代码做了一些修改,它可以很好地检索1号公路和2号公路的表格,然后是交叉口的几何图形。但是,我如何处理新的几何体呢?我要把它放到一个表中,根据它们的名称只包含特定的交点?这是我的代码:选择a.road\u name road\u name\u 1、b.road\u name road\u name\u 2、sdo\u geom.sdo\u交叉点(a.geometry、b.geometry、0.05)交叉点(从Ottawa、Ottawa、b、表(sdo\u连接('OTTAWACOLLECTORS'、'GEOMETRY'、'OTTAWACOLLECTORS'、'GEOMETRY'、'MASK=ANYINTERACT'))j其中a.rowid=j.rowid1和b.rowid=j.rowid2和j.rowid1>j.rowid2;我不确定我是否完全理解你所说的。但是你可以从新的
交叉口
表中选择:
从道路名称为'KENT'的交叉口中选择…并将结果放入另一个表中。或者只需在基本查询。