我有一个带有地理栏的PostGIS数据库。我希望能够使用PHP来选择地理位置,然后我可以使用ST_Distance运行另一个查询以获得点之间的距离。但是,当我跑
时SELECT geog from locations;
我得到一个奇怪的值6而不是HEX输出(类似于0101000020E6100000C442AD69DEAD5740575BB1BFEC6E3D40就是我所期待的)。当我在phpPgAdmin中使用相同的查询时,我得到了预期的输出,但不是来自我的PHP脚本:(
我真的很感激任何帮助:)
谢谢,
elshae
修改
$locations_result = @pg_query($DBConnect, "SELECT geog from locations;");
if (!$locations_result) {
echo "An error occurred upon getting data from the locations table.\n";
exit;
}
$i = 0;
while ($locations_arr = pg_fetch_row($locations_result)) {
$locations['location'][$i] = $locations_arr[0];
echo $locations['location'][$i];
$i++;
}
EDIT2 所以现在我试图在ST_Distance函数中选择地理位置,以便它可以直接得到地理结果,如:
SELECT ST_Distance(geog_a, geog_b) FROM(SELECT geog AS geog_a FROM location WHERE id=123 UNION SELECT geog AS geog_b FROM location WHERE id=345);
但是我的SQL语法错了,我还没弄明白如何才能得到我想要的结果。 UNION将这些值放在一列中,这就是我已经拥有的。相反,我需要像:
geog_a |geog_b
----------------
hdsklgh|shfksh
答案 0 :(得分:3)
你想要的是wkb格式吗?
select ST_AsWKB('geog') from locations
但是你为什么要首先提取数据来进行距离计算呢?
/尼克拉斯
<强>更新强>
确定
我不知道为什么你的查询没有得到正确的结果。我在PHP中太糟糕了。我猜想由于某种原因导致的结果被推入一些不正确的数据类型。我的意思是从ST_AsText你应该得到一个字符串,没有什么比这更奇怪了。
但为了达到你的距离你不应该拿出分数。你做一个自我加入。这就是您在使用PostGIS并在一个表中比较不同几何时所做的一切。
假设第一个地理位置的id = 1,第二个地理位置的id = 2,则查询可能类似于:
SELECT ST_Distance(a.the_geog, b.the_geog) as dist
from locations a, locations b WHERE a.id=1 and b.id = 2;
如果你想从id = 1的点到所有点(或其他任何点)的距离你可以写:
SELECT ST_Distance(a.the_geog, b.the_geog) as dist
from locations a inner join locations b on a.id != b.id WHERE a.id=1;
等等。
这将更加有效。
/尼克拉斯