如何在Debian 10上设置OSM地理编码服务器
- 技术文档
- 2022.03.23
- 浏览:714
文章目录[隐藏]
在上一个教程中,我解释了在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 apache2 php php php pgsql libapache2 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个&gt&;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”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“/>;<;脚本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”src=“传单。js“>;<;/script>;<;script 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地理编码服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?