mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 15:47:58 +00:00
add support for house numbers without street
This commit is contained in:
@@ -888,9 +888,9 @@ BEGIN
|
|||||||
FOR housenum IN startnumber..endnumber BY stepsize LOOP
|
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
|
-- 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
|
-- 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)
|
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));
|
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;
|
newpoints := newpoints + 1;
|
||||||
--RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
|
--RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
|
||||||
@@ -1461,13 +1461,18 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- If the way contains an explicit name of a street copy it
|
-- 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;
|
--RAISE WARNING 'node in way that has a streetname %',location;
|
||||||
NEW.street := location.street;
|
NEW.street := location.street;
|
||||||
END IF;
|
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 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
|
-- Try and find a way that is close roughly parellel to this line
|
||||||
FOR relation IN SELECT place_id FROM placex
|
FOR relation IN SELECT place_id FROM placex
|
||||||
WHERE ST_DWithin(location.geometry, placex.geometry, 0.001) and placex.rank_search = 26
|
WHERE ST_DWithin(location.geometry, placex.geometry, 0.001) and placex.rank_search = 26
|
||||||
@@ -1508,9 +1513,18 @@ BEGIN
|
|||||||
--RAISE WARNING 'x3 %',NEW.parent_place_id;
|
--RAISE WARNING 'x3 %',NEW.parent_place_id;
|
||||||
|
|
||||||
IF NEW.parent_place_id IS NULL AND NEW.street IS NOT NULL THEN
|
IF NEW.parent_place_id IS NULL AND NEW.street IS NOT NULL THEN
|
||||||
address_street_word_id := get_name_id(make_standard_name(NEW.street));
|
address_street_word_id := get_name_id(make_standard_name(NEW.street));
|
||||||
IF address_street_word_id IS NOT NULL THEN
|
IF address_street_word_id IS NOT NULL THEN
|
||||||
FOR location IN SELECT * from getNearestNamedRoadFeature(NEW.partition, place_centroid, address_street_word_id) LOOP
|
FOR location IN SELECT * from getNearestNamedRoadFeature(NEW.partition, place_centroid, address_street_word_id) LOOP
|
||||||
|
NEW.parent_place_id := location.place_id;
|
||||||
|
END LOOP;
|
||||||
|
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;
|
NEW.parent_place_id := location.place_id;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -2074,7 +2088,7 @@ BEGIN
|
|||||||
|
|
||||||
-- No - process it as a new insertion (hopefully of low rank or it will be slow)
|
-- 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,
|
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
|
values (NEW.osm_type
|
||||||
,NEW.osm_id
|
,NEW.osm_id
|
||||||
,NEW.class
|
,NEW.class
|
||||||
@@ -2083,6 +2097,7 @@ BEGIN
|
|||||||
,NEW.admin_level
|
,NEW.admin_level
|
||||||
,NEW.housenumber
|
,NEW.housenumber
|
||||||
,NEW.street
|
,NEW.street
|
||||||
|
,NEW.addr_place
|
||||||
,NEW.isin
|
,NEW.isin
|
||||||
,NEW.postcode
|
,NEW.postcode
|
||||||
,NEW.country_code
|
,NEW.country_code
|
||||||
@@ -2108,6 +2123,9 @@ BEGIN
|
|||||||
IF coalesce(existing.street, '') != coalesce(NEW.street, '') THEN
|
IF coalesce(existing.street, '') != coalesce(NEW.street, '') THEN
|
||||||
RAISE WARNING 'update details, street: % % % %',NEW.osm_type,NEW.osm_id,existing.street,NEW.street;
|
RAISE WARNING 'update details, street: % % % %',NEW.osm_type,NEW.osm_id,existing.street,NEW.street;
|
||||||
END IF;
|
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
|
IF coalesce(existing.isin, '') != coalesce(NEW.isin, '') THEN
|
||||||
RAISE WARNING 'update details, isin: % % % %',NEW.osm_type,NEW.osm_id,existing.isin,NEW.isin;
|
RAISE WARNING 'update details, isin: % % % %',NEW.osm_type,NEW.osm_id,existing.isin,NEW.isin;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -2150,6 +2168,7 @@ BEGIN
|
|||||||
IF FALSE AND existingplacex.rank_search < 26
|
IF FALSE AND existingplacex.rank_search < 26
|
||||||
AND coalesce(existing.housenumber, '') = coalesce(NEW.housenumber, '')
|
AND coalesce(existing.housenumber, '') = coalesce(NEW.housenumber, '')
|
||||||
AND coalesce(existing.street, '') = coalesce(NEW.street, '')
|
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.isin, '') = coalesce(NEW.isin, '')
|
||||||
AND coalesce(existing.postcode, '') = coalesce(NEW.postcode, '')
|
AND coalesce(existing.postcode, '') = coalesce(NEW.postcode, '')
|
||||||
AND coalesce(existing.country_code, '') = coalesce(NEW.country_code, '')
|
AND coalesce(existing.country_code, '') = coalesce(NEW.country_code, '')
|
||||||
@@ -2172,6 +2191,7 @@ BEGIN
|
|||||||
IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
|
IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
|
||||||
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
||||||
OR coalesce(existing.street, '') != coalesce(NEW.street, '')
|
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.isin, '') != coalesce(NEW.isin, '')
|
||||||
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
||||||
OR coalesce(existing.country_code, '') != coalesce(NEW.country_code, '') THEN
|
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.extratags::text, '') != coalesce(NEW.extratags::text, '')
|
||||||
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
OR coalesce(existing.housenumber, '') != coalesce(NEW.housenumber, '')
|
||||||
OR coalesce(existing.street, '') != coalesce(NEW.street, '')
|
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.isin, '') != coalesce(NEW.isin, '')
|
||||||
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
OR coalesce(existing.postcode, '') != coalesce(NEW.postcode, '')
|
||||||
OR coalesce(existing.country_code, '') != coalesce(NEW.country_code, '')
|
OR coalesce(existing.country_code, '') != coalesce(NEW.country_code, '')
|
||||||
@@ -2201,6 +2222,7 @@ BEGIN
|
|||||||
name = NEW.name,
|
name = NEW.name,
|
||||||
housenumber = NEW.housenumber,
|
housenumber = NEW.housenumber,
|
||||||
street = NEW.street,
|
street = NEW.street,
|
||||||
|
addr_place = NEW.addr_place,
|
||||||
isin = NEW.isin,
|
isin = NEW.isin,
|
||||||
postcode = NEW.postcode,
|
postcode = NEW.postcode,
|
||||||
country_code = NEW.country_code,
|
country_code = NEW.country_code,
|
||||||
@@ -2212,6 +2234,7 @@ BEGIN
|
|||||||
name = NEW.name,
|
name = NEW.name,
|
||||||
housenumber = NEW.housenumber,
|
housenumber = NEW.housenumber,
|
||||||
street = NEW.street,
|
street = NEW.street,
|
||||||
|
addr_place = NEW.addr_place,
|
||||||
isin = NEW.isin,
|
isin = NEW.isin,
|
||||||
postcode = NEW.postcode,
|
postcode = NEW.postcode,
|
||||||
country_code = NEW.country_code,
|
country_code = NEW.country_code,
|
||||||
@@ -2595,6 +2618,7 @@ BEGIN
|
|||||||
name = place.name,
|
name = place.name,
|
||||||
housenumber = place.housenumber,
|
housenumber = place.housenumber,
|
||||||
street = place.street,
|
street = place.street,
|
||||||
|
addr_place = place.addr_place,
|
||||||
isin = place.isin,
|
isin = place.isin,
|
||||||
postcode = place.postcode,
|
postcode = place.postcode,
|
||||||
country_code = place.country_code,
|
country_code = place.country_code,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ BEGIN
|
|||||||
FROM search_name_-partition-
|
FROM search_name_-partition-
|
||||||
WHERE name_vector @> ARRAY[isin_token]
|
WHERE name_vector @> ARRAY[isin_token]
|
||||||
AND ST_DWithin(centroid, point, 0.01)
|
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
|
ORDER BY distance ASC limit 1
|
||||||
LOOP
|
LOOP
|
||||||
RETURN NEXT r;
|
RETURN NEXT r;
|
||||||
@@ -139,6 +139,35 @@ END
|
|||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql;
|
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)
|
create or replace function getNearestPostcode(in_partition INTEGER, point GEOMETRY)
|
||||||
RETURNS TEXT AS $$
|
RETURNS TEXT AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
|
|||||||
@@ -362,7 +362,7 @@
|
|||||||
{
|
{
|
||||||
$aDBInstances[$i] =& getDB(true);
|
$aDBInstances[$i] =& getDB(true);
|
||||||
$sSQL = 'insert into placex (osm_type, osm_id, class, type, name, admin_level, ';
|
$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;
|
$sSQL .= 'geometry) select * from place where osm_id % '.$iInstances.' = '.$i;
|
||||||
if ($aCMDResult['verbose']) echo "$sSQL\n";
|
if ($aCMDResult['verbose']) echo "$sSQL\n";
|
||||||
if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
|
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['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'])
|
if ($aSearch['fLon'] && $aSearch['fLat'])
|
||||||
{
|
{
|
||||||
$aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
|
$aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
|
||||||
|
|||||||
Reference in New Issue
Block a user