#openstreetmap #serve #osm #completion #numbers #city #zip #serve #completion

app maps-address-completion-service

提供城市名称、邮政编码、街道名称和门牌号以实现自动完成

GitHub仓库

0.2.0 GitHub仓库
0.1.1 GitHub仓库

GitHub仓库

GitHub仓库

GitHub仓库
GitHub仓库

GitHub仓库

GitHub仓库

GitHub仓库

  • GitHub仓库
  • GitHub仓库
    • GitHub仓库
  • GitHub仓库
    • GitHub仓库
  • GitHub仓库
  • GitHub仓库

GitHub仓库

cargo install maps-address-completion-service
curl -s https://download.geofabrik.de/europe/greece-latest.osm.pbf |
    macs parse |
    macs compress > greece.world
macs serve --world greece.world

GitHub仓库

GitHub仓库

GitHub仓库

GitHub仓库

GitHub仓库

{"country":"ZA","city":"Pinelands","postcode":"7405","street":"La Provence","housenumber":"1"}
{"country":"ZA","city":"Pinelands","postcode":"7405","street":"Ringwood Drive","housenumber":"2"}

GitHub仓库
GitHub仓库

wget https://download.geofabrik.de/europe/great-britain-latest.osm.pbf -O great-britain.osm.pbf

cat great-britain.osm.pbf | macs parse > map.jsonl

# Or compress it directly
cat great-britain.osm.pbf | macs parse | xz > maps.jsonl.xz

GitHub仓库

GitHub仓库
GitHub仓库

cat maps.jsonl | macs compress > great-britain.world
ls -lah great-britain.world

GitHub仓库

GitHub仓库

macs serve -w great-britain.world
macs serve --world great-britain.world --port 3000 --ip 127.0.0.1
[2023-10-16T22:45:11Z INFO macs::serve] Loading from world file "gb.world"...
[2023-10-16T22:45:11Z INFO macs::serve] World loadded, containing 3 countries.
[2023-10-16T22:45:11Z INFO macs::serve] Serve on 127.0.0.1:3000...

GitHub仓库

# First get cities
curl http://localhost:3000/cities --url-query "country_code=GB"

# Then ZIP codes
curl http://localhost:3000/zips\
    --url-query "country_code=GB" \
    --url-query "city_name=London"

# Then streets
curl http://localhost:3000/streets \
    --url-query "country_code=GB" \
    --url-query "city_name=London" \
    --url-query "zip=WC2R 0JR"

# Then house numbers
curl http://localhost:3000/housenumbers \
    --url-query "country_code=GB" \
    --url-query "city_name=London" \
    --url-query "zip=WC2R 0JR" \
    --url-query "street=Strand"

# All requests support prefix searching
curl http://localhost:3000/cities --url-query "country_code=GB" --url-query "prefix=Lon"

# All requests support result limiting
curl http://localhost:3000/cities --url-query "country_code=GB" -H "max-items: 16"

GitHub仓库

  • GitHub仓库
  • GitHub仓库
  • GitHub仓库
  • 通常所有数据都存储在有序向量中,而不是哈希表中。这种紧凑性导致内存使用最优化,并允许进行二分搜索。因此,请求的时间复杂度为O(log n),而不是O(1)。
  • 这是一个旨在供后端使用而不是前端使用的服务。如果由前端使用,请相应地配置反向代理。在反向代理时,注入一个较低的max-items: 123头部,并启用速率限制。小请求-大响应的特性可能对DOS攻击有吸引力。
  • OSM有很多错误数据,如名为"<format"1,2,3的城市,带引号的门牌号码或类似的东西。
  • 还有改进性能的余地,但它已经做得相当不错了。

一些有趣的数字

这些数字是在制作这个小项目时偶然发现的。这些都关系到OSM数据,例如,几乎没有地图非洲最重要的城市。它还注入了错误数据。所以请对这些数字持谨慎态度。

  • 欧洲世界结构为169MiB
  • 整个世界结构为203MiB
  • 整个世界大约有2.6亿个地址*
  • 整个世界大约有73.6万个独特的街道名称*
  • 整个世界大约有37.8万个独特的门牌号码,这些门牌号码不仅仅是整数(例如1A)

* 再次,基于OSM数据,该数据有误且不完整

贡献

非常欢迎贡献。如果您希望添加任何新功能,请随意打开一个问题。在打开拉取请求时,请使用cargo fmt并尽可能使代码保持简单。

潜在的未来改进

  • 按代码和名称搜索国家
  • 跳过一层
    • 给定国家,允许列出邮政编码(无城市)
    • 给定城市,允许列出街道
  • 当404时,指定确切找不到什么
  • 尽可能进行二分搜索(改进SortedVec以包含搜索闭包?)

依赖关系

~11–16MB
~263K SLoC