]> git.openstreetmap.org Git - nominatim.git/blobdiff - sql/functions.sql
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / sql / functions.sql
index 179975d8bcbbb5f2ee261b9c0b976f9d4e177cc1..75ccfd689669dcf7c1673dd9ad8beee7f1c7d216 100644 (file)
@@ -1162,6 +1162,7 @@ TRIGGER
 DECLARE
 
   place_centroid GEOMETRY;
+  near_centroid GEOMETRY;
 
   search_maxdistance FLOAT[];
   search_mindistance FLOAT[];
@@ -1266,6 +1267,8 @@ BEGIN
   -- Speed up searches - just use the centroid of the feature
   -- cheaper but less acurate
   place_centroid := ST_PointOnSurface(NEW.geometry);
+  -- For searching near features rather use the centroid
+  near_centroid := ST_Centroid(NEW.geometry);
   NEW.centroid := null;
   NEW.postcode := null;
   --DEBUG: RAISE WARNING 'Computing preliminary centroid at %',ST_AsText(place_centroid);
@@ -1396,7 +1399,7 @@ BEGIN
     IF NEW.parent_place_id IS NULL AND addr_street IS NOT NULL THEN
       address_street_word_ids := get_name_ids(make_standard_name(addr_street));
       IF address_street_word_ids IS NOT NULL THEN
-        SELECT place_id from getNearestNamedRoadFeature(NEW.partition, place_centroid, address_street_word_ids) INTO NEW.parent_place_id;
+        SELECT place_id from getNearestNamedRoadFeature(NEW.partition, near_centroid, address_street_word_ids) INTO NEW.parent_place_id;
       END IF;
     END IF;
     --DEBUG: RAISE WARNING 'Checked for addr:street (%)', NEW.parent_place_id;
@@ -1404,7 +1407,7 @@ BEGIN
     IF NEW.parent_place_id IS NULL AND addr_place IS NOT NULL THEN
       address_street_word_ids := get_name_ids(make_standard_name(addr_place));
       IF address_street_word_ids IS NOT NULL THEN
-        SELECT place_id from getNearestNamedPlaceFeature(NEW.partition, place_centroid, address_street_word_ids) INTO NEW.parent_place_id;
+        SELECT place_id from getNearestNamedPlaceFeature(NEW.partition, near_centroid, address_street_word_ids) INTO NEW.parent_place_id;
       END IF;
     END IF;
     --DEBUG: RAISE WARNING 'Checked for addr:place (%)', NEW.parent_place_id;
@@ -1439,7 +1442,7 @@ BEGIN
           IF location.address ? 'street' THEN
             address_street_word_ids := get_name_ids(make_standard_name(location.address->'street'));
             IF address_street_word_ids IS NOT NULL THEN
-              SELECT place_id from getNearestNamedRoadFeature(NEW.partition, place_centroid, address_street_word_ids) INTO NEW.parent_place_id;
+              SELECT place_id from getNearestNamedRoadFeature(NEW.partition, near_centroid, address_street_word_ids) INTO NEW.parent_place_id;
               EXIT WHEN NEW.parent_place_id is not NULL;
             END IF;
           END IF;
@@ -1448,7 +1451,7 @@ BEGIN
           IF location.address ? 'place' THEN
             address_street_word_ids := get_name_ids(make_standard_name(location.address->'place'));
             IF address_street_word_ids IS NOT NULL THEN
-              SELECT place_id from getNearestNamedPlaceFeature(NEW.partition, place_centroid, address_street_word_ids) INTO NEW.parent_place_id;
+              SELECT place_id from getNearestNamedPlaceFeature(NEW.partition, near_centroid, address_street_word_ids) INTO NEW.parent_place_id;
               EXIT WHEN NEW.parent_place_id is not NULL;
             END IF;
           END IF;
@@ -1477,7 +1480,7 @@ BEGIN
 
     -- Still nothing, just use the nearest road
     IF NEW.parent_place_id IS NULL THEN
-      SELECT place_id FROM getNearestRoadFeature(NEW.partition, place_centroid) INTO NEW.parent_place_id;
+      SELECT place_id FROM getNearestRoadFeature(NEW.partition, near_centroid) INTO NEW.parent_place_id;
     END IF;
     --DEBUG: RAISE WARNING 'Checked for nearest way (%)', NEW.parent_place_id;
 
@@ -1500,7 +1503,7 @@ BEGIN
              NEW.postcode := location.postcode;
           END IF;
           IF NEW.postcode is null THEN
-            NEW.postcode := get_nearest_postcode(NEW.country_code, place_centroid);
+            NEW.postcode := get_nearest_postcode(NEW.country_code, near_centroid);
           END IF;
       END IF;
 
@@ -1770,7 +1773,7 @@ BEGIN
                                   CASE WHEN NEW.rank_search >= 26
                                              AND NEW.rank_search < 30
                                        THEN NEW.geometry
-                                       ELSE place_centroid END,
+                                       ELSE near_centroid END,
                                   search_maxrank, isin_tokens)
   LOOP
     IF location.rank_address != location_rank_search THEN
@@ -2318,6 +2321,7 @@ DECLARE
   searchhousename HSTORE;
   searchrankaddress INTEGER;
   searchpostcode TEXT;
+  postcode_isaddress BOOL;
   searchclass TEXT;
   searchtype TEXT;
   countryname HSTORE;
@@ -2325,6 +2329,8 @@ 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.
 
+  postcode_isaddress := true;
+
   -- first query osmline (interpolation lines)
   IF in_housenumber >= 0 THEN
     SELECT parent_place_id, country_code, in_housenumber::text, 30, postcode,
@@ -2424,7 +2430,7 @@ BEGIN
     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)
@@ -2441,7 +2447,10 @@ BEGIN
       searchcountrycode := location.country_code;
     END IF;
     IF location.type in ('postcode', 'postal_code') THEN
-      location.isaddress := FALSE;
+      postcode_isaddress := false;
+      IF location.osm_type != 'R' THEN
+        location.isaddress := FALSE;
+      END IF;
     END IF;
     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
                            location.name, location.class, location.type,
@@ -2485,7 +2494,7 @@ BEGIN
 
   IF searchpostcode IS NOT NULL THEN
     location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
-                    'postcode', null, true, true, 5, 0)::addressline;
+                    'postcode', null, false, postcode_isaddress, 5, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
@@ -2495,96 +2504,6 @@ $$
 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 $$