使用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测试。

image.png

使用/api/tile/{z}/{x}/{y}.{ext}这个API。点击“试用”按钮,保持默认的示例,点击“执行”,如果返回码为200,则表示成功。

image.png
image.png

因为仅凭这个不太明白,所以我会在浏览器中输入以下的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。

image.png

由于希望以更动态的方式查看矢量瓦片,因此我们将尝试使用QGIS的矢量瓦片功能。

image.png

链接中指定了以下内容。为了避免学校变得单调,暂时将其设置为没有搜索条件。

http://localhost:8080/api/tile/{z}/{x}/{y}.pbf?indices=[{"name":"osm_building_narok","geometry":"geometry"}]
image.png

在浏览器面板中显示了矢量切片。

image.png

在显示添加的矢量切片之前,请使用QGIS在肯尼亚的纳罗克镇显示位置。这里我们将尝试添加Maptiler插件的基本功能。请提前获取访问密钥。

image.png
image.png

现在,在这里将创建的矢量切片添加到地图中。只需双击浏览器面板中的Vector Tile的elastic MVT test即可。

image.png

当我查看终端时,我能够看到日志正常输出,并且确认程序在运行中。

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。

请多关照。

广告
将在 10 秒后关闭
bannerAds