Локальная копия OpenStreetMap.ru

From OpenStreetMap Wiki
Jump to navigation Jump to search

Ставим локальную копию сайта OpenStreetMap.ru

Настройка производится на Debian.

Ставим сайт Openstreetmap.ru

Ставим сайт

 mkdir /opt/osm/openstreetmap.ru
 git clone https://github.com/ErshKUS/OpenStreetMap.ru.git
 git clone https://github.com/ErshKUS/osmCatalog.git
 git clone https://github.com/ErshKUS/stapio.git

Ставим php

 apt-get install php5 python-psycopg2 php5-curl

Так же нужно убедиться, что в настройках php в файле /etc/php5/cli/php.ini опция short_open_tag установлена в On. Иначе сайт openstreetmap.ru не будет работать - будет белый экран и надпись "OpenStreetMap.ru".

Прописываем виртуальный хост

Создаём файл /etc/apache2/sites-available/05_local_osm_site.conf:

<VirtualHost *:80>
ServerAdmin osm_admin@rsprim.ru

ServerName map.prim.drsk.ru
ServerAlias map.rs.int

DocumentRoot /opt/osm/openstreetmap.ru/OpenStreetMap.ru/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /opt/osm/openstreetmap.ru/OpenStreetMap.ru/www>
Options Indexes FollowSymLinks -MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

ScriptAlias /api/ /opt/osm/openstreetmap.ru/OpenStreetMap.ru/api/
<Directory "/opt/osm/openstreetmap.ru/OpenStreetMap.ru/api">
AllowOverride All
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/map.prim.drsk.ru-error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/map.prim.drsk.ru-access.log combined

<Directory /opt/osm/tilecache/>
Order allow,deny
Allow from all 
  DirectoryIndex tilecache.cgi
  Options +ExecCGI
  AddHandler cgi-script .cgi pl
  #ErrorLog /var/log/apache2/map.prim.drsk.ru-tilecache-error.log
</Directory>

</VirtualHost>

Включаем **rewritemod**:

 a2enmod rewrite

Включаем виртуальный хост:

 cd /etc/apache2/sites-enabled
 ln -s ../sites-available/05_map.prim.drsk.ru.conf 05_map.prim.drsk.ru.conf
 /etc/init.d/apache2 restart

Создаём базу для сайта

Создаём пользователя:

 su postgres
 psql
 CREATE USER osm_www WITH PASSWORD 'XXXXXX';
 \q

Создаём базу:

 createdb -E UTF8 -O osm_www osm_www

Добавляем отсутствующую таблицу в /opt/osm/openstreetmap.ru/OpenStreetMap.ru/install_www/db_pg.sql:

CREATE TABLE personal_map
(
  id integer,
  "admin_hash" character(32),
  "name" text,
  "description" text,
  "json" text
);

Инициализируем базу:

 cd /opt/osm/openstreetmap.ru/OpenStreetMap.ru/install_www
 su postgres
 psql -U osm_www -W osm_www < db_pg.sql

Создаём отсутствующую таблицу config, выполняя следующие команды:

 su postgres
 psql -U osm_www -W osm_www
 CREATE EXTENSION hstore;
 CREATE table config(id serial, value hstore);

FIXME после установки stapio (см. ниже) нужно закомментировать в нём следующий код, для работы с этой таблицей: До сих пор не смог запустить в работу код, для работы с этой таблицей. В принципе, он не критичен. Потому его можно закомментировать /opt/osm/openstreetmap.ru/stapio_install_branch/stapio_utils.py:

def saveDate(whereTime, file, key_config):
  f = open(conf.workactual + file,'w')
  f.write(json.dumps(whereTime, default=jsondumps))
  f.close()
 
# Закомментировал, т.к. так и не смог обеспечить работу его с отсутствующей таблицей. Создать её правильно пока не смог:
 # if conf.saveDateForSite:
 #   whereTime['_key_config'] = key_config
 #   connsite = psycopg2.connect(host=conf.sitefull_host, database=conf.sitefull_database, user=conf.sitefull_user, password=conf.sitefull_password)
 #   cursite = connsite.cursor()
 
 #   cursite.execute("""
 #     UPDATE "config" SET "value"=%(nupd)s WHERE "key"=%(_key_config)s;
 #     INSERT INTO "config" ("key", "value")
 #       SELECT %(_key_config)s, %(nupd)s
 #       WHERE NOT EXISTS (SELECT 1 FROM "config" WHERE "key"=%(_key_config)s);
 #   """, whereTime)
 #   connsite.commit()

Настройка поиска и отображения POI

Ставим osmCatalog

 cd /opt/osm/openstreetmap.ru
 git clone https://github.com/ErshKUS/osmCatalog.git

Ставим stapio

 git clone https://github.com/ErshKUS/stapio.git
 git clone https://github.com/ErshKUS/osmCatalog

Переключаемся на ветку //install// взамен //master//:

 cd stapio
 git checkout install

