PHP для получения типов географии PostGIS - PullRequest
1 голос
/ 01 февраля 2011

У меня есть база данных PostGIS со столбцом географии.Я хотел бы иметь возможность использовать PHP для выбора географии, чтобы затем я мог выполнить другой запрос, используя ST_Distance, чтобы получить расстояние между точками.Однако, когда я запускаю

SELECT geog from locations;

, я получаю странное значение 6 вместо вывода HEX (что-то вроде 0101000020E6100000C442AD69DEAD5740575BB1BFEC6E3D40 - это то, что я ожидаю).Когда я использую тот же запрос в phpPgAdmin, я получаю ожидаемый результат, но не из своего скрипта PHP: (

Я бы очень признателен за любую помощь:)

Спасибо,

elshae

EDIT

$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

1 Ответ

3 голосов
/ 01 февраля 2011

Это нужный вам 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;

и т. Д.

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

/ Никлас

...