]> git.openstreetmap.org Git - nominatim.git/blob - lib-php/admin/warm.php
decode_json() always create arrays instead of objects
[nominatim.git] / lib-php / admin / warm.php
1 <?php
2 /**
3  * SPDX-License-Identifier: GPL-2.0-only
4  *
5  * This file is part of Nominatim. (https://nominatim.org)
6  *
7  * Copyright (C) 2022 by the Nominatim developer community.
8  * For a full list of authors see the git log.
9  */
10 @define('CONST_LibDir', dirname(dirname(__FILE__)));
11
12 require_once(CONST_LibDir.'/init-cmd.php');
13 require_once(CONST_LibDir.'/log.php');
14 require_once(CONST_LibDir.'/PlaceLookup.php');
15 require_once(CONST_LibDir.'/ReverseGeocode.php');
16
17 ini_set('memory_limit', '800M');
18
19 $aCMDOptions = array(
20                 'Tools to warm nominatim db',
21                 array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
22                 array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
23                 array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
24                 array('reverse-only', '', 0, 1, 0, 0, 'bool', 'Warm reverse only'),
25                 array('search-only', '', 0, 1, 0, 0, 'bool', 'Warm search only'),
26                 array('project-dir', '', 0, 1, 1, 1, 'realpath', 'Base directory of the Nominatim installation (default: .)'),
27                );
28 getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
29
30 loadSettings($aCMDResult['project-dir'] ?? getcwd());
31
32 @define('CONST_Database_DSN', getSetting('DATABASE_DSN'));
33 @define('CONST_Default_Language', getSetting('DEFAULT_LANGUAGE', false));
34 @define('CONST_Log_DB', getSettingBool('LOG_DB'));
35 @define('CONST_Log_File', getSetting('LOG_FILE', false));
36 @define('CONST_NoAccessControl', getSettingBool('CORS_NOACCESSCONTROL'));
37 @define('CONST_Places_Max_ID_count', getSetting('LOOKUP_MAX_COUNT'));
38 @define('CONST_PolygonOutput_MaximumTypes', getSetting('POLYGON_OUTPUT_MAX_TYPES'));
39 @define('CONST_Search_BatchMode', getSettingBool('SEARCH_BATCH_MODE'));
40 @define('CONST_Search_NameOnlySearchFrequencyThreshold', getSetting('SEARCH_NAME_ONLY_THRESHOLD'));
41 @define('CONST_Use_US_Tiger_Data', getSettingBool('USE_US_TIGER_DATA'));
42 @define('CONST_MapIcon_URL', getSetting('MAPICON_URL', false));
43 @define('CONST_TokenizerDir', CONST_InstallDir.'/tokenizer');
44
45 require_once(CONST_LibDir.'/Geocode.php');
46
47 $oDB = new Nominatim\DB();
48 $oDB->connect();
49
50 $bVerbose = $aResult['verbose'];
51
52 function print_results($aResults, $bVerbose)
53 {
54     if ($bVerbose) {
55         if ($aResults && count($aResults)) {
56             echo $aResults[0]['langaddress']."\n";
57         } else {
58             echo "<not found>\n";
59         }
60     } else {
61         echo '.';
62     }
63 }
64
65 if (!$aResult['search-only']) {
66     $oReverseGeocode = new Nominatim\ReverseGeocode($oDB);
67     $oReverseGeocode->setZoom(20);
68     $oPlaceLookup = new Nominatim\PlaceLookup($oDB);
69     $oPlaceLookup->setIncludeAddressDetails(true);
70     $oPlaceLookup->setLanguagePreference(array('en'));
71
72     echo 'Warm reverse: ';
73     if ($bVerbose) {
74         echo "\n";
75     }
76     for ($i = 0; $i < 1000; $i++) {
77         $fLat = rand(-9000, 9000) / 100;
78         $fLon = rand(-18000, 18000) / 100;
79         if ($bVerbose) {
80             echo "$fLat, $fLon = ";
81         }
82
83         $oLookup = $oReverseGeocode->lookup($fLat, $fLon);
84         $aSearchResults = $oLookup ? $oPlaceLookup->lookup(array($oLookup->iId => $oLookup)) : null;
85         print_results($aSearchResults, $bVerbose);
86     }
87     echo "\n";
88 }
89
90 if (!$aResult['reverse-only']) {
91     $oGeocode = new Nominatim\Geocode($oDB);
92
93     echo 'Warm search: ';
94     if ($bVerbose) {
95         echo "\n";
96     }
97
98     $oTokenizer = new \Nominatim\Tokenizer($oDB);
99
100     $aWords = $oTokenizer->mostFrequentWords(1000);
101
102     $sSQL = 'SELECT word FROM word WHERE word is not null ORDER BY search_name_count DESC LIMIT 1000';
103     foreach ($aWords as $sWord) {
104         if ($bVerbose) {
105             echo "$sWord = ";
106         }
107
108         $oGeocode->setLanguagePreference(array('en'));
109         $oGeocode->setQuery($sWord);
110         $aSearchResults = $oGeocode->lookup();
111         print_results($aSearchResults, $bVerbose);
112     }
113     echo "\n";
114 }