]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Thu, 21 Feb 2019 22:39:48 +0000 (23:39 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Thu, 21 Feb 2019 22:39:48 +0000 (23:39 +0100)
1  2 
lib/lib.php
sql/functions.sql
utils/update.php

diff --combined lib/lib.php
index 3a6166a60e022d3921ce54db8d48d051b8cbade4,d77a82c131ac4e04b422f6e5776d0f56b54398a6..458930fdb7bd85581b1609c79442d5eeb1d7b664
@@@ -177,10 -177,10 +177,10 @@@ function geometryText2Points($geometry_
          //
          preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
          //
 -    } elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch)) {
 +/*    } elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch)) {
          //
          preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
 -        //
 +        */
      } elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#', $geometry_as_text, $aMatch)) {
          //
          $aPolyPoints = createPointsAroundCenter($aMatch[1], $aMatch[2], $fRadius);
@@@ -228,3 -228,25 +228,25 @@@ function closestHouseNumber($aRow
  
      return max(min($aRow['endnumber'], $iHn), $aRow['startnumber']);
  }
+ function getSearchRankLabel($iRank)
+ {
+     if (!isset($iRank)) return 'unknown';
+     if ($iRank < 2) return 'continent';
+     if ($iRank < 4) return 'sea';
+     if ($iRank < 8) return 'country';
+     if ($iRank < 12) return 'state';
+     if ($iRank < 16) return 'county';
+     if ($iRank == 16) return 'city';
+     if ($iRank == 17) return 'town / island';
+     if ($iRank == 18) return 'village / hamlet';
+     if ($iRank == 20) return 'suburb';
+     if ($iRank == 21) return 'postcode area';
+     if ($iRank == 22) return 'croft / farm / locality / islet';
+     if ($iRank == 23) return 'postcode area';
+     if ($iRank == 25) return 'postcode point';
+     if ($iRank == 26) return 'street / major landmark';
+     if ($iRank == 27) return 'minory street / path';
+     if ($iRank == 28) return 'house / building';
+     return 'other: ' . $iRank;
+ }
diff --combined sql/functions.sql
index 94a0323157f5f83f9fcc657339c988d9e13db8b6,73790353059a683cdfec0db2f101e1dbc5935f4e..54e2a8d36d25ab3015cd2cbe4c296359f958676a
@@@ -1311,10 -1311,6 +1311,6 @@@ BEGI
        --DEBUG: RAISE WARNING 'Waterway processed';
    END IF;
  
-   -- Adding ourselves to the list simplifies address calculations later
-   INSERT INTO place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address)
-     VALUES (NEW.place_id, NEW.place_id, true, true, 0, NEW.rank_address); 
    -- What level are we searching from
    search_maxrank := NEW.rank_search;
  
@@@ -2305,6 -2301,9 +2301,9 @@@ create type addressline as 
    distance FLOAT
  );
  
+ -- Compute the list of address parts for the given place.
+ --
+ -- If in_housenumber is greator or equal 0, look for an interpolation.
  CREATE OR REPLACE FUNCTION get_addressdata(in_place_id BIGINT, in_housenumber INTEGER) RETURNS setof addressline 
    AS $$
  DECLARE
    searchclass TEXT;
    searchtype TEXT;
    countryname HSTORE;
-   hadcountry BOOLEAN;
  BEGIN
+   -- The place ein question might not have a direct entry in place_addressline.
+   -- Look for the parent of such places then and save if in for_place_id.
    -- first query osmline (interpolation lines)
-   select parent_place_id, country_code, 30, postcode, null, 'place', 'house' from location_property_osmline 
-     WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-     INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-   IF for_place_id IS NOT NULL THEN
-     searchhousenumber = in_housenumber::text;
+   IF in_housenumber >= 0 THEN
+     SELECT parent_place_id, country_code, in_housenumber::text, 30, postcode,
+            null, 'place', 'house'
+       FROM location_property_osmline
+       WHERE place_id = in_place_id AND in_housenumber>=startnumber
+             AND in_housenumber <= endnumber
+       INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+            searchpostcode, searchhousename, searchclass, searchtype;
    END IF;
  
    --then query tiger data
    -- %NOTIGERDATA% IF 0 THEN
