sql - 如何将此 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
但它不起作用
解决方案
- 在您的查询中,您检查
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
推荐阅读
- python - Keras 损失仅在纪元结束时变为 nan
- c# - AppSettings 值始终为空网络核心
- reactjs - 从 Firestore 获取数据
- html - 响应式表格显示
- machine-learning - 为什么要使用 CH 和 SIL 寻找 Elbow(或使用 L 方法)来进行集群选择?
- python - 计算整数二进制数的程序 - 需要帮助反转输出字符串
- mysql - 在 SQL 中选择每个带有条件的第 n 行
- node.js - 如何将以下代码转换为异步等待
- javascript - React 组件在 React Bootstrap Navbar 下渲染
- swift - 在 Firebase 数据库中按用户名搜索用户?