npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@maptiler/geosplats

v1.0.1

Published

.....

Readme

MapTiler GeoSplats SDK

The GeoSplats SDK provides all the functions and data required to create fully functional web applications with interactive maps and photorealistic SplatModel visualizations on the map. Each SplatModel can be accurately positioned and combined with our 3D terrain and any MapTiler base map.


🌐 Website   🔑 Get API Key


📦 Installation

npm install --save @maptiler/geosplats

🚀 Basic Usage

import { Map, SplatModel } from "@maptiler/geosplats";
import "@maptiler/geosplats/dist/maptiler-geosplats.css";

//Render basic map, container expects id or HTMLElement
//If you omit center, there is some default place in Prague
const map = new Map({
  apiKey: "YOUR_MAPTILER_API_KEY_HERE",
  container: "map",
  center: [14.454266884169874, 50.089376703005215],
});

map.on("load", () => {
  //Creates SplatModel instance
  const splatModel = new SplatModel({
    model: "YOUR_MAPTILER_SPLAT_MODEL_ID_HERE",
  });

  //Adds SplatModel to map (map needs to be loaded, otherwise this is ignored)
  map.addSplatModel(splatModel);
});

💡 Related Examples

Check out the full list of examples and tutorials

📘 API Reference

For detailed guides, API reference, and advanced examples, visit our comprehensive documentation:

Complete API documentation

Examples of the main functions and methods

//Render basic map, container expects id or HTMLElement
const map = new Map({
  apiKey: "YOUR_MAPTILER_API_KEY_HERE",
  container: "map",
  center: [14.454266884169874, 50.089376703005215],
  basemap: "hybrid-v4",
});

map.on("load", () => {
  //map is ready
  map.setPitch(30);
  map.setBearing(90);

  //Change map center
  map.setCenter({ lng: 16.609643, lat: 49.191569 });

  //This click event takes into consideration terrain
  map.on("click", (event) => {
    //LngLat
    console.log(event.position);
  });

  //Creates SplatModel instance
  //center provided in constructor overrides center declared in json if present
  const splatModel = new SplatModel({
    model: "YOUR_MAPTILER_SPLAT_ID_HERE",
    center: { lng: 16.609643, lat: 49.191569 },
  });

  //Adds SplatModel to map (map needs to be loaded, otherwise this is ignored)
  //You should show loading indicator
  map.addSplatModel(splatModel);

  //Returns center of map as LngLat
  map.getCenter((center) => {
    console.log(center);
  });
});

//SplatModel downloaded, you can hide loading etc
map.on("splatmodel:load", () => {
  //Will fire on model position or elevation change
  map.on("splatmodel:update", (event) => {
    //LngLat
    console.log(event.position);
    //altitude
    console.log(event.altitude);
  });

  map.on("splatmodel:mouseover", (event) => {
    console.log(event);
  });

  map.on("splatmodel:mouseout", (event) => {
    console.log(event);
  });

  //Internally value is clamped: [0, 1]
  splatModel.setOpacity(0.5);

  //Sets visibility and color (see type definition for allowed values)
  splatModel.setBoundingBox(true, "yellow");
  splatModel.setBoundingBox(true, "#ffcc00");
  splatModel.setBoundingBox(true, [20, 60, 102, 0.4]);

  //Disable bounding box
  splatModel.setBoundingBox(false);

  //Returns current altitude in meters
  console.log(splatModel.getAltitude());

  //Set altitude in meters
  splatModel.setAltitude(300);

  //Returns model's scale (after training / before georeferencing, this is going to be 1 in most cases)
  console.log(splatModel.getScale());

  //Set model's scale
  splatModel.setScale(5);

  //Returns model's center as LngLat
  console.log(splatModel.getCenter());

  //Set model's center as LngLatLike
  splatModel.setCenter([14.418269, 50.095494]);

  //Moves camera such that model is centered into viewport - sets pitch to 60 degrees, keeps yaw
  splatModel.fit();

  //Hides splatModel, disables listeners, hides bounding box, opacity set to 0
  splatModel.hide();

  //Shows splatModel, re-enables previous listeners, opacity set to 1
  splatModel.show();

  map.on("splatmodel:click", (event) => {
    //mutually exclusive with map:click event
    //Good place to enable i.e. model dragging
    splatModel.setDraggable(true);
  });

  //Returns model's rotations as an array
  //SplatModelRotationDegree = { xRot: number; yRot: number; zRot: number; }
  let rotation = splatModel.getRotationDegrees();

  //Rotates model by 30 degrees around y-axis
  rotation.yRot += 30;
  splatModel.setRotationDegree(rotation);

  //Sets new zoom for the map
  map.setZoom(12.3);

  //Returns current zoom
  console.log(map.getZoom());

  map.jumpTo({
    center: [13.497569, 47.344369],
    zoom: 12,
    pitch: 80,
    bearing: 60,
  });

  //Possibility to lock current pitch
  map.setPitchLocked(false);

  //Change basemap's style
  //Currently we accept custom string, fallbacks to satellite-v4 if invalid
  map.setBasemap("hybrid-v4");

  //void basemap results in plain model rendering without any map
  map.setBasemap("VOID"); //Or ReferenceMapStyleDefaults.VOID

  //Fires once
  map.once("splatmodel:click", (event) => {});

  //Moves the camera so that the provided bounds are visible.
  map.fitBounds([
    [14.408177, 50.080911],
    [14.44025, 50.085178],
  ]);

  map.on("splatmodel:dragstart", () => {
    console.log("SplatModelDrag start");
  });

  map.on("splatmodel:dragend", () => {
    console.log("SplatModelDrag end");
  });

  map.on("click", (event) => {
    //get altitude on arbitrary location (does not have to be provided by click event)
    map.getAltitudeAt(event.position, (altitude) => {
      console.log(`altitude is ${altitude}`);
    });
  });

  //removes canvas and cleans up all resources related to renderer
  map.remove();

  //Snaps model to terrain and provides altitude via the callback
  //(or you can ignore returned value and handle only splatmodel:update event)
  splatModel.snapToTerrain((altitude) => {
    console.log(`altitude is ${altitude}`);
  });

  //Re-writes void style, renders map together with model
  map.setBasemap("satellite-v4");

  //You can later remove map again
  map.setBasemap("VOID");
});

💬 Support