「开源GIS」public-ip-address:又一开源IP定位库
在之前的文章《「GIS教程」再谈使用IP地址定位用户位置(ip2region)》和《「GIS技巧」使用IP地址定位用户位置的方法小结 》中介绍过不少关于IP定位的使用方法及工具,比如:GeoIP、ipip、ip2region还有高德、百度等等一大堆三方服务商,它们中有在线的也有离线的,有的付费也有的免费。前几天小编又找到了一个比较好玩的开源IP定位库:public-ip-address。

关于 public-ip-address
public-ip-address 是一个轻量级、简单易用的 Rust 库。它的主要功能不仅仅是获取你当前的公网IP,更重要的是,它提供了一个统一的接口,能够从十几个不同的服务商那里获取 IP地址对应的地理位置信息。它不依赖单一来源的数据,而是对多家IP定位数据服务商做了一层代理,并加入缓存等机制,让IP定位的速度更快、更准也更稳定。
项目地址:https://github.com/ghztomash/public-ip-address
核心亮点
首先是多源聚合,集成了约20 + 服务商,覆盖不同速率限制及使用场景,可以使用 IfConfig、IpApiCom等无 API 密钥要求的服务商进行免费调用;也可以使用 IpInfo、Ip2Location等支持 API 密钥的高配额服务商进行高并发场景调用;甚至一些只要低精度的情况,可以使用MyIpCom、Ipify 等服务商提供无限制查询。
其次是智能缓存 + 加密,兼顾性能与隐私,GIS 项目中频繁 IP 查询容易触发服务商限流,同时地理信息属于敏感数据,这款库的缓存机制恰好解决。重复查询同一 IP 时直接返回缓存结果,减少 API 调用次数,提升解析效率;通过encryption特性 flag 启用缓存文件加密,避免地理信息泄露,符合数据隐私规范。
最后其支持 异步 + 同步调用方式,完美适配各种GIS架构,无需额外封装。并且其返回的数据格式可以覆盖 GIS 常见应用场景,基础字段:IP 地址、国家 / 地区代码、省份 / 州、城市、邮政编码、经纬度、时区,甚至包含ISP 运营商、ASN 编号等信息。
快速开始
如果你已经熟悉RUST开发,那么其调用方式非常简单。极简调用示例(本机 IP 地理信息查询):
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// 一行代码,自动寻找最快的服务商
let result = public_ip_address::perform_lookup(None).await?;
// 打印结果
println!("IP地址: {}", result.ip);
println!("国家: {}", result.country.unwrap_or_default());
println!("城市: {}", result.city.unwrap_or_default());
println!("坐标: ({}, {})",
result.latitude.unwrap_or(0.0),
result.longitude.unwrap_or(0.0)
);
Ok(())
}
使用同步模式调用
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let result = public_ip_address::perform_lookup(None)?;
println!("IP地理信息: {}", result);
Ok(())
}
更多高级用法(如指定服务商、配置 API 密钥、批量查询)可参考库中examples目录,直接复用适配 GIS 项目。
服务商列表
目前支持的服务商如下表:

大家也可以根据源码自行添加国内的服务商。
总结
虽然 Python 是 GIS 届的老大,但 Rust 凭借其内存安全和惊人的运行速度,正在 GIS 底层算法和高性能Web服务中崭露头角(看看 Martin服务器、Polars库 就知道了), public-ip-address 解决了 Rust GIS 开发中IP定位能力。如果你也是一名喜欢折腾新技术的 GISer,不妨尝试一下。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。