GitHub仓库
0.2.0 | GitHub仓库 |
---|---|
0.1.1 | 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