Visualising the Topological Relations of LineStrings

Introduction

The Oracle Spatial documentation includes examples of the different types of spatial relationships for polygons. This is in the section 1.8 Spatial Relationships and Filtering, in particular Figure 1-6 Topological Relationships.

I recently had to work on matching two road centreline databases and so generated an equivalent set of examples for two linestrings.

LineString Topological Relationships

The relationships were generated by the following SQL Select statement. The results were visualised in SQL Developer using GeoRaptor.

with base as (
select sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0,0,2,2)) as geom from dual
), data as (
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(-1,-1,0,0)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(-1,-1,1,1)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(-1,-1,2,2)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(-1,-1,3,3)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0,0,2,2)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0.5,0.5,1.5,1.5)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(1,1,2,2)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0,0,3,3)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(1,1,3,3)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(2,2,3,3)) as geom from dual union all
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0.5,2,1,1,2,2)) as geom from dual union all 
select  sdo_geometry(2002,null,null,sdo_elem_info_array(1,2,1),sdo_ordinate_array(0.5,2,1,1,1.5,1.5,2,1)) from dual 
)
select 'Black ' || sdo_geom.relate(b.geom,'DETERMINE',d.geom,0.05) || ' Gray' as relationship, 
       sdo_geom.sdo_union(d.geom,sdo_util.PolygonToLine(sdo_geom.sdo_buffer(b.geom,0.1,0.0005)),0.0005) as image
  from base b, 
       data d
Order by relationship

The results grouped by relationship and including visualisation images, are:

RELATIONSHIPIMAGE
Black CONTAINS Gray
Black COVEREDBY Gray
Black COVERS Gray
Black EQUAL Gray
Black INSIDE Gray
Black OVERLAPBDYDISJOINT Gray
Black OVERLAPBDYINTERSECT Gray
Black TOUCH Gray