我正在使用ST_Intersects()
来了解两个几何是否相交。
这是我的代码:
$var_name = pg_query($conn,"SELECT ST_Intersects(p1.column_name,
p2.column_name)
FROM table_name AS p1, table_name AS p2
WHERE p1.id < p2.id");
if(pg_fetch_assoc($var_name) == 'false')
{
echo "accepted";
}
else
{
echo "rejected";
}
我知道几何不相交,当我在Postgres中运行相同的查询时,结果是false
正如预期的那样。
但是这里正在执行else
语句。我哪里错了?
答案 0 :(得分:1)
Erwin的建议(一如既往)很好,但在您的特定情况下,我认为问题出在您的测试中。
if(pg_fetch_assoc($var_name) == 'false')
pg_fetch_assoc
返回一个与单个字符串进行比较的关联数组。比较混合类型在php中是一个复杂的过程,但在这种情况下,它知道字符串不是数组,所以它们不相等。
您可能需要以下内容:
$row = pg_fetch_assoc($var_name)
if ($row['ST_Intersects'] == false)
不要猜测,做print_r($row)
之类的事情来确认你有你认为的列名和值。
答案 1 :(得分:0)
每次调用它时,相同的查询都会返回不同的结果,因为它不具有确定性。任何数量的行都可以在每个表中限定,从而生成结果的笛卡尔积。由于查询中没有明确的ORDER BY
,因此将首先返回任意行。
添加ORDER BY
(加LIMIT 1
)个或更多WHERE
条件以返回单行(确定性地)。
替代查询:
SELECT EXISTS (
SELECT 1
FROM table_name p1
JOIN table_name p2 ON p1.id < p2.id
WHERE ST_Intersects(p1.column_name, p2.column_name)
);
这将返回1行true
或false
(从不null
,从不返回0或多行)。如果至少有一个组合相交,则为true
。
但是也可以在Richard's answer中查看测试的PHP部分。