]> git.openstreetmap.org Git - nominatim.git/blob - docs/customize/Import-Styles.md
put postcodes in extra table on import
[nominatim.git] / docs / customize / Import-Styles.md
1 # Configuring the Import of OSM data
2
3 In the very first step of a Nominatim import, OSM data is loaded into the
4 database. Nominatim uses [osm2pgsql](https://osm2pgsql.org) for this task.
5 It comes with a [flex style](https://osm2pgsql.org/doc/manual.html#the-flex-output)
6 specifically tailored to filter and convert OSM data into Nominatim's
7 internal data representation. Nominatim ships with a few preset
8 configurations for this import, each results in a geocoding database of
9 different detail. The
10 [Import section](../admin/Import.md#filtering-imported-data) explains
11 these default configurations in detail.
12
13 If you want to have more control over which OSM data is added to the database,
14 you can also create your own custom style. Create a new lua style file, put it
15 into your project directory and then set `NOMINATIM_IMPORT_STYLE` to the name
16 of the file. Custom style files can be used to modify the existing preset
17 configurations or to implement your own configuration from scratch.
18
19 The remainder of the page describes how the flex style works and how to
20 customize it.
21
22 ## The `flex-base` lua module
23
24 The core of Nominatim's flex import configuration is the `flex-base` module.
25 It defines the table layout used by Nominatim and provides standard
26 implementations for the import callbacks that help with customizing
27 how OSM tags are used by Nominatim.
28
29 Every custom style must include this module to make sure that the correct
30 tables are created. Thus start your custom style as follows:
31
32 ``` lua
33 local flex = require('flex-base')
34 ```
35
36 ### Using preset configurations
37
38 If you want to start with one of the existing presets, then you can import
39 its settings using the `load_topic()` function:
40
41 ``` lua
42 local flex = require('flex-base')
43
44 flex.load_topic('streets')
45 ```
46
47 The `load_topic` function takes an optional second configuration
48 parameter. The available options are explained in the
49 [themepark section](#using-osm2pgsql-themepark).
50
51 Available topics are: `admin`, `street`, `address`, `full`. These topic
52 correspond to the [import styles](../admin/Import.md#filtering-imported-data)
53 you can choose during import. To start with the 'extratags' style, use the
54 `full` topic with the appropriate config parameter:
55
56 ``` lua
57 flex.load_topic('full', {with_extratags = true})
58 ```
59
60 !!! note
61     You can also directly import the preset style files, e.g.
62     `local flex = require('import-street')`. It is not possible to
63     set extra configuration this way.
64
65 ### How processing works
66
67 When Nominatim processes an OSM object, it looks for four kinds of tags:
68 The _main tags_ classify what kind of place the OSM object represents. One
69 OSM object can have more than one main tag. In such case one database entry
70 is created for each main tag. _Name tags_ represent searchable names of the
71 place. _Address tags_ are used to compute the address information of the place.
72 Address tags are used for searching and for creating a display name of the place.
73 _Extra tags_ are any tags that are not directly related to search but
74 contain interesting additional information. These are just saved in the database
75 and may be returned with the result [on request](../api/Search.md#output-details).
76
77 !!! danger
78     Some tags in the extratags category are used by Nominatim to better
79     classify the place. These tags will always be added, independent of
80     any settings in the style.
81
82 Configuring the style means deciding which key and/or key/value is used
83 in which category.
84
85 ## Changing the recognized tags
86
87 The flex style offers a number of functions to set the classification of
88 each OSM tag. Most of these functions can also take a preset string instead
89 of a tag description. These presets describe common configurations that
90 are also used in the definition of the predefined styles. This section
91 lists the configuration functions and the accepted presets.
92
93 #### Key match lists
94
95 Some of the following functions take _key match lists_. These lists can
96 contain three kinds of strings to match against tag keys:
97 A string that ends in an asterisk `*` is a prefix match and accordingly matches
98 against any key that starts with the given string (minus the `*`). 
99 A suffix match can be defined similarly with a string that starts with a `*`.
100 Any other string is matched exactly against tag keys.
101
102 ###  Main tags
103
104 `set/modify_main_tags()` allow to define which tags are used as main tags. It
105 takes a lua table parameter which defines for keys and key/value
106 combinations, how they are classified.
107
108 The following classifications are recognized:
109
110 | classification  | meaning |
111 | :-------------- | :------ |
112 | always          | Unconditionally use this tag as a main tag. |
113 | named           | Consider as main tag, when the object has a primary name (see [names](#name-tags) below) |
114 | named_with_key  | Consider as main tag, when the object has a primary name with a domain prefix. For example, if the main tag is  `bridge=yes`, then it will only be added as an extra entry, if there is a tag `bridge:name[:XXX]` for the same object. If this property is set, all names that are not domain-specific are ignored. |
115 | fallback        | Consider as main tag only when no other main tag was found. Fallback always implies `named`, i.e. fallbacks are only tried for objects with primary names. |
116 | postcode_area   | Tag indicates a postcode area. Copy area into the table of postcodes but only when the object is a relation and has a postcode tagged. |
117 | delete          | Completely ignore the tag in any further processing |
118 | extra           | Move the tag to extratags and then ignore it for further processing |
119 | `<function>`| Advanced handling, see [below](#advanced-main-tag-handling) |
120
121 Each key in the table parameter defines an OSM tag key. The value may
122 be directly a classification as described above. Then the tag will
123 be considered a main tag for any possible value that is not further defined.
124 To further restrict which values are acceptable, give a table with the
125 permitted values and their kind of main tag. If the table contains a simple
126 value without key, then this is used as default for values that are not listed.
127
128 `set_main_tags()` will completely replace the current main tag configuration
129 with the new configuration. `modify_main_tags()` will merge the new
130 configuration with the existing one. Merging is done at value level.
131 For example, when the current setting is `highway = {'always', primary = 'named'}`,
132 then `set_main_tags{highway = 'delete'}` will result in a rule
133 `highway = {'delete', primary = 'named'}`.
134
135 !!! example
136     ``` lua
137     local flex = require('import-full')
138
139     flex.set_main_tags{
140         boundary = {administrative = 'named'},
141         highway = {'always', street_lamp = 'named', no = 'delete'},
142         landuse = 'fallback'
143     }
144     ```
145
146     In this example an object with a `boundary` tag will only be included
147     when it has a value of `administrative`. Objects with `highway` tags are
148     always included with two exceptions: the troll tag `highway=no` is
149     deleted on the spot. And when the value is `street_lamp` then the object
150     must also have a name, to be included. Finally, if a `landuse` tag is
151     present then it will be used independently of the concrete value when
152     neither boundary nor highway tags were found and the object is named.
153
154 ##### Presets
155
156 | Name   | Description |
157 | :----- | :---------- |
158 | admin  | Basic tag set collecting places and administrative boundaries. This set is needed also to ensure proper address computation and should therefore always be present. You can disable selected place types like `place=locality` after adding this set, if they are not relevant for your use case. |
159 | all_boundaries | Extends the set of recognized boundaries and places to all available ones. |
160 | natural | Tags for natural features like rivers and mountain peaks. |
161 | street/default | Tags for streets. Major streets are always included, minor ones only when they have a name. |
162 | street/car | Tags for all streets that can be used by a motor vehicle. |
163 | street/all | Includes all highway features named and unnamed. |
164 | poi/delete | Adds most POI features with and without name. Some frequent but very domain-specific values are excluded by deleting them. |
165 | poi/extra | Like 'poi/delete' but excluded values are moved to extratags. |
166
167
168 ##### Advanced main tag handling
169
170 The groups described above are in fact only a preset for a filtering function
171 that is used to make the final decision how a pre-selected main tag is entered
172 into Nominatim's internal table. To further customize handling you may also
173 supply your own filtering function.
174
175 The function takes up to three parameters: a Place object of the object
176 being processed, the key of the main tag and the value of the main tag.
177 The function may return one of three values:
178
179 * `nil` or `false` causes the entry to be ignored
180 * the Place object causes the place to be added as is
181 * `Place.copy(names=..., address=..., extratags=...) causes the
182   place to be enter into the database but with name/address/extratags
183   set to the given different values.
184
185 The Place object has some read-only values that can be used to determine
186 the handling:
187
188 * **object** is the original OSM object data handed in by osm2pgsql
189 * **admin_level** is the content of the admin_level tag, parsed into an integer and normalized to a value between 0 and 15
190 * **has_name** is a boolean indicating if the object has a primary name tag
191 * **names** is a table with the collected list of name tags
192 * **address** is a table with the collected list of address tags
193 * **extratags** is a table with the collected list of additional tags to save
194
195 !!! example
196     ``` lua
197     local flex = require('flex-base')
198
199     flex.add_topic('street')
200
201     local function no_sidewalks(place, k, v)
202         if place.object.tags.footway == 'sidewalk' then
203             return false
204         end
205
206         -- default behaviour is to have all footways
207         return place
208     end
209
210     flex.modify_main_tags(highway = {'footway' = no_sidewalks}
211     ```
212     This script adds a custom handler for `highway=footway`. It only includes
213     them in the database, when the object doesn't have a tag `footway=sidewalk`
214     indicating that it is just part of a larger street which should already
215     be indexed. Note that it is not necessary to check the key and value
216     of the main tag because the function is only used for the specific
217     main tag.
218
219
220 ### Ignored tags
221
222 The function `ignore_keys()` sets the `delete` classification for keys.
223 This function takes a _key match list_ so that it is possible to exclude
224 groups of keys.
225
226 Note that full matches always take precedence over suffix matches, which
227 in turn take precedence over prefix matches.
228
229 !!! example
230     ``` lua
231     local flex = require('flex-base')
232
233     flex.add_topic('admin')
234     flex.ignore_keys{'old_name', 'old_name:*'}
235     ```
236
237     This example uses the `admin` preset with the exception that names
238     that are no longer are in current use, are ignored.
239
240 ##### Presets
241
242 | Name     | Description |
243 | :-----   | :---------- |
244 | metatags | Tags with meta information about the OSM tag like source, notes and import sources. |
245 | name     | Non-names that actually describe properties or name parts. These names can throw off search and should always be removed. |
246 | address  | Extra `addr:*` tags that are not useful for Nominatim. |
247
248
249 ### Tags for `extratags`
250
251 The function `add_for_extratags()` sets the `extra` classification for keys.
252 This function takes a
253 _key match list_ so that it is possible to move groups of keys to extratags.
254
255 Note that full matches always take precedence over suffix matches, which
256 in turn take precedence over prefix matches.
257
258 !!! example
259     ``` lua
260     local flex = require('flex-base')
261
262     flex.add_topic('street')
263     flex.add_for_extratags{'surface', 'access', 'vehicle', 'maxspeed'}
264     ```
265
266     This example uses the `street` preset but adds a couple of tags that
267     are of interest about the condition of the street.
268
269 ##### Presets
270
271 Accepts all [presets from ignored tags](#presets_1).
272
273 ### General pre-filtering
274
275 _(deprecated)_ `set_prefilters()` allows to set the `delete` and `extra`
276 classification for main tags.
277
278 This function removes all previously set main tags with `delete` and `extra`
279 classification and then adds the newly defined tags.
280
281 `set_prefilters()` takes a table with four optional fields:
282
283 * __delete_keys__ is a _key match list_ for tags that should be deleted
284 * __delete_tags__ contains a table of tag keys pointing to a list of tag
285   values. Tags with matching key/value pairs are deleted.
286 * __extra_keys__ is a _key match list_ for tags which should be saved into
287   extratags
288 * __extra_tags__ contains a table of tag keys pointing to a list of tag
289   values. Tags with matching key/value pairs are moved to extratags.
290
291 !!! danger "Deprecation warning"
292     Use of this function should be replaced with `modify_main_tags()` to
293     set the data from `delete_tags` and `extra_tags`, with `ignore_keys()`
294     for the `delete_keys` parameter and with `add_for_extratags()` for the
295     `extra_keys` parameter.
296
297 ### Name tags
298
299 `set/modify_name_tags()` allow to define the tags used for naming places. Name tags
300 can only be selected by their keys. The import script distinguishes
301 between primary and auxiliary names. A primary name is the given name of
302 a place. Having a primary name makes a place _named_. This is important
303 for main tags that are only included when a name is present. Auxiliary names
304 are identifiers like references. They may be searched for but should not
305 be included on their own.
306
307 The functions take a table with two optional fields `main` and `extra`.
308 They take _key match lists_ for primary and auxiliary names respectively.
309 A third field `house` can contain tags for names that appear in place of
310 house numbers in addresses. This field can only contain complete key names.
311 'house tags' are special in that they cause the OSM object to be added to
312 the database independently of the presence of other main tags.
313
314 `set_name_tags()` overwrites the current configuration, while
315 `modify_name_tags()` replaces the fields that are given. (Be aware that
316 the fields are replaced as a whole. `main = {'foo_name'}` will cause
317 `foo_name` to become the only recognized primary name. Any previously
318 defined primary names are forgotten.)
319
320 !!! example
321     ``` lua
322     local flex = require('flex-base')
323
324     flex.set_main_tags{highway = {traffic_light = 'named'}}
325     flex.set_name_tags{main = {'name', 'name:*'},
326                        extra = {'ref'}
327                       }
328     ```
329
330     This example creates a search index over traffic lights but will
331     only include those that have a common name and not those which just
332     have some reference ID from the city.
333
334 ##### Presets
335
336 | Name     | Description |
337 | :-----   | :---------- |
338 | core     | Basic set of recognized names for all places. |
339 | address  | Additional names useful when indexing full addresses. |
340 | poi      | Extended set of recognized names for pois. Use on top of the core set. |
341
342 ### Address tags
343
344 `set/modify_address_tags()` defines the tags that will be used to build
345 up the address of an object. Address tags can only be chosen by their key.
346
347 The functions take a table with arbitrary fields, each defining
348 a key list or _key match list_. Some fields have a special meaning:
349
350 | Field     | Type      | Description |
351 | :---------| :-------- | :-----------|
352 | main      | key list  | Tags that make a full address object out of the OSM object. This is usually the house number or variants thereof. If a main address tag appears, then the object will always be included, if necessary with a fallback of `place=house`. If the key has a prefix of `addr:` or `is_in:` this will be stripped. |
353 | extra     | key match list | Supplementary tags for addresses, tags like `addr:street`, `addr:city` etc. If the key has a prefix of `addr:` or `is_in:` this will be stripped. |
354 | interpolation | key list | Tags that identify address interpolation lines. |
355 | country   | key match list | Tags that may contain the country the place is in. The first found value with a two-letter code will be accepted, all other values are discarded. |
356 | _other_   | key match list | Summary field. If a key matches the key match list, then its value will be added to the address tags with the name of the field as key. If multiple tags match, then an arbitrary one wins. |
357
358 `set_address_tags()` overwrites the current configuration, while
359 `modify_address_tags()` replaces the fields that are given. (Be aware that
360 the fields are replaced as a whole.)
361
362 !!! example
363     ``` lua
364     local flex = require('import-full')
365
366     flex.set_address_tags{
367         main = {'addr:housenumber'},
368         extra = {'addr:*'},
369         postcode = {'postal_code', 'postcode', 'addr:postcode'},
370         country = {'country_code', 'ISO3166-1'}
371     }
372     ```
373
374     In this example all tags which begin with `addr:` will be saved in
375     the address tag list. If one of the tags is `addr:housenumber`, the
376     object will fall back to be entered as a `place=house` in the database
377     unless there is another interested main tag to be found.
378
379     Tags with keys `country_code` and `ISO3166-1` are saved with their
380     value under `country` in the address tag list. The same thing happens
381     to postcodes, they will always be saved under the key `postcode` thus
382     normalizing the multitude of keys that are used in the OSM database.
383
384 ##### Presets
385
386 | Name     | Description |
387 | :-----   | :---------- |
388 | core     | Basic set of tags needed to recognize address relationship for any place. Always include this. |
389 | houses   | Additional set of tags needed to recognize proper addresses |
390
391 ### Handling of unclassified tags
392
393 `set_unused_handling()` defines what to do with tags that remain after all tags
394 have been classified using the functions above. There are two ways in
395 which the function can be used:
396
397 `set_unused_handling(delete_keys = ..., delete_tags = ...)` deletes all
398 keys that match the descriptions in the parameters and moves all remaining
399 tags into the extratags list.
400
401 `set_unused_handling(extra_keys = ..., extra_tags = ...)` moves all tags
402 matching the parameters into the extratags list and then deletes the remaining
403 tags. For the format of the parameters see the description in `set_prefilters()`
404 above.
405
406 When no special handling is set, then unused tags will be discarded with one
407 exception: place tags are kept in extratags for administrative boundaries.
408 When using a custom setting, you should also make sure that the place tag
409 is added for extratags.
410
411 !!! example
412     ``` lua
413     local flex = require('import-full')
414
415     flex.set_address_tags{
416         main = {'addr:housenumber'},
417         extra = {'addr:*', 'tiger:county'}
418     }
419     flex.set_unused_handling{delete_keys = {'tiger:*'}}
420     ```
421
422     In this example all remaining tags except those beginning with `tiger:`
423     are moved to the extratags list. Note that it is not possible to
424     already delete the tiger tags with `set_prefilters()` because that
425     would remove tiger:county before the address tags are processed.
426
427 ## Filling additional tables
428
429 Most of the OSM objects are saved in the main `place` table for further
430 processing. In addition to that, there are some smaller tables that save
431 specialised information. The content of these tables can be customized as
432 well.
433
434 ### Entrance table
435
436 The table `place_entrance` saves information about OSM nodes that represent
437 an entrance. This data is later mingled with buildings and other areas and
438 can be returned [on request](../api/Search.md#output-details). The table
439 saves the type of entrance as well as a set of custom extra tags.
440
441 The function `set_entrance_filter()` can be used to customize the table's
442 content.
443
444 When called without any parameter, then filling the entrance table will be
445 disabled. When called with a preset name, the appropriate preset will be
446 applied.
447
448 To create a custom configuration, call the function
449 with a table with the following fields:
450
451 * __main_tags__ is a list of tags that mark an entrance node. The value of the
452   first tag found in the list will be used as the entrance type.
453 * __extra_include__ is an optional list of tags to be added to the extratags
454   for this entrance. When left out, all tags except for the ones defined
455   in 'main_tags' will be included. To disable saving of extra tags, set
456   this to the empty list.
457 * __extra_exclude__ defines an optional list of tags to drop before including
458   the remaining tags as extratags. Note that the tags defined in 'main_tags'
459   will always be excluded, independently of this setting.
460
461 To have even more fine-grained control over the output, you can also hand
462 in a callback for processing entrance information. The callback function
463 receives a single parameter, the
464 [osm2pgsql object](https://osm2pgsql.org/doc/manual.html#processing-callbacks).
465 This object itself must not be modified. The callback should return either
466 `nil` when the object is not an entrance. Or it returns a table with a
467 mandatory `entrance` field containing a string with the type of entrance
468 and an optional `extratags` field with a simple key-value table of extra
469 information.
470
471 ##### Presets
472
473 | Name     | Description |
474 | :-----   | :---------- |
475 | default  | Standard configuration used with `full` and `extratags` styles. |
476
477 ## Customizing osm2pgsql callbacks
478
479 osm2pgsql expects the flex style to implement three callbacks, one process
480 function per OSM type. If you want to implement special handling for
481 certain OSM types, you can override the default implementations provided
482 by the flex-base module.
483
484 ### Enabling additional relation types
485
486 OSM relations can represent very diverse
487 [types of real-world objects](https://wiki.openstreetmap.org/wiki/Key:type). To
488 be able to process them correctly, Nominatim needs to understand how to
489 create a geometry for each type. By default, the script knows how to
490 process relations of type `multipolygon`, `boundary` and `waterway`. All
491 other relation types are ignored.
492
493 To add other types relations, set `RELATION_TYPES` for
494 the type to the kind of geometry that should be created. The following
495 kinds of geometries can be used:
496
497 * __relation_as_multipolygon__ creates a (Multi)Polygon from the ways in
498   the relation. If the ways do not form a valid area, then the object is
499   silently discarded.
500 * __relation_as_multiline__ creates a (Multi)LineString from the ways in
501   the relations. Ways are combined as much as possible without any regards
502   to their order in the relation.
503
504 !!! Example
505     ``` lua
506     local flex = require('import-full')
507
508     flex.RELATION_TYPES['site'] = flex.relation_as_multipolygon
509     ```
510
511     With this line relations of `type=site` will be included in the index
512     according to main tags found. This only works when the site relation
513     resolves to a valid area. Nodes in the site relation are not part of the
514     geometry.
515
516
517 ### Adding additional logic to processing functions
518
519 The default processing functions are also exported by the flex-base module
520 as `process_node`, `process_way` and `process_relation`. These can be used
521 to implement your own processing functions with some additional processing
522 logic.
523
524 !!! Example
525     ``` lua
526     local flex = require('import-full')
527
528     function osm2pgsql.process_relation(object)
529         if object.tags.boundary ~= 'administrative' or object.tags.admin_level ~= '2' then
530           flex.process_relation(object)
531         end
532     end
533     ```
534
535     This example discards all country-level boundaries and uses standard
536     handling for everything else. This can be useful if you want to use
537     your own custom country boundaries.
538
539
540 ### Customizing the main processing function
541
542 !!! danger "Deprecation Warning"
543     The style used to allow overwriting the internal processing function
544     `process_tags()`. While this is currently still possible, it is no longer
545     encouraged and may stop working in future versions. The internal
546     `Place` class should now be considered read-only.
547
548
549 ## Using osm2pgsql-themepark
550
551 The Nominatim osm2pgsql style is designed so that it can also be used as
552 a theme for [osm2pgsql-themepark](https://osm2pgsql.org/themepark/). This
553 makes it easy to combine Nominatim with other projects like
554 [openstreetmap-carto](https://github.com/gravitystorm/openstreetmap-carto)
555 in the same database.
556
557 To set up one of the preset styles, simply include a topic with the same name:
558
559 ```
560 local themepark = require('themepark')
561 themepark:add_topic('nominatim/address')
562 ```
563
564 Themepark topics offer two configuration options:
565
566 * **street_theme** allows to choose one of the sub topics for streets:
567     * _default_ - include all major streets and named minor paths
568     * _car_ - include all streets physically usable by cars
569     * _all_ - include all major streets and minor paths
570 * **with_extratags**, when set to a truthy value, then tags that are
571   not specifically used for address or naming are added to the
572   extratags column
573
574 The customization functions described in the
575 [Changing recognized tags](#changing-the-recognized-tags) section
576 are available from the theme. To access the theme you need to explicitly initialize it.
577
578 !!! Example
579     ``` lua
580     local themepark = require('themepark')
581
582     themepark:add_topic('nominatim/full', {with_extratags = true})
583
584     local flex = themepark:init_theme('nominatim')
585
586     flex.modify_main_tags{'amenity' = {
587                            'waste_basket' = 'delete'}
588                       }
589     ```
590     This example uses the full Nominatim configuration but disables
591     importing waste baskets.
592
593 You may also write a new configuration from scratch. Simply omit including
594 a Nominatim topic and only call the required customization functions.
595
596 Customizing the osm2pgsql processing functions as explained
597 [above](#adding-additional-logic-to-processing-functions) is not possible
598 when running under themepark. Instead include other topics that make the
599 necessary modifications or add an additional processor before including
600 the Nominatim topic.
601
602 !!! Example
603     ``` lua
604     local themepark = require('themepark')
605
606     local function discard_country_boundaries(object)
607         if object.tags.boundary == 'administrative' and object.tags.admin_level == '2' then
608             return 'stop'
609         end
610     end
611
612     themepark:add_proc('relation', discard_country_boundaries)
613     -- Order matters here. The topic needs to be added after the custom callback.
614     themepark:add_topic('nominatim/full', {with_extratags = true})
615     ```
616     Discarding country-level boundaries when running under themepark.
617
618 ## Changing the style of existing databases
619
620 There is usually no issue changing the style of a database that is already
621 imported and now kept up-to-date with change files. Just be aware that any
622 change in the style applies to updates only. If you want to change the data
623 that is already in the database, then a reimport is necessary.