-
如何在Debian 10上设置OSM地理编码服务器
在上一个教程中,我解释了在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个>&;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地理编码服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
如何在Ubuntu 20.04上安装OSRM——开源路由机器
OSRM(开源路由机器)是OpenStreetMap(OSM)道路网络的超快速路由引擎。在之前的教程中,我们解释了设置自托管OpenStreetMap互动程序服务器的过程,以及如何使用Namingm向地图添加地址查找功能。本教程将向您展示如何使用OSRM向OpenStreetMap添加导航功能,OSRM提供了汽车路线、自行车路线和步行路线。 本教程也适用于Ubuntu 18.04。 先决条件 要学习本教程,您应该安装并运行OSM tile服务器。如果没有,请按照下面的教程设置您自己的OSM tile服务器。 如何在Ubuntu 20.04上设置OpenStreetMap Tile服务器 您还应该可以访问地理编码服务,如用于地址查找的Namingm。 在Ubuntu20.04上设置OSM地理编码服务器 满足要求后,按照以下说明设置OSRM服务器。 步骤1:从源代码构建OSRM 安装依赖软件包。 sudo apt更新sudo apt install build sential git cmake pkg config doxygen libboost all dev libtbb dev lua5。2 liblua5。2-dev libluabind dev libstxxl dev libstxxl1v5 libxml2 libxml2 dev libosmpbf dev libbz2 dev libzip dev libprotobuf dev 创建osrm用户。(无需为此用户创建密码。) sudo useradd-d/srv/osrm-s/bin/bash-m osrm 向您自己的用户帐户授予权限。 sudo apt install acl sudo setfacl-R-mu:username:rwx/srv/osrm/ 更改为/srv/osrm/目录。 cd/srv/osrm/ 从其Github存储库下载OSRM源代码。 git克隆https://github.com/Project-OSRM/osrm-backend.git 创建构建目录。 mkdir构建 更改到此目录并配置生成环境。 cd构建cmake/srv/osrm/osrm后端/ 编译源代码。 制作 安装二进制文件。 sudo make安装 将安装以下二进制文件。 /usr/local/bin/osrm摘录: /usr/local/bin/osrm分区: /usr/local/bin/osrm定制: /usr/local/bin/osrm合同: /usr/local/bin/osrm数据存储: /usr/local/bin/osrm路由: 第2步:安装GNU屏幕 下一步,我们需要从OpenStreetMap中提取道路网络,这可能需要很长时间。您的计算机可能已与Internet断开连接,因此建议使用GNU Screen实用程序使会话保持活动状态。在Ubuntu 20.04服务器上安装屏幕: sudo apt安装屏幕 然后启动屏幕: 屏幕 在第一次启动时,您将看到介绍文本,只需按Enter键即可结束。然后你就可以像往常一样运行命令了。 步骤3:生成OSRM路由数据 现在我们需要下载OpenStreetMap数据,并使其可用于路由。运行以下命令以PBF(ProtoBufBinary)格式下载整个行星(56G)的地图数据。 wget-chttp://planet.openstreetmap.org/pbf/planet-latest.osm.pbf-P/srv/osrm/osrm后端 如果你想要一张单个国家/州/省/市的地图,请访问http://download.geofabrik.de.例如,使用以下命令下载英国地图数据(1.2G)。 wget-chttp://download.geofabrik.de/europe/great-britain-latest.osm.pbf-P/srv/osrm/osrm后端 自行车。org还以不同的格式提供了全球200多个城市和地区的摘录。 确保您位于/srv/osrm/osrm backend/目录中。 cd/srv/osrm/osrm后端/ 从OpenStreetMap数据中提取图形。 osrm最新摘录英国和爱尔兰。奥斯曼。pbf——线程数=10 默认情况下,它将使用汽车。lua简介。 现在,您可能不需要在服务器上执行其他操作。由于您使用的是Screen,所以可以按Ctrl+A,释放这些键,然后按D键从当前屏幕会话中分离。您将看到如下消息。 [与32113.pts-1.focal分离] 这告诉我之前的屏幕会话ID是32113。您可以从SSH会话中注销,甚至可以关闭计算机。别担心,osrm提取过程仍在运行。当需要返回并检查进度时,请将SSH连接到服务器并运行以下命令以获取上一个屏幕会话ID。 屏幕-ls 样本输出: 屏幕显示:32113。pts-1。focal(2020年5月19日03:45:29下午)(已分离)1个插座插入/运行/屏幕/S-linuxbabe。 然后可以重新连接到上一个屏幕会话。 屏幕-r 32113 这个过程是内存密集型的。(它在我的服务器上使用7GB内存。)完成后,将有一个文件名相同但具有相同名称的文件。osrm扩展。运行以下命令以递归方式将该图划分为单元格 osrm最新划分英国和爱尔兰。osrm 通过计算所有单元的布线权重来自定义单元。 osrm最新定制英国和爱尔兰。osrm 现在可以启动路由引擎了。 osrm路由——算法=MLD英国和爱尔兰最新版本。osrm 如您所见,它监听TCP端口5000。 第4步:创建systemd服务 我们可以使用OSRM routed--algorithm=MLD britain and ireland latest手动运行OSRM路由引擎。osrm,但在后台将osrm作为systemd服务运行更方便。按Ctrl+C停止当前osrm路由进程,并使用以下命令为osrm路由创建systemd服务单元文件。 sudo nano/etc/systemd/system/osrm路由。服务 将以下行放入文件中。 [Unit]Description=开源路由机器需求=网络在线。目标后=网络。目标网络在线。target[Service]ExecStart=/usr/local/bin/osrm routed--algorithm=MLD/srv/osrm/osrm backend/britain and ireland latest。osrm User=osrm Group=osrm Restart=always RestartSec=5s[Install]WantedBy=multi-User。目标 保存并关闭文件。更改/srv/osrm/osrm backend/目录的所有权。 sudo chown osrm:osrm/srv/osrm/osrm backend/-R 现在我们可以启动并启用osrm路由systemd服务。 sudo systemctl启动osrm路由sudo systemctl启用osrm路由 检查状态。 systemctl状态osrm路由 如果osrm路由服务未处于活动状态(正在运行),则可以运行以下命令查看问题所在。 sudo journalctl-欧盟osrm路由 第5步:配置Apache web服务器 我们可以将ApacheWeb服务器配置为osrm路由服务的反向代理,因此我们可以使用域名访问路由服务,还可以启用HTTPS加密。 安装Apache web服务器。 sudo apt安装apache2 要使用Apache作为反向代理,我们需要启用代理、代理和重写模块。 sudo a2enmod代理服务器u http重写 然后为OSRM创建一个虚拟主机文件。 sudo nano/etc/apache2/sites available/osrm。形态 将以下文本添加到文件中。更换osrm。你的领域。com与您的实际域名,别忘了为它创建DNS记录。 <;虚拟主机*:80>;服务器名osrm。你的领域。com ProxyPass/http://127.0.0.1:5000/ProxyPassReverse/http://127.0.0.1:5000/</VirtualHost>; 保存并关闭文件。然后启用这个虚拟主机。 sudo a2ensite osrm。形态 重新加载Apache以使更改生效。 sudo systemctl重新加载apache2 现在,您可以通过在浏览器地址栏中输入域名(OSRM.your-domain.com)远程访问OSRM。 第6步:启用HTTPS 我们可以通过安装Let's Encrypt颁发的免费TLS证书来启用HTTPS。在OSM tile服务器安装教程中,我们已经从Snap store安装了Let's Encrypt client(certbot)。所以我们只需要运行以下命令来获取并安装TLS证书。 sudo/snap/bin/certbot-apache-agree-tos-redirect-hsts-style-ocsp-email[email ;protected]-d osrm。你的领域。通用域名格式 哪里: --apache:使用apache插件。 --同意:同意服务条款。 --重定向:通过301重定向强制HTTPS。 --hsts:为每个HTTP响应添加严格的传输安全头。强制浏览器始终对域使用TLS。防止SSL/TLS剥离。 --装订ocsp:启用ocsp装订。有效的OCSP响应被绑定到服务器在TLS期间提供的证书上。 现在应获得证书并自动安装。您将能够通过安全的HTTPS连接访问Webmin web界面。 第7步:将OSRM与拖拉地图集成 我假设您的slippy地图是使用传单JavaScript库显示的,并且您已经在slippy地图中添加了Namingm地理编码服务。 要将OSRM与slippy map集成,我们可以使用一个名为传单路由机器的插件。首先,将传单路由机器JavaScript和CSS文件包含到你的slippy map中。请注意,它们应该放在主传单JavaScript和传单控制Geocoder JavaScript之后。 <;html>&书信电报;head>&书信电报;link rel=“stylesheet”href=”https://unpkg.com/[电子邮件和#160;受保护]/dist/传单传送机。css“/>;<;脚本src=”https://unpkg.com/[电子邮件和#160;受保护]/dist/传单传送机。js“>;<;/script>;<;/head>;<;body>;……<;/body>;<;/html>; 接下来,将以下行添加到<;脚本></脚本>;HTML正文中的代码片段。 L.路线。控件({serviceUrl:'https://osrm.your-domain.com/route/v1,地理编码员:L.控制。地理编码器。提名({serviceUrl:'https://tile.your-domain.com/nominatim/“}),routeWhileDragging:true})。addTo(地图); 这样地: <;html>&书信电报;head>&书信电报;link rel=“stylesheet”href=”https://unpkg.com/[电子邮件和#160;受保护]/dist/传单传送机。css“/>;<;脚本src=”https://unpkg.com/[电子邮件和#160;受保护]/dist/传单传送机。js“>;<;/script>;<;/head>;<;body>;<;div id=“map”>;<;/div>;<;script>;….L.路由控制({serviceUrl:'https://osrm.your-domain.com/route/v1,地理编码员:L.控制。地理编码器。提名({serviceUrl:'https://tile.your-domain.com/nominatim/“}),routeWhileDragging:true})。addTo(地图)</脚本></车身></html>; 保存并关闭文件。然后在web浏览器中重新加载地图,您应该会在右上角看到一个控制面板,您可以在其中输入起始地址和目标地址。 您可以在地图上拖动航路点,OSRM将自动重新计算路线。 收尾 我希望本教程能帮助你在Ubuntu20.04上安装OSRM服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
如何在Ubuntu 20.04上设置OpenStreetMap Tile服务器
OpenStreetMap(OSM)是一个用户贡献的、可自由编辑的世界地图。你可以把它看作是谷歌地图的开源和自托管替代品。本教程将向您展示如何在Ubuntu20.04上构建自己的OpenStreetMap tile服务器,这样您就不必使用专有的地图服务。 OpenStreetMap功能 OpenStreetMap的数据覆盖了全世界,因此可以方便地支持任何国家或每个国家的用户。 OpenStreetMap每天每小时每分钟都会更新,您可以实时获得这些更新。 OpenStreetMap数据是免费和开放的,不收取订阅费和页面浏览费。 OpenStreetMap数据丰富而详细,包含大量与地面人员相关的数据——收集数据的人员。 先决条件/硬件要求 所需的RAM和磁盘空间取决于要使用哪个国家的地图。例如 英国地图至少需要12G内存和100GB磁盘空间。 整个行星地图至少需要32G RAM和1TB SSD(固态驱动器)。用旋转硬盘来绘制整个地球地图是不可行的。 如果要在web浏览器中预渲染分幅以加快地图加载速度,则需要更多磁盘空间,这是强烈建议的。查看此磁贴磁盘使用情况页面,查看预渲染磁贴需要多少磁盘空间。例如,如果要为行星地图预渲染从缩放级别0到缩放级别15的平铺,则需要额外的460 GB磁盘空间。 另外需要注意的是,将大型地图数据(如整个地球)导入PostgreSQL数据库需要很长时间。考虑添加更多的RAM,特别是使用SSD,而不是旋转硬盘来加速导入过程。 如果你打算主持整个世界地图,我建议你从康塔博购买超大VPS,康塔博以 10核CPU 60 GB内存 1.6 TB英特尔Optane SSD 每月只需26.99欧元。 第一步:升级软件 在服务器上进行任何主要工作之前,更新服务器软件始终是一种好的做法。通过SSH登录服务器并运行以下命令。 sudo apt update; sudo apt upgrade 第2步:安装PostgreSQL数据库服务器和PostGIS扩展 我们将使用PostgreSQL存储地图数据。PostGIS是PostgreSQL的地理空间扩展。运行以下命令来安装它们。 sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3 PostgreSQL数据库服务器将自动启动并侦听127.0.0.1:5432。安装过程中将在操作系统上创建postgres用户。它是PostgreSQL数据库服务器的超级用户。默认情况下,该用户没有密码,也不需要设置密码,因为您可以使用sudo切换到postgres用户并登录到PostgreSQL server。 sudo -u postgres -i 现在可以创建PostgreSQL数据库用户osm。 createuser osm 然后创建一个名为gis的数据库,同时让osm成为数据库的所有者-UTF8指定数据库中使用的字符编码方案为UTF8。 createdb -E UTF8 -O osm gis 接下来,为gis数据库创建postgis和hstore扩展。 psql -c "CREATE EXTENSION postgis;" -d gis psql -c "CREATE EXTENSION hstore;" -d gis 将osm设置为表所有者。 psql -c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d gis 退出postgres用户。 exit 在操作系统上创建osm用户,以便平铺服务器可以作为osm用户运行。以下命令将创建一个没有密码的系统用户。 sudo adduser --system --group osm 第3步:下载地图样式表和地图数据 切换到osm的主目录。 cd /home/osm/ 使用git将最新的CartoCSS地图样式表下载到osm用户的主目录。 sudo apt install git git clone https://github.com/gravitystorm/openstreetmap-carto.git 如果在运行上述命令时看到“权限被拒绝”错误,则可以使用以下命令授予权限。用真实用户名替换用户名。 sudo apt install acl sudo setfacl -R -m u:username:rwx /home/osm/ 接下来,运行以下命令以PBF(ProtoBufBinary)格式下载整个行星(50G)的地图数据。 wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf 请注意openstreetmap的下载速度。org当前限制为2048kb/s。您可以从另一个镜像下载植物地图,如 wget -c https://download.bbbike.org/osm/planet/planet-latest.osm.pbf 如果你想要一张各个国家/州/省/市的地图,请访问http://download.geofabrik.de.还有,自行车。org以不同的格式提供了全球200多个城市和地区的摘录。例如,使用以下命令下载英国地图数据(1.1G)。 wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf 第4步:优化PostgreSQL Server性能 导入过程可能需要一些时间。为了加快这个过程,我们可以调整一些PostgreSQL server设置以提高性能。编辑PostgreSQL主配置文件。 sudo nano /etc/postgresql/12/main/postgresql.conf 首先,我们应该更改共享缓冲区的值。默认设置为: shared_buffers = 128MB 这个太小了。经验法则是将其设置为总RAM的25%(不包括交换空间)。例如,我的VPS有60G RAM,所以我将其设置为: shared_buffers = 15GB 找到下面这行。 #work_mem = 4MB #maintenance_work_mem = 64MB 同样,该值太小。我使用以下设置。 work_mem = 1GB maintenance_work_mem = 8GB 然后找到下面一行。 #effective_cache_size = 4GB 如果你像我一样有很多RAM,你可以为有效的缓存大小设置一个更高的值,比如20G。 effective_cache_size = 20GB 保存并关闭文件。重新启动PostgreSQL以使更改生效。 sudo systemctl restart postgresql 默认情况下,PostgreSQL会尝试在RAM中使用巨大的页面。然而,Linux默认情况下不会分配巨大的页面。检查PostgreSQL的进程ID。 sudo head -1 /var/lib/postgresql/12/main/postmaster.pid 样本输出: 7031 然后检查该进程ID的峰值。 grep ^VmPeak /proc/7031/status 样本输出: VmPeak: 16282784 kB 这是PostgreSQL将使用的峰值内存大小。现在检查Linux中巨大页面的大小。 cat /proc/meminfo | grep -i huge 样本输出: AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB 我们可以计算出我们需要多少巨大的页面。将VmPeak值除以巨大页面的大小:16282784KB/2048KB=7950。编辑/etc/sysctl。conf文件。 sudo nano /etc/sysctl.conf 在该文件末尾添加以下行以分配7950个大页面。 vm.nr_hugepages = 7950 保存并关闭文件。然后应用更改。 sudo sysctl -p 如果你再次查看meminfo, cat /proc/meminfo | grep -i huge 我们可以看到有7950个巨大的页面可用。 AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB 重新启动PostgreSQL以使用大型页面。 sudo systemctl restart postgresql 在远程服务器上使用屏幕 由于导入过程可能需要很长时间,并且您的计算机可能已断开与Internet的连接,因此建议使用screen实用程序保持会话的活动状态。在Ubuntu 20.04服务器上安装屏幕: sudo apt install screen 然后启动屏幕: screen 第一次启动时,您将看到一个介绍文本,只需按Enter键即可结束。然后你就可以像往常一样运行命令了。 步骤5:将地图数据导入PostgreSQL 要导入地图数据,我们需要安装osm2pgsql,将OpenStreetMap数据转换为支持postGIS的PostgreSQL数据库。 sudo apt install osm2pgsql 向postgres用户授予权限。 sudo setfacl -R -m u:postgres:rwx /home/osm/ 切换到postgres用户。 sudo -u postgres -i 运行以下命令将地图样式表和地图数据加载到gis数据库中。最新取代英国。奥斯曼。pbf与您自己的地图数据文件。 osm2pgsql --slim -d gis --hstore --multi-geometry --number-processes 10 --tag-transform-script /home/osm/openstreetmap-carto/openstreetmap-carto.lua --style /home/osm/openstreetmap-carto/openstreetmap-carto.style -C 32000 /home/osm/great-britain-latest.osm.pbf 哪里 --苗条模式:在苗条模式下运行,而不是在正常模式下运行。如果希望将来使用OSM更改文件(OSC)更新地图数据,则需要此选项。 -d gis:选择数据库。 --hstore:将不带列的标记添加到PostgreSQL表的另一个hstore(key/value)列中 --多重几何图形:在postgresql表中生成多重几何图形特征。 --样式:指定样式文件的位置 --进程数:服务器上的CPU核心数。我有10个。 -C标志以兆字节为单位指定缓存大小。它应该是你机器上可用内存的70%左右。缓存大小越大,导入速度越快。例如,我的服务器有60GB的空闲RAM,所以我可以指定-C 32000。请注意,PostgreSQL将需要用于共享缓冲区的RAM。使用此公式计算缓存大小应该有多大:(总RAM-PostgreSQL共享_缓冲区)*70% 最后,需要指定地图数据文件的位置。 命令输出: 如果要导入完整的行星地图数据,请使用--drop选项和--flat nodes选项来提高导入速度。请注意--flat nodes选项不适用于小贴图。 osm2pgsql --slim -d gis --drop --flat-nodes /home/osm/nodes.cache --hstore --multi-geometry --number-processes 10 --tag-transform-script /home/osm/openstreetmap-carto/openstreetmap-carto.lua --style /home/osm/openstreetmap-carto/openstreetmap-carto.style -C 32000 /home/osm/planet-latest.osm.pbf 在导入过程中,RAM的使用将逐渐增加。 现在,您可能不需要在服务器上执行其他操作。由于您使用的是Screen,所以可以按Ctrl+A,释放这些键,然后按D键从当前屏幕会话中分离。您将看到如下消息。 [detached from 32113.pts-1.focal] 这告诉我之前的屏幕会话ID是32113。您可以从SSH会话中注销,甚至可以关闭计算机。别担心,OSM导入过程仍在运行。当需要返回并检查导入进度时,请将SSH连接到服务器并运行以下命令以获取上一个屏幕会话ID。 screen -ls 样本输出: There is a screen on: 32113.pts-1.focal (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe. 然后可以重新连接到上一个屏幕会话。 screen -r 32113 这样你就能继续工作了。导入完成后,将gis数据库的所有权限授予osm用户。 psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis 退出postgres用户。 exit 注意:如果osm2pgsql导入尚未完成,请不要继续执行步骤6。 故障排除 如果从PBF文件导入地图数据时遇到以下错误, PBF error : invalid Blobheader size (> max_blob_header_size) 这可能是因为您的PBF文件已损坏。验证PBF文件的md5sum,如下所示。 md5sum great-britain-latest.osm.pbf 将结果与PBF文件下载页面上的md5sum值进行比较。 第6步:安装Renderd和mod_tile renderd是一个后台程序,用于从PostgreSQL数据库呈现OpenStreetMap分幅。 mod_tile是一个Apache模块,用于向客户端(例如web浏览器)提供tile服务 默认的Ubuntu存储库不包括mod_tile和renderd,但我们可以从OSM PPA安装它们。 sudo apt install software-properties-common sudo add-apt-repository ppa:osmadmins/ppa sudo apt install apache2 libapache2-mod-tile renderd 将安装Apache web服务器,并在/etc/apache2/conf available/renderd上创建renderd的配置文件。形态。 启用平铺模块。 sudo a2enmod tile 接下来,为磁贴服务器创建一个虚拟主机。 sudo nano /etc/apache2/sites-available/tileserver_site.conf 在此文件中添加以下行。更换瓷砖。你的领域。使用你的真实域名。别忘了记录。 <VirtualHost *:80> ServerName tile.your-domain.com LogLevel info Include /etc/apache2/conf-available/renderd.conf </VirtualHost> 保存并关闭文件。启用此虚拟主机。 sudo a2ensite tileserver_site.conf 重新启动Apache以使更改生效。 sudo systemctl restart apache2 渲染守护进程将自动启动,如下所示: systemctl status renderd 第7步:生成Mapnik样式表 安装所需的软件包。 sudo apt install curl unzip gdal-bin mapnik-utils libmapnik-dev python3-pip 我们还需要使用以下命令从上游存储库安装nodejs和npm。 curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt-get install -y nodejs 然后用npm安装carto软件包。 sudo npm install -g carto 安装psycopg2 Python模块。 sudo -H pip3 install psycopg2==2.8.5 切换到postgres用户。 sudo -u postgres -i 将Cd放入carto style目录。 cd /home/osm/openstreetmap-carto/ 获取形状文件。 scripts/get-external-data.py 如果在运行上述命令时遇到以下错误消息,则说明您存在DNS问题。只需等待几分钟,然后再次运行Python脚本。 Failed to establish a new connection: [Errno -3] Temporary failure in name resolution 现在使用carto map样式表编译器构建Mapnik XML样式表。 carto project.mml > style.xml 将gis数据库的所有权限授予osm用户。 psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO osm;" -d gis 退出postgres用户。 exit 第8步:安装字体 您需要安装ttf dejavu软件包。 sudo apt install ttf-dejavu 要显示非拉丁字符,请安装以下软件包。 sudo apt install fonts-noto-cjk fonts-noto-cjk-extra fonts-noto-hinted fonts-noto-unhinted ttf-unifont 步骤9:配置renderd 编辑渲染配置文件。 sudo nano /etc/renderd.conf 在[renderd]部分,根据服务器上的CPU内核数更改线程数。 num_threads=10 添加默认图层。以分号(;)开头的行这些都是评论。 ; ADD YOUR LAYERS: [default] URI=/osm/ XML=/home/osm/openstreetmap-carto/style.xml HOST=tile.your-domain.com 保存并关闭文件。然后为renderd服务创建一个新目录。 sudo mkdir /etc/systemd/system/renderd.service.d/ 在此目录下创建自定义配置文件。 sudo nano /etc/systemd/system/renderd.service.d/custom.conf 在此文件中添加以下行。 [Service] User=osm 保存并关闭文件。更改/run/renderd/和/var/cache/renderd/tiles/目录的所有权。 sudo chown osm /run/renderd/ -R sudo chown osm /var/cache/renderd/tiles/ -R 然后重新启动renderd服务。 sudo systemctl daemon-reload sudo systemctl restart renderd 你需要查看renderd的日志。 sudo journalctl -eu renderd 确保renderd在重启后不会在日志中产生任何错误,否则地图将不会显示。 第10步:测试 在web浏览器地址栏中,键入 tile.your-domain.com/osm/0/0/0.png 你应该看到世界地图的瓷砖。恭喜!您刚刚成功构建了自己的OSM磁贴服务器。 如果已启用UFW防火墙,请确保使用以下命令打开端口80和443。 sudo ufw allow 80,443/tcp 如果您看到404 not found错误,只需等待几分钟,在浏览器中刷新页面,它应该能够加载世界地图的平铺。如果仍然无法加载,则重新启动renderd服务(sudo systemctl restart renderd)。 第11步:显示平铺的网络地图 现在您有了一个工作的OSM tile服务器,您需要使用JavaScript映射库在其他服务器上显示映射。在本教程中,我将在tile服务器上创建web地图,但您可以在任何其他服务器上创建。 平铺网络地图在OpenStreetMap术语中也称为slippy地图。有两个免费的开源JavaScript地图库可用于tile服务器:OpenLayer和传单。传单的优点是使用简单,而且地图便于移动。 露天层 要使用OpenLayer显示你的slippy地图,请从OpenLayer下载JavaScript和CSS。组织并将其解压缩到webroot文件夹。 cd /var/www/html/ sudo wget https://github.com/openlayers/openlayers/releases/download/v5.3.0/v5.3.0.zip sudo unzip v5.3.0.zip 接下来,创建索引。html文件。 sudo nano /var/www/html/index.html 在文件中粘贴以下HTML代码。替换红色文本,并根据需要调整经度、纬度和缩放级别。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Accessible Map</title> <link rel="stylesheet" href="http://tile.your-domain.com/v5.3.0/css/ol.css" type="text/css"> <script src="http://tile.your-domain.com/v5.3.0/build/ol.js"></script> <style> a.skiplink { position: absolute; clip: rect(1px, 1px, 1px, 1px); padding: 0; border: 0; height: 1px; width: 1px; overflow: hidden; } a.skiplink:focus { clip: auto; height: auto; width: auto; background-color: #fff; padding: 0.3em; } #map:focus { outline: #4A74A8 solid 0.15em; } </style> </head> <body> <a class="skiplink" href="#map">Go to map</a> <div id="map" class="map" tabindex="0"></div> <button id="zoom-out">Zoom out</button> <button id="zoom-in">Zoom in</button> <script> var map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.OSM({ url: 'http://tile.your-domain.com/osm/{z}/{x}/{y}.png' }) }) ], target: 'map', controls: ol.control.defaults({ attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ collapsible: false }) }), view: new ol.View({ center: [244780.24508882355, 7386452.183179816], zoom:5 }) }); document.getElementById('zoom-out').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom - 1); }; document.getElementById('zoom-in').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom + 1); }; </script> </body> </html> 保存并关闭文件。现在你可以通过在浏览器地址栏中输入你的子域来查看你的拖拉地图。 tile.your-domain.com 或 tile.your-domain.com/index.html 传单 要使用Leftlet显示slippy地图,请从leftletjs下载JavaScript和CSS。com并将其解压缩到webroot文件夹。 cd /var/www/html/ sudo wget http://cdn.leafletjs.com/leaflet/v1.7.1/leaflet.zip sudo unzip leaflet.zip 接下来,创建索引。html文件。如果已经有索引。html文件,然后删除原始内容。 sudo nano /var/www/html/index.html 在文件中粘贴以下HTML代码。替换红色文本,并根据需要调整经度、纬度和缩放级别。 <html> <head> <meta charset="UTF-8"> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <script type="text/javascript" src="leaflet.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([55,0.8],6); L.tileLayer('http://tile.your-domain.com/osm/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map); </script> </body> </html> 保存并关闭文件。现在,您可以通过在浏览器中键入服务器IP地址来查看拖沓的地图。 tile.your-domain.com 或 tile.your-domain.com/index.html 步骤12:预渲染瓷砖 动态渲染平铺将增加在web浏览器中加载地图的时间。要预渲染平铺而不是动态渲染,请使用以下render_list命令。使用-z和-z标志指定缩放级别,并根据服务器上的CPU内核数替换线程数。Render_list通过向渲染守护进程发送请求来渲染贴图分幅列表。预渲染的磁贴将缓存在/var/lib/mod_tile目录中。 render_list -m default -a -z 0 -Z 19 --num-threads=10 如果以后更新了贴图数据,可以使用--force选项再次预渲染所有分片。 render_list -m default -a -z 0 -Z 19 --num-threads=10 --force 要在背景中渲染贴图分幅,请添加&;结尾的符号。 render_list -m default -a -z 0 -Z 19 --num-threads=10 & 现在你可以关闭终端窗口了。要检查呈现进度,请打开另一个SSH会话,然后运行以下命令。 sudo journalctl -eu renderd 上面的命令将显示renderd服务的最新日志。以下几行显示我的OSM服务器现在正在以缩放级别12渲染地图分幅。 renderd[20838]: DEBUG: START TILE default 12 1008-1015 4056-4063, new metatile renderd[20838]: Rendering projected coordinates 12 1008 4056 -> -10175297.205328|-19724422.274944 -10097025.688364|-19646150.757980 to a 8 x 8 tile renderd[20838]: DEBUG: DONE TILE default 12 1008-1015 3984-3991 in 0.799 seconds renderd[20838]: DEBUG: Sending render cmd(3 default 12/1008/3984) with protocol version 2 to fd 18 renderd[20838]: DEBUG: Got incoming request with protocol version 2 renderd[20838]: DEBUG: Got command RenderBulk fd(18) xml(default), z(12), x(1008), y(4064), mime(image/png), options() renderd[20838]: DEBUG: START TILE default 12 1008-1015 4064-4071, new metatile renderd[20838]: Rendering projected coordinates 12 1008 4064 -> -10175297.205328|-19802693.791908 -10097025.688364|-19724422.274944 to a 8 x 8 tile 步骤13:启用HTTPS 为了加密HTTP流量,我们可以从Let's encrypt获得并安装免费的TLS证书。osmadmins/ppa ppa包含一个出现故障的certbot二进制文件,因此我建议从快照存储安装certbot。 sudo apt install snapd sudo snap install --classic certbot 然后运行以下命令获取并安装TLS证书。 sudo /snap/bin/certbot --apache --agree-tos --redirect --hsts --staple-ocsp --must-staple --email [email protected] -d tile.your-domain.com 安装证书后,刷新网页,您将在地址栏中看到一个锁。 如果你在Firefox地址栏中看到一个黄色的三角形,这意味着tile URL仍在使用HTTP。你需要编辑索引。html文件,并使用以下命令将所有HTTP协议替换为HTTPS。 sudo sed -i 's/http/https/g' /var/www/index.html 步骤14:启用HTTP2 为了进一步提高映射加载性能,可以启用HTTP2协议。首先,需要启用HTTP2模块。 sudo a2enmod http2 然后打开SSL虚拟主机文件。 sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf 在打开后放置以下指令<;VirtualHost*:443>;标签 Protocols h2 http/1.1 保存并关闭文件。然后重启Apache,使更改生效。 sudo systemctl restart apache2 使用HTTP Referrer标头限制对OSM磁贴服务器的访问 默认情况下,任何人都可以使用OpenLayer或传单创建一个带有tile服务器URL的滑动地图。要限制对tile服务器的访问,请编辑Apache虚拟主机文件。 sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf 在<;VirtualHost>;标签。 <Location /osm> SetEnvIf Referer example/.com trusted_referer Order deny,allow Deny from all Allow from env=trusted_referer </Location> 上面的代码检查HTTP referer头是否包含您自己的域。否则,将拒绝访问/osm目录。反斜杠用于转义点字符。要将多个主机名添加为受信任的引用程序,请使用以下语法。 SetEnvIf Referer (example/.com|www/.example/.com|map/.example/.com) trusted_referer 保存并关闭文件。然后测试语法。 sudo apache2ctl -t 如果语法正确,请重新加载Apache以使更改生效。 sudo systemctl reload apache2 自动更新TLS证书 您可以创建Cron作业来自动续订TLS证书。只需打开root用户的crontab文件。 sudo crontab -e 在文件底部添加以下行。 @daily /snap/bin/certbot renew --quiet && systemctl reload apache2 不同主机上的PostgreSQL数据库和Web服务器 如果PostgreSQL和Apache web服务器位于不同的主机上,则需要编辑该项目。Apache主机上的mml文件。 nano /home/osm/openstreetmap-carto-4.20.0/project.mml 找到以下几行: osm2pgsql: &osm2pgsql type: "postgis" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508" 指定PostgreSQL数据库服务器的IP地址。 osm2pgsql: &osm2pgsql type: "postgis" host: "10.0.0.2" dbname: "gis" key_field: "" geometry_field: "way" extent: "-20037508,-20037508,20037508,20037508" 保存并关闭文件。然后使用carto map样式表编译器构建Mapnik XML样式表。 carto project.mml > style.xml 在PostgreSQL数据库服务器上,编辑主配置文件。 sudo nano /etc/postgresql/12/main/postgresql.conf 添加以下行,将PostgreSQL设置为在所有接口上侦听。 listen_addresses = '*' 保存并关闭文件。然后编辑PostgreSQL客户端身份验证配置文件。 sudo nano /etc/postgresql/12/main/pg_hba.conf 在文件末尾添加以下行,以允许osm用户从Apache主机登录。将10.0.0.1替换为Apache主机的IP地址。 host gis osm 10.0.0.1/32 trust 保存并关闭文件。然后重新启动PostgreSQL。 sudo systemctl restart postgresql 在Apache主机上重新启动渲染守护程序。 sudo systemctl restart renderd 你需要查看renderd的日志。确保renderd不会在日志中产生任何错误,否则地图将不会显示。 sudo journalctl -eu renderd 还应限制对PostgreSQL数据库服务器端口5432的访问。例如,您可以使用以下UFW命令只允许Apache主机的IP地址。 sudo ufw allow in from 10.0.0.1 to any port 5432 下一步 我希望本教程能帮助您在Ubuntu 20.04上安装OpenStreetMap tile服务器。您可能还需要设置Namingm地理编码服务器,以提供地址查找功能。 在Ubuntu20.04上设置OSM地理编码服务器 您可以使用开源路由机器(OSRM)为地图提供导航功能。 如何在Ubuntu 20.04上安装OSRM——开源路由机器 和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
在Ubuntu20.04上设置OSM地理编码服务器
在之前的教程中,我解释了在Ubuntu 20.04上构建自己的OSM tile服务器的过程。本教程将向您展示如何在Ubuntu20.04上设置Namingm地理编码服务器。Nagnitm为OpenStreetMap提供搜索功能,因此如果访客在搜索框中输入地址,将返回该地址的纬度/经度位置。 注意:如果你要为整个星球安装Namingm,那么你应该为Namingm启动另一台服务器,因为它还需要64GB的RAM和1TB的SSD。 第一步:从源代码构建提名 安装依赖项包以构建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-pgsql libapache2-mod-php php-intl php-cgi phpunit php-codesniffer python3-setuptools python3-dev python3-pip python3-psycopg2 python3-tidylib python3-behave python-pytest pylint git clang-tidy postgresql-server-dev-12 创建提名用户。(无需为此用户创建密码。) sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim 更改为/srv/m/目录。 cd /srv/nominatim/ 向您自己的用户帐户授予权限。 sudo apt install acl sudo setfacl -R -m u:username:rwx /srv/nominatim/ 从官方网站下载提名。 wget https://nominatim.org/release/Nominatim-3.5.1.tar.bz2 取出柏油球。 tar xvf Nominatim-3.5.1.tar.bz2 创建构建目录。 mkdir build 更改到此目录并配置生成环境。 cd build cmake /srv/nominatim/Nominatim-3.5.1 编译源代码。 make 第2步:配置提名 Nagnitm的默认配置文件是/srv/Nagnitm/build/settings/settings。php。我们可以创建一个本地。php文件,并在那里添加我们的修改。 sudo nano /srv/nominatim/build/settings/local.php 在文件中添加以下行。 <?php @define('CONST_Website_BaseURL', '/nominatim/'); @define('CONST_Default_Lat', 55.0); @define('CONST_Default_Lon', 1.0); @define('CONST_Default_Zoom', 6); @define('CONST_Map_Tile_URL', 'https://tile.linuxbabe.com/osm/{z}/{x}/{y}.png'); 上述配置定义了 相对于磁贴服务器的Namingm实例的路径。 默认纬度、经度和缩放级别。 OSM磁贴服务器的URL。默认情况下,提名使用公共资源https://tile.openstreetmap.org磁贴服务器。在这里,我使用自己的磁贴服务器。 您还可以查看/srv/namitm/build/settings/settings。php文件,并在需要时添加自己的自定义项。例如,如果要导入大型数据集(欧洲、北美、planet等),最好启用节点位置的平面节点存储,这样节点坐标将存储在一个简单的文件中,而不是数据库中,从而节省导入时间和磁盘存储。 @define('CONST_Osm2pgsql_Flatnode_File', '/srv/nominatim/flatnode.file'); 保存并关闭文件。 第3步:安装和配置PostgreSQL 注意:如果OSM tile server和Nagnitm安装在同一台服务器上,则可以跳过此步骤,因为您在设置OSM tile server时已经完成了此操作。 我们将使用PostgreSQL存储地图数据。PostGIS是PostgreSQL的地理空间扩展。运行以下命令来安装它们。 sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3 然后我们需要调整PostgreSQL以获得最佳性能。编辑主配置文件。 sudo nano /etc/postgresql/12/main/postgresql.conf 在该文件中查找以下参数并使用以下值。 shared_buffers = 15GB work_mem = 1GB maintenance_work_mem = 10GB effective_cache_size = 24GB synchronous_commit = off max_wal_size = 1GB checkpoint_timeout = 10min checkpoint_completion_target = 0.9 fsync = off full_page_writes = off 保存并关闭文件。重新启动PostgreSQL以使更改生效。 sudo systemctl restart postgresql 请注意,导入OSM数据库后,应打开fsync和full_page_write,否则可能会损坏数据库。 默认情况下,PostgreSQL会尝试在RAM中使用巨大的页面。然而,Linux默认情况下不会分配巨大的页面。检查PostgreSQL的进程ID。 sudo head -1 /var/lib/postgresql/12/main/postmaster.pid 样本输出: 7031 然后检查该进程ID的峰值。 grep ^VmPeak /proc/7031/status 样本输出: VmPeak: 16282784 kB 这是PostgreSQL将使用的峰值内存大小。现在检查Linux中巨大页面的大小。 cat /proc/meminfo | grep -i huge 样本输出: AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB 我们可以计算出我们需要多少巨大的页面。将VmPeak值除以巨大页面的大小:16282784KB/2048KB=7950。编辑/etc/sysctl。conf文件。 sudo nano /etc/sysctl.conf 添加以下行以分配7950个大页面。 vm.nr_hugepages = 7950 保存并关闭文件。然后应用更改。 sudo sysctl -p 如果你再次查看meminfo, cat /proc/meminfo | grep -i huge 我们可以看到有7950个巨大的页面可用。 AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB 重新启动PostgreSQL以使用大型页面。 sudo systemctl restart postgresql 第4步:导入OSM数据库 下载维基百科重要性转储文件,这将提高Nomatim搜索结果的质量。 cd /srv/nominatim/Nominatim-3.5.1/data wget https://www.nominatim.org/data/wikimedia-importance.sql.gz 下载美国和英国邮政编码数据。 wget https://www.nominatim.org/data/us_postcode_data.sql.gz wget https://www.nominatim.org/data/gb_postcode_data.sql.gz 下载国家代码数据文件。 wget -O country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz 然后需要下载一个OSM文件并将其导入PostgreSQL。你可以去http://download.geofabrik.de下载你需要的摘录。也可以在磁贴服务器设置过程中使用PBF文件。 在PostgreSQL中创建www数据用户,这样web服务器将对数据库具有只读访问权限。 sudo -u postgres createuser www-data 向postgres用户授予权限。 sudo setfacl -R -m u:postgres:rwx /srv/nominatim/ 切换到postgres用户。 sudo -u postgres -i 并运行以下命令将OSM提取导入PostgreSQL。 cd /srv/nominatim/build/ /srv/nominatim/build/utils/setup.php --osm-file /home/osm/great-britain-latest.osm.pbf --all 2>&1 | tee setup.log 导入数据库后,索引过程将开始。总共有30个等级。 完成后,运行以下命令进行验证。 /srv/nominatim/build/utils/check_import_finished.php 退出postgres用户。 exit 第5步:设置Apache 如果OSM磁贴服务器上安装了Namingm,则编辑磁贴服务器配置文件。 sudo nano /etc/apache2/sites-enabled/tileserver_site-le-ssl.conf 在VirtualHost标记之间添加以下行。 <Directory "/srv/nominatim/build/website"> Options FollowSymLinks MultiViews AddType application/json .php DirectoryIndex search.php Require all granted </Directory> alias /nominatim /srv/nominatim/build/website 保存并关闭文件。然后重新加载Apache。 sudo systemctl reload apache2 如果要在单独的服务器上设置Namingm,则需要安装Apache和PHP。 sudo apt install apache2 php7.4 libapache2-mod-php7.4 php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline 为提名创建虚拟主机。 sudo nano /etc/apache2/sites-enabled/nominatim.conf 在此文件中添加以下行。 <VirtualHost *:80> ServerName nominatim.example.com DocumentRoot /srv/nominatim/build/website <Directory "/srv/nominatim/build/website"> Options FollowSymLinks MultiViews AddType application/json .php DirectoryIndex search.php Require all granted </Directory> alias /nominatim /srv/nominatim/build/website ErrorLog ${APACHE_LOG_DIR}/nominatim_error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/nominatim_access.log combined </VirtualHost> 保存并关闭文件。然后重启Apache。 sudo systemctl restart apache2 现在参观https://tile.yourdomain.com/nominatim.您将看到您的Nomatim实例。 CSS文件位于/srv/namitm/build/website/CSS/search。css,如果你想定制外观。 第6步:更新提名数据库 为了使Namingm数据库保持最新,我们需要安装Pyosmium。它可以从默认的软件存储库中获得,但建议使用pip3安装最新版本。 sudo pip3 install osmium 这将安装一个二进制文件/usr/local/bin/pyosmium获取更改。编辑配置文件。 sudo nano /srv/nominatim/build/settings/local.php 添加以下行以指定pyosmium get changes的位置。 @define('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。 // base URL of the replication service @define('CONST_Replication_Url', ''); // How often upstream publishes diffs @define('CONST_Replication_Update_Interval', '86400'); // How long to sleep if no update found yet @define('CONST_Replication_Recheck_Interval', '900'); 保存并关闭文件。向postgres用户授予权限。 sudo setfacl -R -m "u:postgres:rwx" /srv/nominatim/build/ 然后切换到postgres用户。 sudo -u postgres -i 初始化更新过程。 /srv/nominatim/build/utils/update.php --init-updates 更新我的数据库。 /srv/nominatim/build/utils/update.php --import-osmosis-all 第7步:设置Cron作业以进行自动更新 编辑root用户的Crontab文件。 sudo crontab -e 在此文件中添加以下行。 @daily sudo -u postgres /srv/nominatim/build/utils/update.php --import-osmosis-all 保存并关闭文件。如果不想自动更新Nagnitm数据库,只需从Crontab文件中删除上面的一行即可。 如何在拖沓的地图上添加搜索功能 我假设你的slippy地图是使用传单JavaScript库显示的。要将搜索功能添加到地图中,需要使用传单地理编码插件。我将向您展示如何使用传单控制地理编码器。其实很简单。 假设您使用以下HTML代码来显示拖拉地图。 <html> <head> <meta charset="UTF-8"> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <script type="text/javascript" src="leaflet.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([54,1],6); L.tileLayer('https://tile.yourdomain.com/osm/{z}/{x}/{y}.png',{maxZoom:19}).addTo(map); </script> </body> </html> 现在,您需要在HTML标题中添加以下两行,以使用传单控制地理编码器插件。 <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" /> <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script> 然后将以下函数添加到<;脚本></脚本>;将搜索功能添加到地图中。 L.Control.geocoder().addTo(map); 最终的HTML代码如下所示: <html> <head> <meta charset="UTF-8"> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" /> <script type="text/javascript" src="leaflet.js"></script> <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([54,1],6); L.tileLayer('https://tile.yourdomain.com/osm/{z}/{x}/{y}.png',{maxZoom:19}).addTo(map); L.Control.geocoder().addTo(map); </script> </body> </html> 保存并关闭文件。然后在web浏览器中重新加载地图,您应该会在右上角看到一个搜索按钮。 默认情况下,传单控制地理编码器使用公共https://nominatim.openstreetmap.org地理编码服务。要使用您自己的地理编码服务,请删除以下行。 L.Control.geocoder().addTo(map); 改为添加以下行。将该URL替换为您的提名地理编码服务的URL。请注意,不应省略尾随的斜杠。 var geocoder = L.Control.Geocoder.nominatim({serviceUrl:'https://tile.yourdomain.com/nominatim/'}); if (URLSearchParams && location.search) { // parse /?geocoder=nominatim 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.geocoder({ query: 'Type Address here', placeholder: 'Search here...', geocoder: geocoder, position: 'topright' }).addTo(map); var marker; setTimeout(function() { control.setQuery('Type Address here'); }, 12000); 默认位置为右上角。如果你愿意,可以把它改成左上角。 您还可以为反向地理编码添加以下代码。当访客点击地图上的某个点时,该地址的名称就会出现。 map.on('click', function(e) { geocoder.reverse(e.latlng, map.options.crs.scale(map.getZoom()), function(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) .bindPopup(r.name) .addTo(map) .openPopup(); } } }); }); 保存并关闭文件。然后在web浏览器中重新加载地图。 提高反向搜索的准确性 提名中有两种类型的搜索: 前向搜索,又名地理编码,返回地址的纬度和经度 反向搜索,又名反向地理编码,返回纬度和经度的地址,即当访问者点击地图上的某个点时。 如果进行反向搜索,则标记针和弹出窗口与您单击的地图上的位置不在同一位置,则需要增加缩放级别。地图。getZoom()函数将获取当前的地图视图,该视图由setView()函数设置,如下所示 var map = L.map('map').setView([54,1],6); 缩放级别设置为6,这将导致反向搜索的精度较低。我们可以对反向搜索的缩放级别进行硬编码,如下所示: geocoder.reverse(e.latlng, map.options.crs.scale(21), function(results) i、 换张地图。getZoom()到21。反向搜索的最大缩放级别为21。您可以选择另一个缩放级别以满足您的需要。 故障排除 如果地图上的搜索功能不起作用,您可以检查web浏览器的控制台,找出哪里出了问题。有些人可能会认为406不可接受或CORS不允许出现错误。确保为设置了正确的MIME类型。Apache配置文件中的php。有些人可能有下面这句话,这可能会导致上述错误。 AddType text/html .php 应该是的 AddType application/json .php 更改MIME类型后。重新加载Apache以使更改生效。 sudo systemctl reload apache2 收尾 我希望本教程能帮助你在Ubuntu20.04上安装Namingm地理编码服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?