]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'lonvia/address-order'
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 20 Jul 2012 22:53:53 +0000 (00:53 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 20 Jul 2012 22:53:53 +0000 (00:53 +0200)
1  2 
sql/functions.sql

diff --combined sql/functions.sql
index 1d653bb205d8e7f17f00f2be8f79eb52726e64a7,d242418c061cc7b97c3ff5fdea893ec651b4323d..25769785b8bfd4fe4a1570e81ff92b369b782125
@@@ -769,13 -769,6 +769,13 @@@ BEGI
            -- null record of right type
            select * from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::INTEGER and type = 'house' limit 1 INTO nextnode;
            select ST_SetSRID(ST_Point(lon::float/10000000,lat::float/10000000),4326) from planet_osm_nodes where id = waynodes[nodeidpos] INTO nextnode.geometry;
 +          IF nextnode.geometry IS NULL THEN
 +            -- we don't have any information about this point, most likely
 +            -- because an excerpt was updated and the node never imported
 +            -- because the interpolation is outside the region of the excerpt.
 +            -- Give up.
 +            RETURN newpoints;
 +          END IF;
          ELSE
            select * from placex where place_id = search_place_id INTO nextnode;
          END IF;
@@@ -1220,6 -1213,8 +1220,8 @@@ DECLAR
  
    location_rank_search INTEGER;
    location_distance FLOAT;
+   location_parent GEOMETRY;
+   location_isaddress BOOLEAN;
  
    tagpairid INTEGER;
  
@@@ -1634,24 -1629,37 +1636,37 @@@ BEGI
  -- RAISE WARNING 'ISIN: %', isin_tokens;
  
      -- Process area matches
-     location_rank_search := 100;
+     location_rank_search := 0;
      location_distance := 0;
- -- RAISE WARNING '  getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
+     location_parent := NULL;
+     -- RAISE WARNING '  getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
      FOR location IN SELECT * from getNearFeatures(NEW.partition, place_centroid, search_maxrank, isin_tokens) LOOP
  
  --RAISE WARNING '  AREA: %',location;
  
-       IF location.rank_search < location_rank_search THEN
-         location_rank_search := location.rank_search;
+       IF location.rank_address != location_rank_search THEN
+         location_rank_search := location.rank_address;
          location_distance := location.distance * 1.5;
        END IF;
  
        IF location.distance < location_distance OR NOT location.isguess THEN
  
+         location_isaddress := NOT address_havelevel[location.rank_address];
+         IF location_isaddress AND location.isguess AND location_parent IS NOT NULL THEN
+             location_isaddress := ST_Contains(location_parent,location.centroid);
+         END IF;
+         -- RAISE WARNING '% isaddress: %', location.place_id, location_isaddress;
          -- Add it to the list of search terms
          nameaddress_vector := array_merge(nameaddress_vector, location.keywords::integer[]);
-         INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, true, NOT address_havelevel[location.rank_address], location.distance, location.rank_address); 
-         address_havelevel[location.rank_address] := true;
+         INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, true, location_isaddress, location.distance, location.rank_address);
+         IF location_isaddress THEN
+             address_havelevel[location.rank_address] := true;
+             IF NOT location.isguess THEN
+                 SELECT geometry FROM placex WHERE place_id = location.place_id INTO location_parent;
+             END IF;
+         END IF;
  
  --RAISE WARNING '  Terms: (%) %',location, nameaddress_vector;
  
      -- for long ways we should add search terms for the entire length
      IF st_length(NEW.geometry) > 0.05 THEN
  
-       location_rank_search := 100;
+       location_rank_search := 0;
        location_distance := 0;
  
        FOR location IN SELECT * from getNearFeatures(NEW.partition, NEW.geometry, search_maxrank, isin_tokens) LOOP
  
-         IF location.rank_search < location_rank_search THEN
-           location_rank_search := location.rank_search;
+         IF location.rank_address != location_rank_search THEN
+           location_rank_search := location.rank_address;
            location_distance := location.distance * 1.5;
          END IF;