编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

来自法国的注重保护个人隐私的开源地图

wxchong 2025-01-02 19:39:00 开源技术 38 ℃ 0 评论

不得不说很佩服老外,为了保护自己的隐私,地图服务代码也开源,程序员的工匠精神让人敬佩!

这款开源地图名叫 Qwant Maps ,是一款来自法国的,不追踪用户的网络搜索引擎 Qwant 最近推出的一款地图服务,基于 OpenStreetMap 地图数据,支持电脑与手机访问。

通过地图可以收集太多的数据了,住在哪、在哪工作、去过哪、计划要去哪等等,一切和地图有关的数据组成了关于你的大数据。

来自法国的 Qwant 网络搜索引擎本身就在强调保护隐私,而这个地图服务,也是主打保护隐私以及开源,你可以在 GitHub 为 Qwant Maps 查看或者贡献代码,



Qwant Maps URL

Qwant Maps 提供可与好友共享的链接,以帮助他们切换到“SwitchToQwant”和“SwitchToOSM”。例如,您可以:

  • 使用以下格式在地图上搜索特定位置:
https://www.qwant.com/maps/#map=<zoom level>/<latitude>/<longitude>
https://www.qwant.com/maps/#map=12.08/48.8642287/2.3391427
  • 使用以下路径在地图上搜索特定位置:
https://www.qwant.com/maps/place/<id>
https://www.qwant.com/maps/place/osm:node:532031656@LExpress_de_Lyon

路由请求

这个端点指向一个路由表单,可以预先填充一些字段。例如:

https://www.qwant.com/maps/routes/?origin=latlon:48.8459543:2.3714015@LExpress_de_Lyon&destination=latlon:48.8702200:2.2786330&arrival_datetime=20160613T135400&mode[]=walking#map=18.00/48.8459543/2.3714015

与此端点对应的参数如下:

origin:用作起点的某个位置的id

destination:用作终点的某个位置的id

mode:如果要在路由窗体中预先选择路由模式。步行、骑自行车、开车、公共交通工具


架构

Qwant Maps 可以看作是4个分离的组件:

  • 一个地图的“地砖”服务器,
  • 搜索引擎(地理编码器),
  • 一个API来详细描述兴趣点和地点,
  • 前端。

地图的“地砖”服务器

提供显示地图的一部分所需的所有信息。

Qwant Maps 只提供矢量平铺,因此平铺服务器不提供图像(就像使用光栅平铺一样),而是提供原始数据。前端Erdapfel接收数据并将其呈现为用户可浏览的地图。

tile服务器是两个伟大的开源项目的组合:

  • kartotherian, Wikimedia堆栈有一个高度可用的tile服务器。它本身基于许多mapbox组件,
  • OpenMapTiles, 为一个非常棒而灵活的“地砖”模式。

OpenMapTiles使Qwant映射有一个易于定义/扩展的矢量平铺模式成为可能。

所有数据(见下文)主要使用impom导入PostgreSQL数据库。然后,使用kartotherian的tilerator生成世界上所有的矢量块,并将其存储在Cassandra中。这使得Qwant地图能够以一种快速且可伸缩的方式来服务。

地理编码器

用于Qwant地图的地理搜索引擎(也称为geocoder)是Mimirsbrunn。

Mimirsbrunn是一个基于Kisio Digital开发的Elasticsearch和rust组件的地理编码器。

位置API

为了获得更多关于地点和兴趣点 (POIs), 的详细信息,Qwant地图使用了一个附加的 API: Idunn, 它将地理编码器中的信息与外部API相结合,以格式化要在前端显示的详细 POIs 数据.

前端

Qwant地图的前端Erdapfel是一个Javascript单页应用程序,允许浏览地图、搜索位置、查看地图上的位置等。您还可以使用Masq保存您最喜欢的位置。

前端使用Mapbox GL渲染地图,使用tile服务器中的分幅和Qwant Maps自定义地图样式。

“地砖”数据

tile服务器的主要数据源是令人敬畏的OpenStreetMap(OSM)数据,而还有来自其他地方的数据,如natural earth, better water polygon等。

所有tile的数据导入过程都是在python脚本中定义的。

这个脚本导入PostgreSQL数据库中的所有数据,并运行许多后处理SQL函数(这些函数被定义为PostgreSQL触发器),因此它们也可以在OSM更新上运行。

当数据加载到PostgreSQL中时,我们使用tilerator生成缩放级别为0到14的所有分片,并将它们存储在Cassandra中。这样,当向tiles API kartotherian请求向量块时,不需要进行任何计算,只需在高度可用的Cassandra上按id进行简单的查询,就可以得到存储在其中的原始protobuf块。

地理编码器数据

Mimirsbrunn中的数据导入过程在python脚本中定义。

首先,OSM数据被提供给Cosmogony,Cosmogony输出一个包含世界所有行政区域的大JSON文件。此文件随后由cosmogony2mimir导入Mimir。

然后我们使用地址导入器导入地址。它下载地址的数据集(主要来自OpenAddresses和OpenStreetMap),对它们进行重复数据消除,然后使用openaddresses2mimir将它们导入到我们的地理编码器中。

然后使用osm2mimir从OSM pbf文件导入街道。

最后使用Fafnir从PostgreSQL数据库中提取POI(因此我们有一个统一的POI处理)。

位置API数据

Idunn 不需要自己的数据导入过程,但API依赖于:

  • 地理编码器的数据,
  • Wikipedia data, 从WikipediaAPI或自定义Elasticsearch数据库中获取。

OSM 升级

世界在不断变化,OpenStreetMap数据每天都在变得越来越好,因此我们需要定期更新所有组件中的数据。世界数据的导入是一个相当长的过程,所以在初始导入之后,我们每天都有一个cron任务来读取OSM差异更新并在PostgreSQL数据库中应用diff。

一旦我们在PostgreSQL中获得了最新数据,我们就可以再次导入geocoder POIs数据并重新生成受更改影响的分片。

我们每月更新余下的地理编码器数据(行政区域、街道和地址)。

整体架构



注意:为了提供Qwant地图服务,Qwant在自己的服务器上托管tile服务器、geocoder和idunnapi的实例。

请注意,Qwant实例是内部组件,除了作为Qwant映射的一部分之外,并不意味着直接使用。


接下来介绍如何运行

“地砖”服务器

要运行tileserver,最简单的方法是使用Docker。

项目kartotherian_docker提供了一个docker-compose与所有需要。

这个存储库很大程度上依赖于包含真正的Qwant地图业务逻辑的kartotherian配置:

  • imposm映射/openmappiles配置(从Qwant的openmappiles fork和openmappiles工具生成,参见自述文件)
  • 数据导入管道脚本
  • 更新脚本
  • kartotherian/tilerator 通用配置

地理编码器

存储库docker_mimir包含一个docker compose,可以轻松生成所需的docker容器并导入其中所需的数据。

位置API

Idunn的使用非常简单,因为它是一个简单的python API(使用apistar)。

自述文件详细说明了运行它的方法。

前端

Erdapfel 是一个简单的节点应用程序,但您也可以使用Docker来运行它。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表