PostGes и GoogleMapAPI

Pavel6

Новичок
PostGis и GoogleMapAPI

Можно ли разместить координаты из базы POSTGRES(PostGes) на карте GoogleMapAPI, если сами координаты выглядят вот так 01040000000100000001010000002A3A92CBA8C81341AC1C5A90E4555541
Можно их как то распознать
 

Wicked

Новичок
1) что такое postges? Смотрел в гугле: судя по всему опечатка от "postgres" или "postgis". Дык?
2) в GoogleMapAPI используются широта и долгота, так что нужно стремиться к этому.
 

Pavel6

Новичок
Автор оригинала: Wicked
1) что такое postges?
2) в GoogleMapAPI используются широта и долгота, так что нужно стремиться к этому.
сори, опечатка postgis
postgis использует база Postgres и данные у меня хранятся в Postgres мне их надо отобразить GoogleMapAPI
 

Wicked

Новичок
Я попробовал распаковать эту строку в соответствии с описанием стандарта WKB. Пришел к выводу, что это объект типа WKBMultiPoint (code=4), который содержит один объект типа WKBPoint (code = 1), у которого, в свою очередь, получаются какие-то невообразимые координаты x, y, которые портят всю картину :) Вероятно, это из-за неправильного little/big endian byte order.

Получился такой код:
PHP:
  $wkb = "01040000000100000001010000002A3A92CBA8C81341AC1C5A90E4555541";
  $wkb = pack("H*", $wkb);
  $geometry = unpack("corder/Ltype/Lnumber/corder2/Ltype2/dx/dy", $wkb);
  print_r($geometry);
который на выходе дает
Код:
Array
(
    [order] => 1
    [type] => 4
    [number] => 1
    [order2] => 1
    [type2] => 1
    [x] => 324138.1988
    [y] => 5592978.2555
)
-~{}~ 03.10.06 16:10:

еще можно почитать http://main.merlin.com.ua/doc/postgis/docs/ch06.html
и воспользоваться функциями типа MPointFromWKB(bytea,[<srid>]), PointN(geometry,integer), AsText(geometry)
 

Pavel6

Новичок
Автор оригинала: Wicked
Я попробовал распаковать эту строку в соответствии с описанием стандарта WKB.
Я перевел с помощью POSTGIS, он встраивается в запрос,

pg_query("SELECT AsText(geo) AS geo FROM table");
вот что на выходе
MULTIPOINT(323638.310982 5590258.699057)
MULTIPOINT(316336.723054 5591157.39613)
MULTIPOINT(324177.374807 5590490.681838)

но эти координаты не отображаются в GoogleMap, говорят что есть алгоритм который переведет эти координаты по GoogleMap,
т.е. (323638.310982 5590258.699057) их надо как то подстроить под GoogleMap
 

YRusinov

Филин Ух
Это надо делать через функции POSTGIS для преобразования проекций в таблице spatial_ref_sys.
 

Wicked

Новичок
но эти координаты не отображаются в GoogleMap
естественно... потому что в google maps совершенно другая система координат - широта и долгота.

Как именно переводить из твоих координат в широту-долготу - не знаю.

Когда мне приходилось делать конверсию координат из растровых x, y (0..9000, 0..6000), пришлось строить триангуляцию Делоне, и задавать на ней кусочно-аффинное преобразование. Это был подходящий способ в моем случае. В твоем же случае вероятно есть способ НАМНОГО проще (см. пост YRusinova), о котором я могу даже не догадываться, т.к. опыта работы с PostGis у меня ровно 0.
 

YRusinov

Филин Ух
Надо преобразовать твои координаты с помощью функции POSTGIS transform в любую проекцию, для которой поле proj4text в таблице spatial_ref_sys содержит нечто подобное этому

+proj=longlat

А потом вычленять по точкам.
 

Pavel6

Новичок
Автор оригинала: YRusinov
Надо преобразовать твои координаты с помощью функции POSTGIS transform в любую проекцию, для которой поле proj4text в таблице spatial_ref_sys содержит нечто подобное этому

+proj=longlat

А потом вычленять по точкам.
А можно гдето почитать за proj в php
 

YRusinov

Филин Ух
Скорее всего нет.

