【问题标题】:PHP To Retrieve PostGIS Geography TypesPHP 检索 PostGIS 地理类型
【发布时间】:2023-03-29 14:15:02
【问题描述】:

我有一个带有地理列的 PostGIS 数据库。我希望能够使用 PHP 来选择地理位置,这样我就可以使用 ST_Distance 运行另一个查询来获取点之间的距离。但是,当我运行

SELECT geog from locations;

我得到了一个奇怪的值 6 而不是 HEX 输出(我所期望的是 0101000020E6100000C442AD69DEAD5740575BB1BFEC6E3D40 之类的东西)。当我在 phpPgAdmin 中使用相同的查询时,我得到了预期的输出,但不是来自我的 PHP 脚本:(

非常感谢任何帮助 :)

谢谢,

艾尔莎

编辑

$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

【问题讨论】:

  • 如果您不发布任何 PHP 代码,您怎么能期望得到帮助?
  • 其实我好像漏了那个,现在发帖。感谢您指出这一点! :)
  • 你试过geog::geography吗?
  • 如果你的意思是:SELECT geog::geography FROM locations; 那么是的,我刚刚做了,仍然得到 6 的输出 :(

标签: php postgresql phpmyadmin postgis


【解决方案1】:

是你想要的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;

等等。

这样会更有效。

/尼克拉斯

【讨论】:

  • 你想得到什么。你得到的一切似乎都出乎意料。
  • 抱歉最后一条评论,这是我真正要发布的内容。我只是尝试了两个:SELECT ST_AsBinary(geog) FROM locations;SELECT ST_AsText(geog) FROM locations;
  • 我仍然遇到同样的问题,我得到了错误的输出。我也尝试过ST_AsWKB,但似乎 PostGIS 没有那个,ST_Binary 是等价的。
  • 我想我想得到的是 Geography 对象,这样我就可以在 ST_Distance 函数中输入它。问题是我正在使用 PHP 与数据库对话,而 PHP 并没有将地理结果保持为 ST_Distance 函数可以理解的格式。我在进行计算之前先提取数据,因为我需要根据他们的 ID 从表中获取两个地理结果...
  • 非常感谢!我将使用这个:SELECT ST_Distance(a.the_geog, b.the_geog) as dist from locations a, locations b WHERE a.id=1 and b.id = 2; 与我最终想出的怪物相比:p SELECT ST_Distance(geog_a,geog_b) FROM(SELECT geog as geog_a FROM locations where id=3825) as pl, (SELECT geog as geog_b FROM locations where id=1488) as gl; 我真的很感谢你的帮助:)
猜你喜欢
  • 2011-09-20
  • 2011-10-23
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2023-04-11
  • 2015-06-23
  • 2018-08-27
  • 2011-02-01
相关资源
最近更新 更多