Import class:type from linked features to the extratags files. Use place tags (in extratags) as well as rank to determine feature type. i.e. allow a admin_level=6 feature also tagged as a place=city to still be found when doing a city search.

This commit is contained in:
Brian Quinion 2013-02-28 12:47:13 +00:00
parent f201371c50
commit b980f8e4e1
2 changed files with 47 additions and 12 deletions

View File

@ -1590,7 +1590,7 @@ BEGIN
-- merge in the label name, re-init word vector -- merge in the label name, re-init word vector
IF NOT linkedPlacex.name IS NULL THEN IF NOT linkedPlacex.name IS NULL THEN
NEW.name := linkedPlacex.name || NEW.name; NEW.name := linkedPlacex.name || NEW.name;
name_vector := make_keywords(NEW.name); name_vector := array_merge(name_vector, make_keywords(linkedPlacex.name));
END IF; END IF;
-- merge in extra tags -- merge in extra tags
@ -1598,6 +1598,10 @@ BEGIN
NEW.extratags := linkedPlacex.extratags || NEW.extratags; NEW.extratags := linkedPlacex.extratags || NEW.extratags;
END IF; END IF;
IF NOT NEW.extratags ? linkedPlacex.class THEN
NEW.extratags := NEW.extratags || hstore(linkedPlacex.class, linkedPlacex.type);
END IF;
-- mark the linked place (excludes from search results) -- mark the linked place (excludes from search results)
UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id; UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id;
@ -1617,7 +1621,6 @@ BEGIN
IF make_standard_name(NEW.name->'name') = make_standard_name(linkedPlacex.name->'name') IF make_standard_name(NEW.name->'name') = make_standard_name(linkedPlacex.name->'name')
AND NEW.rank_address = linkedPlacex.rank_address THEN AND NEW.rank_address = linkedPlacex.rank_address THEN
-- If we don't already have one use this as the centre point of the geometry -- If we don't already have one use this as the centre point of the geometry
IF NEW.centroid IS NULL THEN IF NEW.centroid IS NULL THEN
NEW.centroid := coalesce(linkedPlacex.centroid,st_centroid(linkedPlacex.geometry)); NEW.centroid := coalesce(linkedPlacex.centroid,st_centroid(linkedPlacex.geometry));
@ -1634,6 +1637,10 @@ BEGIN
NEW.extratags := linkedPlacex.extratags || NEW.extratags; NEW.extratags := linkedPlacex.extratags || NEW.extratags;
END IF; END IF;
IF NOT NEW.extratags ? linkedPlacex.class THEN
NEW.extratags := NEW.extratags || hstore(linkedPlacex.class, linkedPlacex.type);
END IF;
-- mark the linked place (excludes from search results) -- mark the linked place (excludes from search results)
UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id; UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id;
@ -1671,6 +1678,10 @@ BEGIN
-- merge in extra tags -- merge in extra tags
NEW.extratags := linkedPlacex.extratags || NEW.extratags; NEW.extratags := linkedPlacex.extratags || NEW.extratags;
IF NOT NEW.extratags ? linkedPlacex.class THEN
NEW.extratags := NEW.extratags || hstore(linkedPlacex.class, linkedPlacex.type);
END IF;
-- mark the linked place (excludes from search results) -- mark the linked place (excludes from search results)
UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id; UPDATE placex set linked_place_id = NEW.place_id where place_id = linkedPlacex.place_id;

View File

