You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
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.***

#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

Ezhick wrote:

зайдите в таблицу 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


old_Bibigon wrote:

'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

Ezhick wrote:

а вот так попробовать религия не позволяет select node_id, lat, lon from public.node_tags ?

Готов спорить, это будет быстрее, чем конвертить WKB...

выше описал таблицу public.node_tags - она попростуне содержит полей lat & lon

Dnica что ли wink wrote:

\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

Ezhick wrote:

тьфу, сории. запрос такой

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'

получаем долготу и широту для искомого узла.

В 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>

увы но в k нет параметров ни lat, ни lon, так что способ с

Ezhick wrote:

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

Dnica wrote:
В 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 только не путайте!

Dnica wrote:

увы но в 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 нету
пример подобного запроса (большой пример!):

For Example wrote:

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

Re: Преобразование geometry type

вечером выложу.

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

Board footer

Powered by FluxBB