23个稳定版本 (9个主要版本)

9.0.0 2024年5月2日
8.3.1 2024年2月7日
8.3.0 2023年6月5日
8.1.0 2022年4月27日
0.3.0 2018年4月9日

#2 in 地理空间

Download history 4545/week @ 2024-05-03 8115/week @ 2024-05-10 4644/week @ 2024-05-17 5192/week @ 2024-05-24 3552/week @ 2024-05-31 4817/week @ 2024-06-07 4038/week @ 2024-06-14 5779/week @ 2024-06-21 4331/week @ 2024-06-28 5328/week @ 2024-07-05 4144/week @ 2024-07-12 5042/week @ 2024-07-19 4536/week @ 2024-07-26 5153/week @ 2024-08-02 6032/week @ 2024-08-09 3503/week @ 2024-08-16

每月20,521次下载
用于 10 crates

MIT许可协议

740KB
19K SLoC

geos

GEOS C API的Rust绑定。

支持的GEOS版本为 >= 3.5

免责声明

GEOS对输入几何的有效性可能有点严格,且在无效输入的情况下容易崩溃,因此需要在包装器中进行检查。本项目已使用valgrind进行检查,但如果您遇到崩溃,请随意打开一个问题,说明问题。

使用示例

您可以在 examples/ 目录中查看示例。

从WKT构建几何图形

use geos::Geom;

let gg1 = geos::Geometry::new_from_wkt("POLYGON ((0 0, 0 5, 6 6, 6 0, 0 0))")
                         .expect("invalid WKT");
let gg2 = geos::Geometry::new_from_wkt("POLYGON ((1 1, 1 3, 5 5, 5 1, 1 1))")
                         .expect("invalid WKT");
let mut gg3 = gg1.difference(&gg2).expect("difference failed");
// normalize is only used for consistent ordering of vertices
gg3.normalize().expect("normalize failed");
assert_eq!(
    gg3.to_wkt_precision(0).expect("to_wkt failed"),
    "POLYGON ((0 0, 0 5, 6 6, 6 0, 0 0), (1 1, 5 1, 5 5, 1 3, 1 1))",
);

"准备"几何图形以在重复调用上进行更快的谓词(相交、包含等)计算

let g1 = geos::Geometry::new_from_wkt("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))")
                        .expect("invalid WKT");
let g2 = geos::Geometry::new_from_wkt("POLYGON ((1 1, 1 3, 5 5, 5 0, 1 1))")
                        .expect("invalid WKT");

let pg1 = geos::PreparedGeometry::new(&g1)
                                 .expect("PreparedGeometry::new failed");
let result = pg1.intersects(&g2).expect("intersects failed");
assert_eq!(result, true);

geo转换

geo的对象可以转换为GEOS,以使用所有GEOS算法。

完整示例可在 examples/from_geo.rs 中找到

use geos::geo_types::{LineString, Coordinate, Polygon};

// first we create a Geo object
let exterior = LineString(vec![
    Coordinate::from((0., 0.)),
    Coordinate::from((0., 1.)),
    Coordinate::from((1., 1.)),
]);
let interiors = vec![
    LineString(vec![
        Coordinate::from((0.1, 0.1)),
        Coordinate::from((0.1, 0.9)),
        Coordinate::from((0.9, 0.9)),
    ]),
];
let p = Polygon::new(exterior, interiors);
// and we can create a Geos geometry from this object
let geom: geos::Geometry = (&p).try_into()
                               .expect("failed conversion");
// do some stuff with geom

沃罗诺伊图

绑定中提供了沃罗诺伊图的计算。

为了更容易与geo一起使用,voronoi.rs中提供了一些辅助函数。

use geos::compute_voronoi;
use geos::geo_types::Point;

let points = vec![
    Point::new(0., 0.),
    Point::new(0., 1.),
    Point::new(1., 1.),
    Point::new(1., 0.),
];

let voronoi = compute_voronoi(&points, None, 0., false)
                  .expect("compute_voronoi failed");

静态构建

默认情况下,此包会动态链接到系统中安装的GEOS或您配置的另一个版本。有关更多信息,请参阅sys/README.md

如果您想将GEOS静态链接,请使用static特性。

静态构建使用位于sys/geos-src/source的git子模块中的GEOS版本。目前是GEOS 3.12.1。

您需要有一个支持GEOS静态版本的构建环境。有关更多信息,请参阅GEOS构建说明,但请注意,说明可能适用于比静态构建中包含的GEOS版本更新的版本。

贡献

仅实现了geos的一小部分功能,欢迎为缺失的功能添加包装器。

所有添加的功能都需要进行测试,并且作为一个C包装器,valgrind将在所有示例/测试上运行以检查是否存在错误/内存泄漏。

依赖项

~0.4–1.5MB
~32K SLoC