You are not logged in.
- Topics: Active | Unanswered
Announcement
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***
Pages: 1
#1 2009-11-20 15:23:30
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Преобразование geometry type
Натолкнулся на проблему преобразования из geometry типа
osmosis перегоняет osm файл в postgre, причем преобразовывая долготу и широту в формат geometry
для примера:
select * from nodes where id = 319852474;
id | version | user_id | tstamp | changeset_id | geom
-----------+---------+---------+---------------------+--------------+----------------------------------------------------
319852474 | 1 | 21417 | 2008-12-19 01:27:47 | 468495 | 0101000020E6100000320395F1EF873E402D05A4FD0F204B40
(1 row)
каким образом можно geom значение преобразовать обратно в latitude и longitude ?
Offline
#2 2009-11-20 17:00:28
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
зайдите в таблицу node_tags, будете приятно удивлены - там и широта, и долгота есть в чистом виде. колонка geom - дополнительная, это те же координаты в WKB. Из которого, в принципе, конвертировать-то можно, только в данном случае - не нужно.
Offline
#3 2009-11-20 17:28:51
- old_Bibigon
- Member

- From: Kirov|Vyatka
- Registered: 2009-06-12
- Posts: 26
Re: Преобразование geometry type
http://gis-lab.info/docs/postgis/manual/index.html
'select st_x(geom), st_y(geom) from nodes where id = 319852474;' должно помочь, если действительно они нужны из этой таблицы
Offline
#4 2009-11-24 10:07:19
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
зайдите в таблицу node_tags, будете приятно удивлены - там и широта, и долгота есть в чистом виде. колонка geom - дополнительная, это те же координаты в WKB. Из которого, в принципе, конвертировать-то можно, только в данном случае - не нужно.
\d node_tags
Table "public.node_tags"
Column | Type | Modifiers
---------+--------+-----------
node_id | bigint | not null
k | text | not null
v | text | not null
Indexes:
"idx_node_tags_node_id" btree (node_id)
видимо несколько некорректно замечание - можно только инфу по ключам k и v вытянуть согласно node_id
'select st_x(geom), st_y(geom) from nodes where id = 319852474;' должно помочь, если действительно они нужны из этой таблицы
красавец!!! что еще можно сказать, спасибо - выручили
тему можно, пожалуй, закрывать
(в дополнение)
select st_x(geom), st_y(geom) from nodes where id = 319852474;
st_x | st_y
-----------+-----------
30.531005 | 54.250488
(1 row)
Last edited by Dnica (2009-11-24 10:08:29)
Offline
#5 2009-11-24 11:10:02
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
а вот так попробовать религия не позволяет select node_id, lat, lon from public.node_tags ?
Готов спорить, это будет быстрее, чем конвертить WKB...
Last edited by Ezhick (2009-11-24 11:10:32)
Offline
#6 2009-11-25 10:43:41
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
а вот так попробовать религия не позволяет select node_id, lat, lon from public.node_tags ?
Готов спорить, это будет быстрее, чем конвертить WKB...
выше описал таблицу public.node_tags - она попростуне содержит полей lat & lon
\d node_tags
Table "public.node_tags"
Column | Type | Modifiers
---------+--------+-----------
node_id | bigint | not null
k | text | not null
v | text | not null
Indexes:
"idx_node_tags_node_id" btree (node_id)
еще важен тот аспект, что пользуюсь postgres и может osmosis'ом можно создавать другие таблицы в mysql не знаю и подобных .sql скриптов не видел
Offline
#7 2009-11-25 15:53:40
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
тьфу, сории. запрос такой
select v from public.node_tags where node_id = 1 and k = 'lat'
select v from public.node_tags where node_id = 1 and k = 'lon'
получаем долготу и широту для искомого узла.
Offline
#8 2009-11-26 11:50:27
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
тьфу, сории. запрос такой
select v from public.node_tags where node_id = 1 and k = 'lat'
select v from public.node_tags where node_id = 1 and k = 'lon'получаем долготу и широту для искомого узла.
<node id="1" version="1" timestamp="2007-09-04T05:38:10Z" uid="1" user="knutux" changeset="1" lat="1" lon="1">
<tag k="highway" v="traffic_signals"/>
</node>
увы но в k нет параметров ни lat, ни lon, так что способ с
select v from public.node_tags where node_id = 1 and k = 'lat';
не пройдет
Offline
#9 2009-11-26 18:54:27
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
В OSM ведь несколько иначе, поправьте если я ошибаюсь wrote:<node id="1" version="1" timestamp="2007-09-04T05:38:10Z" uid="1" user="knutux" changeset="1" lat="1" lon="1">
<tag k="highway" v="traffic_signals"/>
</node>
Вы базу и xml только не путайте!
увы но в k нет параметров ни lat, ни lon, так что способ с
Ezhick wrote:select v from public.node_tags where node_id = 1 and k = 'lat';
не пройдет
Вот только честно, вы пробовали? Попробуйте, вам понравится!
Offline
#10 2009-11-27 09:59:20
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
начинаем флейм, потому что запрос базе я скармливал и аналогичные , увы значений ни lat, ни lon нету
пример подобного запроса (большой пример!):
gisdb=# \d node_tags
Table "public.node_tags"
Column | Type | Modifiers
---------+--------+-----------
node_id | bigint | not null
k | text | not null
v | text | not null
Indexes:
"idx_node_tags_node_id" btree (node_id)gisdb=# \d nodes
Table "public.nodes"
Column | Type | Modifiers
--------------+-----------------------------+-----------
id | bigint | not null
version | integer | not null
user_id | integer | not null
tstamp | timestamp without time zone | not null
changeset_id | bigint | not null
geom | geometry |
Indexes:
"pk_nodes" PRIMARY KEY, btree (id)
"idx_nodes_geom" gist (geom)
Check constraints:
"enforce_dims_geom" CHECK (ndims(geom) = 2)
"enforce_geotype_geom" CHECK (geometrytype(geom) = 'POINT'::text OR geom IS NULL)
"enforce_srid_geom" CHECK (srid(geom) = 4326)gisdb=# select * from node_tags where k LIKE 'lon%' or k LIKE 'lat%'; --запрос по шаблону вхождения 'lat' или 'lon'
node_id | k | v
---------+---+---
(0 rows)gisdb=# --но в то же время, запрос по шаблону значения 'name' ключа k будет иметь огромноe количество совпадений:
gisdb=# select count(*) from node_tags where k LIKE 'name%';
count
-------
40375
(1 row)gisdb=# select count(*) from node_tags where k = 'name';
count
-------
34241
(1 row)
как говорится от слов к делу
Offline
#11 2009-11-27 12:14:51
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
Мда...
и кагбы понять, почему у меня запрос
select * from public.node_tags where k = 'lat';
(не LIKE, а именно =, я вообще не понимаю, зачем сравнение использовать, когда у ключа четкое имя) , выдает количество вхождение, равное количеству узлов?
Ну и последний вопрос, если в базе нет lat и lon, ТО ОТКУДА ОСМОСИС ИХ ПОСЧИТАЛ В СТРОКУ geom? Так, ради интереса, посмотрите на запросы к базе, которые осмосис делает, он ВСЕ geometry рассчитывает силами Постгиса из данных, которые уже есть в базе!!!
Offline
#12 2009-11-30 08:13:08
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
(поясню, что сравнение использовал на тот случай, если в базе вдруг окажется не lat и lon поля, а latitude и longitude)
интересно почему ... может дело в используемом API или даже postgis tasks, ведь в своей базе использую лишь pgsql_simple_schema_0.6.sql
на оффсайте: http://wiki.openstreetmap.org/wiki/Osmo … tGIS_Tasks
Offline
#13 2009-11-30 08:18:39
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
Не может такого быть. Эти данные от схемы не зависят, это аттрибуты каждой точки и они у вас есть, иначе у вас не было бы колонки геометрия. Осмосис не считает геометрию сам ,он это делает силами постгиса из данных, имеющихся В БАЗЕ. Так что еще раз запустить приведенный выше запрос и убедитесь, что эти данные у вас ЕСТЬ!
Offline
#14 2009-11-30 08:55:14
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
мне в общем не сложно написать это еще раз :
select * from public.node_tags where k = 'lat';
node_id | k | v
---------+---+---
(0 rows)
Offline
#15 2009-11-30 09:01:10
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
я в шоке... Ну откуда тогда колонка geom посчиталась?
Offline
#16 2009-11-30 09:24:30
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
geom для скорости и удобства - в ней и содержатся ведь координаты - функции st_x(geom) st_y(geom) и помогают вытянуть lat и lon
думаю можно считать итогом этой ветки
Offline
#17 2009-11-30 10:01:01
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
Блин... geom не могла правильно посчитаться, если нет в node_tags lat и lon. Потому что она из них считается. Если их там нет - geom неверная! (То есть вообще должна быть пустая). Если у вас нет части данных - значит у вас неверно прошел импорт (хотя ума не приложу как так могло получиться!) Значит у вас может нехватать еще каких-то данных!!! То есть база НЕ ВАЛИДНАЯ!!!
Offline
#18 2009-11-30 10:51:50
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
подтверждаю валидность базы, следующими фактами
из базы выдрал первое попавшееся значение нода:
gisdb=# select id, version, user_id, tstamp, changeset_id, geom from nodes where id = '243055735';
id | version | user_id | tstamp | changeset_id | geom
-----------+---------+---------+---------------------+--------------+----------------------------------------------------
243055735 | 8 | 21417 | 2009-02-01 00:22:40 | 858930 | 0101000020E6100000C2DD59BBED723D403FA9F6E978F44B40
(1 row)
gisdb=# select id, version, user_id, tstamp, changeset_id, st_x(geom), st_y(geom) from nodes where id = '243055735';
id | version | user_id | tstamp | changeset_id | st_x | st_y
-----------+---------+---------+---------------------+--------------+----------+----------
243055735 | 8 | 21417 | 2009-02-01 00:22:40 | 858930 | 29.44894 | 55.90994
(1 row)
лезу в osm файл и убеждаюсь:
<node id="243055735" version="8" timestamp="2009-01-31T22:22:40Z" uid="21417" user="/*ЗДЕСЬ ИМЯ ПОЛЬЗОВАТЕЛЯ*/" changeset="858930" lat="55.90994" lon="29.44894"/>
Значения lat и lon идентично значениям st_x(geom) и st_y(geom)
Offline
#19 2009-11-30 11:01:18
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
Подтверждать чем-либо валидность базы, в которой доказано отсутствуют данные, которые там должны быть, нонсенс. Откуда вы знаете, что вместе с данными лат/лон не пропало что-то еще???
Upd. В любом случае, пользоваться базой вам, так что решайте сами. Только огромная просьба - не вносите ОБРАТНО в ОСМ данные, построенные на основе вашей базы, ибо это чревато ошибками!
Last edited by Ezhick (2009-11-30 11:02:33)
Offline
#20 2009-11-30 11:15:38
- Dnica
- Member
- Registered: 2009-11-05
- Posts: 16
Re: Преобразование geometry type
если можно пример приведите вывода своего запроса
select * from public.node_tags where k = 'lat' limit 20; -- к чему стремится так сказать
заливать обратно на сервер не стану, некрасиво и вправду получится если у меня в системе сбой произошел
Offline
#21 2009-11-30 13:50:31
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Offline
#22 2009-11-30 20:43:21
- Ezhick
- Member

- From: Moscow
- Registered: 2008-10-08
- Posts: 2,508
- Website
Re: Преобразование geometry type
482296520;"lat";"-10.6844444"
482296515;"lat";"-10.9388889"
480137192;"lat";"-12.58000000"
480137188;"lat";"-12.58083333"
480137194;"lat";"-12.58166667"
480137183;"lat";"-12.61416667"
480137197;"lat";"-12.63166667"
480137200;"lat";"-12.65166667"
480137205;"lat";"-12.66166667"
480137210;"lat";"-12.71916667"
480137213;"lat";"-12.73083333"
480137215;"lat";"-12.74833333"
480137254;"lat";"-12.86750000"
480137250;"lat";"-12.87666667"
480137219;"lat";"-12.88000000"
480137247;"lat";"-12.89916667"
480137244;"lat";"-12.93500000"
480137238;"lat";"-12.94250000"
480137241;"lat";"-12.94666667"
480137223;"lat";"-12.96750000"
Offline
Pages: 1