]> git.openstreetmap.org Git - nominatim.git/blob - lib-php/admin/specialphrases.php
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / lib-php / admin / specialphrases.php
1 <?php
2 @define('CONST_LibDir', dirname(dirname(__FILE__)));
3
4 require_once(CONST_LibDir.'/init-cmd.php');
5 ini_set('memory_limit', '800M');
6 ini_set('display_errors', 'stderr');
7
8 $aCMDOptions
9 = array(
10    'Import and export special phrases',
11    array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
12    array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
13    array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
14    array('wiki-import', '', 0, 1, 0, 0, 'bool', 'Create import script for search phrases '),
15    array('project-dir', '', 0, 1, 1, 1, 'realpath', 'Base directory of the Nominatim installation (default: .)'),
16   );
17 getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
18
19 loadSettings($aCMDResult['project-dir'] ?? getcwd());
20 setupHTTPProxy();
21
22 include(getSettingConfig('PHRASE_CONFIG', 'phrase_settings.php'));
23
24 if ($aCMDResult['wiki-import']) {
25     $oNormalizer = Transliterator::createFromRules(getSetting('TERM_NORMALIZATION'));
26     $aPairs = array();
27
28     $sLanguageIn = getSetting(
29         'LANGUAGES',
30         'af,ar,br,ca,cs,de,en,es,et,eu,fa,fi,fr,gl,hr,hu,'.
31         'ia,is,it,ja,mk,nl,no,pl,ps,pt,ru,sk,sl,sv,uk,vi'
32     );
33
34     foreach (explode(',', $sLanguageIn) as $sLanguage) {
35         $sURL = 'https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/'.strtoupper($sLanguage);
36         $sWikiPageXML = file_get_contents($sURL);
37
38         if (!preg_match_all(
39             '#\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([\\-YN])#',
40             $sWikiPageXML,
41             $aMatches,
42             PREG_SET_ORDER
43         )) {
44             continue;
45         }
46
47         foreach ($aMatches as $aMatch) {
48             $sLabel = trim($aMatch[1]);
49             if ($oNormalizer !== null) {
50                 $sTrans = pg_escape_string($oNormalizer->transliterate($sLabel));
51             } else {
52                 $sTrans = null;
53             }
54             $sClass = trim($aMatch[2]);
55             $sType = trim($aMatch[3]);
56             // hack around a bug where building=yes was imported with
57             // quotes into the wiki
58             $sType = preg_replace('/(&quot;|")/', '', $sType);
59             // sanity check, in case somebody added garbage in the wiki
60             if (preg_match('/^\\w+$/', $sClass) < 1
61                 || preg_match('/^\\w+$/', $sType) < 1
62             ) {
63                 trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
64                 exit;
65             }
66             // blacklisting: disallow certain class/type combinations
67             if (isset($aTagsBlacklist[$sClass]) && in_array($sType, $aTagsBlacklist[$sClass])) {
68                 // fwrite(STDERR, "Blacklisted: ".$sClass."/".$sType."\n");
69                 continue;
70             }
71             // whitelisting: if class is in whitelist, allow only tags in the list
72             if (isset($aTagsWhitelist[$sClass]) && !in_array($sType, $aTagsWhitelist[$sClass])) {
73                 // fwrite(STDERR, "Non-Whitelisted: ".$sClass."/".$sType."\n");
74                 continue;
75             }
76             $aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
77
78             switch (trim($aMatch[4])) {
79                 case 'near':
80                     printf(
81                         "SELECT getorcreate_amenityoperator(make_standard_name('%s'), '%s', '%s', '%s', 'near');\n",
82                         pg_escape_string($sLabel),
83                         $sTrans,
84                         $sClass,
85                         $sType
86                     );
87                     break;
88                 case 'in':
89                     printf(
90                         "SELECT getorcreate_amenityoperator(make_standard_name('%s'), '%s', '%s', '%s', 'in');\n",
91                         pg_escape_string($sLabel),
92                         $sTrans,
93                         $sClass,
94                         $sType
95                     );
96                     break;
97                 default:
98                     printf(
99                         "SELECT getorcreate_amenity(make_standard_name('%s'), '%s', '%s', '%s');\n",
100                         pg_escape_string($sLabel),
101                         $sTrans,
102                         $sClass,
103                         $sType
104                     );
105                     break;
106             }
107         }
108     }
109
110     echo 'CREATE INDEX idx_placex_classtype ON placex (class, type);';
111
112     foreach ($aPairs as $aPair) {
113         $sql_tablespace = getSetting('TABLESPACE_AUX_DATA');
114         if ($sql_tablespace) {
115             $sql_tablespace = ' TABLESPACE '.$sql_tablespace;
116         }
117
118         printf(
119             'CREATE TABLE place_classtype_%s_%s'
120             . $sql_tablespace
121             . ' AS'
122             . ' SELECT place_id AS place_id,st_centroid(geometry) AS centroid FROM placex'
123             . " WHERE class = '%s' AND type = '%s'"
124             . ";\n",
125             pg_escape_string($aPair[0]),
126             pg_escape_string($aPair[1]),
127             pg_escape_string($aPair[0]),
128             pg_escape_string($aPair[1])
129         );
130
131         printf(
132             'CREATE INDEX idx_place_classtype_%s_%s_centroid'
133             . ' ON place_classtype_%s_%s USING GIST (centroid)'
134             . $sql_tablespace
135             . ";\n",
136             pg_escape_string($aPair[0]),
137             pg_escape_string($aPair[1]),
138             pg_escape_string($aPair[0]),
139             pg_escape_string($aPair[1])
140         );
141
142         printf(
143             'CREATE INDEX idx_place_classtype_%s_%s_place_id'
144             . ' ON place_classtype_%s_%s USING btree(place_id)'
145             . $sql_tablespace
146             . ";\n",
147             pg_escape_string($aPair[0]),
148             pg_escape_string($aPair[1]),
149             pg_escape_string($aPair[0]),
150             pg_escape_string($aPair[1])
151         );
152
153         printf(
154             'GRANT SELECT ON place_classtype_%s_%s TO "%s"'
155             . ";\n",
156             pg_escape_string($aPair[0]),
157             pg_escape_string($aPair[1]),
158             getSetting('DATABASE_WEBUSER')
159         );
160     }
161
162     echo 'DROP INDEX idx_placex_classtype;';
163 }