Для правильной работы stapio нужен postgix 2.x. Ставим по [[1]]:

  1. Добавляем **/etc/apt/sources.list.d/postgres.list**: <file bash postgres.list>deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main</file>
  2. Добавляем gpg-ключ: <csource lang=bash>cd /tmp

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -</source>

  1. Ставим пакеты:
    apt-get update; apt-get install postgresql-9.1-postgis-2.1 postgresql-9.1-postgis-2.1-scripts
    
  2. По идее можно удалить старые:
    apt-get remove postgresql-9.1-postgis postgis libpostgis-java
    

Правим конфиг stapio:

 mv stapio_config_distributed.py stapio_config.py
 vim stapio_config.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# STAPIO CONFIGURATION
#

# ! все пути до каталога должны оканчиватся на '/'

# global
format_datetime = '%Y-%m-%d %H:%M:%S'

stapio_dir = '/opt/osm/openstreetmap.ru/stapio'

file_log = 'stapio_run.log'
workdir = stapio_dir # путь до каталога stapio (путь в конце с /)
workactual = stapio_dir + '/actual/' # путь до каталога дат актуализации данных (путь в конце с /)
logdir = stapio_dir + '/log/' # путь до каталога логов stapio (путь в конце с /)
tempdir = '/tmp/stapio/' # путь до каталога временных файлов, в основном osmosis-а (путь в конце с /)
authFileOsmosis = stapio_dir + '/.auth_osmosis' # файл аутентификации postgresql
runAfter = '' # команда выпоняемая после работы, например очистка temp файлов после работы osmosis


# sphinx
sphinx_reindex = True # делать реиндекс сфинкса по окончании работы
cmdindexrotate = 'indexer --all --rotate' # строка реиндекса


# osmCatalog
osm_catalog = '/osmCatalog'
file_catalog_json = osm_catalog + '/catalog.json' # catalog.json
path_dictionary_json = osm_catalog + '/dictionary/' # путь до dictionary (путь в конце с /)
file_tree_json = stapio_dir + '/poi/poidatatree.json' # poidatatree.json (обычно stapio/poi/poidatatree.json)
file_marker_json = stapio_dir + '/poi/poimarker.json' # poimarker.json (обычно stapio/poi/poimarker.json)
path_markers = '/osm.ru/www/img/poi_marker/' # путь до иконок маркеров poi_marker (для генерации poimarker.json)
file_listPerm_json = stapio_dir + '/poi/poidatalistperm.json' # poidatalistperm.json (обычно stapio/poi/poidatalistperm.json)


# addr config
use_country = True # *old*
use_addr_save = True # использовать сохраненные данные по странам и регионам (область, край, ...)


# load file
urlpbf = ['http://be.gis-lab.info/data/osm_dump/dump/latest/RU-PRI.osm.pbf']
#urlpbf = ['http://data.gis-lab.info/osm_dump/dump/latest/RU-KGD.osm.pbf']
#urlpbf = ['http://data.gis-lab.info/osm_dump/dump/latest/RU.osm.pbf', 'http://data.gis-lab.info/osm_dump/dump/latest/UA.osm.pbf', 'http://data.gis-lab.info/osm_dump/dump/latest/BY.osm.pbf']

urlpbfmeta = 'http://be.gis-lab.info/data/osm_dump/dump/latest/RU-PRI.osm.pbf.meta'
#urlpbfmeta = 'http://data.gis-lab.info/osm_dump/dump/latest/RU-KGD.osm.pbf.meta'
# urlpbfmeta = 'http://data.gis-lab.info/osm_dump/dump/latest/RU.osm.pbf.meta'

urlmaskosc = ['http://data.gis-lab.info/osm_dump/diff/RU/RU-%(daystart)s-%(dayend)s.osc.gz','http://data.gis-lab.info/osm_dump/diff/UA/UA-%(daystart)s-%(dayend)s.osc.gz','http://data.gis-lab.info/osm_dump/diff/BY/BY-%(daystart)s-%(dayend)s__.osc.gz']


# for logger
write_in_file = True
write_in_singlefile = True
singlefile_log = 'singlestapio.log'
email_send = False
email_from = '' # stapio@server.ru
email_to = '' # ershkus@server.ru
email_send_finish = False
smtp_server = '' # server.ru
email_pass = '' #
email_head_error = 'stapio error'
email_head_finish = 'stapio finish'


# utils
saveDateForSite = True


# steps
nodeStep = 2500000
wayStep = 1000000
GeomInStep = 5000

# DATABASE CONFIGURATION
#

db_host = "localhost"
db_name = "stapio_gis"
db_user = "openstreetmap"
db_password = "XXXXXX"

addr_table = 'addr'
addr_p_table = 'addr_p'
poi_table = 'poi'
addr_upd_table = 'addr_street_upd'
deleted_entries_table = 'deleted_entries'

