#几何 #GIS #地理空间 #API绑定 #2D-3D #凸包

sfcgal

对SFCGAL的高层绑定以及与其他几何库的转换

7个版本 (破坏性更新)

0.7.0 2024年4月16日
0.6.0 2023年3月29日
0.5.0 2020年10月18日
0.4.0 2020年9月2日
0.1.0 2019年3月10日

#189 in 算法

Download history 15/week @ 2024-04-19 1/week @ 2024-05-24 5/week @ 2024-06-14 7/week @ 2024-07-05 70/week @ 2024-07-26 5/week @ 2024-08-02

每月75次下载

MIT/Apache

140KB
3K SLoC

sfcgal-rs

Build and run tests Crates.io

文档

Rust绑定,提供对SFCGAL库的高层API访问以及与其他Rust生态系统几何crate的转换。
基于sfcgal-sys crate,它提供了低层绑定。

底层库的一些关键特性

  • 支持ISO 19107和OGC简单特征访问1.2进行3D操作。
  • 读取和写入WKT,对于2D和3D几何,使用精确的有理数坐标表示。
  • 交集、差集和并集。
  • 直线骨架、镶嵌、Minkowski和、alpha形状和凸包。

SFCGAL的所需版本目前是1.5.x(最新版本 - 2023-10-30)。

用法

使用3元组为3D坐标和WKT的示例:

extern crate sfcgal;
use sfcgal::{SFCGeometry, CoordSeq, ToCoordinates, ToSFCGAL};

// create a linestring from WKT:
let line_3d = SFCGeometry::new("LINESTRING(-0.5 -0.5 2.5, 0.0 0.0 4.0)")?;

// create a polygon as Vec of 3-member tuples...
let coords_polygon = vec![
    vec![ // Exterior ring
        (-1., -1., 3.0),
        (1., -1., 3.0),
        (1., 1., 3.0),
        (-1., 1., 3.0),
        (-1., -1., 3.0),
    ],
    vec![ // 1 interior ring
        (0.1, 0.1, 3.0),
        (0.1, 0.9, 3.0),
        (0.9, 0.9, 3.0),
        (0.9, 0.1, 3.0),
        (0.1, 0.1, 3.0),
    ],
];
// ...by using the CoordSeq enum variants to match the wanted SFCGAL geometry type
// (returns a SFCGeometry)
let polygon_3d = CoordSeq::Polygon(coords_polygon).to_sfcgal()?;

// ...
let intersection = line_3d.intersection_3d(&polygon_3d)?;

// Retrieve coordinates of the resulting geometry as 3-member tuples:
let coords_intersection: CoordSeq<(f64, f64, f64)> = intersection.to_coordinates()?;

println!("{:?} and {:?} intersects at {:?}", line_3d, polygon_3d, coords_intersection);

使用geo-types的示例:

extern crate geo_types;
extern crate sfcgal;

use geo_types::{LineString, Polygon};
use sfcgal::ToSFCGAL;


// create a geo_types Polygon:
let polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 0.), (1., 1.), (0., 1.,), (0., 0.)]),
    vec![LineString::from(
        vec![(0.1, 0.1), (0.1, 0.9,), (0.9, 0.9), (0.9, 0.1), (0.1, 0.1)])]);

// create a geo_types LineString:
let line = LineString::from(vec![(-0.5, -0.5), (1.3, 1.), (1.1, 1.9)]);

// convert them to sfcgal geometries:
let polyg_sfc = polygon.to_sfcgal().unwrap();
let line_sfc = line.to_sfcgal().unwrap();

// Use SFCGAL operations:
assert!(polyg_sfc.intersects(&line_sfc).unwrap(), true);

示例

查看examples/skeleton_geojson.rs,以了解如何与其他Rust-geo生态系统crate一起使用。

动机

需要一个SFCGAL特性用于Rust的侧项目,我想这是一个尝试使用bindgen在SFCGAL C API上的好机会。
最终,API的大部分内容都被包装了,因此现在它在crates.io上发布后,可能可以被某人重用或改进。

许可

根据您的选择,许可为以下之一

贡献

除非您明确声明,否则您有意提交的工作将被双重许可,如上所述,没有其他条款或条件。

依赖

~1.8–5MB
~97K SLoC