-   IF for_place_id IS NULL THEN
-     select parent_place_id,'us', 30, postcode, null, 'place', 'house' from location_property_tiger 
-       WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-       INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-     IF for_place_id IS NOT NULL THEN
-       searchhousenumber = in_housenumber::text;
-     END IF;
+   IF for_place_id IS NULL AND in_housenumber >= 0 THEN
+     SELECT parent_place_id, 'us', in_housenumber::text, 30, postcode, null,
+            'place', 'house'
+       FROM location_property_tiger
+       WHERE place_id = in_place_id AND in_housenumber >= startnumber
+             AND in_housenumber <= endnumber
+       INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+            searchpostcode, searchhousename, searchclass, searchtype;
    END IF;
    -- %NOTIGERDATA% END IF;
  
    -- %NOAUXDATA% IF 0 THEN
    IF for_place_id IS NULL THEN
-     select parent_place_id,'us', housenumber, 30, postcode, null, 'place', 'house' from location_property_aux
+     SELECT parent_place_id, 'us', housenumber, 30, postcode, null, 'place', 'house'
+       FROM location_property_aux
        WHERE place_id = in_place_id
-       INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+       INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress,
+            searchpostcode, searchhousename, searchclass, searchtype;
    END IF;
    -- %NOAUXDATA% END IF;
  
    -- postcode table
    IF for_place_id IS NULL THEN
-     select parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
+     SELECT parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
        FROM location_postcode
        WHERE place_id = in_place_id
-       INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode, searchclass, searchtype;
+       INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode,
+            searchclass, searchtype;
    END IF;
  
+   -- POI objects in the placex table
    IF for_place_id IS NULL THEN
-     select parent_place_id, country_code, housenumber, rank_search, postcode, name, class, type from placex 
-       WHERE place_id = in_place_id and  rank_search > 27
-       INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+     SELECT parent_place_id, country_code, housenumber, rank_search, postcode,
+            name, class, type
+       FROM placex
+       WHERE place_id = in_place_id and rank_search > 27
+       INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+            searchpostcode, searchhousename, searchclass, searchtype;
    END IF;
  
+   -- If for_place_id is still NULL at this point then the object has its own
+   -- entry in place_address line. However, still check if there is not linked
+   -- place we should be using instead.
    IF for_place_id IS NULL THEN
      select coalesce(linked_place_id, place_id),  country_code,
             housenumber, rank_search, postcode, null
  
  --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode;
  
-   found := 1000;
-   hadcountry := false;
-   FOR location IN 
-     select placex.place_id, osm_type, osm_id, name,
-       class, type, admin_level, true as isaddress,
-       CASE WHEN rank_address = 0 THEN 100 WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
-       0 as distance, country_code, postcode
-       from placex
-       where place_id = for_place_id 
+   found := 1000; -- the lowest rank_address included
+   -- Return the record for the base entry.
+   FOR location IN
+     SELECT placex.place_id, osm_type, osm_id, name,
+            class, type, admin_level,
+            type not in ('postcode', 'postal_code') as isaddress,
+            CASE WHEN rank_address = 0 THEN 100
+                 WHEN rank_address = 11 THEN 5
+                 ELSE rank_address END as rank_address,
+            0 as distance, country_code, postcode
+       FROM placex
+       WHERE place_id = for_place_id
    LOOP
  --RAISE WARNING '%',location;
      IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
        searchcountrycode := location.country_code;
      END IF;
-     IF location.type in ('postcode', 'postal_code') THEN
-       location.isaddress := FALSE;
-     ELSEIF location.rank_address = 4 THEN
-       hadcountry := true;
+     IF location.rank_address < 4 THEN
+       -- no country locations for ranks higher than country
+       searchcountrycode := NULL;
      END IF;
-     IF location.rank_address < 4 AND NOT hadcountry THEN
-       select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-       IF countryname IS NOT NULL THEN
-         countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-         RETURN NEXT countrylocation;
-       END IF;
-     END IF;
-     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                            location.type, location.admin_level, true, location.isaddress, location.rank_address,
-                            location.distance)::addressline;
+     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                            location.name, location.class, location.type,
+                            location.admin_level, true, location.isaddress,
+                            location.rank_address, location.distance)::addressline;
      RETURN NEXT countrylocation;
      found := location.rank_address;
    END LOOP;
  
