]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge branch 'master' of github.com:twain47/Nominatim
authorBrian Quinion <openstreetmap@brian.quinion.co.uk>
Mon, 26 Mar 2012 22:57:24 +0000 (23:57 +0100)
committerBrian Quinion <openstreetmap@brian.quinion.co.uk>
Mon, 26 Mar 2012 22:57:24 +0000 (23:57 +0100)
lib/lib.php
settings/phrase_settings.php [new file with mode: 0644]
sql/functions.sql
utils/specialphrases.php
website/details.php
website/reverse.php
website/search.php

index 069f3e2535da491f7959c92606f41ab29a307a8c..1564a83cceffa45dc4a1f65ef29cce3d87cb0608 100644 (file)
@@ -1,5 +1,30 @@
 <?php
 
+       function failInternalError($sError, $sSQL = false, $vDumpVar = false) 
+       {
+               header('HTTP/1.0 500 Internal Server Error');
+               header('Content-type: text/html; charset=utf-8');
+               echo "<html><body><h1>Internal Server Error</h1>";
+               echo '<p>Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.</p>';
+               echo "<p><b>Details:</b> ".$sError,"</p>";
+               echo '<p>Feel free to report the bug in the <a href="http://trac.openstreetmap.org">OSM bug database</a>. Please include the error message above an the URL you used.</p>';
+               if (CONST_Debug)
+               {
+                       echo "<hr><h2>Debugging Information</h2><br>";
+                       if ($sSQL) {
+                               echo "<h3>SQL query</h3><code>".$sSQL."</code>";
+                       }
+                       if ($vDumpVar) {
+                               echo "<h3>Result</h3> <code>";
+                               var_dump($vDumpVar);
+                               echo "</code>";
+                       }
+               }
+               echo "\n</body></html>\n";
+               exit;
+
+       }
+
        function fail($sError, $sUserError = false)
        {
                if (!$sUserError) $sUserError = $sError;
diff --git a/settings/phrase_settings.php b/settings/phrase_settings.php
new file mode 100644 (file)
index 0000000..4456316
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+# These settings control the import of special phrases from the wiki.
+
+# Languages to download the special phrases for.
+$aLanguageIn = array(
+                       'af',
+                       'ar',
+                       'br',
+                       'ca',
+                       'cs',
+                       'de',
+                       'en',
+                       'es',
+                       'et',
+                       'eu',
+                       'fa',
+                       'fi',
+                       'fr',
+                       'gl',
+                       'hr',
+                       'hu',
+                       'ia',
+                       'is',
+                       'it',
+                       'ja',
+                       'mk',
+                       'nl',
+                       'no',
+                       'pl',
+                       'ps',
+                       'pt',
+                       'ru',
+                       'sk',
+                       'sv',
+                       'uk',
+                       'vi',
+               );
+
+# class/type combinations to exclude
+$aTagsBlacklist = array(
+  'boundary' => array('administrative'),
+  'place' => array('house', 'houses'),
+);
+# If a class is in the white list then all types will 
+# be ignored except the ones given in the list.
+# Also use this list to exclude an entire class from
+# special phrases.
+$aTagsWhitelist = array(
+  'highway' => array('bus_stop', 'rest_area', 'raceway'),
+  'building' => array(),
+);
index 9a6131524f44ff8b69fd753de3b74c6f769d07c7..7e9f957b8e750dcd858e7e4be347105675844687 100644 (file)
@@ -1118,9 +1118,9 @@ BEGIN
 
       -- work around bug in postgis, this may have been fixed in 2.0.0 (see http://trac.osgeo.org/postgis/ticket/547)
       update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry)) 
-       AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point';
+       AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) = 'ST_Point' and (rank_search < 28 or name is not null);
       update placex set indexed_status = 2 where (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry)) 
-       AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point';
+       AND rank_search > NEW.rank_search and indexed_status = 0 and ST_geometrytype(placex.geometry) != 'ST_Point' and (rank_search < 28 or name is not null);
     END IF;
   ELSE
     -- mark nearby items for re-indexing, where 'nearby' depends on the features rank_search and is a complete guess :(
@@ -1145,7 +1145,7 @@ BEGIN
     END IF;
     IF diameter > 0 THEN
 --      RAISE WARNING 'placex point insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,diameter;
-      update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter);
+      update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter) and (rank_search < 28 or name is not null);
     END IF;
 
   END IF;
