У меня есть база данных 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
Это нужный формат 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;
и так далее.
Это будет намного более эффективно.
/ Никлас