]> git.openstreetmap.org Git - nominatim.git/blob - lib-lua/themes/nominatim/presets.lua
prefer leisure=nature_reserve as main tag
[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                 protected_area = 'fallback',
121                 postal_code = 'always'},
122     landuse = 'fallback',
123     place = 'always'
124 }
125
126 module.MAIN_TAGS.natural = {
127     waterway = {'named',
128                 riverbank = 'delete'},
129     natural = {'named',
130                yes = 'delete',
131                no = 'delete',
132                coastline = 'delete',
133                saddle = 'fallback',
134                water = exclude_when_key_present('water', true)},
135     mountain_pass = {'always',
136                      no = 'delete'},
137     water = {include_when_tag_present('natural', 'water', true),
138              river = 'never',
139              stream = 'never',
140              canal = 'never',
141              ditch = 'never',
142              drain = 'never',
143              fish_pass = 'never',
144              yes = 'delete',
145              intermittent = 'delete',
146              tidal = 'delete'
147              }
148 }
149
150 module.MAIN_TAGS_POIS = function (group)
151     group = group or 'delete'
152     return {
153     aerialway = {'always',
154                  no = group,
155                  pylon = group},
156     aeroway = {'always',
157                no = group},
158     amenity = {'always',
159                no = group,
160                parking_space = group,
161                parking_entrance = group,
162                waste_disposal = group,
163                hunting_stand = group},
164     building = {'fallback',
165                 no = group},
166     bridge = {'named_with_key',
167               no = group},
168     club = {'always',
169             no = group},
170     craft = {'always',
171              no = group},
172     emergency = {'always',
173                  no = group,
174                  yes = group,
175                  fire_hydrant = group},
176     healthcare = {'fallback',
177                   yes = group,
178                   no = group},
179     highway = {'always',
180                no = group,
181                turning_circle = group,
182                mini_roundabout = group,
183                noexit = group,
184                crossing = group,
185                give_way = group,
186                stop = group,
187                turning_loop = group,
188                passing_place = group,
189                street_lamp = 'named',
190                traffic_signals = 'named'},
191     historic = {'fallback',
192                 yes = group,
193                 no = group},
194     information = {include_when_tag_present('tourism', 'information'),
195                    yes = 'delete',
196                    route_marker = 'never',
197                    trail_blaze = 'never'},
198     junction = {'fallback',
199                 no = group},
200     landuse = {cemetery = 'always'},
201     leisure = {'always',
202                nature_reserve = 'named',
203                swimming_pool = 'named',
204                garden = 'named',
205                common = 'named',
206                no = group},
207     lock = {yes = lock_transform},
208     man_made = {pier = 'always',
209                 tower = 'always',
210                 bridge = 'always',
211                 works = 'named',
212                 water_tower = 'always',
213                 dyke = 'named',
214                 adit = 'named',
215                 lighthouse = 'always',
216                 watermill = 'always',
217                 tunnel = 'always'},
218     military = {'always',
219                 yes = group,
220                 no = group},
221     office = {'always',
222               no = group},
223     railway = {'named',
224                rail = group,
225                no = group,
226                abandoned = group,
227                disused = group,
228                razed = group,
229                level_crossing = group,
230                switch = group,
231                signal = group,
232                buffer_stop = group},
233     shop = {'always',
234             no = group},
235     tourism = {'always',
236                attraction = 'fallback',
237                no = group,
238                yes = group,
239                information = exclude_when_key_present('information')},
240     tunnel = {'named_with_key',
241               no = group}
242 } end
243
244 module.MAIN_TAGS_STREETS = {}
245
246 module.MAIN_TAGS_STREETS.default = {
247     place = {square = 'always'},
248     highway = {motorway = 'always',
249                trunk = 'always',
250                primary = 'always',
251                secondary = 'always',
252                tertiary = 'always',
253                unclassified = 'always',
254                residential = 'always',
255                road = 'always',
256                living_street = 'always',
257                pedestrian = 'always',
258                service = 'named',
259                cycleway = 'named',
260                path = 'named',
261                footway = filter_footways,
262                steps = 'named',
263                bridleway = 'named',
264                track = 'named',
265                motorway_link = 'named',
266                trunk_link = 'named',
267                primary_link = 'named',
268                secondary_link = 'named',
269                tertiary_link = 'named'}
270 }
271
272 module.MAIN_TAGS_STREETS.car = {
273     place = {square = 'always'},
274     highway = {motorway = 'always',
275                trunk = 'always',
276                primary = 'always',
277                secondary = 'always',
278                tertiary = 'always',
279                unclassified = 'always',
280                residential = 'always',
281                road = 'always',
282                living_street = 'always',
283                service = 'always',
284                track = 'always',
285                motorway_link = 'always',
286                trunk_link = 'always',
287                primary_link = 'always',
288                secondary_link = 'always',
289                tertiary_link = 'always'}
290 }
291
292 module.MAIN_TAGS_STREETS.all = {
293     place = {square = 'always'},
294     highway = {motorway = 'always',
295                trunk = 'always',
296                primary = 'always',
297                secondary = 'always',
298                tertiary = 'always',
299                unclassified = 'always',
300                residential = 'always',
301                road = 'always',
302                living_street = 'always',
303                pedestrian = 'always',
304                service = 'always',
305                cycleway = 'always',
306                path = 'always',
307                footway = 'always',
308                steps = 'always',
309                bridleway = 'always',
310                track = 'always',
311                motorway_link = 'always',
312                trunk_link = 'always',
313                primary_link = 'always',
314                secondary_link = 'always',
315                tertiary_link = 'always'}
316 }
317
318
319 -- name tags
320
321 module.NAME_TAGS = {}
322
323 module.NAME_TAGS.core = {main = {'name', 'name:*',
324                                  'int_name', 'int_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 -- INTERNAL: Required extra tags
379
380 module.EXTRATAGS = {keys = {'wikipedia', 'wikipedia:*', 'wikidata', 'capital'}}
381
382 -- Defaults for the entrance table
383
384 module.ENTRANCE_TABLE = {}
385
386 module.ENTRANCE_TABLE.default = {main_tags = {'entrance', 'routing:entrance'},
387                                  extra_exclude = module.IGNORE_KEYS.metatags}
388
389 return module