Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

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
share|improve this question
    
Where Mike Toewsless's answer?? The gis.stackexchange deleted it when I post the mine? –  Peter Krauss May 25 '12 at 4:03
    
Sorry, I deleted it to think about it bit more .. I'll add new one in a bit. –  Mike T May 25 '12 at 4:11

1 Answer 1

up vote 3 down vote accepted

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)
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.