Format support¶
Supported formats¶
| Data | Formats | Reader / extra |
|---|---|---|
| Point cloud | LAS / LAZ 1.x-1.4 | vixar[las] |
| Point cloud | CSV / TSV / XYZ (plain + .gz/.bz2/.zip) |
core |
| Point cloud | Parquet / Feather / Arrow | vixar[tabular] |
| Point cloud | Excel .xlsx / .xls |
vixar[tabular] |
| Point cloud | JSON / NDJSON (.jsonl) |
core |
| Point cloud | NumPy array / pandas DataFrame | core |
| Point cloud (streaming) | Binary tile files produced by vixar tile |
core (server-side) |
| Borehole / drill trace | CSV / TSV (FROM/TO/XYZ), NumPy, DataFrame | core |
| Borehole / drill trace | Parquet / Feather / Excel / JSON | vixar[tabular] |
| Vector geometry | GeoJSON (.geojson, .json) |
vixar[geo] |
| Vector geometry | Shapefile (.shp) |
vixar[geo] |
| Vector geometry | GeoPackage (.gpkg) |
vixar[geo] |
| Vector geometry | GML, KML, FlatGeobuf and other OGR sources | vixar[geo] |
| Block model | CSV, NumPy | core |
| Ore body (hollow/solid) | OBJ, NumPy mesh | core (OBJ parser) |
| Surface | GOCAD TS, OBJ, NumPy (verts+faces) | vixar[mesh] / parsers |
| Volume / grid | NumPy 3-D, .npy, meshio lattice |
core / vixar[mesh] |
| Isosurface | Derived from a block model via Marching Cubes | core (WASM-accelerated) |
Install optional extras¶
pip install 'vixar[las]' # LAS / LAZ point clouds
pip install 'vixar[tabular]' # Parquet, Feather, Excel
pip install 'vixar[geo]' # GeoJSON, Shapefile, GeoPackage
pip install 'vixar[mesh]' # GOCAD TS, VTK, STL via meshio
pip install 'vixar[all]' # All of the above
Coordinate systems¶
Auto-detection and reprojection¶
Vixar auto-detects whether coordinates are geographic (lon/lat degrees) and
reprojects them to the appropriate UTM zone -- no manual set_crs() call
required for common cases:
- LAS/LAZ: EPSG is read from the GeoKeyDirectory header.
- GeoJSON / Shapefile / GeoPackage: CRS is read from the file; if the file has no CRS it is treated as unprojected and a warning is emitted.
- CSV / tabular: if X/Y values fall within lon/lat ranges (|X|<=180, |Y|<=90) they are auto-reprojected to the UTM zone derived from the centroid.
To override the auto-detected CRS:
viewer.set_crs("EPSG:32754") # fix the working projected CRS
viewer.add_point_cloud("data.csv", src_epsg=4326) # declare the source EPSG
Float32 precision¶
Large UTM coordinates (~500 000 m) lose precision when cast to float32 in
WebGL. Vixar keeps full float64 precision in Python, computes a shared scene
origin (the bounding-box centroid of all layers) and subtracts it so the JS
engine only ever sees small, float32-safe local offsets. The absolute origin
travels in the scene config for pick/export round-trips (see
Architecture).
LAS / LAZ¶
.las and .laz are read through laspy. LAZ (LASzip-compressed LAS) is
decompressed transparently -- pip install 'vixar[las]' bundles the pure-Rust
lazrs backend (prebuilt wheels, no system LASzip required). If a .laz is
opened with no backend installed, a clear LAZBackendError is raised.
Supported point-data-record formats: 0-3 (LAS 1.2-1.3) and 6-8 (LAS 1.4). EPSG is extracted from the Variable Length Record GeoKeyDirectory when present.
CSV / tabular text¶
Column names are detected case-insensitively with domain aliases:
| Role | Accepted column names |
|---|---|
| X | x, easting, east, lon, long, longitude |
| Y | y, northing, north, lat, latitude |
| Z | z, elevation, elev, depth, alt, altitude, height, rl |
The delimiter is sniffed from the first two header rows (, ; \t | ).
European files with ; separators and decimal commas are handled transparently;
pass decimal="," explicitly if auto-sniff fails.
Compressed files (.gz, .bz2, .zip) are decompressed on the fly.
Parquet / Feather / Arrow¶
Columnar binary formats for large tabular point clouds and borehole tables.
Read via pyarrow (pip install 'vixar[tabular]'). Parquet is strongly
recommended over CSV for datasets larger than a few hundred MB -- a typical
survey CSV of 500 MB compresses to ~50 MB Parquet and loads ~10x faster.
viewer.add_point_cloud("survey.parquet", color_by="grade")
viewer.add_boreholes("collars.parquet", id_col="HoleID", x_col="X", y_col="Y", z_col="Z")
GeoJSON / Shapefile / GeoPackage¶
Vector geometry files are read via geopandas + pyogrio
(pip install 'vixar[geo]'). Use viewer.add_vector_layer():
viewer.add_vector_layer("boundaries.geojson") # polygons -> ring outlines
viewer.add_vector_layer("drill_traces.shp") # lines -> tube chains
viewer.add_vector_layer("samples.gpkg", color_by="grade") # points -> point cloud
Geometry dispatch:
- Point / MultiPoint -- rendered as a point cloud.
- LineString / MultiLineString -- rendered as tube chains (borehole renderer).
- Polygon / MultiPolygon -- exterior + interior rings as tube outlines.
CRS is read from the file. If the file has no CRS, coordinates are used as-is and a warning is emitted. Geographic (lon/lat) data is auto-reprojected to UTM.
Memory and scale¶
Vixar warns before loading large files:
| Format | Warning threshold |
|---|---|
| CSV / JSON | > 200 MB |
| Parquet | > 500 MB |
| Excel | > 50 MB |
| Geo (SHP/etc) | > 50 MB |
For datasets larger than a few GB, tile the point cloud with vixar tile and
stream binary tiles on demand:
vixar tile survey.las --output ./tiles/ --tile-size 100
viewer.add_tiled_point_cloud("./tiles/meta.json")
viewer.serve()
Not supported in v1¶
- GOCAD Voxet, full VTK unstructured grids -- post-v1.
- GeoTIFF / DEM rasters -- post-v1 (
vixar[raster]planned). - SEG-Y seismic -- post-v1 (
vixar[seismic]planned). - Photorealistic PBR materials -- Vixar uses a schematic geoscientific aesthetic.