5级行政区域数据

Rust 实现 省市县镇村 数据查询 名称模糊搜索 及坐标对应城市搜索

c的ffi示例,可以通过ffi转接到其他语言上,示例:php扩展

包含以下数据:

  1. 五级行政区域数据库: sqlite数据 csv数据

  2. 县区级经纬度坐标数据 sqlite数据 csv数据

  3. 预计下一步引入:ip对应城市数据

使用示例:
  1. 请先下载CSV数据文件到你的项目:城市数据示例 城市坐标示例

csv数据源使用示例

```toml

cargo.toml 默认仅引入:data-csv

area-db = { version = "~0.0.*"} ```

rust let code_path = PathBuf::from("data/2023-7-area-code.csv.gz"); let geo_path = PathBuf::from("data/2023-7-area-geo.csv.gz"); let data = area_db::CsvAreaData::new( area_db::CsvAreaCodeData::from_inner_path(code_path, true).unwrap(), Some(area_db::CsvAreaGeoData::from_inner_path(geo_path, true).unwrap()), ); let area = area_db::AreaDao::new(data).unwrap();

  1. 请先下载sqlite数据到你的项目 内置的包含5级行政区域跟坐标的sqlite数据 解压后使用

如果你已经装了lib-sqlite的库,可用:data-sqlite 会使用系统的sqlite库. 具体参见crate:rusqlite实现

如果你未安装lib-sqlite的库,可用:data-sqlite-source 会通过c源码编译sqlite库. sqlite源码通过子模块git submodule update --init获取

sqlite数据源使用示例

```toml

cargo.toml

area-db = { version = "~0.0.*", default-features=false,features=["data-sqlite-source"]} ```

rust let area = area_db::AreaDao::new(mysql).unwrap(); let conn = "data/area-data.db"; let sqlite = area_db::SqliteAreaData::new( area_db::SqliteAreaCodeData::from_path(PathBuf::from(&conn)), Some(area_db::SqliteAreaGeoData::from_path(PathBuf::from(&conn))), ); let area = area_db::AreaDao::new(sqlite).unwrap();

  1. 使用mysql作为数据来源:表定义 数据可以把以上的csv数据导入进去

mysql数据库作为数据源的示例

```toml

cargo.toml

area-db = { version = "~0.0.*", default-features=false,features=["data-mysql"]} ```

rust let pool = "mysql://***:***@127.~0.0.*:3306/***"; let mysql = area_db::MysqlAreaData::new( area_db::MysqlAreaCodeData::from_uri(pool), Some(area_db::MysqlAreaGeoData::from_uri(pool)), ); let area = area_db::AreaDao::new(mysql).unwrap();

  1. 数据更新时重新加载数据

rust let area = area_db::AreaDao::new(...).unwrap(); area.geo_reload().unwrap();//重新加载GEO数据 area.code_reload().unwrap();//重新加载CODE数据

  1. FFI导出

默认不引入 lib-clib ,需要FFI请开启

```toml

cargo.toml

lib-clib 输出c的动态库,用于其他语言对接

area-db = { version = "~0.0.*",features=["lib-clib"]} ```

可用的查询方法
  1. 查询 省市县镇村 可用在地址选择多级联动接口

测试查询时间 100us 以内

rust let child="";//空列出省级,把省级的code转入列出市级..依次完成 let res = area.code_childs(child).unwrap(); println!("{}", &res);

  1. 查询 指定code 的相关数据

rust let child="441403133";//地址code let res = area.code_related(child).unwrap(); println!("{}", &res);

  1. 查询 指定code 的详细地址信息

测试查询时间 100us 以内

可用于系统内的code到地址转换

rust let child="441403133";//地址code let res = area.code_find(child).unwrap(); println!("{}", &res);

  1. 搜索任意地址,返回匹配的地址信息

测试查询时间 50 ~ 80ms

rust let child="guang dong";//地址信息 在比如: 广东 布吉 let limit = 10;//返回匹配数量 let res = area.code_search(child, limit).unwrap(); println!("{}", &res);

  1. 返回指定坐标的地址信息

可用手机根据geo信息自动填写当前位置收货地址

测试查询时间 10 ~ 30ms

目前到市一级,因为只找到了市一级的坐标数据

rust let res = area.geo_search( 26.61474, 114.13548 , ).unwrap(); println!("{}", &res);

  1. 根据当前ip获取地址信息【待定,后面会补上】