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'];