使用Nodejs将Elasticsearch搜索结果作为矢量瓦片进行分发
摘要
出于个人兴趣,我想尝试利用矢量瓦片来使用,因此我使用Nodejs创建了一个不太清楚的瓦片服务器,将Elasticsearch的搜索结果转换为Mapbox的二进制矢量瓦片格式,并作为开源项目进行了公开。我创建的仓库如下:
elastic2mvt: z/x/yと検索クエリを受け取ってバイナリベクトルタイルを1枚だけ生成するモジュール
es_tileserv: NodejsのExpressで構築したElasticsearch用のベクトルタイル配信サーバー
考虑到这种使用方式可能本身就是可能的,我们正在进行相当试验性和摸索性的API规范等方面的思考,因此,与我在这里写的内容相比,未来内容可能会有很大变化的可能性,但如果能提供一些想法,我会介绍工具。
由于篇幅较长,我不会在此进行源代码的解释,请有兴趣的人自行查阅。如果有任何疑问,请在存储库上提出问题。
使用方法
为了方便,我们进行了配置,使得可以通过Docker启动全部的服务,包括Elasticsearch。我们还将Tile服务器的Docker镜像上传到了Docker hub,因此如果要使用最新的源代码进行执行,只需按照以下方式操作,即可通过pm2启动Elasticsearch和分发服务器。
git clone git@github.com:JinIgarashi/es_tileserv.git
cd es_tileserv
npm run docker:start
如果对源代码进行修正,然后运行npm run docker:build,则会构建最新的镜像。
我只准备了肯尼亚纳洛克镇的建筑多边形数据作为测试数据。您可以使用以下命令在Elasticsearch中创建索引。请确保安装了GDAL,因为我们将使用ogr2ogr。
cd sample-data
./insert_test_data.sh
只要有一个名为osm_building_narok的索引,就可以。
ogrinfo ES:http://localhost:9200
INFO: Open of `ES:http://localhost:9200'
using driver `Elasticsearch' successful.
1: osm_building_narok (Multi Polygon)
关于API规范的说明
在启动服务器后,可以使用浏览器打开http://localhost:8080/docs并使用Swagger进行API测试。
使用/api/tile/{z}/{x}/{y}.{ext}这个API。点击“试用”按钮,保持默认的示例,点击“执行”,如果返回码为200,则表示成功。
因为仅凭这个不太明白,所以我会在浏览器中输入以下的URL尝试一下。
http://localhost:8080/api/tile/14/9824/8241.pbf?indices=%5B%7B%22name%22%3A%22osm_building_narok%22%2C%22geometry%22%3A%22geometry%22%2C%22query%22%3A%7B%22term%22%3A%7B%22building%22%3A%22school%22%7D%7D%7D%5D
由于8241.pbf已经下载下来了,我将在QGIS3.14或更高版本中尝试拖放此文件。看起来多边形已经显示出来了!你可以从这里下载QGIS。
由于希望以更动态的方式查看矢量瓦片,因此我们将尝试使用QGIS的矢量瓦片功能。
链接中指定了以下内容。为了避免学校变得单调,暂时将其设置为没有搜索条件。
http://localhost:8080/api/tile/{z}/{x}/{y}.pbf?indices=[{"name":"osm_building_narok","geometry":"geometry"}]
在浏览器面板中显示了矢量切片。
在显示添加的矢量切片之前,请使用QGIS在肯尼亚的纳罗克镇显示位置。这里我们将尝试添加Maptiler插件的基本功能。请提前获取访问密钥。
现在,在这里将创建的矢量切片添加到地图中。只需双击浏览器面板中的Vector Tile的elastic MVT test即可。
当我查看终端时,我能够看到日志正常输出,并且确认程序在运行中。
es_tileserv_1 | 06:18:20 2|es_tileserv | GET /api/tile/13/4914/4121.pbf?indices=[%7B%22name%22:%22osm_building_narok%22,%22geometry%22:%22geometry%22%7D] 200 51.559 ms - 0
es_tileserv_1 | 06:18:20 1|es_tileserv | GET /api/tile/13/4914/4122.pbf?indices=[%7B%22name%22:%22osm_building_narok%22,%22geometry%22:%22geometry%22%7D] 200 53.046 ms - 0
未来展望
-
- フロントエンドでMapboxGL JSを使って動的に検索ワードを変えつつ、ベクトルタイルを地図に表示したい。
-
- もしできたら、es_tileservで検索して表示するMapbox GL JSのプラグインを作りたい。
- Elasticsearchのいろんな検索に対応できるようにAPIの仕様を洗練させたい(自分はElasticsearchは素人同然なので検索ワードのAPIへの指定方法とかかなり手探りで作りました。)。
从两天前开始匆忙制作,所以可能有很多地方需要改进。如果有关于API规格的好建议,或者关于可以这样使用的创意想法,请在Github的存储库中提交Issue。
请多关照。