超优化的逆向地理编码 API

发布: (2026年3月19日 GMT+8 22:38)
5 分钟阅读

Source: Hacker News

一个基于 OpenStreetMap 数据的快速自托管逆向地理编码服务。给定纬度和经度坐标后,它会返回最近的街道地址,包括门牌号、街道名称、城市、州/省、县、邮政编码和国家。

Traccar 开源 GPS 跟踪平台的一部分。也提供 托管服务

功能

  • 基于 OSM 数据的街道级逆向地理编码
  • 地址点、街道名称和地址插值查询
  • 行政边界解析(国家、州/省、县、市、邮政编码)
  • 使用内存映射索引文件实现亚毫秒查询延迟
  • 自动使用 Let’s Encrypt 的 HTTPS
  • Docker 支持,自动下载 PBF 并建立索引

快速入门

Docker Compose

services:
  geocoder:
    image: traccar/traccar-geocoder
    environment:
      - PBF_URLS=https://download.geofabrik.de/europe/monaco-latest.osm.pbf
    ports:
      - "3000:3000"
    volumes:
      - geocoder-data:/data

volumes:
  geocoder-data:
docker compose up

Docker

一体化:下载、构建索引并提供服务

docker run -e PBF_URLS="https://download.geofabrik.de/europe-latest.osm.pbf" \
  -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder

仅构建索引

docker run -e PBF_URLS="https://download.geofabrik.de/europe-latest.osm.pbf" \
  -v geocoder-data:/data traccar/traccar-geocoder build

仅提供服务(使用预先构建的索引)

docker run -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder serve

多个 PBF 文件

docker run -e PBF_URLS="https://download.geofabrik.de/europe/france-latest.osm.pbf https://download.geofabrik.de/europe/germany-latest.osm.pbf" \
  -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder

自动 HTTPS

docker run -e PBF_URLS="https://download.geofabrik.de/planet-latest.osm.pbf" \
  -e DOMAIN=geocoder.example.com \
  -v geocoder-data:/data -p 443:443 traccar/traccar-geocoder

PBF 文件可从 Geofabrik 下载。

API

GET /reverse

查询参数

  • lat – 纬度(必填)
  • lon – 经度(必填)

响应 follows the Nominatim format:

{
  "display_name": "Avenue de la Costa 42, 98000 Monaco, Monaco",
  "address": {
    "house_number": "42",
    "road": "Avenue de la Costa",
    "city": "Monaco",
    "state": "Monaco",
    "county": "Monaco",
    "postcode": "98000",
    "country": "Monaco",
    "country_code": "MC"
  }
}

当字段不可用时将被省略。

架构

该项目由两个组件组成:

  • Builder(C++)——解析 OSM PBF 文件,并使用 S2 几何单元格创建紧凑的二进制索引以进行空间查找。
  • Server(Rust)——内存映射索引文件,并通过 HTTP/HTTPS 提供查询,延迟低于毫秒。

索引结构

构建器会生成 14 个二进制文件:

文件描述
geo_cells.bin合并的 S2 单元格索引,用于街道、地址和插值
street_entries.bin每个单元格的街道路段 ID
street_ways.bin街道路段头信息(节点偏移,名称)
street_nodes.bin街道节点坐标
addr_entries.bin每个单元格的地址点 ID
addr_points.bin地址点数据(坐标,门牌号,街道)
interp_entries.bin每个单元格的插值道路 ID
interp_ways.bin插值道路头信息
interp_nodes.bin插值节点坐标
admin_cells.bin用于行政边界的 S2 单元格索引
admin_entries.bin每个单元格的行政多边形 ID
admin_polygons.bin行政多边形元数据
admin_vertices.bin行政多边形顶点
strings.bin去重的字符串池

从源码构建

前置条件

Builder (C++)

  • CMake 3.16+
  • C++17 编译器
  • libosmiumprotozeros2geometryzlibbzip2expat

Server (Rust)

  • Rust 工具链

构建

# Build the indexer
mkdir build && cd build && cmake ../builder && make

# Build the server
cargo build --release --manifest-path server/Cargo.toml

运行

# Create index from PBF file(s)
./build/build-index output-dir input.osm.pbf [input2.osm.pbf ...]

# Start the server
./server/target/release/query-server output-dir [bind-address]

# Start with automatic HTTPS
./server/target/release/query-server output-dir --domain geocoder.example.com

Environment Variables (Docker)

VariableDescriptionDefault
PBF_URLS以空格分隔的 PBF 下载 URL 列表(自动/构建所必需)
DOMAIN用于 Let’s Encrypt 自动 HTTPS 的域名(disabled)
BIND_ADDRHTTP 绑定地址0.0.0.0:3000
DATA_DIR用于存放 PBF 文件和索引的数据目录/data
CACHE_DIRACME 证书缓存目录acme-cache
Apache License, Version 2.0

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
0 浏览
Back to Blog

相关文章

阅读更多 »

我发现字体设计的那一天

五十年前的本月,1976年3月,我20岁时,对字体设计的兴趣由此萌生。!https://www.marksimonson.com/_astro/Mark_1976.CUI1PPRz_Z1hRTVk.webp

对独立 AI Grid 的需求

苦涩的教训告诉我们,要通过扩大计算规模来解锁前沿 AI 的进展。经验记录证实了这一点。专注的、独立的团队已经展示了……

Waymo 比人类司机安全13倍

出了点问题,但别担心——我们再试一次。!https://abs-0.twimg.com/emoji/v2/svg/26a0.svg 某些隐私相关的扩展可能导致问题…