mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-11-09 16:26:02 +03:00
add support for house numbers without street
This commit is contained in:
parent
2df0cafb24
commit
ddc46acd26
@ -888,9 +888,9 @@ BEGIN
|
||||
FOR housenum IN startnumber..endnumber BY stepsize LOOP
|
||||
-- this should really copy postcodes but it puts a huge burdon on the system for no big benefit
|
||||
-- ideally postcodes should move up to the way
|
||||
insert into placex (osm_type, osm_id, class, type, admin_level, housenumber, street, isin, postcode,
|
||||
insert into placex (osm_type, osm_id, class, type, admin_level, housenumber, street, addr_place, isin, postcode,
|
||||
country_code, parent_place_id, rank_address, rank_search, indexed_status, geometry)
|
||||
values ('N',prevnode.osm_id, prevnode.class, prevnode.type, prevnode.admin_level, housenum, prevnode.street, prevnode.isin, coalesce(prevnode.postcode, defpostalcode),
|
||||
values ('N',prevnode.osm_id, prevnode.class, prevnode.type, prevnode.admin_level, housenum, prevnode.street, prevnode.addr_place, prevnode.isin, coalesce(prevnode.postcode, defpostalcode),
|
||||
prevnode.country_code, prevnode.parent_place_id, prevnode.rank_address, prevnode.rank_search, 1, ST_Line_Interpolate_Point(linegeo, (housenum::float-orginalstartnumber::float)/originalnumberrange::float));
|
||||
newpoints := newpoints + 1;
|
||||
--RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
|
||||
@ -1461,13 +1461,18 @@ BEGIN
|
||||
END IF;
|
||||
|
||||
-- If the way contains an explicit name of a street copy it
|
||||
IF NEW.street IS NULL AND location.street IS NOT NULL THEN
|
||||
IF NEW.street IS NULL AND NEW.addr_place IS NULL AND location.street IS NOT NULL THEN
|
||||
--RAISE WARNING 'node in way that has a streetname %',location;
|
||||
NEW.street := location.street;
|
||||
END IF;
|
||||
|
||||
-- IF the way contains an explicit name of a place copy it
|
||||
IF NEW.addr_place IS NULL AND NEW.street IS NULL AND location.addr_place IS NOT NULL THEN
|
||||
NEW.addr_place := location.addr_place;
|
||||
END IF;
|
||||
|
||||
-- If this way is a street interpolation line then it is probably as good as we are going to get
|
||||
IF NEW.parent_place_id IS NULL AND NEW.street IS NULL AND location.class = 'place' and location.type='houses' THEN
|
||||
IF NEW.parent_place_id IS NULL AND NEW.street IS NULL AND NEW.addr_place IS NULL AND location.class = 'place' and location.type='houses' THEN
|
||||
-- Try and find a way that is close roughly parellel to this line
|
||||
FOR relation IN SELECT place_id FROM placex
|
||||
WHERE ST_DWithin(location.geometry, placex.geometry, 0.001) and placex.rank_search = 26
|
||||
@ -1516,6 +1521,15 @@ BEGIN
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
IF NEW.parent_place_id IS NULL AND NEW.addr_place IS NOT NULL THEN
|
||||
address_street_word_id := get_name_id(make_standard_name(NEW.addr_place));
|
||||
IF address_street_word_id IS NOT NULL THEN
|
||||
FOR location IN SELECT * from getNearestNamedPlaceFeature(NEW.partition, place_centroid, address_street_word_id) LOOP
|
||||
NEW.parent_place_id := location.place_id;
|
||||
END LOOP;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
--RAISE WARNING 'x4 %',NEW.parent_place_id;
|
||||
-- Still nothing, just use the nearest road
|
||||
IF NEW.parent_place_id IS NULL THEN
|
||||
@ -2074,7 +2088,7 @@ BEGIN
|
||||
|
||||
-- No - process it as a new insertion (hopefully of low rank or it will be slow)
|
||||
insert into placex (osm_type, osm_id, class, type, name, admin_level, housenumber,
|
||||
street, isin, postcode, country_code, extratags, geometry)
|
||||
street, addr_place, isin, postcode, country_code, extratags, geometry)
|
||||
values (NEW.osm_type
|
||||
,NEW.osm_id
|
||||
,NEW.class
|
||||
@ -2083,6 +2097,7 @@ BEGIN
|
||||
,NEW.admin_level
|
||||
,NEW.housenumber
|
||||
,NEW.street
|
||||
,NEW.addr_place
|
||||
,NEW.isin
|
||||
,NEW.postcode
|
||||
,NEW.country_code
|
||||
@ -2108,6 +2123,9 @@ BEGIN
|
||||
IF coalesce(existing.street, '') != coalesce(NEW.street, '') THEN
|
||||
RAISE WARNING 'update details, street: % % % %',NEW.osm_type,NEW.osm_id,existing.street,NEW.street;
|
||||
END IF;
|
||||
IF coalesce(existing.addr_place, '') != coalesce(NEW.addr_place, '') THEN
|
||||
RAISE WARNING 'update details, street: % % % %',NEW.osm_type,NEW.osm_id,existing.addr_place,NEW.addr_place;
|
||||
END IF;
|
||||
IF coalesce(existing.isin, '') != coalesce(NEW.isin, '') THEN
|
||||
RAISE WARNING 'update details, isin: % % % %',NEW.osm_type,NEW.osm_id,existing.isin,NEW.isin;
|
||||
END IF;
|
||||
@ -2150,6 +2168,7 @@ BEGIN
|
||||
IF FALSE AND existingplacex.rank_search < 26
|
||||
AND coalesce(existing.housenumber, '') = coalesce(NEW.housenumber, '')
|
||||
AND coalesce(existing.street, '') = coalesce(NEW.street, '')
|
||||
AND coalesce(existing.addr_place, '') = coalesce(NEW.addr_place, '')
|
||||
AND coalesce(existing.isin, '') = coalesce(NEW.isin, '')
|
||||
AND coalesce(existing.postcode, '') = coalesce(NEW.postcode, '')
|
||||
AND coalesce(existing.country_code, '') = coalesce(NEW.country_code, '')
|
||||
@ -2172,6 +2191,7 @@ BEGIN
|
||||
IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
|
||||
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
||||
OR coalesce(existing.street, '') != coalesce(NEW.street, '')
|
||||
OR coalesce(existing.addr_place, '') != coalesce(NEW.addr_place, '')
|
||||
OR coalesce(existing.isin, '') != coalesce(NEW.isin, '')
|
||||
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
||||
OR coalesce(existing.country_code, '') != coalesce(NEW.country_code, '') THEN
|
||||
@ -2190,6 +2210,7 @@ BEGIN
|
||||
OR coalesce(existing.extratags::text, '') != coalesce(NEW.extratags::text, '')
|
||||
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
||||
OR coalesce(existing.street, '') != coalesce(NEW.street, '')
|
||||
OR coalesce(existing.addr_street, '') != coalesce(NEW.addr_street, '')
|
||||
OR coalesce(existing.isin, '') != coalesce(NEW.isin, '')
|
||||
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
||||
OR coalesce(existing.country_code, '') != coalesce(NEW.country_code, '')
|
||||
@ -2201,6 +2222,7 @@ BEGIN
|
||||
name = NEW.name,
|
||||
housenumber = NEW.housenumber,
|
||||
street = NEW.street,
|
||||
addr_place = NEW.addr_place,
|
||||
isin = NEW.isin,
|
||||
postcode = NEW.postcode,
|
||||
country_code = NEW.country_code,
|
||||
@ -2212,6 +2234,7 @@ BEGIN
|
||||
name = NEW.name,
|
||||
housenumber = NEW.housenumber,
|
||||
street = NEW.street,
|
||||
addr_place = NEW.addr_place,
|
||||
isin = NEW.isin,
|
||||
postcode = NEW.postcode,
|
||||
country_code = NEW.country_code,
|
||||
@ -2595,6 +2618,7 @@ BEGIN
|
||||
name = place.name,
|
||||
housenumber = place.housenumber,
|
||||
street = place.street,
|
||||
addr_place = place.addr_place,
|
||||
isin = place.isin,
|
||||
postcode = place.postcode,
|
||||
country_code = place.country_code,
|
||||
|
@ -125,7 +125,7 @@ BEGIN
|
||||
FROM search_name_-partition-
|
||||
WHERE name_vector @> ARRAY[isin_token]
|
||||
AND ST_DWithin(centroid, point, 0.01)
|
||||
AND search_rank between 22 and 27
|
||||
AND search_rank between 26 and 27
|
||||
ORDER BY distance ASC limit 1
|
||||
LOOP
|
||||
RETURN NEXT r;
|
||||
@ -139,6 +139,35 @@ END
|
||||
$$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
create or replace function getNearestNamedPlaceFeature(in_partition INTEGER, point GEOMETRY, isin_token INTEGER)
|
||||
RETURNS setof nearfeature AS $$
|
||||
DECLARE
|
||||
r nearfeature%rowtype;
|
||||
BEGIN
|
||||
|
||||
-- start
|
||||
IF in_partition = -partition- THEN
|
||||
FOR r IN
|
||||
SELECT place_id, name_vector, address_rank, search_rank,
|
||||
ST_Distance(centroid, point) as distance, null as isguess
|
||||
FROM search_name_-partition-
|
||||
WHERE name_vector @> ARRAY[isin_token]
|
||||
AND ST_DWithin(centroid, point, 0.03)
|
||||
AND search_rank between 16 and 22
|
||||
ORDER BY distance ASC limit 1
|
||||
LOOP
|
||||
RETURN NEXT r;
|
||||
END LOOP;
|
||||
RETURN;
|
||||
END IF;
|
||||
-- end
|
||||
|
||||
RAISE EXCEPTION 'Unknown partition %', in_partition;
|
||||
END
|
||||
$$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
|
||||
create or replace function getNearestPostcode(in_partition INTEGER, point GEOMETRY)
|
||||
RETURNS TEXT AS $$
|
||||
DECLARE
|
||||
|
@ -362,7 +362,7 @@
|
||||
{
|
||||
$aDBInstances[$i] =& getDB(true);
|
||||
$sSQL = 'insert into placex (osm_type, osm_id, class, type, name, admin_level, ';
|
||||
$sSQL .= 'housenumber, street, isin, postcode, country_code, extratags, ';
|
||||
$sSQL .= 'housenumber, street, addr_place, isin, postcode, country_code, extratags, ';
|
||||
$sSQL .= 'geometry) select * from place where osm_id % '.$iInstances.' = '.$i;
|
||||
if ($aCMDResult['verbose']) echo "$sSQL\n";
|
||||
if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
|
||||
|
@ -941,7 +941,7 @@
|
||||
}
|
||||
}
|
||||
if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
|
||||
if ($aSearch['sHouseNumber']) $aTerms[] = "address_rank between 22 and 27";
|
||||
if ($aSearch['sHouseNumber']) $aTerms[] = "address_rank between 16 and 27";
|
||||
if ($aSearch['fLon'] && $aSearch['fLat'])
|
||||
{
|
||||
$aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
|
||||
|
Loading…
Reference in New Issue
Block a user