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

From OpenStreetMap Wiki
(Redirected from Local openstreetmap ru site)
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)
              )
            )
          )
        }