【问题标题】:Getting Geometry of Intersection of Road SQL and Inserting Into Table获取道路 SQL 交叉口的几何形状并插入到表中
【发布时间】:2015-06-19 20:21:49
【问题描述】:

我需要找到多条道路的交叉点,但每条道路都分为多个路段,因此一条道路有很多记录。我有这个查询,我可以用它来查找几何,但每个都显示为空。我需要有一个几何图形,以便我可以将其插入到一条记录中。

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';

【问题讨论】:

标签: sql intersection oracle-spatial


【解决方案1】:

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

我假设您的表格如下所示:

create table ottawacollectors (
  road_id number,
  segment_id number,
  road_name varchar2(30),
  geometry sdo_geometry,
  primary key (road_id, segment_id)
);

它包含路段。每个路段由道路标识符和路段标识符标识。

以下创建新表 INTERSECTIONS,其中每个交叉口包含一行,即每当两个路段交互时。交点被计算为几何点。每行包含每个路段的标识符(道路标识符和路段标识符)以及每条道路的名称。

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 元素,其中每个元素都包含一对名为 ROWID1 和 ROWID2 的 rowid(表中行的物理标识符),它们指向一对相互作用的路段。
  • TABLE() 构造函数对该数组进行强制转换,使其看起来像一个常规表,从而可以轻松地将其嵌入到关系查询中。该“虚拟”表在查询中称为 J。
  • 查询还读取OTTAWACOLLECTORS 表两次(如您的示例中所示)。它将它们与TABLE() 结果连接起来:J.ROWID1=A.ROWID AND 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 的正确许可,那么请确保您已打开 Vector Performance Accelerator 选项。

【讨论】:

  • 所以我对您的代码进行了一些修改,它可以很好地检索道路 1 和道路 2 的表格,然后检索交叉口几何。但是,我如何操作我将要获取的新几何并将其放入仅基于名称的特定交叉点的表格中?这是我的代码:
  • select a.road_name road_name_1, 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;
  • 我不确定我是否完全理解你所说的。但是您可以从新的intersections 表中选择:select ... from intersections where road_name_1 = 'KENT' 并将结果放入另一个表中。或者只是将道路名称过滤器添加到基本查询中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2015-10-24
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多