您現在的位置是:首頁 > 武術
如何在Debian 10上設定OSM地理編碼伺服器
- 由 MMCLOUD 發表于 武術
- 2022-03-28
如何改變檔案型別
在上一個教程中,我解釋了在Debian 10上構建自己的OSM tile伺服器的過程。本教程將向您展示如何在Debian 10上設定Namingm地理編碼伺服器。Nagnitm為OpenStreetMap提供搜尋功能,因此如果訪客在搜尋框中輸入地址,將返回該地址的緯度/經度位置。
第一步:從原始碼構建提名
安裝依賴項包以構建Nagnitm。
sudo apt update sudo apt install build essential cmake g++libboost dev libboost system dev libboost filesystem dev libexpat1 dev zlib1g dev libbz2 dev libpq dev libproj dev
apache
2 php php php pgsql lib
apache
2 mod php intl python3 setuptools python3 dev python3 pip python3-psycopg2 python3 tidylib git gram postgresql-server-dev-11
建立提名使用者。(無需為此使用者建立密碼。)
sudo useradd-d/srv/namitm-s/bin/bash-m namitm
更改為/srv/m/目錄。
cd/srv/M/
向您自己的使用者帳戶授予許可權。
sudo apt install acl sudo setfacl-R-mu:username:rwx/srv/m/
從官方網站下載提名。
wgethttps://nominatim。org/release/Nominatim-3。5。1。tar。bz2
取出柏油球。
tar xvf M-3。5。1。焦油bz2
建立構建目錄。
mkdir構建
更改到此目錄並配置生成環境。
cd build cmake/srv/Namingm/Namingm-3。5。1
編譯原始碼。
製作
第2步:配置提名
Nagnitm的預設配置檔案是/srv/Nagnitm/build/settings/settings。php。我們可以建立一個本地。php檔案,並在那裡新增我們的修改。
sudo nano/srv/m/build/settings/local。php
在檔案中新增以下行。
<;?php@define(‘CONST_Website_BaseURL’,‘/namignm/’)@定義(‘CONST_Default_Lat’,55。0)@定義(‘CONST_Default_Lon’,1。0)@定義(‘CONST_Default_Zoom’,6)@定義(‘CONST_Map_Tile_URL’,‘https://tile。linuxbabe。com/osm/{z} /{x}/{y}。巴布亞紐幾內亞);
上述配置定義了
相對於磁貼伺服器的Namingm例項的路徑。
預設緯度、經度和縮放級別。
OSM磁貼伺服器的URL。預設情況下,Nagnitm使用公共openstreetmap。組織平鋪伺服器。在這裡,我使用自己的磁貼伺服器。
您還可以檢視/srv/namitm/build/settings/settings。php檔案,並在需要時新增自己的自定義項。例如,如果要匯入大型資料集(歐洲、北美、planet等),最好啟用節點位置的平面節點儲存,這樣節點座標將儲存在一個簡單的檔案中,而不是資料庫中,從而節省匯入時間和磁碟儲存。
@定義(’CONST_Osm2pgsql_Flatnode_File‘,’/srv/namignm/Flatnode。File‘);
儲存並關閉檔案。
第3步:匯入OSM資料庫
下載維基百科重要性轉儲檔案,這將提高Nomatim搜尋結果的質量。
cd/srv/NAMMATIONM/NAMMATIONM-3。5。1/data wgethttps://www。nominatim。org/data/wikimedia-importance。sql。gz
下載美國和英國郵政編碼資料。
wgethttps://www。nominatim。org/data/us_postcode_data。sql。gzwgethttps://www。nominatim。org/data/gb_postcode_data。sql。gz
下載國家程式碼資料檔案。
wget——國家電網。sql。廣州https://www。nominatim。org/data/country_grid。sql。gz
然後需要下載一個OSM檔案並將其匯入PostgreSQL。你可以去http://download。geofabrik。de下載你需要的摘錄。也可以在磁貼伺服器設定過程中使用PBF檔案。
在PostgreSQL中建立www資料使用者,這樣web伺服器將對資料庫具有隻讀訪問許可權。
sudo-u postgres createuser www資料
向postgres使用者授予許可權。
sudo setfacl-R-mu:postgres:rwx/srv/m/
切換到postgres使用者。
sudo-u postgres-i
並執行以下命令將OSM提取匯入PostgreSQL。
cd/srv/Namingm/build//srv/Namingm/build/utils/setup。php——osm檔案/home/osm/great british-latest。奧斯曼。pbf——全部2個>&;1 |三通設定。日誌
匯入資料庫後,索引過程將開始。
完成後,執行以下命令進行驗證。
/srv/namignm/build/utils/check_import_finished。php
退出postgres使用者。
出口
第4步:設定Apache
編輯磁貼
伺服器配置
檔案。
sudo nano/etc/apache2/sites enabled/tileserver_site-le-ssl。形態
在VirtualHost標記之間新增以下行。
<;目錄“/srv/namitm/build/website”>;選項如下SymLinks MultiViews AddType application/json。php目錄索引搜尋。php需要所有授權</目錄>;別名/namitm/srv/namitm/build/website
儲存並關閉檔案。然後重新載入Apache。
sudo systemctl重新載入apache2
現在參觀https://tile。yourdomain。com/nominatim。您將看到您的Nomatim例項。
CSS檔案位於/srv/namitm/build/website/CSS/search。css,如果你想定製外觀。
更新提名資料庫
為了使Namingm資料庫保持最新,我們需要安裝Pyosmium。它可以從預設的軟體儲存庫中獲得,但建議使用pip3安裝最新版本。
sudo pip3安裝鋨
這將安裝一個二進位制檔案/usr/local/bin/pyosmium獲取更改。編輯配置檔案。
sudo nano/srv/m/build/settings/local。php
新增以下行以指定pyosmium get changes的位置。
@定義(’CONST_Pyosmium_Binary‘,’/usr/local/bin/Pyosmium get changes‘);
接下來,我們需要告訴Namingm在哪裡下載更新。預設情況下,它被配置為從https://planet。openstreetmap。org/replication/minute。如果您從geofabrik下載了OSM PBF檔案。de,那麼最好也從那裡下載更新。
要查詢自己地圖的更新URL,請轉到https://download。geofabrik。de/找到你所在的地區。然後找到該檔案的URL。osc。gz檔案。
此URL是更新URL。
在/srv/namignm/build/settings/local中新增以下行。php檔案。您需要使用自己的更新URL。
//複製服務@define的基本URL(’CONST_replication_URL‘,’http://download。geofabrik。de/europe/great-britain-updates‘); // 上游釋出diff@define的頻率(’CONST_Replication_Update_Interval‘,’86400‘);//如果還沒有找到更新@define(’CONST_Replication_Recheck_Interval‘,’900‘),需要多長時間睡眠;
儲存並關閉檔案。向postgres使用者授予許可權。
sudo setfacl-R-m“u:postgres:rwx”/srv/m/build/
然後切換到postgres使用者。
sudo-u postgres-i
初始化更新過程。
/srv/namignm/build/utils/update。php——初始化更新
更新我的資料庫。
/srv/namignm/build/utils/update。php——全部匯入
設定Cron作業以進行自動更新
編輯root使用者的Crontab檔案。
sudo crontab-e
在此檔案中新增以下行。
@每日sudo-u postgres/srv/namitm/build/utils/update。php——全部匯入
儲存並關閉檔案。
如何在拖沓的地圖上新增搜尋功能
我假設你的slippy地圖是使用傳單JavaScript庫顯示的。要將搜尋功能新增到地圖中,需要使用傳單地理編碼外掛。我將向您展示如何使用傳單控制地理編碼器。其實很簡單。
假設您使用以下HTML程式碼來顯示拖拉地圖。
<;html>&書信電報;頭>&書信電報;meta charset=“UTF-8”大於&書信電報;標題>;我的第一個osm</標題>&書信電報;link rel=“stylesheet”type=“text/css”href=“傳單。css”/>&書信電報;script type=“text/javascript”alt="如何在Debian 10上設定OSM地理編碼伺服器" data-isLoading="0" src="/static/img/blank.gif" data-src=“ployate。js”></指令碼>&書信電報;風格>#地圖{寬度:100%;高度:100%}</風格></頭>&書信電報;車身>&書信電報;div id=“map”></部門>&書信電報;指令碼>;var map=L。map(’map‘)。setView([54,1],6);蒂萊萊耶https://tile。yourdomain。com/osm/{z} /{x}/{y}。png’,{maxZoom:19})。addTo(地圖)</指令碼></車身></html>;
現在,您需要在HTML標題中新增以下兩行,以使用傳單控制地理編碼器外掛。
<;link rel=“stylesheet”href=”https://unpkg。com/leaflet-control-geocoder/dist/Control。Geocoder。css“/>;<;指令碼alt="如何在Debian 10上設定OSM地理編碼伺服器" data-isLoading="0" src="/static/img/blank.gif" data-src=”https://unpkg。com/leaflet-control-geocoder/dist/Control。Geocoder。js“>;<;/script>;
然後將以下函式新增到<;指令碼></指令碼>;將搜尋功能新增到地圖中。
控制。地理編碼器()。addTo(地圖);
最終的HTML程式碼如下所示:
<;html>&書信電報;頭>&書信電報;meta charset=“UTF-8”大於&書信電報;標題>;我的第一個osm</標題>&書信電報;link rel=“stylesheet”type=“text/css”href=“傳單。css”/>&書信電報;link rel=“stylesheet”href=”https://unpkg。com/leaflet-control-geocoder/dist/Control。Geocoder。css“/>;<;script type=“text/javascript”alt="如何在Debian 10上設定OSM地理編碼伺服器" data-isLoading="0" src="/static/img/blank.gif" data-src=“傳單。js“>;<;/script>;<;script alt="如何在Debian 10上設定OSM地理編碼伺服器" data-isLoading="0" src="/static/img/blank.gif" data-src=”https://unpkg。com/leaflet-control-geocoder/dist/Control。Geocoder。js“>;<;/script>;<;style>;#map{寬度:100%;高度:100%}<;/style>;<;/head>;<;body>;<;div id=“map”>;<;/div>;<;script>;var map=L。map(‘map’)。setView([54,1],6);L。tileLayer(‘map’)”https://tile。yourdomain。com/osm/{z} /{x}/{y}。png‘,{maxZoom:19})。addTo(地圖);控制。地理編碼器()。addTo(地圖)</指令碼></車身></html>;
儲存並關閉檔案。然後在web瀏覽器中重新載入地圖,您應該會在右上角看到一個搜尋按鈕。
預設情況下,傳單控制地理編碼器使用公共https://nominatim。openstreetmap。org地理編碼服務。要使用您自己的地理編碼服務,請刪除以下行。
控制。地理編碼器()。addTo(地圖);
改為新增以下行。將該URL替換為您的提名地理編碼服務的URL。請注意,不應省略尾隨的斜槓。
var geocoder=L。控制。地理編碼器。提名({serviceUrl:’https://tile。yourdomain。com/nominatim/‘}); if(URLSearchParams&;location。search){//parse/?geocoder=namitm from URL var params=new URLSearchParams(location。search);var geocoderString=params。get(’geocoder‘);if(geocoderString&;L。Control。geocoder[geocoderString]){console。log(’Using geocoder‘,geocoderString);geocoder=L。Control geocoder[geocoderString](); } else if(geocoderString){console。warn(’Unsupported geocoder‘,geocoderString);}var control=L。control。地理編碼器({query:’Moon‘,佔位符:’Search here…‘,geocoder:geocoder})。addTo(地圖);var標記;setTimeout(function(){control。setQuery(’Earth‘);},12000);
您還可以為反向地理編碼新增以下程式碼。當訪客點選地圖上的某個點時,該地址的名稱就會出現。
地圖在(’click‘,函式(e){geocoder。reverse(e。latlng,map。options。crs。scale(map。getZoom()),函式(results){var r=results[0];if(r){if(marker){marker。setLatLng(r。center。)。setPopupContent(r。html | | r。name)。openPopup()}else{marker=L。marker(r。center)。bindpoppup(r。name)。addTo(map。openPopup();}}});});
儲存並關閉檔案。然後在web瀏覽器中重新載入地圖。
提高反向搜尋的準確性
提名中有兩種型別的搜尋:
前向搜尋,又名地理編碼,返回地址的緯度和經度
反向搜尋,又名反向地理編碼,返回緯度和經度的地址,即當訪問者點選地圖上的某個點時。
如果進行反向搜尋,則標記針和彈出視窗與您單擊的地圖上的位置不在同一位置,則需要增加縮放級別。地圖。getZoom()函式將獲取當前的地圖檢視,該檢視由setView()函式設定,如下所示
var map=L。map(’map‘)。setView([54,1],6);
縮放級別設定為6,這將導致反向搜尋的精度較低。我們可以對反向搜尋的縮放級別進行硬編碼,如下所示:
地理編碼器。反轉(如拉特林、地圖選項、crs比例(21)、功能(結果)
i、 換張地圖。getZoom()到21。反向搜尋的最大縮放級別為21。您可以選擇另一個縮放級別以滿足您的需要。
故障排除
如果地圖上的搜尋功能不起作用,您可以檢查web瀏覽器的控制檯,找出哪裡出了問題。有些人可能會認為406不可接受或CORS不允許出現錯誤。確保為設定了正確的MIME型別。Apache配置檔案中的php。有些人可能有下面這句話,這可能會導致上述錯誤。
AddType text/html。php
應該是的
AddType應用程式/json。php
更改MIME型別後。重新載入Apache以使更改生效。
sudo systemctl重新載入apache2
收尾
我希望本教程能幫助您在Debian 10上安裝Namingm地理編碼伺服器。和往常一樣,如果你覺得這篇文章很有用,那麼訂閱我們的免費時事通訊以獲得更多提示和竅門。當心
除非註明,否則均為MMCloud原創文章,轉載必須以連結形式標明本文連結。