From: Sarah Hoffmann Date: Fri, 16 May 2014 09:23:05 +0000 (+0200) Subject: Merge branch 'place-in-addressdetails' of https://github.com/lonvia/Nominatim X-Git-Tag: v2.3.0~31 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/ea48e50c60e3d09030d95a005bd679985e708eca?hp=bafd92093bc080c791698182a31ab06a89ae53b5 Merge branch 'place-in-addressdetails' of https://github.com/lonvia/Nominatim --- diff --git a/lib/Geocode.php b/lib/Geocode.php index 7f1d3733..7563a26d 100644 --- a/lib/Geocode.php +++ b/lib/Geocode.php @@ -890,6 +890,9 @@ if ($aSearch['sHouseNumber'] === '') { $aSearch['sHouseNumber'] = $sToken; + // sanity check: if the housenumber is not mainly made + // up of numbers, add a penalty + if (preg_match_all("/[^0-9]/", $sToken, $aMatches) > 2) $aSearch['iSearchRank']++; if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch; /* // Fall back to not searching for this item (better than nothing) @@ -908,6 +911,7 @@ $aSearch['sType'] = $aSearchTerm['type']; if (sizeof($aSearch['aName'])) $aSearch['sOperator'] = 'name'; else $aSearch['sOperator'] = 'near'; // near = in for the moment + if (strlen($aSearchTerm['operator']) == 0) $aSearch['iSearchRank'] += 1; // Do we have a shortcut id? if ($aSearch['sOperator'] == 'name') @@ -1177,6 +1181,10 @@ if (CONST_Debug) var_dump($sSQL); $aPlaceIDs = $this->oDB->getCol($sSQL); } + else + { + $aPlaceIDs = array(); + } } else { @@ -1201,7 +1209,8 @@ // If excluded place IDs are given, it is fair to assume that // there have been results in the small box, so no further // expansion in that case. - if (!sizeof($aPlaceIDs) && !sizeof($this->aExcludePlaceIDs)) + // Also don't expand if bounded results were requested. + if (!sizeof($aPlaceIDs) && !sizeof($this->aExcludePlaceIDs) && !$this->bBoundedSearch) { $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct"; if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)"; @@ -1334,8 +1343,8 @@ $sPlaceIDs = join(',',$aPlaceIDs); // Now they are indexed look for a house attached to a street we found - $sHouseNumberRegex = '\\\\m'.str_replace(' ','[-,/ ]',$aSearch['sHouseNumber']).'\\\\M'; - $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and housenumber ~* E'".$sHouseNumberRegex."'"; + $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M'; + $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and transliteration(housenumber) ~* E'".$sHouseNumberRegex."'"; if (sizeof($this->aExcludePlaceIDs)) { $sSQL .= " and place_id not in (".join(',',$this->aExcludePlaceIDs).")"; @@ -1458,7 +1467,7 @@ } if ($sCountryCodesSQL) $sSQL .= " and lp.calculated_country_code in ($sCountryCodesSQL)"; if ($sOrderBySQL) $sSQL .= "order by ".$sOrderBySQL." asc"; - if ($iOffset) $sSQL .= " offset $iOffset"; + if ($this->iOffset) $sSQL .= " offset $this->iOffset"; $sSQL .= " limit $this->iLimit"; if (CONST_Debug) var_dump($sSQL); $aClassPlaceIDs = array_merge($aClassPlaceIDs, $this->oDB->getCol($sSQL)); @@ -1480,7 +1489,7 @@ } if ($sCountryCodesSQL) $sSQL .= " and l.calculated_country_code in ($sCountryCodesSQL)"; if ($sOrderBy) $sSQL .= "order by ".$OrderBysSQL." asc"; - if ($iOffset) $sSQL .= " offset $iOffset"; + if ($this->iOffset) $sSQL .= " offset $this->iOffset"; $sSQL .= " limit $this->iLimit"; if (CONST_Debug) var_dump($sSQL); $aClassPlaceIDs = array_merge($aClassPlaceIDs, $this->oDB->getCol($sSQL)); @@ -1561,7 +1570,7 @@ } $aClassType = getClassTypesWithImportance(); - $aRecheckWords = preg_split('/\b/u',$sQuery); + $aRecheckWords = preg_split('/\b[\s,\\-]*/u',$sQuery); foreach($aRecheckWords as $i => $sWord) { if (!$sWord) unset($aRecheckWords[$i]); @@ -1722,7 +1731,11 @@ $sAddress = $aResult['langaddress']; foreach($aRecheckWords as $i => $sWord) { - if (stripos($sAddress, $sWord)!==false) $iCountWords++; + if (stripos($sAddress, $sWord)!==false) + { + $iCountWords++; + if (preg_match("/(^|,)\s*$sWord\s*(,|$)/", $sAddress)) $iCountWords += 0.1; + } } $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right @@ -1786,17 +1799,3 @@ } // end class - -/* - if (isset($_GET['route']) && $_GET['route'] && isset($_GET['routewidth']) && $_GET['routewidth']) - { - $aPoints = explode(',',$_GET['route']); - if (sizeof($aPoints) % 2 != 0) - { - userError("Uneven number of points"); - exit; - } - $sViewboxCentreSQL = "ST_SetSRID('LINESTRING("; - $fPrevCoord = false; - } -*/ diff --git a/osm2pgsql b/osm2pgsql index d1d82e5f..49089cb1 160000 --- a/osm2pgsql +++ b/osm2pgsql @@ -1 +1 @@ -Subproject commit d1d82e5fe6b3087d5b14ecddaf5d0e983f13aa26 +Subproject commit 49089cb1a3c72ad97b57db21716a5fa07d4f2f8a diff --git a/sql/functions.sql b/sql/functions.sql index c2268f43..1da46920 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -1136,7 +1136,11 @@ BEGIN ELSEIF NEW.class = 'waterway' AND NEW.name is NULL THEN RETURN NULL; ELSEIF NEW.class = 'waterway' THEN - NEW.rank_search := 17; + IF NEW.osm_type = 'R' THEN + NEW.rank_search := 16; + ELSE + NEW.rank_search := 17; + END IF; NEW.rank_address := 0; ELSEIF NEW.class = 'highway' AND NEW.osm_type != 'N' AND NEW.type in ('service','cycleway','path','footway','steps','bridleway','motorway_link','primary_link','trunk_link','secondary_link','tertiary_link') THEN NEW.rank_search := 27; @@ -1366,6 +1370,22 @@ BEGIN END IF; NEW.geometry_sector := geometry_sector(NEW.partition, place_centroid); + -- waterway ways are linked when they are part of a relation and have the same class/type + IF NEW.osm_type = 'R' and NEW.class = 'waterway' THEN + FOR relation IN select * from planet_osm_rels r where r.id = NEW.osm_id + LOOP + FOR i IN relation.way_off+1..relation.rel_off LOOP + IF relation.members[2*i] in ('', 'main_stream') THEN + --DEBUG: RAISE WARNING 'waterway parent %, child %/%', NEW.osm_id, i, relation.parts[i]; + FOR location IN SELECT * FROM placex WHERE osm_type = 'W' and osm_id = relation.parts[i] and class = NEW.class and type = NEW.type + LOOP + UPDATE placex SET linked_place_id = NEW.place_id WHERE place_id = location.place_id; + END LOOP; + END IF; + END LOOP; + END LOOP; + END IF; + -- Adding ourselves to the list simplifies address calculations later INSERT INTO place_addressline VALUES (NEW.place_id, NEW.place_id, true, true, 0, NEW.rank_address); @@ -1478,13 +1498,10 @@ BEGIN END IF; -- If the way contains an explicit name of a street copy it - IF NEW.street IS NULL AND NEW.addr_place IS NULL AND location.street IS NOT NULL THEN + -- Slightly less strict then above because data is copied from any object. + IF NEW.street IS NULL AND NEW.addr_place IS 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; diff --git a/utils/setup.php b/utils/setup.php index 9e946035..a1d8ae5d 100755 --- a/utils/setup.php +++ b/utils/setup.php @@ -22,6 +22,7 @@ array('create-functions', '', 0, 1, 0, 0, 'bool', 'Create functions'), array('enable-diff-updates', '', 0, 1, 0, 0, 'bool', 'Turn on the code required to make diff updates work'), array('enable-debug-statements', '', 0, 1, 0, 0, 'bool', 'Include debug warning statements in pgsql commands'), + array('ignore-errors', '', 0, 1, 0, 0, 'bool', 'Continue import even when errors in SQL are present (EXPERT)'), array('create-minimal-tables', '', 0, 1, 0, 0, 'bool', 'Create minimal main tables'), array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create main tables'), array('create-partition-tables', '', 0, 1, 0, 0, 'bool', 'Create required partition tables'), @@ -745,11 +746,13 @@ function pgsqlRunScript($sScript) { + global $aCMDResult; // Convert database DSN to psql parameters $aDSNInfo = DB::parseDSN(CONST_Database_DSN); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database']; - $sCMD .= ' -v ON_ERROR_STOP=1'; + if (!$aCMDResult['ignore-errors']) + $sCMD .= ' -v ON_ERROR_STOP=1'; $aDescriptors = array( 0 => array('pipe', 'r'), 1 => STDOUT, @@ -762,6 +765,7 @@ while(strlen($sScript)) { $written = fwrite($ahPipes[0], $sScript); + if ($written <= 0) break; $sScript = substr($sScript, $written); } fclose($ahPipes[0]);