6

Spatial databases, such as PostGIS, implement the DE-9IM model with function st_relate(), which returns a string with domain of {0,1,2,F}, meaning 0=point, 1=line, 2=area, and F="empty set"...
See DE-9IM at Wikipedia.

The DE-9IM codes are not understandable for programmers and mortal users, but each code have the semantic of a list of predicates, then, it can be translated into a human-redable list of predicates.

Example: when st_relate(a,b)='FF1F0F1F2' or st_relate(a,b)='FF10F0102' or st_relate(a,b)='FF1F0F1F2' the DE-9IM code can be understood as "Intersects & Touches" or "Intersects & Touches with a point".

Is there a standard function or library that implements this translation, from a DE-9IM code to a human-readable string?


REPORT EXAMPLES: instead Report-1 I need Report-2.

Report-1 (have a standard string, but not human readable)

 0F1F00102 |       2 | group 1
 0F1FF0102 |     616 | 
      total      618

 1FF00F102 |       1 | group 2
 1FF0FF102 |       1 | 
      total        2

 1FFF0FFF2 |      23 | group 3
      total        23

 F01FF0102 |      31 | group 4
 F01FFF102 |       1 | 
 FF10F0102 |      42 | 
 FF1F00102 |   19673 | 
 FF1F0F1F2 |      25 | 
     total     19772

Report-2 (human readable... There are a SQL function to do this?)

  618 | point-Intersects & point-Crosses & line-Overlaps
    2 | point-Intersects & line-Crosses & line-Within & point-CoveredBy
   23 | line-Equals
19772 | point-Intersects & point-Touches
PolyGeo
  • 65,136
  • 29
  • 109
  • 338
Peter Krauss
  • 2,292
  • 23
  • 43

1 Answers1

4

I am using ST_relate_summary function, acting as the requested ST_Relate_readable(), that I posted into code.google as simple a SQL/PostGIS code. It is not from a standard library, neither a systematically tested or optimized one.

Thanks to Mike about JTS Topology Suite: JTS offers a (very good!) graphical interface, reporting spatial predicates... I need "string reports", listing predicates (operators) names only, all into SQL.

The ST_relate_summary function and the reports below illustrates an answer, but it is not based on a standard or homogated library, as requested by the question...
Well, if there are another oldest or standardized function, please answer or comment here...

EXAMPLES

REPORT-1: (illustrating usual report) Shows standard string codes (DE-9IM) but they are not human-readable.

SELECT count(*) as n, rel
FROM (
  SELECT  ST_Relate(r1.the_geom, r2.the_geom) AS rel
  FROM mylayer r1, mylayer r2
  WHERE r1.gid>r2.gid AND r1.the_geom && r2.the_geom
) AS t
GROUP BY rel;

Result:

   n   |    rel    
 ------+-----------
     2 | 0F1F00102
 10669 | FF1FF0102
   616 | 0F1FF0102
    25 | FF1F0F1F2
     1 | 1FF0FF102
     1 | 1FF00F102
     1 | F01FFF102
 19673 | FF1F00102
    42 | FF10F0102
     1 | FF1FF01F2
    23 | 1FFF0FFF2
     1 | FF1FFF102
    31 | F01FF0102
(13 records)

REPORT-2: Shows non-standard but human-readable summary.

SELECT count(*) as n, rel
FROM (
  SELECT  ST_Relate_summary(ST_Relate(r1.the_geom, r2.the_geom)) AS rel
  FROM mylayer r1, mylayer r2
  WHERE r1.gid>r2.gid AND r1.the_geom && r2.the_geom 
) AS t
GROUP BY rel;

Result:

   n   |                                 rel                                                       
 ------+-------------------------------------------------------------
 10671 | Disjoint.
 19772 | Intersects-point & Touches-point.
   618 | Intersects-point & Crosses-line & Overlaps-line.
     2 | Intersects-line & Crosses-line & Within-line & CoveredBy-line.
    23 | Equals-line.

Same report, removing sufixes and abbreviating predicate names (changing ST_Relate_summary parameters)... Not so readable, not standard, but a compact summary:

   n   |     rel                                                       
 ------+------------------
 10671 | dsj
 19772 | int tch
   618 | int crs ovr
     2 | int crs wth cvb
    23 | eql

REPORT-3: Explains and groups the standard codes.

SELECT count(*) as n, rel
FROM (
  SELECT  lib.st_relate_summary( ST_Relate(r1.the_geom,r2.the_geom) , 'las') AS rel
  FROM mylayer r1, mylayer r2
  WHERE r1.gid>r2.gid AND r1.the_geom && r2.the_geom 
) AS t
GROUP BY rel
ORDER BY rel;

Result:

   n   |               rel               
 ------+---------------------------------
 10669 | dsj - FF1FF0102
     1 | dsj - FF1FF01F2
     1 | dsj - FF1FFF102
    23 | eql1 - 1FFF0FFF2
     2 | int0 crs1 ovr1 - 0F1F00102
   616 | int0 crs1 ovr1 - 0F1FF0102
    31 | int0 tch0 - F01FF0102
     1 | int0 tch0 - F01FFF102
    42 | int0 tch0 - FF10F0102
 19673 | int0 tch0 - FF1F00102
    25 | int0 tch0 - FF1F0F1F2
     1 | int1 crs1 wth1 cvb1 - 1FF00F102
     1 | int1 crs1 wth1 cvb1 - 1FF0FF102
 (13 records)
Peter Krauss
  • 2,292
  • 23
  • 43