-   FOR location IN 
-     select placex.place_id, osm_type, osm_id, name,
-       CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
-       CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
-       admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
-       CASE WHEN address_place_id = for_place_id AND rank_address = 0 THEN 100 WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
-       distance,country_code,postcode
-       from place_addressline join placex on (address_place_id = placex.place_id) 
-       where place_addressline.place_id = for_place_id 
-       and (cached_rank_address > 0 AND cached_rank_address < searchrankaddress)
-       and address_place_id != for_place_id and linked_place_id is null
-       and (placex.country_code IS NULL OR searchcountrycode IS NULL OR placex.country_code = searchcountrycode)
-       order by rank_address desc,isaddress desc,fromarea desc,distance asc,rank_search desc
+   FOR location IN
+     SELECT placex.place_id, osm_type, osm_id, name,
+            CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
+            CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
 -           admin_level, fromarea, isaddress,
++           admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
+            CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
+            distance, country_code, postcode
+       FROM place_addressline join placex on (address_place_id = placex.place_id)
+       WHERE place_addressline.place_id = for_place_id
+             AND (cached_rank_address >= 4 AND cached_rank_address < searchrankaddress)
+             AND linked_place_id is null
+             AND (placex.country_code IS NULL OR searchcountrycode IS NULL
+                  OR placex.country_code = searchcountrycode)
+       ORDER BY rank_address desc, isaddress desc, fromarea desc,
+                distance asc, rank_search desc
    LOOP
  --RAISE WARNING '%',location;
      IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
      IF location.type in ('postcode', 'postal_code') THEN
        location.isaddress := FALSE;
      END IF;
-     IF location.rank_address = 4 AND location.isaddress THEN
-       hadcountry := true;
-     END IF;
-     IF location.rank_address < 4 AND NOT hadcountry THEN
-       select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-       IF countryname IS NOT NULL THEN
-         countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-         RETURN NEXT countrylocation;
-       END IF;
-     END IF;
-     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                            location.type, location.admin_level, location.fromarea, location.isaddress, location.rank_address, 
+     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                            location.name, location.class, location.type,
+                            location.admin_level, location.fromarea,
+                            location.isaddress, location.rank_address,
                             location.distance)::addressline;
      RETURN NEXT countrylocation;
      found := location.rank_address;
    END LOOP;
  
+   -- If no country was included yet, add the name information from country_name.
    IF found > 4 THEN
-     select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
+     SELECT name FROM country_name
+       WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
  --RAISE WARNING '% % %',found,searchcountrycode,countryname;
      IF countryname IS NOT NULL THEN
-       location := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
+       location := ROW(null, null, null, countryname, 'place', 'country',
+                       null, true, true, 4, 0)::addressline;
        RETURN NEXT location;
      END IF;
    END IF;
  
+   -- Finally add some artificial rows.
    IF searchcountrycode IS NOT NULL THEN
-     location := ROW(null, null, null, hstore('ref', searchcountrycode), 'place', 'country_code', null, true, false, 4, 0)::addressline;
+     location := ROW(null, null, null, hstore('ref', searchcountrycode),
+                     'place', 'country_code', null, true, false, 4, 0)::addressline;
      RETURN NEXT location;
    END IF;
  
    IF searchhousename IS NOT NULL THEN
-     location := ROW(in_place_id, null, null, searchhousename, searchclass, searchtype, null, true, true, 29, 0)::addressline;
+     location := ROW(in_place_id, null, null, searchhousename, searchclass,
+                     searchtype, null, true, true, 29, 0)::addressline;
      RETURN NEXT location;
    END IF;
  
    IF searchhousenumber IS NOT NULL THEN
-     location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber), 'place', 'house_number', null, true, true, 28, 0)::addressline;
+     location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber),
+                     'place', 'house_number', null, true, true, 28, 0)::addressline;
      RETURN NEXT location;
    END IF;
  
    IF searchpostcode IS NOT NULL THEN
-     location := ROW(null, null, null, hstore('ref', searchpostcode), 'place', 'postcode', null, true, true, 5, 0)::addressline;
+     location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
+                     'postcode', null, true, true, 5, 0)::addressline;
      RETURN NEXT location;
    END IF;
  
  LANGUAGE plpgsql;
  
  
