4个版本

0.2.3 2024年2月15日
0.2.2 2024年2月15日
0.2.1 2022年3月23日
0.2.0 2022年3月23日
0.1.0 2022年3月22日

地理空间 中排名第94

Download history 3351/week @ 2024-04-16 4587/week @ 2024-04-23 3113/week @ 2024-04-30 5821/week @ 2024-05-07 6229/week @ 2024-05-14 3743/week @ 2024-05-21 3698/week @ 2024-05-28 3075/week @ 2024-06-04 3854/week @ 2024-06-11 4407/week @ 2024-06-18 4330/week @ 2024-06-25 4266/week @ 2024-07-02 4697/week @ 2024-07-09 2245/week @ 2024-07-16 4372/week @ 2024-07-23 3274/week @ 2024-07-30

每月下载量 15,625
3 个crate中使用(通过 geos-sys

MIT 许可证

3MB
75K SLoC

C++ 74K SLoC // 0.2% comments C 1K SLoC // 0.3% comments Shell 190 SLoC // 0.4% comments Batch 39 SLoC Rust 20 SLoC Perl 11 SLoC

geos

Rust对GEOS C API的绑定。

支持的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");

静态构建

默认情况下,此crate将动态链接到您系统安装的GEOS或您配置的不同版本。有关更多信息,请参阅 sys/README.md

如果您想静态链接GEOS,请使用 static 功能。

静态构建使用 sys/geos-src/source 中的GEOS版本。目前是GEOS 3.12.1。

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

贡献

仅实现了地理空间数据集的一部分,欢迎为缺失的功能添加包装器。

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

依赖项