X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/06796745ff3aa67a2a658f28f3d3016894359847..e1dc4379e0cd100200ac53752442143ca4846fc5:/settings/flex-base.lua diff --git a/settings/flex-base.lua b/settings/flex-base.lua index fb39a32d..7860737f 100644 --- a/settings/flex-base.lua +++ b/settings/flex-base.lua @@ -5,13 +5,21 @@ local module = {} local PRE_DELETE = nil local PRE_EXTRAS = nil +local POST_DELETE = nil local MAIN_KEYS = nil local NAMES = nil 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. -place_table = osm2pgsql.define_table{ +local place_table = osm2pgsql.define_table{ name = "place", ids = { type = 'any', id_column = 'osm_id', type_column = 'osm_type' }, columns = { @@ -23,6 +31,8 @@ place_table = osm2pgsql.define_table{ { column = 'extratags', type = 'hstore' }, { column = 'geometry', type = 'geometry', projection = 'WGS84', not_null = true }, }, + data_tablespace = os.getenv("NOMINATIM_TABLESPACE_PLACE_DATA"), + index_tablespace = os.getenv("NOMINATIM_TABLESPACE_PLACE_INDEX"), indexes = {} } @@ -106,38 +116,6 @@ function Place:grab_extratags(data) return count end -function Place:grab_address(data) - local count = 0 - - if data.match ~= nil then - for k, v in pairs(self.object.tags) do - if data.match(k, v) then - self.object.tags[k] = nil - - if data.include_on_name == true then - self.has_name = true - end - - if data.out_key ~= nil then - self.address[data.out_key] = v - return 1 - end - - if k:sub(1, 5) == 'addr:' then - self.address[k:sub(6)] = v - elseif k:sub(1, 6) == 'is_in:' then - self.address[k:sub(7)] = v - else - self.address[k] = v - end - count = count + 1 - end - end - end - - return count -end - local function strip_address_prefix(k) if k:sub(1, 5) == 'addr:' then return k:sub(6) @@ -176,24 +154,6 @@ function Place:grab_address_parts(data) return count end -function Place:grab_name(data) - local count = 0 - - if data.match ~= nil then - for k, v in pairs(self.object.tags) do - if data.match(k, v) then - self.object.tags[k] = nil - self.names[k] = v - if data.include_on_name ~= false then - self.has_name = true - end - count = count + 1 - end - end - end - - return count -end function Place:grab_name_parts(data) local fallback = nil @@ -218,9 +178,6 @@ function Place:grab_name_parts(data) return fallback end -function Place:grab_tag(key) - return self.object:grab_tag(key) -end function Place:write_place(k, v, mtype, save_extra_mains) if mtype == nil then @@ -270,13 +227,13 @@ function Place:write_row(k, v, save_extra_mains) if self.geometry == nil then self.geometry = self.geom_func(self.object) end - if self.geometry:is_null() then + if self.geometry == nil or self.geometry:is_null() then return 0 end - if save_extra_mains then + if save_extra_mains ~= nil then for extra_k, extra_v in pairs(self.object.tags) do - if extra_k ~= k then + if extra_k ~= k and save_extra_mains(extra_k, extra_v) then self.extratags[extra_k] = extra_v end end @@ -293,8 +250,10 @@ function Place:write_row(k, v, save_extra_mains) } if save_extra_mains then - for k, v in pairs(self.object.tags) do - self.extratags[k] = nil + for tk, tv in pairs(self.object.tags) do + if save_extra_mains(tk, tv) then + self.extratags[tk] = nil + end end end @@ -421,8 +380,19 @@ 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 osm2pgsql.process_node(object) +function module.process_node(object) local function geom_func(o) return o:as_point() @@ -431,13 +401,16 @@ function osm2pgsql.process_node(object) module.process_tags(Place.new(object, geom_func)) end -function osm2pgsql.process_way(object) +function module.process_way(object) local function geom_func(o) local geom = o:as_polygon() if geom:is_null() then geom = o:as_linestring() + if not geom:is_null() and geom:length() > 30 then + return nil + end end return geom @@ -446,7 +419,7 @@ function osm2pgsql.process_way(object) module.process_tags(Place.new(object, geom_func)) end -function osm2pgsql.process_relation(object) +function module.process_relation(object) local geom_func = module.RELATION_TYPES[object.tags.type] if geom_func ~= nil then @@ -454,6 +427,11 @@ function osm2pgsql.process_relation(object) end end +-- The process functions are used by default by osm2pgsql. +osm2pgsql.process_node = module.process_node +osm2pgsql.process_way = module.process_way +osm2pgsql.process_relation = module.process_relation + function module.process_tags(o) o:clean{delete = PRE_DELETE, extra = PRE_EXTRAS} @@ -474,7 +452,7 @@ function module.process_tags(o) if o.address.country ~= nil and #o.address.country ~= 2 then o.address['country'] = nil end - if fallback == nil and o.address.postcode ~= nil then + if POSTCODE_FALLBACK and fallback == nil and o.address.postcode ~= nil then fallback = {'place', 'postcode', 'always'} end @@ -483,7 +461,7 @@ function module.process_tags(o) return end - o:clean{delete = POST_DELETE, extra = POST_EXTRAS} + o:clean{delete = POST_DELETE} -- collect main keys for k, v in pairs(o.object.tags) do @@ -507,37 +485,65 @@ end 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.extratag_keys, - tags = data.extratag_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) + if data.postcode_fallback ~= nil then + 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) if data.extra_keys == nil and data.extra_tags == nil then - POST_DELETE = module.tag_match{data.delete_keys, tags = data.delete_tags} - POST_EXTRAS = nil - SAVE_EXTRA_MAINS = true + POST_DELETE = module.tag_match{keys = data.delete_keys, tags = data.delete_tags} + SAVE_EXTRA_MAINS = function() return true end elseif data.delete_keys == nil and data.delete_tags == nil then POST_DELETE = nil - POST_EXTRAS = module.tag_match{data.extra_keys, tags = data.extra_tags} - SAVE_EXTRA_MAINS = false + SAVE_EXTRA_MAINS = module.tag_match{keys = data.extra_keys, tags = data.extra_tags} else error("unused handler can have only 'extra_keys' or 'delete_keys' set.") end end -function set_relation_types(data) +function module.set_relation_types(data) module.RELATION_TYPES = {} for k, v in data do if v == 'multipolygon' then