RU:User:S-s-s wiki/Creating and maintaining the relevance of the local database OSM
Jump to navigation
Jump to search
Описание шагов по созданию локальной базы данных ОСМ и поддержке её актуальности
Работы с ОС FreeBSD
Настраиваем ядро
options SYSVSHM # совместно используемая память SysV options SHMMAXPGS=65536 options SYSVSEM # семафоры SysV options SEMMNI=40 # максимальное количество наборов семафоров в системе options SEMUME=40 options SEMMNS=240 # макс количество семафоров в системе options SEMMNU=120 # макс количество структур undo в системе options SYSVMSG # межпроцессорное взаимодействие SysV
Настраиваем login.conf:
postgres:\ :lang=en_US.UTF-8:\ :setenv=LC_COLLATE=C:\ :tc=default:
run `cap_mkdb login.conf'
Настраиваем rc.conf
postgresql_enable="YES" postgresql_data="path_to/pgsql/data" postgresql_flags="-w -s -m fast" postgresql_initdb_flags="--encoding=utf-8 --lc-collate=C"
Работы с Postgres
Инициализируем postgres
#postgresql initdb
Настраиваем postgresql.conf
shared_buffers = 128MB checkpoint_segments = 20 maintenance_work_mem = 256MB autovacuum = off
Запускаем postgres
# sudo -u pgsql postgresql start
Создаем пользователя postgres
# sudo -u pgsql createuser usr-local Shall the new role be a superuser? (y/n) n Shall the new role be allowed to create databases? (y/n) n Shall the new role be allowed to create more new roles? (y/n) n
Создаем БД postgres
#sudo -u pgsql createdb -E UTF8 -O usr-local db-local #sudo -u pgsql createlang plpgsql db-local
Настраиваем доступ к postgres в pg_hba.conf.
# "local" is for Unix domain socket connections only local usr-local db-local trust local all all ident sameuser # IPv4 local connections: host all all 127.0.0.1/32 trust host usr-local db-local 192.168.0.0/24 trust host all all 192.168.0.0/24 trust
Создаем структуру БД postgres
#sudo -u pgsql psql db-local < /usr/local/share/postgresql/contrib/hstore.sql #sudo -u pgsql psql db-local < /usr/local/share/postgresql/contrib/_int.sql
Примечание: _int.sql не нужен при использовании osm2pgsql c v0.80
+ расширение postgis-1.5
#sudo -u pgsql psql db-local < /usr/local/share/postgis/contrib/postgis-1.5/postgis.sql #sudo -u pgsql psql db-local < /usr/local/share/postgis/contrib/postgis-1.5/spatial_ref_sys.sql
+ pgsnapshot схема
#sudo -u pgsql psql db-local < /usr/local/share/osmosis/script/pgsnapshot_schema_0.6.sql #sudo -u pgsql psql db-local < /usr/local/share/osmosis/script/pgsnapshot_schema_0.6_action.sql #sudo -u pgsql psql db-local < /usr/local/share/osmosis/script/pgsnapshot_schema_0.6_bbox.sql #sudo -u pgsql psql db-local < /usr/local/share/osmosis/script/pgsnapshot_schema_0.6_linestring.sql
Устанавливаем пользователя таблиц
#echo 'ALTER TABLE geometry_columns OWNER TO usr-local; ALTER TABLE spatial_ref_sys OWNER TO usr-local;'\ | sudo -u pgsql psql db-local
Извлекаем первоначальные данные из api-базы
С помощью osmosis
#osmosis --read-apidb database="db-api" user="usr-api" validateSchemaVersion=no outPipe.0="mypipe"\ --write-xml file="first-dump_api.osm" inPipe.0="mypipe"
С помощью скрипта osmget из набора инструментов osm2mp
#perl osmget.pl long_min,lat_min,long_max,lat_max >> fisrt-dump_api.osm
С помощью wget
#wget -O first-dump_api.osm "http://адрес_api-базы/map?bbox=long_min,lat_min,long_max,lat_max"
Вносим первоначальные данные в локальную базу
#osm2pgsql --style /usr/local/share/osm2pgsql/default.style --create --database db-local\ --username usr-local --prefix planet --slim --cache 2048 --hstore first-dump_api.osm
-------------------------------------- osm2pgsql SVN version 0.70.5 Using projection SRS 900913 (Spherical Mercator) Setting up table: planet_point NOTICE: table "planet_point" does not exist, skipping NOTICE: table "planet_point_tmp" does not exist, skipping Setting up table: planet_line NOTICE: table "planet_line" does not exist, skipping NOTICE: table "planet_line_tmp" does not exist, skipping Setting up table: planet_polygon NOTICE: table "planet_polygon" does not exist, skipping NOTICE: table "planet_polygon_tmp" does not exist, skipping Setting up table: planet_roads NOTICE: table "planet_roads" does not exist, skipping NOTICE: table "planet_roads_tmp" does not exist, skipping Mid: pgsql, scale=100, cache=2048MB, maxblocks=262145*8192 Setting up table: planet_nodes NOTICE: table "planet_nodes" does not exist, skipping NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_nodes_pkey" for table "planet_nodes" Setting up table: planet_ways NOTICE: table "planet_ways" does not exist, skipping NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_ways_pkey" for table "planet_ways" Setting up table: planet_rels NOTICE: table "planet_rels" does not exist, skipping NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_rels_pkey" for table "planet_rels" Reading in file: first-dump_api.osm Processing: Node(48945k) Way(4309k) Relation(70702) parse time: 7624s Node stats: total(48945527), max(1334083869) Way stats: total(4309318), max(118664108) Relation stats: total(70702), max(1634550) Going over pending ways processing way (2732k) Going over pending relations node cache: stored: 47105737(96.24%), storage efficiency: 17.55%, hit rate: 95.42% Committing transaction for planet_roads Sorting data and creating indexes for planet_roads Committing transaction for planet_line Committing transaction for planet_polygon Sorting data and creating indexes for planet_line Sorting data and creating indexes for planet_polygon Committing transaction for planet_point Sorting data and creating indexes for planet_point Stopping table: planet_nodes Stopping table: planet_ways Stopping table: planet_rels Building index on table: planet_ways Building index on table: planet_rels Stopped table: planet_nodes Stopped table: planet_rels Completed planet_roads Completed planet_point Completed planet_line Completed planet_polygon Stopped table: planet_ways ------------------------------------
Просматриваем и проверяем БД
Подключаемся к базе
#psql -U usr-local db-local psql (8.4.8) Type "help" for help.
Вызываем список таблиц
#db-local=> \d List of relations Schema | Name | Type | Owner --------+-------------------+-------+------- public | actions | table | pgsql public | geography_columns | view | pgsql public | geometry_columns | table | usr-local public | node_tags | table | pgsql public | nodes | table | pgsql public | planet_line | table | usr-local public | planet_nodes | table | usr-local public | planet_point | table | usr-local public | planet_polygon | table | usr-local public | planet_rels | table | usr-local public | planet_roads | table | usr-local public | planet_ways | table | usr-local public | relation_members | table | pgsql public | relation_tags | table | pgsql public | relations | table | pgsql public | schema_info | table | pgsql public | spatial_ref_sys | table | usr-local public | users | table | pgsql public | way_nodes | table | pgsql public | way_tags | table | pgsql public | ways | table | pgsql (21 rows)
Вызываем таблицу planet_point
#db-local=> \d planet_point Table "public.planet_point" Column | Type | Modifiers --------------------+----------+----------- osm_id | integer | access | text | addr:housename | text | addr:housenumber | text | addr:interpolation | text | admin_level | text | aerialway | text | aeroway | text | amenity | text | area | text | barrier | text | bicycle | text | ... wood | text | z_order | integer | tags | hstore | way | geometry | Indexes: "planet_point_index" gist (way) "planet_point_pkey" btree (osm_id) "planet_point_tags" gin (tags)
Делаем запрос по osm_id и смотрим заполнение
#db-local=> SELECT osm_id, tags FROM planet_point LIMIT 5; osm_id | tags ------------+----------------------------------------------- 329526473 | "alt_name"=>"РљСѓР±РёРЅРєР° 1", "esr:user"=>"182603" 1305674782 | 98820001 | 634991837 | 994660217 | (5 rows)
Поддержка актуальности локальной базы
Анализ изменений:
Создать файл изменений, проанализировав API-базу и файл последней выгрузки.
#osmosis --read-apidb database="db-api" user="usr-api" validateSchemaVersion=no --read-xml first-dump_api.osm\ --derive-change --write-xml-change diff_api_changes.osc
Создать файл изменений, проанализировав старый и новый файл выгрузки
Новая выгрузка данных api-базы в файл
#osmosis --read-apidb database="db-api" user="usr-api" validateSchemaVersion=no outPipe.0="mypipe"\ --write-xml new-dump_api.osm inPipe.0="mypipe"
Выявление изменений в старом и новом файлах выгрузки и запись их в файл
#osmosis --read-xml first-dump_api.osm --read-xml new-dump_api.osm --derive-change\ --write-xml-change diff_api_changes.osc
Внесение изменений в локальную базу
Добавление файла изменений
#osm2pgsql --append --style /usr/local/share/osm2pgsql/default.style --database db-local --username usr-local\ --prefix planet --slim --cache 2048 --hstore diff_api_changes.osc
Полная замена данных в локальной базе новым дампом из api.
#osm2pgsql --style /usr/local/share/osm2pgsql/default.style --database db-local --username usr-local\ --prefix planet --slim --cache 2048 --hstore new-dump_api.osm
Источники информации
- Category:Mapnik
- DE:HowTo Mapnik & Tirex
- HowTo mod_tile
- DE:HowtoMinutelyHstore
- User:Ajoessen/Osmosis
- User:BigPeteB/Setting up a local database copy
- Osmosis/Examples
- Osmosis/Detailed_Usage_0.39
- Osm2mp