首页 > 解决方案 > 如何将此 oracle 空间掩码转换为 st_relate postgis

问题描述

我正在尝试将 oracle 空间查询转换为我的工作的 postgis 查询,但我不明白如何将此 sdo_relate 子句转换为 st_relate close :

Oracle空间代码:

WHERE sdo_relate (a.geometry, 
                  b.GEOMETRY,
                 'mask=contains+inside+covers+coveredby+overlapbdyintersect+equal+overlapbdydisjoint'
                 ) = 'TRUE'

我可以在 st_relate 函数中放置 3 个以上的参数吗?

我试过这个:

WHERE 
    st_contains(a.geometrie, b.geometrie) AND 
    st_contains(a.geometrie, b.geometrie) AND 
    st_covers(a.geometrie, b.geometrie) AND 
    st_coveredby(a.geometrie, b.geometrie) AND 
    st_contains(a.geometrie, b.geometrie) AND 
    st_intersects(a.geometrie, b.geometrie) 
    AND st_disjoint(a.geometrie, b.geometrie) 
    AND st_equals(a.geometrie, b.geometrie) 
    AND a.GID = '142284 '
GROUP BY b.SOUS_TYPE, b.TYPE_PRESCRIPTION, a.geometrie, b.geometrie, b.TRIG_COMM

但它不起作用

标签: sqlpostgresqlpostgisoracle-spatial

解决方案


  • 在您的查询中,您检查st_contains(a.geometrie, b.geometrie)了三遍,这显然没有必要。
  • 您的子句中的某些组合WHERE永远不会起作用。例如,st_disjoint(a.geometrie, b.geometrie) AND st_equals(a.geometrie, b.geometrie)永远不会带来任何结果,因为两个几何不能同时相等AND不相交——也许是薛定谔几何?;-)。
  • 为了避免自相交错误,您可能想用它ST_MakeValid来包装您的几何图形(请参阅评论)。
  • 我建议您重新评估您的用例并只使用您实际需要的功能,而不是简单地将 Oracle Spatial 掩码转换为 PostGIS 函数。正如您在评论中提到的,一个简单的ST_Intersects可能就足够了。
  • 如果您想坚持使用 ST_Relate,请查看这些字符串代码示例并构建您自己的代码。

您可以让ST_Relate计算矩阵为您,以便您可以在WHERE子句中使用它。将它与您知道应该工作的几何图形一起使用,例如

数据样本

CREATE TABLE a (geom geometry(polygon,4326));
CREATE TABLE b (geom geometry(polygon,4326));

INSERT INTO a VALUES ('SRID=4326;POLYGON((-4.5412382957234065 54.216850443917195,-4.506219374824969 54.216850443917195,-4.506219374824969 54.19677082652654,-4.5412382957234065 54.19677082652654,-4.5412382957234065 54.216850443917195))');
INSERT INTO b VALUES ('SRID=4326;POLYGON((-4.5233855125202815 54.20681185515958,-4.484246718574969 54.20681185515958,-4.484246718574969 54.185923774806604,-4.5233855125202815 54.185923774806604,-4.5233855125202815 54.20681185515958))');

在此处输入图像描述

SELECT ST_Relate(a.geom,b.geom) FROM a,b;

 st_relate 
-----------
 212101212

比在 where 子句中使用它:

SELECT count(*) FROM a 
JOIN b ON ST_Relate(a.geom,b.geom,'212101212');

 count 
-------
     1
(1 row)

演示:db<>fiddle


推荐阅读