]> git.openstreetmap.org Git - nominatim.git/blob - lib-lua/themes/nominatim/presets.lua
add migration for separate entrance table
[nominatim.git] / lib-lua / themes / nominatim / presets.lua
1 -- Defines defaults used in the topic definitions.
2
3 local module = {}
4
5 -- Helper functions
6
7 local function group_merge(group1, group2)
8     for name, values in pairs(group2) do
9         if group1[name] == nil then
10             group1[name] = values
11         else
12             for _, v in pairs(values) do
13                 table.insert(group1[name], v)
14             end
15         end
16     end
17
18     return group1
19 end
20
21 -- Customized main tag filter functions
22
23 local EXCLUDED_FOOTWAYS = { sidewalk = 1, crossing = 1, link = 1, traffic_aisle }
24
25 local function filter_footways(place)
26     if place.has_name then
27         local footway = place.object.tags.footway
28         if footway == nil or EXCLUDED_FOOTWAYS[footway] ~= 1 then
29             return place
30         end
31     end
32     return false
33 end
34
35 local function include_when_tag_present(key, value, named)
36     if named then
37         return function(place)
38                    if place.has_name and place.intags[key] == value then
39                        return place
40                    end
41                    return false
42                end
43     else
44         return function(place)
45                    if place.intags[key] == value then
46                        return place
47                    end
48                    return false
49                end
50     end
51 end
52
53 local function exclude_when_key_present(key, named)
54     if named then
55         return function(place)
56                    if place.has_name and place.intags[key] == nil then
57                        return place
58                    end
59                    return false
60                end
61     else
62         return function(place)
63                    if place.intags[key] == nil then
64                        return place
65                    end
66                    return false
67                end
68
69     end
70 end
71
72 local function lock_transform(place)
73     if place.object.tags.waterway ~= nil then
74         local name = place.object.tags.lock_name
75         if name ~= nil then
76             return place:clone{names={name=name, ref=place.object.tags.lock_ref}}
77         end
78     end
79
80     return false
81 end
82
83 -- Main tag definition
84
85 module.MAIN_TAGS = {}
86
87 module.MAIN_TAGS.admin = {
88     boundary = {administrative = 'named'},
89     landuse = {residential = 'fallback',
90                farm = 'fallback',
91                farmyard = 'fallback',
92                industrial = 'fallback',
93                commercial = 'fallback',
94                allotments = 'fallback',
95                retail = 'fallback'},
96     place = {county = 'always',
97              district = 'always',
98              municipality = 'always',
99              city = 'always',
100              town = 'always',
101              borough = 'always',
102              village = 'always',
103              suburb = 'always',
104              hamlet = 'always',
105              croft = 'always',
106              subdivision = 'always',
107              allotments = 'always',
108              neighbourhood = 'always',
109              quarter = 'always',
110              isolated_dwelling = 'always',
111              farm = 'always',
112              city_block = 'always',
113              locality = 'always'}
114 }
115
116 module.MAIN_TAGS.all_boundaries = {
117     boundary = {'named',
118                 place = 'delete',
119                 land_area = 'delete',
120                 postal_code = 'always'},
121     landuse = 'fallback',
122     place = 'always'
123 }
124
125 module.MAIN_TAGS.natural = {
126     waterway = {'named',
127                 riverbank = 'delete'},
128     natural = {'named',
129                yes = 'delete',
130                no = 'delete',
131                coastline = 'delete',
132                saddle = 'fallback',
133                water = exclude_when_key_present('water', true)},
134     mountain_pass = {'always',
135                      no = 'delete'},
136     water = {include_when_tag_present('natural', 'water', true),
137              river = 'never',
138              stream = 'never',
139              canal = 'never',
140              ditch = 'never',
141              drain = 'never',
142              fish_pass = 'never',
143              yes = 'delete',
144              intermittent = 'delete',
145              tidal = 'delete'
146              }
147 }
148
149 module.MAIN_TAGS_POIS = function (group)
150     group = group or 'delete'
151     return {
152     aerialway = {'always',
153                  no = group,
154                  pylon = group},
155     aeroway = {'always',
156                no = group},
157     amenity = {'always',
158                no = group,
159                parking_space = group,
160                parking_entrance = group,
161                waste_disposal = group,
162                hunting_stand = group},
163     building = {'fallback',
164                 no = group},
165     bridge = {'named_with_key',
166               no = group},
167     club = {'always',
168             no = group},
169     craft = {'always',
170              no = group},
171     emergency = {'always',
172                  no = group,
173                  yes = group,
174                  fire_hydrant = group},
175     healthcare = {'fallback',
176                   yes = group,
177                   no = group},
178     highway = {'always',
179                no = group,
180                turning_circle = group,
181                mini_roundabout = group,
182                noexit = group,
183                crossing = group,
184                give_way = group,
185                stop = group,
186                turning_loop = group,
187                passing_place = group,
188                street_lamp = 'named',
189                traffic_signals = 'named'},
190     historic = {'fallback',
191                 yes = group,
192                 no = group},
193     information = {include_when_tag_present('tourism', 'information'),
194                    yes = 'delete',
195                    route_marker = 'never',
196                    trail_blaze = 'never'},
197     junction = {'fallback',
198                 no = group},
199     landuse = {cemetery = 'always'},
200     leisure = {'always',
201                nature_reserve = 'fallback',
202                swimming_pool = 'named',
203                garden = 'named',
204                common = 'named',
205                no = group},
206     lock = {yes = lock_transform},
207     man_made = {pier = 'always',
208                 tower = 'always',
209                 bridge = 'always',
210                 works = 'named',
211                 water_tower = 'always',
212                 dyke = 'named',
213                 adit = 'named',
214                 lighthouse = 'always',
215                 watermill = 'always',
216                 tunnel = 'always'},
217     military = {'always',
218                 yes = group,
219                 no = group},
220     office = {'always',
221               no = group},
222     railway = {'named',
223                rail = group,
224                no = group,
225                abandoned = group,
226                disused = group,
227                razed = group,
228                level_crossing = group,
229                switch = group,
230                signal = group,
231                buffer_stop = group},
232     shop = {'always',
233             no = group},
234     tourism = {'always',
235                attraction = 'fallback',
236                no = group,
237                yes = group,
238                information = exclude_when_key_present('information')},
239     tunnel = {'named_with_key',
240               no = group}
241 } end
242
243 module.MAIN_TAGS_STREETS = {}
244
245 module.MAIN_TAGS_STREETS.default = {
246     place = {square = 'always'},
247     highway = {motorway = 'always',
248                trunk = 'always',
249                primary = 'always',
250                secondary = 'always',
251                tertiary = 'always',
252                unclassified = 'always',
253                residential = 'always',
254                road = 'always',
255                living_street = 'always',
256                pedestrian = 'always',
257                service = 'named',
258                cycleway = 'named',
259                path = 'named',
260                footway = filter_footways,
261                steps = 'named',
262                bridleway = 'named',
263                track = 'named',
264                motorway_link = 'named',
265                trunk_link = 'named',
266                primary_link = 'named',
267                secondary_link = 'named',
268                tertiary_link = 'named'}
269 }
270
271 module.MAIN_TAGS_STREETS.car = {
272     place = {square = 'always'},
273     highway = {motorway = 'always',
274                trunk = 'always',
275                primary = 'always',
276                secondary = 'always',
277                tertiary = 'always',
278                unclassified = 'always',
279                residential = 'always',
280                road = 'always',
281                living_street = 'always',
282                service = 'always',
283                track = 'always',
284                motorway_link = 'always',
285                trunk_link = 'always',
286                primary_link = 'always',
287                secondary_link = 'always',
288                tertiary_link = 'always'}
289 }
290
291 module.MAIN_TAGS_STREETS.all = {
292     place = {square = 'always'},
293     highway = {motorway = 'always',
294                trunk = 'always',
295                primary = 'always',
296                secondary = 'always',
297                tertiary = 'always',
298                unclassified = 'always',
299                residential = 'always',
300                road = 'always',
301                living_street = 'always',
302                pedestrian = 'always',
303                service = 'always',
304                cycleway = 'always',
305                path = 'always',
306                footway = 'always',
307                steps = 'always',
308                bridleway = 'always',
309                track = 'always',
310                motorway_link = 'always',
311                trunk_link = 'always',
312                primary_link = 'always',
313                secondary_link = 'always',
314                tertiary_link = 'always'}
315 }
316
317
318 -- name tags
319
320 module.NAME_TAGS = {}
321
322 module.NAME_TAGS.core = {main = {'name', 'name:*',
323                                  'int_name', 'int_name:*',
324                                  'nat_name', 'nat_name:*',
325                                  'reg_name', 'reg_name:*',
326                                  'loc_name', 'loc_name:*',
327                                  'old_name', 'old_name:*',
328                                  'alt_name', 'alt_name:*', 'alt_name_*',
329                                  'official_name', 'official_name:*',
330                                  'place_name', 'place_name:*',
331                                  'short_name', 'short_name:*'},
332                          extra = {'ref', 'int_ref', 'nat_ref', 'reg_ref',
333                                   'loc_ref', 'old_ref', 'ISO3166-2'}
334                         }
335 module.NAME_TAGS.address = {house = {'addr:housename'}}
336 module.NAME_TAGS.poi = group_merge({main = {'brand'},
337                                     extra = {'iata', 'icao', 'faa'}},
338                                    module.NAME_TAGS.core)
339
340 -- Address tagging
341
342 module.ADDRESS_TAGS = {}
343
344 module.ADDRESS_TAGS.core = { extra = {'addr:*', 'is_in:*', 'tiger:county'},
345                              postcode = {'postal_code', 'postcode', 'addr:postcode',
346                                          'tiger:zip_left', 'tiger:zip_right'},
347                              country = {'country_code', 'ISO3166-1',
348                                         'addr:country_code', 'is_in:country_code',
349                                         'addr:country', 'is_in:country'}
350                            }
351
352 module.ADDRESS_TAGS.houses = { main = {'addr:housenumber',
353                                        'addr:conscriptionnumber',
354                                        'addr:streetnumber'},
355                                interpolation = {'addr:interpolation'}
356                              }
357
358 -- Ignored tags (prefiltered away)
359
360 module.IGNORE_KEYS = {}
361
362 module.IGNORE_KEYS.metatags = {'note', 'note:*', 'source', 'source:*', '*source',
363                                'attribution', 'comment', 'fixme', 'created_by',
364                                'tiger:cfcc', 'tiger:reviewed', 'nysgissam:*',
365                                'NHD:*', 'nhd:*', 'gnis:*', 'geobase:*', 'yh:*',
366                                'osak:*', 'naptan:*', 'CLC:*', 'import', 'it:fvg:*',
367                                'lacounty:*', 'ref:linz:*', 'survey:*',
368                                'ref:bygningsnr', 'ref:ruian:*', 'building:ruian:type',
369                                'type',
370                                'is_in:postcode'}
371 module.IGNORE_KEYS.name = {'*:prefix', '*:suffix', 'name:prefix:*', 'name:suffix:*',
372                            'name:etymology', 'name:etymology:*',
373                            'name:signed', 'name:botanical'}
374 module.IGNORE_KEYS.address = {'addr:street:*', 'addr:city:*', 'addr:district:*',
375                               'addr:province:*', 'addr:subdistrict:*', 'addr:place:*',
376                               'addr:TW:dataset'}
377
378 -- Extra tags (prefiltered away)
379
380 module.EXTRATAGS = {}
381
382 module.EXTRATAGS.required = {'wikipedia', 'wikipedia:*', 'wikidata', 'capital'}
383
384 return module
385
386 -- Defaults for the entrance table
387
388 module.ENTRACE_TABLE.default = {main_tags = {'entrance', 'routing:entrance'},
389                                 extra_exclude=module.IGNORE_KEYS.metatags}