]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Thu, 26 Apr 2018 20:29:54 +0000 (22:29 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Thu, 26 Apr 2018 20:29:54 +0000 (22:29 +0200)
1  2 
sql/functions.sql
website/reverse.php

diff --combined sql/functions.sql
index 396487b1ae1a1c3c93f5236c009324bd71a67252,16862acb39803c8ddf4cf08139eb2cb74ab589a2..305365d1b612878d292df21f7d436f02ce3c808f
@@@ -1234,6 -1234,7 +1234,7 @@@ DECLAR
    relation_members TEXT[];
    relMember RECORD;
    linkedplacex RECORD;
+   addr_item RECORD;
    search_diameter FLOAT;
    search_prevdiameter FLOAT;
    search_maxrank INTEGER;
@@@ -1766,44 -1767,43 +1767,43 @@@ BEGI
    parent_place_id_rank = 0;
  
  
-   -- convert isin to array of tokenids
+   -- convert address store to array of tokenids
    --DEBUG: RAISE WARNING 'Starting address search';
    isin_tokens := '{}'::int[];
    IF NEW.address IS NOT NULL THEN
-     isin := avals(NEW.address);
-     IF array_upper(isin, 1) IS NOT NULL THEN
-       FOR i IN 1..array_upper(isin, 1) LOOP
-         -- TODO further split terms with comma and semicolon
-         address_street_word_id := get_name_id(make_standard_name(isin[i]));
+     FOR addr_item IN SELECT * FROM each(NEW.address)
+     LOOP
+       IF addr_item.key IN ('city', 'tiger:county', 'state', 'suburb', 'province', 'district', 'region', 'county', 'municipality', 'hamlet', 'village', 'subdistrict', 'town', 'neighbourhood', 'quarter', 'parish') THEN
+         address_street_word_id := get_name_id(make_standard_name(addr_item.value));
          IF address_street_word_id IS NOT NULL AND NOT(ARRAY[address_street_word_id] <@ isin_tokens) THEN
-           nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
            isin_tokens := isin_tokens || address_street_word_id;
          END IF;
-         -- merge word into address vector
-         address_street_word_id := get_word_id(make_standard_name(isin[i]));
+         address_street_word_id := get_word_id(make_standard_name(addr_item.value));
          IF address_street_word_id IS NOT NULL THEN
            nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
          END IF;
-       END LOOP;
-     END IF;
-   END IF;
+       END IF;
+       IF addr_item.key = 'is_in' THEN
+         -- is_in items need splitting
+         isin := regexp_split_to_array(addr_item.value, E'[;,]');
+         IF array_upper(isin, 1) IS NOT NULL THEN
+           FOR i IN 1..array_upper(isin, 1) LOOP
+             address_street_word_id := get_name_id(make_standard_name(isin[i]));
+             IF address_street_word_id IS NOT NULL AND NOT(ARRAY[address_street_word_id] <@ isin_tokens) THEN
+               isin_tokens := isin_tokens || address_street_word_id;
+             END IF;
  
-   -- %NOTIGERDATA% IF 0 THEN
-   -- for the USA we have an additional address table.  Merge in zip codes from there too
-   IF NEW.rank_search = 26 AND NEW.country_code = 'us' THEN
-     FOR location IN SELECT distinct postcode from location_property_tiger where parent_place_id = NEW.place_id LOOP
-       address_street_word_id := get_name_id(make_standard_name(location.postcode));
-       nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
-       isin_tokens := isin_tokens || address_street_word_id;
-       -- also merge in the single word version
-       address_street_word_id := get_word_id(make_standard_name(location.postcode));
-       nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
+             -- merge word into address vector
+             address_street_word_id := get_word_id(make_standard_name(isin[i]));
+             IF address_street_word_id IS NOT NULL THEN
+               nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
+             END IF;
+           END LOOP;
+         END IF;
+       END IF;
      END LOOP;
    END IF;
-   --DEBUG: RAISE WARNING 'Tiger postcodes collected';
-   -- %NOTIGERDATA% END IF;
+   nameaddress_vector := array_merge(nameaddress_vector, isin_tokens);
  
  -- RAISE WARNING 'ISIN: %', isin_tokens;
  
    END LOOP;
    --DEBUG: RAISE WARNING 'address computed';
  
-   -- try using the isin value to find parent places
-   IF array_upper(isin_tokens, 1) IS NOT NULL THEN
-     FOR i IN 1..array_upper(isin_tokens, 1) LOOP
- --RAISE WARNING '  getNearestNamedFeature: % % % %',NEW.partition, place_centroid, search_maxrank, isin_tokens[i];
-       IF NOT ARRAY[isin_tokens[i]] <@ nameaddress_vector THEN
-         FOR location IN SELECT * from getNearestNamedFeature(NEW.partition, place_centroid, search_maxrank, isin_tokens[i]) LOOP
- --RAISE WARNING '  ISIN: %',location;
-           IF location.rank_search > 4 THEN
-               nameaddress_vector := array_merge(nameaddress_vector, location.keywords::integer[]);
-               INSERT INTO place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address)
-                 VALUES (NEW.place_id, location.place_id, false, NOT address_havelevel[location.rank_address], location.distance, location.rank_address);
-               IF NEW.postcode is null AND location.postcode is not null
-                  AND NOT address_havelevel[location.rank_address] THEN
-                 NEW.postcode := location.postcode;
-               END IF;
-               address_havelevel[location.rank_address] := true;
-               IF location.rank_address > parent_place_id_rank THEN
-                 NEW.parent_place_id = location.place_id;
-                 parent_place_id_rank = location.rank_address;
-               END IF;
-           END IF;
-         END LOOP;
-       END IF;
-     END LOOP;
-   END IF;
-   --DEBUG: RAISE WARNING 'isin tokens processed';
    -- for long ways we should add search terms for the entire length
    IF st_length(NEW.geometry) > 0.05 THEN
  
@@@ -2505,7 -2471,7 +2471,7 @@@ BEGI
      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 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) 
diff --combined website/reverse.php
index 822081ef7d4caff8973550e909400db78865d599,3bcac2ce40b2a99c412d6dd027e9c7f0af7bd09d..0251c8c8206d122f24ca0867f1135f2efca61ee8
@@@ -62,10 -62,9 +62,10 @@@ if (isset($aPlace)) 
          $aPlace = array_merge($aPlace, $aOutlineResult);
      }
  } else {
-     $aPlace = [];
+     $aPlace = array();
  }
  
 +logEnd($oDB, $hLog, sizeof($aPlace)?1:0);
  
  if (CONST_Debug) {
      var_dump($aPlace);