Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

GeoSPARQL

PurRDF 在进程内,对查询已持有的数据集计算空间谓词、地理度量、缓冲区和显式坐标操作。purrdf-geo 是 Rust 门面:它重新导出 purrdf-geo-kernel 的几何与地理类型,以及原生求值器的标量和属性函数适配器。计算内核不依赖 SPARQL 求值器、GEOS、PROJ 或外部地理运行时。同一内核服务于 Rust、Python、C、WebAssembly 和 CLI。

参考系必须显式指定

标准地理 profile 将无前缀 WKT、OGC CRS84 和 GeoJSON 解释为 WGS84,坐标顺序为经度、纬度。原始十进制坐标保持为精确有理数。经度超出 [-180, 180] 或纬度超出 [-90, 90] 时,在转换前拒绝;有效输入绝不被环绕或钳位。

EPSG:4326 要求显式注册 WGS84 纬度/经度顺序。其他参考系、单位和操作链也必须由调用方注册。指定椭球并不等于指定基准转换;引擎不会猜测分带、高程、历元、控制点或区域转换参数。标准 OGC 术语遵循其已发布含义;应用命名空间和自定义注册仍由调用方提供。

地理配置与请求 规定了带版本的 JSON 记录、参考坐标轴、操作参数、限制、身份规则及各个宿主入口。

原生查询引擎中的标量函数

默认 NativeSparqlEngine 安装不可变的标准 geof: 函数。注册与标准函数冲突的函数,会在执行前产生硬错误。查询通过 QueryOptions::with_geo 选择附加绑定及独立的数值限制:

use purrdf::geo::GeoProfile;
use purrdf::sparql::{NativeSparqlEngine, QueryOptions};
use purrdf::SparqlRequest;

let profile = GeoProfile::standard();
let result = NativeSparqlEngine::new().query_with_options_view(
    &dataset,
    SparqlRequest {
        query: r#"PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
                  PREFIX geo: <http://www.opengis.net/ont/geosparql#>
                  SELECT (geof:metricDistance(
                    "POINT(0 0)"^^geo:wktLiteral,
                    "POINT(1 0)"^^geo:wktLiteral) AS ?metres)
                  WHERE {}"#,
        base_iri: None,
        substitutions: &[],
    },
    QueryOptions::new().with_geo(&profile),
)?;

地理 metricDistance、metricLength、metricPerimeter、metricArea、metricBuffer 及其显式单位版本使用声明的椭球。以米为单位的投影系统保留其平面法则。长度包含多边形边界,并保留声明的混合维度规则;面积扣除孔洞,并对单位换算因子取平方。Z 和 M 得到保留,不会凭空生成高程。

格式错误的参数和几何定义域错误保留 SPARQL 表达式错误行为。精度、工作量、内存、收敛、取消和浮点环境方面的运行故障,即使经过 FILTER 和 BIND 仍是致命错误。受治理的求值保留原有未完成结果和工作证据。直接地理请求 API 保留相同的类型化原因,不会将被拒绝的调用转成空结果。

几何与地理法则

WKT 和 GeoJSON 保留原始坐标线性边,包括明确写出的跨经度长路径。显式最短测地线及方位角/长度弧保留所选分支;仅由端点表示且存在歧义的弧会被拒绝。预备区域表示孔洞、补集和整个表面。度量、拓扑、连续坐标操作的像、缓冲区和覆盖,均使用这些相同的预备曲线与区域。

点距离是最短椭球距离,以米为单位保留六位小数,并按中点取偶规则正确舍入。完整且经过证明的包围区间必须确定唯一舍入结果;仅仅满足近似误差要求并不足以允许返回结果。正算坐标使用声明的角度网格。几何距离、长度、周长、面积和向外缓冲各自携带声明的证书与舍入法则。数值原语统一位于 purrdf-xsd;答案不会由平台 libm 或改变结合次序的归约决定。

显式坐标链涵盖投影、地理/地心转换、命名的 GCJ/BD 方程,以及由调用方提供参数的Helmert、相似、多项式和内存网格模型。有界反算隔离全部可接受根,并拒绝歧义。这些数学法则不声称具有测绘精度,也不声称获得官方提供方认证。

空间关系与网格单元

属性函数适配器将调用方选择的几何谓词投影到可复用的 GeoIndex,并注册所选的Simple Features、Egenhofer 或 RCC8 关系。已断言的关系三元组保留其 RDF 含义;计算关系补充蕴涵的匹配。实际查询选定的地理上下文和原始分配所有者在游标整个生命周期内保持存活。关系族注册为空时会被拒绝。

原生立方球层次在 0–30 层分配带 profile 身份的单元 ID。父子操作、大端键和有序范围共享这一定义。闭圆盘、包围盒和预备区域的覆盖具有保守保证;调用方限制会拒绝无法完整生成的覆盖,而不会截断或静默降低精度。可复用点索引保留原始坐标,并按请求的物理距离或报告距离法则精化候选。h3 v4.0 兼容性是架构文档,不是已实现的网格族。

宿主所有权与验证

GeoSession 和 GeoPointIndex 在所有宿主上提供相同的带版本请求。Python 查询和更新入口接受 geo=。WebAssembly 引擎为可挂起操作保存所选配置的快照。C 提供不透明的创建/调用/释放句柄及接受上下文的查询入口。CLI 的地理请求、查询和更新接受 --geo-profile。

语义拒绝具有完整响应记录。运行拒绝保留原始失败通道,且不会在失败调用下创建未经准入的响应。预备数据不可变且可共享;活动数值上下文仍绑定在线程上。原生存储在创建前取得准入,并保留至实际载荷销毁为止。

冻结的数值、几何和层次运行记录比较已完成的原生与 WebAssembly 答案。公开 GeodTest 收集器按摘要检查完整的 500,000 行源数据;分配器、后端和宿主测试分别检查各自的契约。数学推导和精确性边界记录于 测地线数值方法 和 几何精确性。