@@ -1807,12 +1807,12 @@ BEGIN
       update placex set indexed_status = 2 where indexed_status = 0 and 
           (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
           AND NOT (ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
-          AND rank_search > existingplacex.rank_search;
+          AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
 
       update placex set indexed_status = 2 where indexed_status = 0 and 
           (ST_Contains(existinggeometry, placex.geometry) OR ST_Intersects(existinggeometry, placex.geometry))
           AND NOT (ST_Contains(NEW.geometry, placex.geometry) OR ST_Intersects(NEW.geometry, placex.geometry))
-          AND rank_search > existingplacex.rank_search;
+          AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
 
     END IF;
 
@@ -1832,7 +1832,8 @@ BEGIN
 
       IF st_area(NEW.geometry) < 0.5 THEN
         UPDATE placex set indexed_status = 2 from place_addressline where address_place_id = existingplacex.place_id 
-          and placex.place_id = place_addressline.place_id and indexed_status = 0;
+          and placex.place_id = place_addressline.place_id and indexed_status = 0
+          and (rank_search < 28 or name is not null);
       END IF;
 
     END IF;
@@ -2408,13 +2409,6 @@ END;
 $$
 LANGUAGE plpgsql;
 
-CREATE AGGREGATE array_agg(INT[])
-(
-    sfunc = array_cat,
-    stype = INT[],
-    initcond = '{}'
-);
-
 CREATE OR REPLACE FUNCTION tigger_create_interpolation(linegeo GEOMETRY, in_startnumber INTEGER, 
   in_endnumber INTEGER, interpolationtype TEXT, 
   in_street TEXT, in_isin TEXT, in_postcode TEXT) RETURNS INTEGER
index 81d240a612c1dc77062023967fff7cfb88ea734a..28d550106f7ff3a0d890928b714d6507bebcdabd 100755 (executable)
         );
         getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
 
-       $aLanguageIn = array(
-                       'af',
-                       'ar',
-                       'br',
-                       'ca',
-                       'cs',
-                       'de',
-                       'en',
-                       'es',
-                       'et',
-                       'eu',
-                       'fa',
-                       'fi',
-                       'fr',
-                       'gl',
-                       'hr',
-                       'hu',
-                       'ia',
-                       'is',
-                       'it',
-                       'ja',
-                       'mk',
-                       'nl',
-                       'no',
-                       'pl',
-                       'ps',
-                       'pt',
-                       'ru',
-                       'sk',
-                       'sv',
-                       'uk',
-                       'vi',
-               );
+               include(CONST_BasePath.'/settings/phrase_settings.php');
+
 
     if ($aCMDResult['countries']) {
         echo "select getorcreate_country(make_standard_name('uk'), 'gb');\n";
                                                preg_match('/^\\w+$/', $sType) < 1) {
                                                trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
                                                exit;
-                                       }       
+                                       }
+                                       # blacklisting: disallow certain class/type combinations
+                                       if (isset($aTagsBlacklist[$sClass]) && in_array($sType, $aTagsBlacklist[$sClass])) {
+                                               # fwrite(STDERR, "Blacklisted: ".$sClass."/".$sType."\n");
+                                               continue;
+                                       }
+                                       # whitelisting: if class is in whitelist, allow only tags in the list
+                                       if (isset($aTagsWhitelist[$sClass])     && !in_array($sType, $aTagsWhitelist[$sClass])) {
+                                               # fwrite(STDERR, "Non-Whitelisted: ".$sClass."/".$sType."\n");
+                                               continue;
+                                       }
                                        $aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
 
                                        switch(trim($aMatch[4]))
index 110fdc07a06f01d3cab9fa157162ff735909a475..a4cb8b960072e4fde4fa7124c2c3bbb6126cdfc2 100755 (executable)
        $sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea,ST_GeometryType(geometry) as geotype, ST_Y(ST_Centroid(geometry)) as lat,ST_X(ST_Centroid(geometry)) as lon ";
        $sSQL .= " from placex where place_id = $iPlaceID";
        $aPointDetails = $oDB->getRow($sSQL);
-       IF (PEAR::IsError($aPointDetails))
+       if (PEAR::IsError($aPointDetails))
        {
-               var_dump($aPointDetails);
-               exit;
+               failInternalError("Could not get details of place object.", $sSQL, $aPointDetails);
        }
+
         $aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
        $fLon = $aPointDetails['lon'];
        $fLat = $aPointDetails['lat'];
 
        // Get the bounding box and outline polygon
        $sSQL = "select ST_AsText(geometry) as outlinestring,";
