Вроде как osm2pgsql умеет загружать данные сохраняя атрибуты в hstore колонку (если что осмозис точно умеет но он тормоз).
С такой бд уже можно “нарезать” слоев с любыми данными какие хочется.
Александр, если Вам не тяжело, чирканите мне на мыло, оно у меня подсвечено. У меня есть небольшой вопрос по osm2pgsql, который на форуме задавать не хочется.
Пытаюсь загрузить данные в БД. Выкидывает непонятную для меня ошибку:
defond@defond-1201T:~$ sudo osm2pgsql -U defond -d RU-KDA.osm.bz2
[sudo] password for defond:
osm2pgsql SVN version 0.80.0 (64bit id space)
Usage error. For further information see:
osm2pgsql -h|--help
defond@defond-1201T:~$ sudo osm2pgsql -U defond -d ./home/defond/Загрузки/RU-KDA.osm.bz2
osm2pgsql SVN version 0.80.0 (64bit id space)
Usage error. For further information see:
osm2pgsql -h|--help
defond@defond-1201T:~$ sudo osm2pgsql -U defond -d '/home/defond/Загрузки/RU-KDA.osm.bz2'
osm2pgsql SVN version 0.80.0 (64bit id space)
Usage error. For further information see:
osm2pgsql -h|--help
defond@defond-1201T:~$
defond@defond-1201T:~$ sudo osm2pgsql -U defond -d '/home/defond/Загрузки/RU-KDA.osm.bz2'
osm2pgsql SVN version 0.80.0 (64bit id space)
Usage error. For further information see:
osm2pgsql -h|--help
defond@defond-1201T:~$ sudo su - postgres
postgres@defond-1201T:~$ psql
psql (9.3.3)
Введите "help", чтобы получить справку.
postgres=# create user defond login;
ОШИБКА: роль "defond" уже существует
postgres=# create database defond owner defond;
ОШИБКА: база данных "defond" уже существует
postgres=# \c defond
Вы подключены к базе данных "defond" как пользователь "postgres".
defond=#
Тут уже зависит от настройки постгреса. Я вижу используется метод Peer - это значит имя пользователя
постгреса должно совпадать с системным (попробуйте без sudo)
или настроить чтобы был md5 (pg_hba.conf)
local defond defond md5
# TYPE DATABASE USER ADDRESS METHOD
@remove-line-for-nolocal@# "local" is for Unix domain socket connections only
@remove-line-for-nolocal@local all all @authmethodlocal@
# IPv4 local connections:
host all all 127.0.0.1/32 @authmethodhost@
# IPv6 local connections:
host all all ::1/128 @authmethodhost@
# Allow replication connections from localhost, by a user with the
# replication privilege.
@remove-line-for-nolocal@#local replication @default_username@ @authmethodlocal@
#host replication @default_username@ 127.0.0.1/32 @authmethodhost@
#host replication @default_username@ ::1/128 @authmethodhost@
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
#local all postgres peer
local all defond trust
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 md5
#host replication postgres ::1/128 md5
Так подключается. Неправильно конечно, но для тестов пойдет, наверное.
Reading in file: /home/defond/Загрузки/RU-KDA.osm.bz2
Processing: Node(7242k 39.6k/s) Way(1036k 6.69k/s) Relation(20829 473.39/s) parse time: 382s
Node stats: total(7242174), max(2709816665) in 183s
Way stats: total(1036551), max(265312658) in 155s
Relation stats: total(20829), max(3565275) in 44s
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Writing way (1036k)
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Writing relation (20827)
node cache: stored: 7242174(100.00%), storage efficiency: 7.20% (dense blocks: 98266, sparse nodes: 0), hit rate: -314827792988556364415920065772644327655763563221306441589669245303251058456859376547800634110346725413175378590393701880668591052769971067490926204871441598399687703508224312681756171480332708610048.00%
Sorting data and creating indexes for planet_osm_roads
Sorting data and creating indexes for planet_osm_polygon
Sorting data and creating indexes for planet_osm_line
Sorting data and creating indexes for planet_osm_point
Analyzing planet_osm_roads finished
Analyzing planet_osm_point finished
Analyzing planet_osm_polygon finished
Analyzing planet_osm_line finished
Copying planet_osm_roads to cluster by geometry finished
Copying planet_osm_point to cluster by geometry finished
Creating indexes on planet_osm_roads finished
All indexes on planet_osm_roads created in 20s
Completed planet_osm_roads
Creating indexes on planet_osm_point finished
All indexes on planet_osm_point created in 26s
Completed planet_osm_point
Copying planet_osm_polygon to cluster by geometry finished
Creating indexes on planet_osm_polygon finished
All indexes on planet_osm_polygon created in 58s
Completed planet_osm_polygon
Copying planet_osm_line to cluster by geometry finished
Creating indexes on planet_osm_line finished
All indexes on planet_osm_line created in 78s
Completed planet_osm_line
Osm2pgsql took 566s overall
defond@defond-1201T:~$
Вроде что-то сформировалось и таблицы создал. Попробую посмотреть, что в них… Если не получится - снесу БД defond и сделаю с учетом Ваших команд.
Теперь, вопрос напрямую к теме - мне нужно сформировать команду, которая вызовет наименования всех аэродромов для данного региона (у меня этот регион Краснодарский край).
Я формирую запрос:
SELECT 'point' AS type,ST_X(way) AS lon,ST_Y(way) AS lat,aeroway,name FROM planet_osm_point
WHERE aeroway IN ('airport','aerodrome')
UNION
SELECT 'polygon' AS type,ST_X(ST_Centroid(way)) AS lon,ST_Y(ST_Centroid(way)) AS lat,aeroway,name FROM planet_osm_polygon
WHERE aeroway IN ('airport','aerodrome') LIMIT 3;
При этом, названий аэродромов нет. Т.е. у меня их нет в таблице, или я неправильно запрос сформировал? Или неправильно сформировались таблицы при импорте данных?