Вот твой алгоритм: сначала делаешь SELECT srid FROM spatial_ref_sys WHERE proj4text ilike '%+proj=longlat%'; Потом select astext (transform (POINT (x, y), <твой srid>)); и получаешь точку в координатах long/lat.
 

Pavel6

Новичок
Автор оригинала: YRusinov
Скорее всего нет.

Вот твой алгоритм: сначала делаешь SELECT srid FROM spatial_ref_sys WHERE proj4text ilike '%+proj=longlat%'; Потом select astext (transform (POINT (x, y), <твой srid>)); и получаешь точку в координатах long/lat.
Спасибо за помощь, но ничего невыходит
PHP:
$r = pg_query($dbconn,"SELECT srid FROM spatial_ref_sys WHERE proj4text ilike '%+proj=longlat%'");
while($num = pg_fetch_array($r)){
 $c = pg_query("select astext (transform (POINT (x, y), $num[srid]  ))");
}
Я наверно непонял, можите мне примерно так написать, координаты хранятся в тбл. obj_exp в поле geo
 

YRusinov

Филин Ух
смотрим документацию к функции transform http://postgis.refractions.net/docs/ch06.html,
должен быть примерно следующий код.
while (...)
{
...
$coords = pg_query ($dbconn, "SELECT geo FROM ojb_exp;");
$coordarr = pg_fetch_array($coords);
$x = $coordarr [0];
$y = $coordarr [1];
$c = pg_query ($dbconn, "SELECT astext(transform (POINT ($x, $y), $num[0]))");
...
}
 

Pavel6

Новичок
Автор оригинала: YRusinov
смотрим документацию к функции transform http://postgis.refractions.net/docs/ch06.html,
должен быть примерно следующий код.
while (...)
{
...
$coords = pg_query ($dbconn, "SELECT geo FROM ojb_exp;");
$coordarr = pg_fetch_array($coords);
$x = $coordarr [0];
$y = $coordarr [1];
$c = pg_query ($dbconn, "SELECT astext(transform (POINT ($x, $y), $num[0]))");
...
}
невыходит, а у тебя примера нету?
 

YRusinov

Филин Ух
И ещё тут такое дело, что не все проекции могут быть преобразованы друг в друга. Что именно не выходит ? Вот пример
SELECT astext (transform (GeomFromText ('POINT (7313763.5000000000000000 6035576.5000000000000000)', 300001), 300006));

в результате дает POINT(5973099.05278491 14061284.0808775), который можно пропарсить на пхп.

-~{}~ 04.10.06 17:40:

SELECT astext (transform (GeomFromText ('POINT (7313763.5000000000000000 6035576.5000000000000000)', 300001), 4024)); -> POINT(36.1295709069521 54.4110818216995), для проекции 300001 координаты в метрах, для проекции 4024 в градусах long/lat, эллипсоид Крассовского.
 

Pavel6

Новичок
Автор оригинала: YRusinov
И ещё тут такое дело, что не все проекции могут быть преобразованы друг в друга. Что именно не выходит ? Вот пример
SELECT astext (transform (GeomFromText ('POINT (7313763.5000000000000000 6035576.5000000000000000)', 300001), 300006));

в результате дает POINT(5973099.05278491 14061284.0808775), который можно пропарсить на пхп.

-~{}~ 04.10.06 17:40:

SELECT astext (transform (GeomFromText ('POINT (7313763.5000000000000000 6035576.5000000000000000)', 300001), 4024)); -> POINT(36.1295709069521 54.4110818216995), для проекции 300001 координаты в метрах, для проекции 4024 в градусах long/lat, эллипсоид Крассовского.
Выдает ошибку Warning: pg_query(): Query failed: ERROR: Cannot find input SRID (300001) in spatial_ref_sys in z:\home\sm\www\index2.php on line 18
 

YRusinov

Филин Ух
300001 -- это один из возможных srid'ов, вот ты привел данные (323638.310982 5590258.699057), они у тебя не просто так с потолка взялись, а были получены в какой-то проекции, так вот ты должен вместо 300001 взять srid этой самой проекции.

-~{}~ 04.10.06 18:01:

т.е. твой запрос должен выглядить так
SELECT astext (transform (GeomFromText ('POINT (323638.310982 5590258.699057)', <твой srid>), 4024));
 
Сверху