PHP для получения типов географии PostGIS

У меня есть база данных 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

person elshae    schedule 31.01.2011    source источник
comment
Как вы можете рассчитывать на помощь с вашим PHP-кодом, если вы его не публикуете?   -  person Dutchie432    schedule 01.02.2011
comment
На самом деле я, кажется, поскользнулся на этом, публикуя сейчас. Спасибо, что указали на это! :)   -  person elshae    schedule 01.02.2011
comment
Вы пробовали geog::geography?   -  person DrColossos    schedule 01.02.2011
comment
Если вы имеете в виду: SELECT geog::geography FROM locations; Тогда да, я только что сделал и все равно получил 6 :(   -  person elshae    schedule 01.02.2011


Ответы (1)


Вам нужен именно wkb-формат?

select ST_AsWKB('geog') from locations

Но почему вы хотите сначала извлечь данные для расчета расстояния?

/ Никлас

Обновить

Ok

Я не знаю, почему вы не получаете должного результата по своим запросам. Я плохо разбираюсь в 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;

и так далее.

Это будет намного эффективнее.

/ Никлас

person Nicklas Avén    schedule 01.02.2011
comment
чего ты добиваешься. ничего из того, что вы получаете, не кажется неожиданным. - person Nicklas Avén; 01.02.2011
comment
Извините за последний комментарий, это то, что я действительно собирался опубликовать .. Я просто попробовал оба: SELECT ST_AsBinary(geog) FROM locations; и SELECT ST_AsText(geog) FROM locations; - person elshae; 01.02.2011
comment
У меня все еще та же проблема, я получаю неправильный результат. Я тоже пробовал ST_AsWKB, но похоже, что в PostGIS этого нет, и ST_Binary был бы эквивалентен. - person elshae; 01.02.2011
comment
Думаю, я хочу получить объект Geography, чтобы затем ввести его в функцию ST_Distance. Проблема в том, что я использую PHP для связи с базой данных, а PHP не сохраняет результат географии в формате, понятном функции ST_Distance. Я сначала извлекаю данные, прежде чем выполнять расчет, потому что мне нужно получить два результата по географии из таблицы на основе их идентификатора ... - person elshae; 01.02.2011
comment
Большое спасибо! Я буду использовать это: 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; Я очень благодарен за вашу любезную помощь :) - person elshae; 01.02.2011