| Crates.io | oxirs-geosparql |
| lib.rs | oxirs-geosparql |
| version | 0.1.0 |
| created_at | 2025-10-12 10:14:51.899954+00 |
| updated_at | 2026-01-20 21:41:15.994032+00 |
| description | GeoSPARQL implementation for spatial data and queries |
| homepage | https://github.com/cool-japan/oxirs |
| repository | https://github.com/cool-japan/oxirs |
| max_upload_size | |
| id | 1879135 |
| size | 1,910,843 |
GeoSPARQL implementation for spatial data and queries in RDF/SPARQL.
Status: Production Release (v0.1.0) - Released January 7, 2026
✅ Production Ready: APIs are stable and ready for production deployments.
oxirs-geosparql provides a complete implementation of the OGC GeoSPARQL 1.0/1.1 specification for the OxiRS semantic web platform. It enables spatial queries and operations on RDF knowledge graphs.
Add this to your Cargo.toml:
[dependencies]
oxirs-geosparql = "0.1.0"
use oxirs_geosparql::geometry::Geometry;
use oxirs_geosparql::functions::simple_features;
// Parse WKT geometries
let point = Geometry::from_wkt("POINT(1.0 2.0)").unwrap();
let polygon = Geometry::from_wkt("POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))").unwrap();
// Test spatial relations
let contains = simple_features::sf_contains(&polygon, &point).unwrap();
assert!(contains);
// Convert back to WKT
let wkt = point.to_wkt();
println!("WKT: {}", wkt); // Output: POINT(1 2)
use oxirs_geosparql::geometry::Geometry;
use oxirs_geosparql::functions::egenhofer;
let polygon1 = Geometry::from_wkt("POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))").unwrap();
let polygon2 = Geometry::from_wkt("POLYGON((2 2, 6 2, 6 6, 2 6, 2 2))").unwrap();
// Test various Egenhofer relations
let overlap = egenhofer::eh_overlap(&polygon1, &polygon2).unwrap();
assert!(overlap); // Polygons overlap
let meets = egenhofer::eh_meet(&polygon1, &polygon2).unwrap();
// Note: Egenhofer relations require GEOS backend for boundary calculations
use oxirs_geosparql::geometry::Geometry;
use oxirs_geosparql::functions::rcc8;
let polygon1 = Geometry::from_wkt("POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))").unwrap();
let polygon2 = Geometry::from_wkt("POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))").unwrap();
// Test RCC8 relations
let tpp = rcc8::rcc8_tpp(&polygon1, &polygon2).unwrap();
assert!(tpp); // polygon1 is a tangential proper part of polygon2
Requirements for Egenhofer & RCC8:
geos-backend feature for boundary calculationsbrew install geos (macOS) or apt-get install libgeos-dev (Ubuntu)use oxirs_geosparql::{Geometry, SpatialIndex};
use geo_types::{Geometry as GeoGeometry, Point};
// Create a spatial index
let index = SpatialIndex::new();
// Insert geometries
let point1 = Geometry::new(GeoGeometry::Point(Point::new(1.0, 1.0)));
let point2 = Geometry::new(GeoGeometry::Point(Point::new(5.0, 5.0)));
index.insert(point1).unwrap();
index.insert(point2).unwrap();
// Query by bounding box
let results = index.query_bbox(0.0, 0.0, 2.0, 2.0);
assert_eq!(results.len(), 1);
// Find nearest geometry
let (nearest, distance) = index.nearest(0.0, 0.0).unwrap();
use oxirs_geosparql::geometry::{Crs, Geometry};
use geo_types::{Geometry as GeoGeometry, Point};
// Create geometry with EPSG:4326 (WGS84)
let point = Geometry::with_crs(
GeoGeometry::Point(Point::new(139.7, 35.7)), // Tokyo
Crs::epsg(4326),
);
// Parse WKT with CRS
let point_with_crs = Geometry::from_wkt(
"<http://www.opengis.net/def/crs/EPSG/0/4326> POINT(139.7 35.7)"
).unwrap();
Transform geometries between different coordinate reference systems (requires proj-support feature):
use oxirs_geosparql::geometry::{Crs, Geometry};
use oxirs_geosparql::functions::coordinate_transformation::transform;
// Tokyo in WGS84 (EPSG:4326)
let tokyo_wgs84 = Geometry::from_wkt(
"<http://www.opengis.net/def/crs/EPSG/0/4326> POINT(139.7 35.7)"
)?;
// Transform to Web Mercator (EPSG:3857) for web mapping
let tokyo_mercator = transform(&tokyo_wgs84, &Crs::epsg(3857))?;
println!("WGS84: {}", tokyo_wgs84.to_wkt());
println!("Web Mercator: {}", tokyo_mercator.to_wkt());
Common transformations:
Requirements:
proj-support feature in Cargo.tomlbrew install proj (macOS) or apt-get install libproj-dev (Ubuntu)This implementation supports:
geo:, geof:)geo:wktLiteral)geo:gmlLiteral) - with gml-support featuregeof:sfEquals, geof:sfDisjoint, geof:sfIntersectsgeof:sfTouches, geof:sfCrosses, geof:sfWithingeof:sfContains, geof:sfOverlapsgeof:ehEquals, geof:ehDisjoint, geof:ehMeet, geof:ehOverlapgeof:ehCovers, geof:ehCoveredBy, geof:ehInside, geof:ehContainsgeof:rcc8eq, geof:rcc8dc, geof:rcc8ec, geof:rcc8pogeof:rcc8tpp, geof:rcc8tppi, geof:rcc8ntpp, geof:rcc8ntppigml-support)proj-support)GeoSPARQL functions can be used in SPARQL queries:
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
SELECT ?place ?name
WHERE {
?place geo:hasGeometry ?geom ;
rdfs:label ?name .
?geom geo:asWKT ?wkt .
FILTER(geof:sfWithin(?wkt, "POLYGON((...))"^^geo:wktLiteral))
}
wkt-support (default): WKT parsing and serializationgml-support: GML (Geography Markup Language) parsing and serializationgeojson-support: GeoJSON supportgeos-backend: Use GEOS C++ library for advanced operations (requires GEOS installation)rust-buffer: Pure Rust buffer operations for Polygon/MultiPolygon (no C++ dependencies)proj-support: Coordinate transformation supportparallel: Parallel processing for large datasets📖 See BUFFER_GUIDE.md for comprehensive buffer operations documentation
oxirs-geosparql provides two buffer implementations:
1. Pure Rust Buffer (rust-buffer feature):
[dependencies]
oxirs-geosparql = { version = "0.1.0", features = ["rust-buffer"] }
use oxirs_geosparql::functions::geometric_operations::buffer;
let poly = Geometry::from_wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))").unwrap();
let buffered = buffer(&poly, 2.0).unwrap(); // Pure Rust!
Advantages:
Limitations:
2. GEOS Backend (geos-backend feature):
[dependencies]
oxirs-geosparql = { version = "0.1.0", features = ["geos-backend"] }
Advantages:
Requirements:
brew install geossudo apt-get install libgeos-devHybrid Strategy:
The buffer() function automatically uses the best available backend:
rust-buffer (if enabled), else geos-backendgeos-backend (required)oxirs-geosparql/
├── vocabulary/ # GeoSPARQL URIs and terms
├── geometry/ # Geometry types and WKT parser
├── functions/ # Topological and geometric functions
│ ├── simple_features/ # DE-9IM relations
│ ├── geometric_operations/ # Buffer, hull, etc.
│ └── geometric_properties/ # Dimension, SRID, etc.
├── index/ # R-tree spatial indexing
└── error/ # Error types
Dual-licensed under MIT OR Apache-2.0.