# права на insert, update, delete, select
addrfull_host = 'localhost'
#addrfull_database = 'stapio_gis_addr_full'
addrfull_database = 'stapio_gis'
addrfull_user = 'openstreetmap'
addrfull_password = 'XXXXXXX'

# for saveDateForSite
# права на insert, update, select (можно только к одной таблице 'config')
sitefull_host = 'localhost'
sitefull_database = 'osm_www'
sitefull_user = 'openstreetmap'
sitefull_password = 'XXXXXX'


Создаём таблицы

Инициализируем stapio:

 ./run install

Сообщаем пользователя и пароль для создания таблиц и баз данных.

Однако скрипт создаёт несколько устаревшие базы и таблицы. И не добавляет функций в базу. Поэтому добавляем их вручную:

Выполняем скрипт. Можно перед этим поменять пользователя:

 vim ershkus_tables.sql:
-- Table: ershkus_search_addr

-- DROP TABLE ershkus_search_addr;

CREATE TABLE ershkus_search_addr
(
  id bigserial NOT NULL,
  id_link_n bigint[],
  id_link_w bigint[],
  id_link_r bigint[],
  full_name text,
  region text,
  region_id bigint,
  district text,
  district_id bigint,
  city text,
  city_id bigint,
  village text,
  village_id bigint,
  street text,
  housenumber text,
  member_role text,
  addr_type text,
  index_name text,
  addr_type_id integer,
  geom geometry,
  c_geom geometry,
  modify boolean NOT NULL DEFAULT false,
  osm_id text[],
  postcode text,
  country text,
  country_id bigint,
  street_id bigint,
  name text,
  CONSTRAINT pk_ershkus_search_addr PRIMARY KEY (id ),
  CONSTRAINT enforce_dims_c_geom CHECK (st_ndims(c_geom) = 2),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_geotype_c_geom CHECK (geometrytype(c_geom) = 'POINT'::text OR c_geom IS NULL),
  CONSTRAINT enforce_srid_c_geom CHECK (st_srid(c_geom) = 4326),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ershkus_search_addr
  OWNER TO osm_www;
GRANT ALL ON TABLE ershkus_search_addr TO osm_www;
GRANT SELECT, UPDATE ON TABLE ershkus_search_addr TO osm_www;

-- Index: addr_type_id_idx

-- DROP INDEX addr_type_id_idx;

CREATE INDEX addr_type_id_idx
  ON ershkus_search_addr
  USING btree
  (addr_type_id );

-- Index: ershkus_search_addr_geom_idx

-- DROP INDEX ershkus_search_addr_geom_idx;

CREATE INDEX ershkus_search_addr_geom_idx
  ON ershkus_search_addr
  USING gist
  (geom );

-- Index: ershkus_search_addr_osm_id_idx

-- DROP INDEX ershkus_search_addr_osm_id_idx;

CREATE INDEX ershkus_search_addr_osm_id_idx
  ON ershkus_search_addr
  USING gin
  (osm_id COLLATE pg_catalog."default" );

-- Table: ershkus_search_addr_p

-- DROP TABLE ershkus_search_addr_p;

CREATE TABLE ershkus_search_addr_p
(
  id bigint NOT NULL DEFAULT nextval('ershkus_search_addr_id_seq'::regclass),
  id_link_n bigint[],
  id_link_w bigint[],
  id_link_r bigint[],
  full_name text,
  region text,
  region_id bigint,
  district text,
  district_id bigint,
  city text,
  city_id bigint,
  village text,
  village_id bigint,
  street text,
  housenumber text,
  member_role text,
  addr_type text,
  addr_type_id integer,
  index_name text,
  geom geometry,
  c_geom geometry,
  osm_id text[],
  postcode text,
  country text,
  country_id bigint,
  name text,
  CONSTRAINT ershkus_search_addr_p_pk_ershkus_search_addr PRIMARY KEY (id ),
  CONSTRAINT enforce_dims_c_geom CHECK (st_ndims(c_geom) = 2),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_geotype_c_geom CHECK (geometrytype(c_geom) = 'POINT'::text OR c_geom IS NULL),
  CONSTRAINT enforce_srid_c_geom CHECK (st_srid(c_geom) = 4326),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ershkus_search_addr_p
  OWNER TO osm_www;
GRANT ALL ON TABLE ershkus_search_addr_p TO osm_www;
GRANT SELECT ON TABLE ershkus_search_addr_p TO osm_www;

-- Index: ershkus_search_addr_p_addr_type_id_idx

-- DROP INDEX ershkus_search_addr_p_addr_type_id_idx;

CREATE INDEX ershkus_search_addr_p_addr_type_id_idx
  ON ershkus_search_addr_p
  USING btree
  (addr_type_id );

-- Index: ershkus_search_addr_p_geom_idx

-- DROP INDEX ershkus_search_addr_p_geom_idx;

CREATE INDEX ershkus_search_addr_p_geom_idx
  ON ershkus_search_addr_p
  USING gist
  (geom );

-- Table: ershkus_poi

-- DROP TABLE ershkus_poi;

CREATE TABLE ershkus_poi
(
  id bigserial NOT NULL,
  class text NOT NULL,
  tags hstore,
  name_ru text DEFAULT ''::text,
  operator text,
  tags_ru hstore,
  opening_hours text,
  class_ru text,
  addr_region text,
  addr_district text,
  addr_city text,
  addr_full_name text,
  index_name text,
  addr_region_id bigint,
  addr_district_id bigint,
  addr_city_id bigint,
  addr_house_id bigint,
  addr_in_id bigint,
  addr_in_type integer,
  brand text,
  phone text,
  fax text,
  website text,
  addr_village text,
  addr_street text,
  addr_house text,
  c_geom geometry,
  addr_country text,
  email text,
  description text,
  wikipedia text,
  osm_id text,
  CONSTRAINT ershkus_poi_pkey PRIMARY KEY (id ),
  CONSTRAINT enforce_dims_c_geom CHECK (st_ndims(c_geom) = 2),
  CONSTRAINT enforce_geotype_c_geom CHECK (geometrytype(c_geom) = 'POINT'::text OR c_geom IS NULL),
  CONSTRAINT enforce_srid_c_geom CHECK (st_srid(c_geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ershkus_poi
  OWNER TO osm_www;
GRANT ALL ON TABLE ershkus_poi TO osm_www;
GRANT SELECT ON TABLE ershkus_poi TO osm_www;

-- Index: ershkus_poi_addr_in_id_idx

-- DROP INDEX ershkus_poi_addr_in_id_idx;

CREATE INDEX ershkus_poi_addr_in_id_idx
  ON ershkus_poi
  USING btree
  (addr_in_type );

-- Index: ershkus_poi_osm_id_idx

-- DROP INDEX ershkus_poi_osm_id_idx;

CREATE INDEX ershkus_poi_osm_id_idx
  ON ershkus_poi
  USING btree
  (osm_id COLLATE pg_catalog."default" , id );

-- Table: ershkus_addr_street_upd

-- DROP TABLE ershkus_addr_street_upd;

CREATE TABLE ershkus_addr_street_upd
(
  id bigserial NOT NULL,
  osm_id text,
  street_name text,
  country text,
  country_id bigint,
  region text,
  region_id bigint,
  district text,
  district_id bigint,
  city text,
  city_id bigint,
  village text,
  village_id bigint,
  street text,
  postcode text,
  geom geometry,
  CONSTRAINT ershkus_addr_street_upd_pkey PRIMARY KEY (id ),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ershkus_addr_street_upd
  OWNER TO osm_www;




-- Table: deleted_entries

-- DROP TABLE deleted_entries;

CREATE TABLE deleted_entries
(
  id bigserial NOT NULL,
  type character(1) NOT NULL,
  osm_id bigint NOT NULL,
  deleted_at timestamp without time zone DEFAULT now(),
  CONSTRAINT deleted_entries_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE deleted_entries
  OWNER TO osm_www;

-- Index: idx_deleted_entries_updated_at

-- DROP INDEX idx_deleted_entries_updated_at;

CREATE INDEX idx_deleted_entries_updated_at
  ON deleted_entries
  USING btree
  (deleted_at , id );

-- Table: ershkus_addr_save

-- DROP TABLE ershkus_addr_save;

CREATE TABLE ershkus_addr_save
(
  id bigserial NOT NULL,
  osm_id text[],
  addr_type text,
  addr_type_id integer,
  full_name text,
  country text,
  country_id bigint,
  region text,
  region_id bigint,
  geom geometry,
  name text,
  CONSTRAINT pk_ershkus_addr_save PRIMARY KEY (id),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ershkus_addr_save
  OWNER TO osm_www;
GRANT ALL ON TABLE ershkus_addr_save TO osm_www;
GRANT SELECT, UPDATE ON TABLE ershkus_addr_save TO osm_www;
 psql local_osm_gis < ershkus_tables.sql

Добавляем функции

Тут и тут: Создаём fun.sql:

-- Function: ershkus_fn_geompoly(geometry[])
 
 -- DROP FUNCTION ershkus_fn_geompoly(geometry[]);
  
  CREATE OR REPLACE FUNCTION ershkus_fn_geompoly(geometry[])
  RETURNS geometry AS
  $BODY$
  BEGIN
  -- RETURN (SELECT ST_Polygonize(c2) FROM (SELECT ST_GeomFromText(astext(ST_Collect(c1)),4326) as c2 FROM (SELECT unnest($1) as c1) as t1) as t2);
  RETURN (SELECT ST_BuildArea(ST_GeomFromText(astext(ST_Collect(c1)),4326)) as c2 FROM (SELECT unnest($1) as c1) as t1);
   
   EXCEPTION
   WHEN SQLSTATE 'XX000' THEN
   RETURN null;
   WHEN SQLSTATE '21000' THEN
   RETURN null;
   END;
   $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;
   ALTER FUNCTION ershkus_fn_geompoly(geometry[])
   OWNER TO osm_www;
   GRANT EXECUTE ON FUNCTION ershkus_fn_geompoly(geometry[]) TO public;
   GRANT EXECUTE ON FUNCTION ershkus_fn_geompoly(geometry[]) TO osm_www;
   
 -- Function: ershkus_fn_buildarea(geometry)
 
 -- DROP FUNCTION ershkus_fn_buildarea(geometry);
  
  CREATE OR REPLACE FUNCTION ershkus_fn_buildarea(geometry)
  RETURNS geometry AS
  $BODY$
  BEGIN
  RETURN (SELECT ST_BuildArea($1));
   
   EXCEPTION
   WHEN SQLSTATE 'XX000' THEN
   RETURN null;
   WHEN SQLSTATE '21000' THEN
   RETURN null;
   END;
   $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;
   ALTER FUNCTION ershkus_fn_buildarea(geometry)
   OWNER TO osm_www;
   GRANT EXECUTE ON FUNCTION ershkus_fn_buildarea(geometry) TO public;
   GRANT EXECUTE ON FUNCTION ershkus_fn_buildarea(geometry) TO osm_www;
 psql local_osm_gis < fun.sql

Алиасы на старые функции

В новом (2.0) postgis переименовали функции, поэтому может потребоваться запуск создания алиасов на старые (1.5) функции:

 psql stapio_gis < /usr/share/postgresql/9.1/contrib/postgis-2.1/legacy.sql

Чтобы решить возможную проблему запуска stapio:

 ./run --load insert

Завершался следующей ошибкой:

  File "./run.py", line 663, in main
    insert(log_level=1, load_files=args.load, only_addr=args.onlyAddr, only_poi=args.onlyPOI)
  File "./run.py", line 563, in insert
    stapio_addr.insert_addr(conn, log_level=log_level + 1)
  File "/opt/osm/openstreetmap.ru/stapio_install_branch/stapio_addr.py", line 1758, in insert_addr
    insertFromSimpleOSM(conn = conn, loglevel = log_level+1)
  File "/opt/osm/openstreetmap.ru/stapio_install_branch/stapio_addr.py", line 827, in insertFromSimpleOSM
    """, whereTime)
ProgrammingError: ОШИБКА:  функция astext(geometry) не существует
LINE 1: SELECT (SELECT ST_BuildArea(ST_GeomFromText(astext(ST_Collec...
                                                    ^
HINT:  Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные преобразования типов.
QUERY:  SELECT (SELECT ST_BuildArea(ST_GeomFromText(astext(ST_Collect(c1)),4326)) as c2 FROM (SELECT unnest($1) as c1) as t1)
CONTEXT:  PL/pgSQL function "ershkus_fn_geompoly" line 4 at RETURN

Доступ сайта к базе stapio

Прописываем доступ к базе stapio из кода сайта:

Правим файл: /opt/osm/openstreetmap.ru/OpenStreetMap.ru/api/db_config.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# DATABASE CONFIGURATION
#
# гис-база stapio:
addr_host = "localhost"
addr_database = "stapio_gis"
addr_user = "openstreetmap"
addr_password = "XXXXXX"
# база сайта:
site_host = "localhost"
site_database = "osm_www"
site_user = "openstreetmap"
site_password = "XXXXXX"

Прописываем настройки в файл конфигурации stapio

Файл конфиурации в нашем случае /opt/osm/openstreetmap.ru/stapio_install_branch/stapio_config.py:

#!/usr/bin/env python

format_datetime = '%Y-%m-%d %H:%M:%S'

stapio_dir = '/opt/osm/openstreetmap.ru/stapio/'

file_log = 'stapio_run.log'
workdir = stapio_dir # путь до каталога stapio (путь в конце с /)
workactual = stapio_dir + '/actual/' # путь до каталога дат актуализации данных (путь в конце с /)
logdir = stapio_dir + '/log/' # путь до каталога логов stapio (путь в конце с /)
tempdir = '/tmp/stapio/' # путь до каталога временных файлов, в основном osmosis-а (путь в конце с /)
authFileOsmosis = stapio_dir + '/.auth_osmosis' # файл аутентификации postgresql
runAfter = '' # команда выпоняемая после работы, например очистка temp файлов после работы osmosis

sphinx_reindex = False # делать реиндекс сфинкса по окончании работы
cmdindexrotate = 'indexer --all --rotate' # строка реиндекса

osm_catalog = '../osmCatalog/'
file_catalog_json = osm_catalog + '/catalog.json' # catalog.json
path_dictionary_json = osm_catalog + '/dictionary/' # путь до dictionary (путь в конце с /)
file_tree_json = stapio_dir + '/poi/poidatatree.json' # poidatatree.json (обычно stapio/poi/poidatatree.json)
file_marker_json = stapio_dir + '/poi/poimarker.json' # poimarker.json (обычно stapio/poi/poimarker.json)
path_markers = '/osm.ru/www/img/poi_marker/' # путь до иконок маркеров poi_marker (для генерации poimarker.json)
file_listPerm_json = stapio_dir + '/poi/poidatalistperm.json' # poidatalistperm.json (обычно stapio/poi/poidatalistperm.json)


use_country = True # *old*
use_addr_save = True # использовать сохраненные данные по странам и регионам (область, край, ...)


urlpbf = ['http://be.gis-lab.info/data/osm_dump/dump/latest/RU-PRI.osm.pbf']

urlpbfmeta = 'http://be.gis-lab.info/data/osm_dump/dump/latest/RU-PRI.osm.pbf.meta'

urlmaskosc = ['http://data.gis-lab.info/osm_dump/diff/RU/RU-%(daystart)s-%(dayend)s.osc.gz','http://data.gis-lab.info/osm_dump/diff/UA/UA-%(daystart)s-%(dayend)s.osc.gz','http://data.gis-lab.info/osm_dump/diff/BY/BY-%(daystart)s-%(dayend)s.osc.gz']

write_in_file = True
write_in_singlefile = True
singlefile_log = 'singlestapio.log'
email_send = False
email_from = '' # stapio@server.ru
email_to = '' # ershkus@server.ru
email_send_finish = False
smtp_server = '' # server.ru
email_pass = '' #
email_head_error = 'stapio error'
email_head_finish = 'stapio finish'

# Нет нужных таблиц:
saveDateForSite = False

nodeStep = 2500000
wayStep = 1000000
GeomInStep = 5000

db_host = "localhost"
db_name = "stapio_gis"
db_user = "openstreetmap"
db_password = "XXXXXXX"

addr_table = 'addr'
addr_p_table = 'addr_p'
poi_table = 'poi'
addr_upd_table = 'addr_street_upd'
deleted_entries_table = 'deleted_entries'

addrfull_host = 'localhost'
addrfull_database = 'stapio_gis'
addrfull_user = 'openstreetmap'
addrfull_password = 'XXXXXXX'

sitefull_host = 'localhost'
sitefull_database = 'osm_www'
sitefull_user = 'openstreetmap'
sitefull_password = 'XXXXXXX'


Запуск stapio

 ./run.py --onlyPOI --load insert

Правим отображение интерактивных POI под свои данные

В данном случае структура не интересна для общего проекта, т.к. сугубо уникальна (теги их значения придуманы для внутреннего использования). Файл приводится для примера.

Правим файл catalog.json в osmCatalog:

    [
      {
        "name": "power",
        "parent": [],
        "tags": {},
        "moretags": {},
        "poi": false,
        "type": [],
        "id": 30
      },
      {
        "name": "offices",
        "parent": [],
        "tags": {},
        "moretags": {},
        "poi": false,
        "type": [],
        "id": 32
      },
      {
        "name": "power_upravlenie",
        "parent": ["offices"],
        "tags": {"office":"power","office:type":"manage"},
        "moretags": {
          "population": {
            "type": "number",
            "tag": "population"
          },
          "operator": {
            "type": "number",
            "tag": "operator"
          }
        },
        "poi": true,
        "type": ["way", "relation","node","area"],
        "id": 411
      },
      {
        "name": "power_res",
        "parent": ["offices"],
        "tags": {"office":"power","office:type":"res"},
        "moretags": {
          "population": {
            "type": "number",
            "tag": "population"
          },
          "operator": {
            "type": "number",
            "tag": "operator"
          }
        },
        "poi": true,
        "type": ["way", "relation","node","area"],
        "id": 412
      },
      {
        "name": "power_master",
        "parent": ["offices"],
        "tags": {"office":"power","office:type":"master"},
        "moretags": {
          "population": {
            "type": "number",
            "tag": "population"
          },
          "operator": {
            "type": "number",
            "tag": "operator"
          }
        },
        "poi": true,
        "type": ["way", "relation","node","area"],
        "id": 413
      },
    
      {
        "name": "power_station",
        "parent": ["power"],
        "tags": {"power": "station"},
        "moretags": {
          "voltage": {
            "type": "number",
            "tag": "voltage"
             },  
            "power_usage_mvt_dopustima":{
            "type":"number",
            "tag":"power_usage_mvt_dopustima"
            },
            "power_usage_mvt_real_kdz":{
            "type":"number",
            "tag":"power_usage_mvt_real_kdz"
            },
            "power_usage_mvt_perspectiv_all":{
            "type":"number",
            "tag":"power_usage_mvt_perspectiv_all"
            },
            "power_usage_percent":{
            "type":"number",
            "tag":"power_usage_percent"
            },
            "power_usage_comment":{
            "type":"number",
            "tag":"power_usage_comment"
            },
            "operator": {
            "type": "number",
            "tag": "operator"
          }
        },
        "poi": true,
        "type": ["node", "area"],
        "id": 351
      },
      {
        "name": "power_substation",
        "parent": ["power"],
        "tags": {"power": "sub_station"},
        "moretags": {
          "voltage": {
            "type": "number",
            "tag": "voltage"
          },
            "ele":{
            "type":"number",
            "tag":"ele"
            },
          "operator": {
            "type": "number",
            "tag": "operator"
          }
        },
        "poi": true,
        "type": ["node", "area"],
        "id": 409
      },
      {
        "name": "power_link",
        "parent": ["power"],
        "tags": {"power": "link"},
        "moretags": {
            "power_link_type":{
                "type":"translate",
                "class":"power_link_type",
                "tag":"link"
            },
            "voltage":{
            "type":"number",
            "tag":"voltage"
            },
            "ele":{
            "type":"number",
            "tag":"ele"
            },
            "operator":{
            "type":"number",
            "tag":"operator"
            },
            "note":{
            "type":"number",
            "tag":"note"
            }
        },
        "poi": true,
        "type": ["node"],
        "id": 416
      },
      {
        "name": "power_tower",
        "parent": ["power"],
        "tags": {"power": "tower"},
        "moretags": {
            "material":{
                "type":"translate",
                "class":"material",
                "tag":"material"
            },
            "tower:type":{
                "type":"translate",
                "class":"tower:type",
                "tag":"tower:type"
            },
            "insulation:type":{
                "type":"translate",
                "class":"insulation:type",
                "tag":"insulation:type"
            },
            "insulation:material":{
                "type":"translate",
                "class":"material",
                "tag":"insulation:material"
            },
            "ground_wire":{
                "type":"translate",
                "class":"ground_wire",
                "tag":"ground_wire"
            },
            "unit_name":{
                "type":"number",
                "tag":"unit_name"
            },
            "model":{
                "type":"number",
                "tag":"model"
            },
            "date_enter_exp":{
                "type":"number",
                "tag":"date_enter_exp"
            },
            "wire_num":{
                "type":"number",
                "tag":"wire_num"
            },
            "base:type":{
                "type":"number",
                "tag":"base:type"
            },
            "disp_name":{
                "type":"number",
                "tag":"disp_name"
            },
            "voltage_construct":{
                "type":"number",
                "tag":"voltage_construct"
            },
    
            "height":{
                "type":"number",
                "tag":"height"
            },
            "ele":{
                "type":"number",
                "tag":"ele"
            },
            "operator":{
                "type":"number",
                "tag":"operator"
            }
        },
        "poi": true,
        "type": ["node"],
        "id": 408
      },
      {
        "name": "power_pole",
        "parent": ["power"],
        "tags": {"power": "pole"},
        "moretags": {
            "material":{
                "type":"translate",
                "class":"material",
                "tag":"material"
            },
            "height":{
            "type":"number",
            "tag":"height"
            },
            "ele":{
            "type":"number",
            "tag":"ele"
            },
            "operator":{
            "type":"number",
            "tag":"operator"
            }
        },
        "poi": true,
        "type": ["node"],
        "id": 414
      },
      {
        "name": "power_plant",
        "parent": ["power"],
        "tags": {"power": "plant", "plant:output:electricity": "*" },
        "moretags": {
          "power_generation_source": {
            "class": "power_generation_source",
            "tag": "generator:source",
            "type": "translate"
          },
          "power_generation_method": {
            "class": "power_generation_method",
            "tag": "generator:method",
            "type": "translate"
          },
          "power_output_electricity": {
            "tag": "plant:output:electricity",
            "type": "number"
          },
          "power_output_hot_water": {
            "tag": "plant:output:hot_water",
            "type": "number"
          },
          "power_output_hot_air": {
            "tag": "plant:output:hot_air",
            "type": "number"
          },
          "power_output_cold_water": {
            "tag": "plant:output:cold_water",
            "type": "number"
          },
          "power_output_cold_air": {
            "tag": "plant:output:cold_air",
            "type": "number"
          },
          "power_output_compressed_air": {
            "tag": "plant:output:compressed_air",
            "type": "number"
          },
          "power_output_steam": {
            "tag": "plant:output:steam",
            "type": "number"
          },
          "power_output_vacuum": {
            "tag": "plant:output:vacuum",
            "type": "number"
          }
        },
        "poi": true,
        "type": ["node", "area"],
        "id": 353
      }
    ]

Соответственно нужно поправить dictionary_ru.json там же. Часть кода, для примера:

    "power_upravlenie": {"name": "Управление ЭС", "description": "", "link": "", "keywords": ""},
    "power_res": {"name": "Управление РЭС", "description": "", "link": "", "keywords": ""},
    "power_master": {"name": "Мастерский участок", "description": "", "link": "", "keywords": ""},
    "power_link_type": {"name": "Тип соединения"},
    "power_usage_mvt_dopustima": {"name": "Допустимая нагрузка ПС (по схеме n-1, c перегрузкой 5%), МВт"},
    "power_usage_mvt_real_kdz": {"name": "Загрузка ПС по данным КДЗ, МВт"},
    "power_usage_mvt_perspectiv_all": {"name": "Перспективная нагрузка (всего), МВт"},
    "power_usage_comment": {"name": "Дата снятия показаний"},
    "power_usage_percent": {"name": "Загрузка ПС с учётом перспективной загрузки, % (по схеме n-1)"}
    },
      "class": {
        "tower:type": {
          "air_to_ground": "Земля - Воздух"
        },   
        "insulation:type": {
          "support": "поддерживающая"
        },   
        "ground_wire": {
          "yes": "присутствует",
          "no": "отсутствует"
        },   
        "material": {
          "metal": "металлическая",
          "steel": "стальная",
          "wood": "деревянная",
          "concrete": "бетонная",
          "aluminium": "алюминиевая",
          "composite": "композитные материалы",
          "polymer": "полимер",
          "glass": "стекло"
        },
        "power_link_type": {
          "connection": "соединительная муфта",
          "end_connection": "концевая муфта"
        },
        "communication_line_type": {
          "optic": "оптическая",
          "copper": "медная"
        },

Дополнение:

Более того возможно понадобиться править sql-запросы в stapio, для того, чтобы строить логику на js при отрисовке POI. Мне это понадобилось в случае отрисовки изображений объектов в сплывающих описаниях POI. Например (я добавил тег image, которого не было в изначальном stapio, возможно часть новых тегов придётся добавить и в стиль миграции osm2postgis, в приведённом примере теги power_usage_percent,power_usage_mva и другие):

         execute = """ 
            INSERT INTO
              ershkus_poi(
                "osm_id",
                "class",
                "tags",
                "opening_hours",
                "operator",
                "brand",
                "ref",
                "image",
                "scheme",
                "phone",
                "fax",
                "website",
                "email",
                "wikipedia",
                "description",
                 %(langinsert)s
                "addr_street",
                "addr_house",
                "c_geom")
            SELECT
              'w' || id as "osm_id",
              '%(class)s' as "class",
              %(moretags)s
              tags->'opening_hours' as "opening_hours",
              tags->'operator' as "operator",
              tags->'brand' as "brand",
              tags->'ref' as "ref",
              tags->'image' as "image",
              tags->'scheme' as "scheme",
              coalesce(tags->'contact:phone', tags->'phone') as "phone",
              coalesce(tags->'contact:fax', tags->'fax') as "fax",
              coalesce(tags->'contact:website', tags->'website') as "website",
              coalesce(tags->'contact:email', tags->'email') as "email",
              tags->'wikipedia' as "wikipedia",
              tags->'description' as "description",
              %(langname)s
              %(langtype)s
              %(lmoretags)s
              tags->'addr:street' as addr_street,
              tags->'addr:housenumber' as addr_house,
              ST_Centroid(linestring) as "c_geom"
            FROM ways
            WHERE
              %(wheretags)s
              %(wheretimeALL)s
              AND ST_NumPoints(linestring)>1
          ;""" % {"langinsert":langinsert, "class":icatalog['name'], "moretags":moretags, "langname":langname, "langtype":langtype, "lmoretags":lmoretags, "wheretags":wheretags, "wheretimeALL":wheretimeALL}

И потом добавить в файле: /opt/osm/openstreetmap.ru/OpenStreetMap.ru/www/js/page.map/poi.js

        var image;
        //var image_full_size_link;
        if (!(getdata.image== null)) {
            var image_link = 'http://wiki.rs.int/lib/exe/fetch.php/изображения_для_карты:'+getdata.image
        
            //image=$('<div>').addClass('image').append($('<img>').attr('src', image_link).attr('style','width: 240px; height: 200px'));
            //image=$('<div>').addClass('image').append($('<img>').attr('src', image_link).attr('style','width: 240px; height: 200px').attr('href',image_link));
                //.append($('<a>').text('image:'+getdata.image));
    
          image = $('<div>').addClass('image')
            .append($('<img>').attr('src', image_link).attr('style','width: 240px; height: 200px'))
            .append($('<br>'))
            .append($('<a>').attr('href', image_link).attr('target', '_blank').text("Открыть изображение в полном размере"));
    
          //image_full_size_link = $('<div>').addClass('image_link')
           //   .append($('<a>').attr('href', image_link).text('Открыть изображение в полном размере'));
          }   
...
  
        if (moretags.length || brand) {
          ret = ret
          .append($('<div>').addClass('moretags')
            .append($('<a>')
              .addClass('on_button')
              .attr('href', '#')
              .text('Подробнее…')
              .click(function(){
                $(this).hide();
                $(this.nextSibling).removeClass('off');
                return false;
              })
            )
            .append($('<div>').addClass('frame off')
              .append($('<a>')
                .append(image))
              .append($('<table>')
                .append(moretags)
              )
            )
          )
        }