From 562f8bc84a632971e8ff41cb5d4a02a5a9f6c4e1 Mon Sep 17 00:00:00 2001 From: biswajit-k Date: Wed, 26 Apr 2023 23:44:20 +0530 Subject: [PATCH] Add script to generate taginfo project description --- .github/actions/build-nominatim/action.yml | 2 +- settings/flex-base.lua | 43 ++++++++++++- settings/import-extratags.lua | 1 - settings/import-full.lua | 1 - settings/taginfo.lua | 74 ++++++++++++++++++++++ 5 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 settings/taginfo.lua diff --git a/.github/actions/build-nominatim/action.yml b/.github/actions/build-nominatim/action.yml index 5d06267c..eaab5ae0 100644 --- a/.github/actions/build-nominatim/action.yml +++ b/.github/actions/build-nominatim/action.yml @@ -25,7 +25,7 @@ runs: shell: bash - name: Install${{ matrix.flavour }} prerequisites run: | - sudo apt-get install -y -qq libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev libicu-dev liblua${LUA_VERSION}-dev lua${LUA_VERSION} + sudo apt-get install -y -qq libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev libicu-dev liblua${LUA_VERSION}-dev lua${LUA_VERSION} lua-dkjson if [ "$FLAVOUR" == "oldstuff" ]; then pip3 install MarkupSafe==2.0.1 python-dotenv psycopg2==2.7.7 jinja2==2.8 psutil==5.4.2 pyicu==2.9 osmium PyYAML==5.1 sqlalchemy==1.4 GeoAlchemy2==0.10.0 datrie asyncpg else diff --git a/settings/flex-base.lua b/settings/flex-base.lua index 58d60228..fbfb4d54 100644 --- a/settings/flex-base.lua +++ b/settings/flex-base.lua @@ -11,6 +11,11 @@ local ADDRESS_TAGS = nil local SAVE_EXTRA_MAINS = false local POSTCODE_FALLBACK = true +-- tables required for taginfo +module.TAGINFO_MAIN = {keys = {}, delete_tags = {}} +module.TAGINFO_NAME_KEYS = {} +module.TAGINFO_ADDRESS_KEYS = {} + -- The single place table. local place_table = osm2pgsql.define_table{ @@ -372,6 +377,17 @@ function module.tag_group(data) end end +-- Returns prefix part of the keys, and reject suffix matching keys +local function process_key(key) + if key:sub(1, 1) == '*' then + return nil + end + if key:sub(#key, #key) == '*' then + return key:sub(1, #key - 2) + end + return key +end + -- Process functions for all data types function module.process_node(object) @@ -465,14 +481,29 @@ function module.set_prefilters(data) PRE_DELETE = module.tag_match{keys = data.delete_keys, tags = data.delete_tags} PRE_EXTRAS = module.tag_match{keys = data.extra_keys, tags = data.extra_tags} + module.TAGINFO_MAIN.delete_tags = data.delete_tags end function module.set_main_tags(data) MAIN_KEYS = data + local keys = {} + for k, _ in pairs(data) do + table.insert(keys, k) + end + module.TAGINFO_MAIN.keys = keys end function module.set_name_tags(data) NAMES = module.tag_group(data) + + for _, lst in pairs(data) do + for _, k in ipairs(lst) do + local key = process_key(k) + if key ~= nil then + module.TAGINFO_NAME_KEYS[key] = true + end + end + end end function module.set_address_tags(data) @@ -480,8 +511,18 @@ function module.set_address_tags(data) POSTCODE_FALLBACK = data.postcode_fallback data.postcode_fallback = nil end - ADDRESS_TAGS = module.tag_group(data) + + for _, lst in pairs(data) do + if lst ~= nil then + for _, k in ipairs(lst) do + local key = process_key(k) + if key ~= nil then + module.TAGINFO_ADDRESS_KEYS[key] = true + end + end + end + end end function module.set_unused_handling(data) diff --git a/settings/import-extratags.lua b/settings/import-extratags.lua index fd9a15f3..204bd1c8 100644 --- a/settings/import-extratags.lua +++ b/settings/import-extratags.lua @@ -7,7 +7,6 @@ flex.set_main_tags{ historic = 'always', military = 'always', natural = 'named', - landuse = 'named', highway = {'always', street_lamp = 'named', traffic_signals = 'named', diff --git a/settings/import-full.lua b/settings/import-full.lua index 1b64124d..1dc317a9 100644 --- a/settings/import-full.lua +++ b/settings/import-full.lua @@ -7,7 +7,6 @@ flex.set_main_tags{ historic = 'always', military = 'always', natural = 'named', - landuse = 'named', highway = {'always', street_lamp = 'named', traffic_signals = 'named', diff --git a/settings/taginfo.lua b/settings/taginfo.lua new file mode 100644 index 00000000..0eaa96e5 --- /dev/null +++ b/settings/taginfo.lua @@ -0,0 +1,74 @@ +-- Prints taginfo project description in the standard output +-- + +-- create fake "osm2pgsql" table for flex-base, originally created by the main C++ program +osm2pgsql = {} +function osm2pgsql.define_table(...) end + +-- provide path to flex-style lua file +flex = require('import-extratags') +local json = require ('dkjson') + + +------------ helper functions --------------------- + +function get_key_description(key, description) + local desc = {} + desc.key = key + desc.description = description + set_keyorder(desc, {'key', 'description'}) + return desc +end + +-- Sets the key order for the resulting JSON table +function set_keyorder(table, order) + setmetatable(table, { + __jsonorder = order + }) +end + + +-- Prints the collected tags in the required format in JSON +function print_taginfo() + local tags = {} + + for _, k in ipairs(flex.TAGINFO_MAIN.keys) do + local desc = get_key_description(k, 'POI/feature in the search database') + if flex.TAGINFO_MAIN.delete_tags[k] ~= nil then + desc.description = string.format('%s(except for values: %s).', desc.description, + table.concat(flex.TAGINFO_MAIN.delete_tags[k], ', ')) + end + table.insert(tags, desc) + end + + for k, _ in pairs(flex.TAGINFO_NAME_KEYS) do + local desc = get_key_description(k, 'Searchable name of the place.') + table.insert(tags, desc) + end + for k, _ in pairs(flex.TAGINFO_ADDRESS_KEYS) do + local desc = get_key_description(k, 'Used to determine the address of a place.') + table.insert(tags, desc) + end + + local format = { + data_format = 1, + data_url = 'http://nominatim.openstreetmap.org/taginfo.json', + project = { + name = 'Nominatim', + description = 'OSM search engine.', + project_url = 'http://nominatim.openstreetmap.org', + doc_url = 'http://wiki.osm.org/wiki/Nominatim', + contact_name = 'Sarah Hoffmann', + contact_email = 'lonvia@denofr.de' + } + } + format.tags = tags + + set_keyorder(format, {'data_format', 'data_url', 'project', 'tags'}) + set_keyorder(format.project, {'name', 'description', 'project_url', 'doc_url', + 'contact_name', 'contact_email'}) + + print(json.encode(format)) +end + +print_taginfo() -- 2.39.5