You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Pirmin Kalberer 9056d3c96c bumb version 6 years ago
src Make error module public 6 years ago
.gitignore first commit: Point*, LineString 8 years ago
.travis.yml ci: fix ignored test cases 6 years ago
Cargo.toml bumb version 6 years ago
LICENSE Initial commit 8 years ago README: fix doc link 6 years ago


Build Status


An extension to rust-postgres, adds support for PostGIS.

  • PostGIS type helper
  • GCJ02 support (used offically in Mainland China)
  • Tiny WKB (TWKB) support


use postgres::{Connection, TlsMode};
use postgis::ewkb;
use postgis::LineString;

fn main() {
    // conn ....
    for row in &conn.query("SELECT * FROM busline", &[]).unwrap() {
        let route: ewkb::LineString = row.get("route");
        let last_stop = route.points().last().unwrap();
        let _ = conn.execute("INSERT INTO stops (stop) VALUES ($1)", &[&last_stop]);

Handling NULL values:

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

Writing other geometry types into PostGIS

rust-postgis supports writing geometry types into PostGIS which implement the following traits:

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

See the TWKB implementation as an example.

An example for reading a TWKB geometry and writing it back as 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()]);

Unit tests

Unit tests which need a PostgreSQL connection are ignored by default. To run the database tests, declare the connection in an environment variable DBCONN. Example:

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

Run the tests with

cargo test -- --ignored