-       $sSQL .= "ST_Y(ST_PointN(ExteriorRing(ST_Box2D(geometry)),4)) as minlat,ST_Y(ST_PointN(ExteriorRing(ST_Box2D(geometry)),2)) as maxlat,";
-       $sSQL .= "ST_X(ST_PointN(ExteriorRing(ST_Box2D(geometry)),1)) as minlon,ST_X(ST_PointN(ExteriorRing(ST_Box2D(geometry)),3)) as maxlon";
+       $sSQL .= "ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,";
+       $sSQL .= "ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon";
        $sSQL .= " from placex where place_id = $iPlaceID";
        $aPointPolygon = $oDB->getRow($sSQL);
        IF (PEAR::IsError($aPointPolygon))
        {
-               var_dump($aPointPolygon);
-               exit;
+               failInternalError("Could not get bounding box of place object.", $sSQL, $aPointPolygon);
        }
        if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['outlinestring'],$aMatch))
        {
index f569ffac1abbf6ba9dc82ad33ddcc7acb1f1500f..d9ecc09efc83d022cfb3aa4955357bd12b1eee9b 100755 (executable)
                        $iPlaceID = $aPlace['place_id'];
                        if (PEAR::IsError($iPlaceID))
                        {
-                               var_Dump($sSQL, $iPlaceID); 
-                               exit;
+                               failInternalError("Could not determine closest place.", $sSQL, $iPlaceID); 
                        }
                }
 
                        $iPlaceID = $oDB->getOne($sSQL);
                        if (PEAR::IsError($iPlaceID))
                        {
-                               var_Dump($sSQL, $iPlaceID); 
-                               exit;
+                               failInternalError("Could not get parent for place.", $sSQL, $iPlaceID); 
                        }
 
                        if ($iPlaceID && $aPlace['place_id'] && $iMaxRank < 28)
                                $iPlaceID = $oDB->getOne($sSQL);
                                if (PEAR::IsError($iPlaceID))
                                {
-                                       var_Dump($sSQL, $iPlaceID); 
-                                       exit;
+                                       failInternalError("Could not get larger parent for place.", $sSQL, $iPlaceID); 
                                }
                        }
                        if (!$iPlaceID)
index 64cec021ee472cb4f484a8f2201dfaa799c78506..ae2c39635eed0b1d188ef1c29aeb61db07872e92 100755 (executable)
                        $sViewboxSmallSQL = $oDB->getOne($sSQL);
                        if (PEAR::isError($sViewboxSmallSQL))
                        {
-                               var_dump($sViewboxSmallSQL);
-                               exit;
+                               failInternalError("Could not get small viewbox.", $sSQL, $sViewboxSmallSQL);
                        }
                        $sViewboxSmallSQL = "'".$sViewboxSmallSQL."'::geometry";
 
                        $sViewboxLargeSQL = $oDB->getOne($sSQL);
                        if (PEAR::isError($sViewboxLargeSQL))
                        {
-                               var_dump($sViewboxLargeSQL);
-                               exit;
+                               failInternalError("Could not get large viewbox.", $sSQL, $sViewboxLargeSQL);
                        }
                        $sViewboxLargeSQL = "'".$sViewboxLargeSQL."'::geometry";
                }
                                $aDatabaseWords = array();
                        if (PEAR::IsError($aDatabaseWords))
                        {
-                               var_dump($sSQL, $aDatabaseWords);
-                               exit;
+                               failInternalError("Could not get word tokens.", $sSQL, $aDatabaseWords);
                        }
                        $aPossibleMainWordIDs = array();
                        foreach($aDatabaseWords as $aToken)
                                                                $aViewBoxPlaceIDs = $oDB->getAll($sSQL);
                                                                if (PEAR::IsError($aViewBoxPlaceIDs))
                                                                {
-                                                                       var_dump($sSQL, $aViewBoxPlaceIDs);                                     
-                                                                       exit;
+                                                                       failInternalError("Could not get places for search terms.", $sSQL, $aViewBoxPlaceIDs);
                                                                }
 //var_dump($aViewBoxPlaceIDs);
                                                                // Did we have an viewbox matches?
 
                                                if (PEAR::IsError($aPlaceIDs))
                                                {
-                                                       var_dump($sSQL, $aPlaceIDs);                                    
-                                                       exit;
+                                                       failInternalError("Could not get place IDs from tokens." ,$sSQL, $aPlaceIDs);
                                                }
 
                                                if (CONST_Debug) var_Dump($aPlaceIDs);
 
                                        if (PEAR::IsError($aSearchResults))
                                        {
-                                               var_dump($sSQL, $aSearchResults);                                       
-                                               exit;
+                                               failInternalError("Could not get details for place.", $sSQL, $aSearchResults);
                                        }
                                }
                        } // end if ($sQuery)
 
                                        if (PEAR::IsError($aSearchResults))
                                        {
-                                               var_dump($sSQL, $aSearchResults);                                       
-                                               exit;
+                        failInternalError("Could not get details for place (near).", $sSQL, $aSearchResults);
                                        }
                                }
                        }
                        $aPointPolygon = $oDB->getRow($sSQL);
                        if (PEAR::IsError($aPointPolygon))
                        {
-                               var_dump($sSQL, $aPointPolygon);
-                               exit;
+                               failInternalError("Could not get outline.", $sSQL, $aPointPolygon);
                        }
                        if ($aPointPolygon['place_id'])
                        {