PostGis вопросы по запросам к БД

Может подскажет кто. Почему osm2pgsql может не загрузить точку из данных? Смотрю загрузку osmosis-ом точка есть, osm2pgsql - нет. Соответственно и дорога поличилась обрезана. например node - 2246232221, way - 215216040

64-битные ID в некоторых сборках по умолчанию выключены, особенно если под Windows :frowning:

Кто-нибудь знает рабочую сборку, кроме моей экспериментальной из предыдущего поста?

А там случаем не составная дорога? один и тот же osm_id могут иметь несколько рядов в таблицах

Да нет, обычная дорога. В JOSM немного её обновил, теперь нормально. а было так:

поторопился с нормально :slight_smile:

vs

Запрос
select osm_id from (нужная таблица) where osm_id>2150000000
что-нибудь выдает? Если нет, то проблема с 64бит ID.

Выдает. Смущает вот это:

select * from planet_osm_ways where id = 215288977;
    id     |                                                           nodes                                                            |                         tags                          | pending 
-----------+----------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------+---------
 215288977 | {2246913140,2379011215,2246913145,2246232221,2246232218,2246913148,2246913147,2246232215,2246232213,2687582891,2246232210} | {surface,unpaved,name,"Дачная улица",highway,service} | f

и

gis=# select * from planet_osm_ways where id = 215216043;
    id     |                                   nodes                                   |                            tags                             | pending 
-----------+---------------------------------------------------------------------------+-------------------------------------------------------------+---------
 215216043 | {-2048735089,-1915956082,-2048054156,-2048735096,-2048735093,-2048735092} | {surface,paved,name,"Просторная улица",highway,residential} | f

Вот эти точки с минусом они есть и в planet_osm_nodes хотя вроде должны быть другие цифирки. Это так и должно быть?

система Debian Wheezy amd64, версия osm2pgsql: 0.80.0+r27899-4

А в .osm-файле отрицательные ID есть?

Если да:
В OSM-файле, сохраненном в JOSM, минусы означают новые объекты, сервер присвоит им ID при аплоаде. Не факт, что osm2pgsql их полностью поддерживает.

Если нет (более вероятно):
IDшники -2048735089,-1915956082,-2048054156,-2048735096,-2048735093,-2048735092
очень похожи на проблему 64 бит (было чуть больше +2148…) , но она какая-то частичная (другие ID-то в порядке). Возможен баг в osm2pgsql или в сочетании с какими-то другими библиотеками системы (если что-то из libxml2 / protobuf / protobuf-c запортило большие ID) :slight_smile:

Нужно мнение эксперта. Ну и хорошо бы мелкий OSM-файл с проблемными данными для проверки.

Он начинает с -1, -2 …, врятли он создал 2ккк объектов прежде чем решил сохраниться.

Да ктож его теперь знает. Это был local.pbf с gis-lab

похоже на то. точек с отрицательным id 42697905 из 199222491. Попробую воспроизвести загрузку.

Кстати, можно попробовать считать не только из pbf, но и из раскодированного osm (вдруг проблема в pbf-читалке или цепочке protobuf/protobuf-c).

Здравствуйте.

Спасибо за советы в этой ветке - на Линуксе все работает здорово. Но, теперь возникли проблемы с Виндой.

По инструкции сделал БД на Линуксе (кодировка UTF-8, сопоставление UTF-8, символы - UTF-8). Соответственно в запросе Ru_ru.UTF-8.

Теперь мне нужно сделать аналогичную БД на Виндовс 7 (х86 Начальная). Я пошел простым путем - экспорт (линукс) импорт (Виндовс).

На Винде, создаю новую БД, тут первая проблема - локали Russian_russian.utf нет, следовательно метод сопоставления и символов - Russian_russian.1251.

При этом, при запросах в sql терминале pgAdmin - кириллица в данных есть. Все ок и отлично.

Но, ПО на котором я работаю, работает исключительно в UTF и с БД работает через ODBC драйвер. В результате, вместо кириллицы у меня идут кракозяблы.

Судя по тому, что при запросах в pgAgent данные в кириллице читаются и сохраняются, а в ПО они получаются в виде кракозяблов, предполагаю данную проблему можно как то поправить запросами… Но возможно ошибаюсь.

Можно ли как то запросы по аэродромам модифицировать так, чтобы данные кодировались в UTF-8?

Вам нужен UTF-8 на базе, если не хотите вносить изменения в клиентское ПО.

Как делался этот шаг? Бякапьте всю базу целиком и восстанавливайте на Винде. pg_dumpall, pgsql в помощь. На вывод pg_dumpall советую натравить потоковый архиватор (gzip). Ну, либо из pgAdmin.

Похоже, не тот теплейт для базы выбрали. Да и не нужно вам создавать новую базу, если перенос осуществите по описанному выше алгоритму. База сама создасться при восстановлении из бякапа.

Все делал через pgAgent. Делал бэкап и восстановление. Везде кодировка БД указана как UTF-8.

Восстановление происходит нормально, т.к. при sql запросах в pgAgent - все работает нормально. Кириллица отображается нормально.

Проблемы возникают в Клиентском ПО, которое работает через ODBC. Точно такой же запрос, как и в pgAgente возвращает кириллицу в виде иероглифов. При этом Клиентское ПО работает строго в UTF-8.

Я хочу попробовать убедиться, что проблема кодировки возникает в Клиентском ПО. Поэтому и спрашиваю - есть вариант во время sql запроса, сразу конвертировать ответ в UTF?

Попробую сейчас сделать бэкап без предварительного создания новой БД.

Отпишусь о результате.

convert_to(‘some text’, ‘UTF8’). Но это потребует изменений клиентского ПО, ибо придется изменять SQL запросы. Поэтому, вам нужно, что бы все данные в базе имели кодировку UTF-8.
Можете изменить и текущую кодировку базы, выполнив запрос

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'you_database_name'

Если табличные данные остались в UTF-8, то прокатит

Спасибо! Все работает. И конвертация налету в запросе тоже.


Вопрос по запросам - мне нужно отрисовать векторную карту. При этом ПО рисует вначале те объекты, запрос которых идет раньше. Т.е. к примеру, если первым запросом я выбираю дороги, а вторым реки, то реки будут нарисованы поверх дорог.

Если у меня БД собрана из ОСМ данных, из скаченного шейп файла, то каким образом мне лучше формировать запросы? Вначале границы региона, затем полигоны растительности, затем водные объекты, дороги, пои?

Может у кого-то есть ссылки на примеры.

Принцип, которым Мапник рисует карты я тоже просматриваю в данный момент.

Я тут вроде бы собрал последний osm2pgsql под Windows (64 bit), Visual Studio 2013 Express:
https://dl.dropboxusercontent.com/u/63393258/osm2pgsql.zip

Говорят, оно быстрее старой версии ворочается. Кто-нибудь может проверить правильность и скорость работы?
(см. также https://github.com/openstreetmap/osm2pgsql/issues/17 )

Новая версия osm2pgsql под Windows:
https://dl.dropboxusercontent.com/u/63393258/osm2pgsql.zip

Инструментарий для сборки со всеми скриптами
https://dl.dropboxusercontent.com/u/63393258/osm2pgsql_builder.zip
(нужны PostgreSql, git, svn и Visual Studio 2013 [express], правим settings.bat под свои пути и запускаем build_all.bat).