RU:User:S-s-s wiki/Creating and maintaining the relevance of the local database OSM

From OpenStreetMap Wiki
Jump to: navigation, search
Доступные языки — S-s-s wiki/Creating and maintaining the relevance of the local database OSM
Afrikaans Alemannisch aragonés asturianu azərbaycanca Bahasa Indonesia Bahasa Melayu Bân-lâm-gú Basa Jawa Baso Minangkabau bosanski brezhoneg català čeština dansk Deutsch eesti English español Esperanto estremeñu euskara français Frysk Gaeilge Gàidhlig galego Hausa hrvatski Igbo interlingua Interlingue isiXhosa isiZulu íslenska italiano Kiswahili Kreyòl ayisyen kréyòl gwadloupéyen kurdî latviešu Lëtzebuergesch lietuvių magyar Malagasy Malti Nederlands Nedersaksies norsk norsk nynorsk occitan Oromoo oʻzbekcha/ўзбекча Plattdüütsch polski português português do Brasil română shqip slovenčina slovenščina Soomaaliga suomi svenska Tiếng Việt Türkçe Vahcuengh vèneto Wolof Yorùbá Zazaki српски / srpski беларуская български қазақша македонски монгол русский тоҷикӣ українська Ελληνικά Հայերեն ქართული नेपाली मराठी हिन्दी অসমীয়া বাংলা ਪੰਜਾਬੀ ગુજરાતી ଓଡ଼ିଆ தமிழ் తెలుగు ಕನ್ನಡ മലയാളം සිංහල ไทย မြန်မာဘာသာ ລາວ ភាសាខ្មែរ ⵜⴰⵎⴰⵣⵉⵖⵜ አማርኛ 한국어 日本語 中文(简体)‎ 吴语 粵語 中文(繁體)‎ ייִדיש עברית اردو العربية پښتو سنڌي فارسی ދިވެހިބަސް

Описание шагов по созданию локальной базы данных ОСМ и поддержке её актуальности

Contents

Работы с ОС 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

Источники информации

Что еще почитать