@ -1205,9 +1205,12 @@
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance, "; $sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
$sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(placex.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(placex.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
$sSQL .= "(extratags->'place') as extra_place ";
$sSQL .= "from placex where place_id in ($sPlaceIDs) "; $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
$sSQL .= "and placex.rank_address between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
$sSQL .= ") ";
if ($sAllowedTypesSQLList) $sSQL .= "and placex.class in $sAllowedTypesSQLList "; if ($sAllowedTypesSQLList) $sSQL .= "and placex.class in $sAllowedTypesSQLList ";
$sSQL .= "and linked_place_id is null "; $sSQL .= "and linked_place_id is null ";
$sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance"; $sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
@ -1215,6 +1218,7 @@
$sSQL .= ",langaddress "; $sSQL .= ",langaddress ";
$sSQL .= ",placename "; $sSQL .= ",placename ";
$sSQL .= ",ref "; $sSQL .= ",ref ";
$sSQL .= ",extratags->'place' ";
$sSQL .= " union "; $sSQL .= " union ";
$sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,"; $sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
$sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
@ -1223,7 +1227,8 @@
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "-0.15 as importance, "; $sSQL .= "-0.15 as importance, ";
$sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_tiger.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_tiger.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
$sSQL .= "null as extra_place ";
$sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) "; $sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "group by place_id"; $sSQL .= "group by place_id";
@ -1236,7 +1241,8 @@
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "-0.10 as importance, "; $sSQL .= "-0.10 as importance, ";
$sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance "; $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
$sSQL .= "null as extra_place ";
$sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) "; $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "group by place_id"; $sSQL .= "group by place_id";
@ -1277,14 +1283,18 @@
$sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,"; $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance "; $sSQL .= "coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
$sSQL .= "(extratags->'place') as extra_place ";
$sSQL .= "from placex where place_id in ($sPlaceIDs) "; $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
$sSQL .= "and placex.rank_address between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and (placex.rank_address between $iMinAddressRank and $iMaxAddressRank ";
if (14 >= $iMinAddressRank && 14 <= $iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
$sSQL .= ") ";
$sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance"; $sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
if (!$bDeDupe) $sSQL .= ",place_id"; if (!$bDeDupe) $sSQL .= ",place_id";
$sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) "; $sSQL .= ",get_address_by_language(place_id, $sLanguagePrefArraySQL) ";
$sSQL .= ",get_name_by_language(name, $sLanguagePrefArraySQL) "; $sSQL .= ",get_name_by_language(name, $sLanguagePrefArraySQL) ";
$sSQL .= ",get_name_by_language(name, ARRAY['ref']) "; $sSQL .= ",get_name_by_language(name, ARRAY['ref']) ";
$sSQL .= ",extratags->'place' ";
$sSQL .= " union "; $sSQL .= " union ";
$sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,"; $sSQL .= "select 'T' as osm_type,place_id as osm_id,'place' as class,'house' as type,null as admin_level,30 as rank_search,30 as rank_address,min(place_id) as place_id,'us' as country_code,";
$sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= "get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
@ -1292,7 +1302,8 @@
$sSQL .= "null as ref,"; $sSQL .= "null as ref,";
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "-0.15 as importance "; $sSQL .= "-0.15 as importance, ";
$sSQL .= "null as extra_place ";
$sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) "; $sSQL .= "from location_property_tiger where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "group by place_id"; $sSQL .= "group by place_id";
@ -1304,7 +1315,8 @@
$sSQL .= "null as ref,"; $sSQL .= "null as ref,";
$sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, "; $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
// $sSQL .= $sOrderSQL." as porder, "; // $sSQL .= $sOrderSQL." as porder, ";
$sSQL .= "-0.10 as importance "; $sSQL .= "-0.10 as importance, ";
$sSQL .= "null as extra_place ";
$sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) "; $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
$sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank "; $sSQL .= "and 30 between $iMinAddressRank and $iMaxAddressRank ";
$sSQL .= "group by place_id"; $sSQL .= "group by place_id";
@ -1413,6 +1425,13 @@
} }
} }
if ($aResult['extra_place'] == 'city')
{
$aResult['class'] = 'place';
$aResult['type'] = 'city';
$aResult['rank_search'] = 16;
}
if (!isset($aResult['aBoundingBox'])) if (!isset($aResult['aBoundingBox']))
{ {
// Default // Default
@ -1470,6 +1489,11 @@
if ($bShowAddressDetails) if ($bShowAddressDetails)
{ {
$aResult['address'] = getAddressDetails($oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code']); $aResult['address'] = getAddressDetails($oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code']);
if ($aResult['extra_place'] == 'city' && !isset($aResult['address']['city']))
{
$aResult['address'] = array_merge(array('city' => array_shift(array_values($aResult['address']))), $aResult['address']);
}
//var_dump($aResult['address']); //var_dump($aResult['address']);
//exit; //exit;
} }
@ -1526,10 +1550,10 @@
$bFirst = false; $bFirst = false;
} }
if (!$bDeDupe || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']]) if (!$bDeDupe || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']])
&& !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name']]))) && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']])))
{ {
$aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']] = true; $aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']] = true;
$aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name']] = true; $aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']] = true;
$aSearchResults[] = $aResult; $aSearchResults[] = $aResult;
} }