From: Sarah Hoffmann Date: Mon, 2 May 2022 14:06:02 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~112 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/b8d41cf38cb9abead17f53fc42c28b65e0ae62b7?hp=e941a3f00b2944e0d624f395e9a252d29ad4c95c Merge remote-tracking branch 'upstream/master' --- diff --git a/docs/admin/Migration.md b/docs/admin/Migration.md index bc649918..11ee7f05 100644 --- a/docs/admin/Migration.md +++ b/docs/admin/Migration.md @@ -15,6 +15,15 @@ breaking changes. **Please read them before running the migration.** If you are migrating from a version <3.6, then you still have to follow the manual migration steps up to 3.6. +## 4.0.0 -> master + +### geocodejson output changed + +The `type` field of the geocodejson output has changed. It now contains +the address class of the object instead of the value of the OSM tag. If +your client has used the `type` field, switch them to read `osm_value` +instead. + ## 3.7.0 -> 4.0.0 ### NOMINATIM_PHRASE_CONFIG removed diff --git a/docs/api/Output.md b/docs/api/Output.md index 07525a98..d59f75dd 100644 --- a/docs/api/Output.md +++ b/docs/api/Output.md @@ -98,7 +98,10 @@ The GeocodeJSON format follows the The following feature attributes are implemented: * `osm_type`, `osm_id` - reference to the OSM object (unofficial extension, [see notes](#osm-reference)) - * `type` - value of the main tag of the object (e.g. residential, restaurant, ...) + * `type` - the 'address level' of the object ('house', 'street', `district`, `city`, + `county`, `state`, `country`, `locality`) + * `osm_key`- key of the main tag of the OSM object (e.g. boundary, highway, amenity) + * `osm_value` - value of the main tag of the OSM object (e.g. residential, restaurant) * `label` - full comma-separated address * `name` - localised name of the place * `housenumber`, `street`, `locality`, `district`, `postcode`, `city`, diff --git a/lib-php/lib.php b/lib-php/lib.php index 9babe5ed..d17c9d72 100644 --- a/lib-php/lib.php +++ b/lib-php/lib.php @@ -206,6 +206,36 @@ function parseLatLon($sQuery) return array($sFound, $fQueryLat, $fQueryLon); } +function addressRankToGeocodeJsonType($iAddressRank) +{ + if ($iAddressRank >= 29 && $iAddressRank <= 30) { + return 'house'; + } + if ($iAddressRank >= 26 && $iAddressRank < 28) { + return 'street'; + } + if ($iAddressRank >= 22 && $iAddressRank < 26) { + return 'locality'; + } + if ($iAddressRank >= 17 && $iAddressRank < 22) { + return 'district'; + } + if ($iAddressRank >= 13 && $iAddressRank < 17) { + return 'city'; + } + if ($iAddressRank >= 10 && $iAddressRank < 13) { + return 'county'; + } + if ($iAddressRank >= 5 && $iAddressRank < 10) { + return 'state'; + } + if ($iAddressRank >= 4 && $iAddressRank < 5) { + return 'country'; + } + + return 'locality'; +} + if (!function_exists('array_key_last')) { function array_key_last(array $array) { diff --git a/lib-php/template/search-geocodejson.php b/lib-php/template/search-geocodejson.php index b8727719..5439e3cf 100644 --- a/lib-php/template/search-geocodejson.php +++ b/lib-php/template/search-geocodejson.php @@ -25,8 +25,10 @@ foreach ($aSearchResults as $iResNum => $aPointDetails) { $aPlace['properties']['geocoding']['osm_type'] = $sOSMType; $aPlace['properties']['geocoding']['osm_id'] = $aPointDetails['osm_id']; } + $aPlace['properties']['geocoding']['osm_key'] = $aPointDetails['class']; + $aPlace['properties']['geocoding']['osm_value'] = $aPointDetails['type']; - $aPlace['properties']['geocoding']['type'] = $aPointDetails['type']; + $aPlace['properties']['geocoding']['type'] = addressRankToGeocodeJsonType($aPointDetails['rank_address']); $aPlace['properties']['geocoding']['label'] = $aPointDetails['langaddress']; diff --git a/nominatim/tools/check_database.py b/nominatim/tools/check_database.py index 3640197b..7ac31271 100644 --- a/nominatim/tools/check_database.py +++ b/nominatim/tools/check_database.py @@ -23,6 +23,7 @@ class CheckState(Enum): FAIL = 1 FATAL = 2 NOT_APPLICABLE = 3 + WARN = 4 def _check(hint=None): """ Decorator for checks. It adds the function to the list of @@ -40,6 +41,11 @@ def _check(hint=None): params = {} if ret == CheckState.OK: print('\033[92mOK\033[0m') + elif ret == CheckState.WARN: + print('\033[93mWARNING\033[0m') + if hint: + print('') + print(dedent(hint.format(**params))) elif ret == CheckState.NOT_APPLICABLE: print('not applicable') else: @@ -180,6 +186,23 @@ def check_tokenizer(_, config): return CheckState.FAIL, dict(msg=result) +@_check(hint="""\ + Wikipedia/Wikidata importance tables missing. + Quality of search results may be degraded. Reverse geocoding is unaffected. + See https://nominatim.org/release-docs/latest/admin/Import/#wikipediawikidata-rankings + """) +def check_existance_wikipedia(conn, _): + """ Checking for wikipedia/wikidata data + """ + if not conn.table_exists('search_name'): + return CheckState.NOT_APPLICABLE + + with conn.cursor() as cur: + cnt = cur.scalar('SELECT count(*) FROM wikipedia_article') + + return CheckState.WARN if cnt == 0 else CheckState.OK + + @_check(hint="""\ The indexing didn't finish. {count} entries are not yet indexed.