#postgresql #gis

postgis

rust-postgres 的扩展,增加了对 PostGIS 的支持

18 个版本

0.9.0 2021年9月23日
0.8.0 2021年2月7日
0.7.0 2020年3月25日
0.6.0 2018年3月17日
0.1.6 2015年6月13日

#171数据库接口

Download history 3350/week @ 2024-03-25 3726/week @ 2024-04-01 3390/week @ 2024-04-08 6060/week @ 2024-04-15 6066/week @ 2024-04-22 1699/week @ 2024-04-29 4439/week @ 2024-05-06 4806/week @ 2024-05-13 4976/week @ 2024-05-20 4743/week @ 2024-05-27 3638/week @ 2024-06-03 4244/week @ 2024-06-10 4368/week @ 2024-06-17 5146/week @ 2024-06-24 4815/week @ 2024-07-01 6561/week @ 2024-07-08

20,977 每月下载量
11 个 Crates 中使用 (10 个直接使用)

MIT 许可证

155KB
3.5K SLoC

rust-postgis

Build Status

文档

rust-postgres 的扩展,增加了对 PostGIS 的支持。

  • PostGIS 类型辅助工具
  • 支持 GCJ02 (在中国大陆官方使用)
  • 支持 Tiny WKB (TWKB)

使用方法

use postgres::{Client, NoTls};
use postgis::{ewkb, LineString};

fn main() {
    let mut client = Client::connect("host=localhost user=postgres", NoTls).unwrap();
    for row in &client.query("SELECT * FROM busline", &[]).unwrap() {
        let route: ewkb::LineString = row.get("route");
        let last_stop = route.points().last().unwrap();
        let _ = client.execute("INSERT INTO stops (stop) VALUES ($1)", &[&last_stop]);
    }
}

处理 NULL 值

let route = row.try_get::<_, Option<ewkb::LineString>>("route");
match route {
    Ok(Some(geom)) => { println!("{:?}", geom) }
    Ok(None) => { /* Handle NULL value */ }
    Err(err) => { println!("Error: {}", err) }
}

将其他几何类型写入 PostGIS

rust-postgis 支持将以下 traits 实现的几何类型写入 PostGIS

  • Point, LineString, ...
  • AsEwkbPoint, AsEwkbLineString, ...

以 TWKB 实现为例。

读取 TWKB 几何体并将其写回 EWKB 的示例

use postgis::twkb;
use postgis::LineString;

for row in &conn.query("SELECT ST_AsTWKB(route) FROM busline", &[]).unwrap() {
    let route: twkb::LineString = row.get(0);
    let last_stop = route.points().last().unwrap();
    let _ = conn.execute("INSERT INTO stops (stop) VALUES ($1)", &[&last_stop.as_ewkb()]);
}

单元测试

默认情况下,需要 PostgreSQL 连接的单元测试被忽略。要运行数据库测试,请在环境变量 DBCONN 中声明连接。示例

export DBCONN=postgresql://user@localhost/testdb

使用以下命令运行测试

cargo test -- --ignored

依赖项

~3.5MB
~86K SLoC