- CREATE OR REPLACE FUNCTION get_searchrank_label(rank INTEGER) RETURNS TEXT
-   AS $$
- DECLARE
- BEGIN
-   IF rank < 2 THEN
-     RETURN 'Continent';
-   ELSEIF rank < 4 THEN
-     RETURN 'Sea';
-   ELSEIF rank < 8 THEN
-     RETURN 'Country';
-   ELSEIF rank < 12 THEN
-     RETURN 'State';
-   ELSEIF rank < 16 THEN
-     RETURN 'County';
-   ELSEIF rank = 16 THEN
-     RETURN 'City';
-   ELSEIF rank = 17 THEN
-     RETURN 'Town / Island';
-   ELSEIF rank = 18 THEN
-     RETURN 'Village / Hamlet';
-   ELSEIF rank = 20 THEN
-     RETURN 'Suburb';
-   ELSEIF rank = 21 THEN
-     RETURN 'Postcode Area';
-   ELSEIF rank = 22 THEN
-     RETURN 'Croft / Farm / Locality / Islet';
-   ELSEIF rank = 23 THEN
-     RETURN 'Postcode Area';
-   ELSEIF rank = 25 THEN
-     RETURN 'Postcode Point';
-   ELSEIF rank = 26 THEN
-     RETURN 'Street / Major Landmark';
-   ELSEIF rank = 27 THEN
-     RETURN 'Minory Street / Path';
-   ELSEIF rank = 28 THEN
-     RETURN 'House / Building';
-   ELSE
-     RETURN 'Other: '||rank;
-   END IF;
-   
- END;
- $$
- LANGUAGE plpgsql;
- CREATE OR REPLACE FUNCTION get_addressrank_label(rank INTEGER) RETURNS TEXT
-   AS $$
- DECLARE
- BEGIN
-   IF rank = 0 THEN
-     RETURN 'None';
-   ELSEIF rank < 2 THEN
-     RETURN 'Continent';
-   ELSEIF rank < 4 THEN
-     RETURN 'Sea';
-   ELSEIF rank = 5 THEN
-     RETURN 'Postcode';
-   ELSEIF rank < 8 THEN
-     RETURN 'Country';
-   ELSEIF rank < 12 THEN
-     RETURN 'State';
-   ELSEIF rank < 16 THEN
-     RETURN 'County';
-   ELSEIF rank = 16 THEN
-     RETURN 'City';
-   ELSEIF rank = 17 THEN
-     RETURN 'Town / Village / Hamlet';
-   ELSEIF rank = 20 THEN
-     RETURN 'Suburb';
-   ELSEIF rank = 21 THEN
-     RETURN 'Postcode Area';
-   ELSEIF rank = 22 THEN
-     RETURN 'Croft / Farm / Locality / Islet';
-   ELSEIF rank = 23 THEN
-     RETURN 'Postcode Area';
-   ELSEIF rank = 25 THEN
-     RETURN 'Postcode Point';
-   ELSEIF rank = 26 THEN
-     RETURN 'Street / Major Landmark';
-   ELSEIF rank = 27 THEN
-     RETURN 'Minory Street / Path';
-   ELSEIF rank = 28 THEN
-     RETURN 'House / Building';
-   ELSE
-     RETURN 'Other: '||rank;
-   END IF;
-   
- END;
- $$
- LANGUAGE plpgsql;
  CREATE OR REPLACE FUNCTION aux_create_property(pointgeo GEOMETRY, in_housenumber TEXT, 
    in_street TEXT, in_isin TEXT, in_postcode TEXT, in_countrycode char(2)) RETURNS INTEGER
    AS $$
diff --combined utils/update.php
index 7cf96d90330d3e125825c4659802f81b99ff85f2,3ef12cfb588fbb8fef7b9578d9b2bd7426bd1ced..8e1188349f025a4ec6558f1ccec25b6df9039570
@@@ -48,7 -48,6 +48,7 @@@ $aCMDOption
  getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
  
  if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1;
 +
  if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0;
  
  date_default_timezone_set('Etc/UTC');
@@@ -306,6 -305,8 +306,8 @@@ if ($aResult['index']) 
      }
  
      runWithEnv($sCmd, $aProcEnv);
+     $oDB->query('update import_status set indexed = true');
  }
  
  if ($aResult['update-address-levels']) {
@@@ -444,6 -445,11 +446,11 @@@ if ($aResult['import-osmosis'] || $aRes
  
              $sSQL = 'update import_status set indexed = true';
              $oDB->query($sSQL);
+         } else {
+             if ($aResult['import-osmosis-all']) {
+                 echo "Error: --no-index cannot be used with continuous imports (--import-osmosis-all).\n";
+                 exit(1);
+             }
          }
  
          $fDuration = time() - $fStartTime;