{"id":48927352,"url":"https://github.com/360-geo/copc","last_synced_at":"2026-04-17T07:09:28.402Z","repository":{"id":348020212,"uuid":"1196240186","full_name":"360-geo/copc","owner":"360-geo","description":"Cloud-Optimized Point Cloud (COPC) streaming reader for Rust, with temporal index support","archived":false,"fork":false,"pushed_at":"2026-03-30T14:11:11.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-30T14:34:25.012Z","etag":null,"topics":["copc","rust","streaming"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/360-geo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-30T14:03:24.000Z","updated_at":"2026-03-30T14:11:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/360-geo/copc","commit_stats":null,"previous_names":["360-geo/copc"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/360-geo/copc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/360-geo%2Fcopc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/360-geo%2Fcopc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/360-geo%2Fcopc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/360-geo%2Fcopc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/360-geo","download_url":"https://codeload.github.com/360-geo/copc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/360-geo%2Fcopc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31918937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"online","status_checked_at":"2026-04-17T02:00:06.879Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["copc","rust","streaming"],"created_at":"2026-04-17T07:09:27.748Z","updated_at":"2026-04-17T07:09:28.395Z","avatar_url":"https://github.com/360-geo.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# copc\n\n[![Crates.io](https://img.shields.io/crates/v/copc-streaming)](https://crates.io/crates/copc-streaming)\n[![docs.rs](https://docs.rs/copc-streaming/badge.svg)](https://docs.rs/copc-streaming)\n[![CI](https://github.com/360-geo/copc/actions/workflows/ci.yaml/badge.svg)](https://github.com/360-geo/copc/actions/workflows/ci.yaml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nRust libraries for reading [COPC](https://copc.io/) (Cloud-Optimized Point Cloud) files, with support for the [COPC Temporal Index Extension](copc-temporal/docs/temporal-index-spec.md).\n\n## Crates\n\n### [`copc-streaming`](./copc-streaming)\n\n[![Crates.io](https://img.shields.io/crates/v/copc-streaming)](https://crates.io/crates/copc-streaming)\n[![docs.rs](https://docs.rs/copc-streaming/badge.svg)](https://docs.rs/copc-streaming)\n\nAsync streaming COPC reader. Loads octree hierarchy and point data incrementally via a `ByteSource` trait — works with HTTP range requests, local files, or any random-access byte source.\n\n- LAS header and VLR parsing via the `las` crate\n- LAZ decompression via the `laz` crate\n- Incremental hierarchy page loading\n- Individual chunk fetch + decompression\n- `ByteSource` trait with `FileSource` (local) and `Vec\u003cu8\u003e` (in-memory) implementations\n- No `Send` requirement on futures — WASM compatible\n\n### [`copc-temporal`](./copc-temporal)\n\n[![Crates.io](https://img.shields.io/crates/v/copc-temporal)](https://crates.io/crates/copc-temporal)\n[![docs.rs](https://docs.rs/copc-temporal/badge.svg)](https://docs.rs/copc-temporal)\n\nReader for the COPC Temporal Index Extension. Enables time-range filtering of octree nodes without decompressing point data.\n\n- Parse temporal index EVLR (paged layout for incremental loading)\n- Per-node GPS time range queries\n- Intra-node point range estimation via binary search\n- Incremental page loading via `ByteSource` — only fetch index pages relevant to your query\n- Combined spatial + temporal filtering\n\nDepends on `copc-streaming` for core COPC types (`VoxelKey`, `Aabb`, `ByteSource`).\n\n## Use case\n\nWhen multiple survey passes cover the same area at different times, a single merged COPC file may contain overlapping data from many collection epochs. A client querying a spatial region often needs only points from a specific time window — not every pass that ever traversed that location. Without the temporal index, all spatially overlapping nodes must be decompressed. With the temporal index, irrelevant epochs are skipped before any decompression.\n\n## Quick start\n\n```rust\nuse copc_streaming::{Aabb, CopcStreamingReader, FileSource};\n\nlet mut reader = CopcStreamingReader::open(FileSource::open(\"points.copc.laz\")?).await?;\n\n// One call: loads hierarchy, fetches chunks, filters points.\nlet points = reader.query_points(\u0026query_box).await?;\n```\n\n### With LOD control\n\n```rust\n// Load points with at most 0.5 m between samples.\nlet level = reader.copc_info().level_for_resolution(0.5);\nlet points = reader.query_points_to_level(\u0026query_box, level).await?;\n```\n\n### With temporal filtering\n\n```rust\nuse copc_temporal::{GpsTime, TemporalCache};\n\nif let Some(mut temporal) = TemporalCache::from_reader(\u0026reader).await? {\n    let start = GpsTime(1_000_000.0);\n    let end   = GpsTime(1_000_010.0);\n\n    // Loads hierarchy + temporal pages, fetches chunks, filters by bounds AND time.\n    let points = temporal.query_points(\u0026mut reader, \u0026query_box, start, end).await?;\n}\n```\n\n## Related\n\n- [copc-converter](https://github.com/360-geo/copc-converter) — CLI tool that produces COPC files with optional temporal index\n- [COPC specification](https://copc.io/)\n- [Temporal index spec](copc-temporal/docs/temporal-index-spec.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F360-geo%2Fcopc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F360-geo%2Fcopc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F360-geo%2Fcopc/lists"}