Локальная копия OpenStreetMap.ru
Ставим локальную копию сайта 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]]:
- Добавляем **/etc/apt/sources.list.d/postgres.list**: <file bash postgres.list>deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main</file>
- Добавляем gpg-ключ: <csource lang=bash>cd /tmp
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -</source>
- Ставим пакеты:
apt-get update; apt-get install postgresql-9.1-postgis-2.1 postgresql-9.1-postgis-2.1-scripts
- По идее можно удалить старые:
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
Добавляем функции
-- 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)
)
)
)
}