Skip to content

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.