# 360ForYou - full product documentation > Complete knowledge base for 360-for-you.com: product overview, accounts, uploading, supported formats, viewers (virtual tours, point clouds, 3D Gaussian splats, BIM/IFC, 360 video, PDF, GeoTIFF, map), comments, sharing and collaboration, downloads, pricing, the public API and integrations (QGIS, Revit). ## Product overview (home page `/home`) ### What the platform is - The platform is an online viewer for reality-capture and 3D data. You upload a file and get an interactive viewer in the browser, which you share as a link anyone can open. - Supported content includes virtual tours, point clouds, meshes, 3D Gaussian splats, BIM models, 360° video, PDFs and GeoTIFF maps. - Nothing needs to be installed. Every viewer runs inside the web browser. - Processing is fully automatic. - The platform works with data from any scanner. - Links can point to a specific view (shareable deep links). - Projects can be viewed online and offline. - A self-hosted option exists. - VR is supported. - You can start for free. No credit card is required. - The home page shows the number of users, projects and setups on the platform. It states that the platform has been in production since 2023. ### Home page actions - A signed-in user sees a **Create a new project** button, which leads to the upload page. - A visitor who is not signed in sees an **Upload your first project** button, which leads to signup, when signup is open. - **See it in action** scrolls down to the feature section. - **See pricing** leads to the plans page, when paid plans are offered. - **Browse public projects** leads to the public project gallery, when it is available. - The contact section offers **Ask our AI assistant**, which opens the on-page assistant where available. - The contact section also offers **Browse the FAQ** and the support email address support@360-for-you.com. - A scrolling strip shows the supported file formats. You can drag it with the mouse or scroll it by touch. ### Live demos on the home page - Each of the eight viewer types has a live demo on the home page. - A demo loads only when you click it, or when you press Enter or Space on it. - Only one demo runs at a time. Opening a new demo closes the one that was running. - If the demo area is narrower than 600 pixels, the demo opens full-screen in a new browser tab instead of inside the page. This applies on phones, small tablets and narrow windows. ### The eight viewers Each kind of data gets its own viewer. The viewers are reached under project routes such as `/projects//` (tour), `/projects//pointcloud`, `/projects//3dgs`, `/projects//ifc`, `/projects//video360`, `/projects//pdf` and `/projects//geotiff`. The point cloud viewer can be opened without its interface using `?noUI=1`. 1. **Virtual tours** - You can bring processed laser scans, or 360° photos from any camera or drone. - You automatically get an explorable tour with linked spheres, a 2D site map, hotspots and comments. - Formats: E57, RCP, RCS, LGS, LGSX, JPG, PNG, EXR, INSP, DNG. 2. **Point clouds** - Point clouds of any format and any size open in any browser on any device, including low-end phones on slow connections. - The viewer renders billions of points. - It has built-in panoramas, as in Autodesk ReCap. - OpenStreetMap and satellite underlays are available. - You can overlay IFC/RVT models with point deviation. - Tools include measurements, cross-sections and a first-person avatar. - Formats: E57, RCP, RCS, LGSX, LAS, LAZ, PTS, PTX, XYZ. - Classified point clouds, normals and a globe mode are supported. 3. **Meshes** - Supported meshes are OBJ (with its MTL material file and textures), GLB, STL and IFC. - Meshes load into the same scene as the point cloud. Measuring, clipping and the avatar work on them too. 4. **3D Gaussian Splatting** - Large files render quickly through level-of-detail streaming, including on low-end devices. - You can explore in orbit mode or first-person mode. - Formats: PLY, SPZ, SPLAT, KSPLAT, SOG, RAD. 5. **3D models & BIM** - Very large IFC and Revit models open in the browser. - You can measure, cut cross-sections and filter by element groups. - You can inspect the parameters of any element you click. - Formats: RVT, IFC, FRAG. 6. **360° video** - You can stream equirectangular 360° video up to 5.7K. - A GPS minimap tracks your position during playback. - The minimap shows speed, elevation, time, neighbouring routes and KML/KMZ overlays. - Clicking a point on the track jumps the video to that point. - Formats: MP4, GPX. 7. **PDFs with annotations** - You can set a real-world scale from the drawing, then measure distances and areas. - You can add shapes, text and comments. - You can download a copy with all markup baked in (flattened). 8. **GeoTIFF maps** - GeoTIFF layers are shown over satellite or topographic basemaps, with an opacity slider. - You can add KML/KMZ vector overlays and measure on the map. - All of this works in the project's own coordinate system. - Formats: TIF, TIFF, KML, KMZ. - XYZ tile servers and WMTS servers are supported (see the FAQ). ### Standout capabilities - **Panorama synthesis** - When a project has no 360° photos, the platform generates equirectangular panoramas from the point cloud. - This also works for intensity-only (black-and-white) scans. - It also works with raw camera images from SLAM scanners, for example CHCNAV RS10, Share S20, Share S100 and RealView. - The FAQ includes an article explaining how the E57 format works. - **Tours without a point cloud** - Panoramas plus a capture-positions file are enough to build a full tour. - This works with data from RIEGL (RiPANO), Leica, Z+F, Trimble, FARO, OmniSLAM, Lixel, CHCNAV and Share. - **Street View-style tours** - You can use panoramas from any 360° camera, such as Insta360, GoPro or RICOH Theta. - GPS-tagged shots are placed on the map automatically. - Headings are estimated from the route. This suits car- or backpack-mounted capture. - Without GPS, you place points by hand on a basemap. - **Publish to Google Street View** - You can publish 360° tours to Google Street View on Google Maps using your own Google account. - Panoramas appear at their GPS positions and link into a connected, walkable tour with the blue Street View line. - A guide is available where this feature is enabled. - **Automatic AI blur** - Built-in AI detects faces or full bodies, and license plates or entire vehicles, in panoramas. - It blurs them automatically for GDPR-friendly anonymization. - **Built for billions of points** - Point clouds of 10+ billion points are supported. - Country-scale LiDAR datasets (hundreds of gigabytes) stream in the browser, including on a phone. - **Any coordinate system on Earth** - You can specify a coordinate system as an EPSG code, a WKT definition or a PROJ string. - Full datum transformations are applied, including national grid shifts (NTv2 / nadgrids). - **No upload needed — paste a link** - Instead of uploading, you can paste a share link. The platform pulls the data from the source. - Supported sources are WeTransfer, Google Drive, Dropbox, Yandex.Disk, Mail.ru Cloud and any direct download URL. - **Scan-vs-BIM deviation** - You can overlay a point cloud with its Revit/IFC model. - You get per-point deviation values and a colour scale you can adjust in real time. - An option clips away everything outside the tolerance band. - **Comments, tasks and PDF reports** - You can pin comments and tasks to any spot in a panorama. - You can attach files, or take a photo with your phone's camera. - Comments are discussed in a chat-style thread. - Email notifications link back to the spot. - On panoramas made from a scan, each comment also appears as a 3D annotation in the point cloud. - The project owner can export all comments, or only filtered ones, as a PDF report. The report contains a view of each spot, the discussion and the attached photos. - **Synced map, even on a second screen** - One project map is shared across all viewing modes. - Rotating, measuring or toggling setups syncs between the tour and the point cloud. - The map can be popped out into its own tab or onto a second monitor, where it stays in sync. - **Live & IoT data** - Annotations can hold custom HTML, so a tour can show live readings from sensors, IoT devices or dashboards. - MQTT embedding is supported, including KNX over MQTT. - **REST API and automation** - The REST API lets you list and manage projects, start a project from a download link and track its status. - It uses Bearer-token authentication. - It is documented with Swagger/OpenAPI 3. - An API guide is available where the public API is enabled. - **QGIS plugin** - The official uploader plugin for QGIS publishes raster, vector and point cloud layers as a shareable web project in one click. - Uploads are resumable and run as a background task. - The plugin requires QGIS 3.40 or newer and works with Qt5 and Qt6 builds. - **Your map layers in any GIS** - Every GeoTIFF layer of a project, whether uploaded or built from the point cloud, is published as an XYZ tile service (EPSG:3857). - All layers together are also published as an OGC WMTS service. - You copy the service address in the project settings and add the layers to QGIS, Leaflet or OpenLayers. - **Stream point clouds into Revit** (marked "New") - The Qbitec plugin for Autodesk Revit supports the platform's project links natively. - It streams the point cloud from the cloud in the open Entwine (EPT) format, without downloading the full scan. - The same link serves the browser, your clients and Revit. It is intended for Scan2BIM work. - **Works with no internet at all** - You can download a whole project as one ZIP archive. - The archive contains every viewer, all the data and a small web server for Windows, macOS and other systems. - You can unpack it on a laptop, a USB stick or a network drive and open the project offline. - The same archive can be deployed to your own hosting. - The FAQ describes the archive contents. - **White-label and embed** - You can add your own logo. - You can host a portfolio on a custom subdomain such as `your-company-name.mypoint.cloud`. - You can embed any project as an iframe showing only the UI buttons you choose. - This is available on every plan. - **Everything in one scene** - Panoramas, point clouds and 3D models (RVT, IFC, OBJ, GLB) share a single scene. - Measurements, cross-sections and the first-person avatar work across all of them. ### Supported platforms and browsers - Viewers run on Windows, macOS, Linux, Android, iOS (iPhone and iPad) and ChromeOS. - Supported browsers are Chrome, Safari, Firefox and Edge. - No download, plugin or app-store install is needed. ### Three ways to run the platform **SaaS (the public website)** - The service is ready to use immediately: you register, upload and start working. - Data is stored in a shared cloud in Germany (GDPR). - Maintenance and updates are fully automatic. - You control basic settings. - Resources are shared, with standard performance. - Access is through a ready-to-use web link. - No infrastructure costs or technical knowledge are needed. **Dedicated (turnkey dedicated server)** - The platform team sets up the server. - The server can be located anywhere in the world. - Full-service maintenance is included. - Extensive customization is possible. - The data environment is isolated: the server is exclusively yours. - The platform can be integrated with your own company domain. - It scales to any data volume. - The platform developers provide end-to-end monitoring. **Self-hosted (your own server)** - Your own IT team installs the platform from a ready-to-deploy software package. - Data stays on your hardware, in your server room. - Maintenance is self-managed. Your IT department approves updates. - You can use the platform on a closed internal network. - Use is perpetual with no ongoing costs. ### Project handover for surveyors and scanning companies - This section is shown where paid plans are offered. - Surveyors can transfer a finished project to the client who commissioned it. - The client gets the viewer and the original scans, and takes over storage of the data. - The steps are: 1. Keep the original files, not just the viewer. 2. Add the client as an owner. 3. Remove yourself as an owner. - After that, the archive is no longer the surveyor's responsibility. - A dedicated page linked from the home page, **See how the handover works**, explains the process. ## User accounts: registration, login, 2FA, SSO, profile and email verification ### Ways to sign in and sign up - The platform supports two sign-in methods: email address and password, and single sign-on (SSO) through an external identity provider. - The supported SSO providers are Google, Microsoft, and a generic OpenID Connect provider such as AD FS. Each installation decides which providers are enabled, and the button shows that provider's name. - An installation can turn off self-service password sign-up, SSO sign-up, password sign-in, or SSO sign-in independently. Forms and buttons for disabled methods are hidden. - When password sign-in is turned off, its pages show "Sign-in with email and password is currently disabled." - When all new sign-ups are turned off, the sign-up page shows "Registration is currently unavailable" and "New sign-ups are temporarily disabled. Please try again later.", with a "Log in" button. - SSO buttons appear only on the platform's main address, not on custom subdomains. ### Registering with email and password (`/signup`) - The sign-up page shows SSO buttons ("Sign up with Google", "Sign up with Microsoft", "Sign up with ") when SSO sign-up is enabled. It also shows the password form when password sign-up is enabled. - The form fields are: - **E-mail** - **Name** - **Country**: pre-selected from your estimated location. - **Time zone**: suggested by your browser. The list groups "Your country" and "All time zones". - **Language**: the interface language for the new account. It is applied when you submit the form. - **New password** - A consent checkbox, for example "I agree to the Terms and Conditions of Use and the Privacy Policy", with links to `/terms-of-service` and `/privacy-policy` where those pages exist. - All fields and the consent checkbox are required. - Password rules: at least 12 characters, at least one uppercase letter, and at least one digit. A live checklist shows which rules are met. The "Sign up" button stays disabled until the password is valid. - If the password fails the rules, the message is "Password must be at least 12 characters long and include uppercase letters and numbers." - On installations with paid plans, typing a hotmail.com address shows a warning that Microsoft blocks email delivery to hotmail.com addresses, and that you should use a different address. - On installations with paid plans, the form explains email types: - Account and activity emails are required and cannot be turned off. - Tips and news emails are sent a few times a year. You can opt out of them at any time in your profile or through the unsubscribe link in the email. - New accounts are subscribed to tips and news by default. - If the address already has an account, the message is "This email address is already registered. Please sign in." and you are sent to the login page. - A submission may be rejected as spam. In that case, check the form and submit it again. - Account creation is rate-limited per network. The limit message is "Too many accounts have been created from your network." - After successful registration: - You are signed in immediately. - A welcome and verification email is sent. - The message asks you to check your email, and to mark the message as "Not spam" if it landed in your Spam folder. - Where you go next: - If you arrived with a `?next=` destination, you go there. - If the installation requires email confirmation, you go to the "Confirm your email address" page. - Otherwise you go to the upload page. ### Signing up or signing in with SSO - Sign-in routes: `/google-login`, `/ms-login`, `/oidc-login`. Sign-up routes: `/google-signup`, `/ms-signup`, `/oidc-signup`. - The first time an email address arrives through SSO, you see a **Complete your sign-up** page: - **E-mail** is read-only and comes from the identity provider. - **Name** is pre-filled from the provider and can be edited. - **Country**, **Time zone** and **Language** must be selected. - The consent checkbox must be ticked. The "Sign up" button is enabled only after it is ticked. - This happens whether you clicked a "Sign in" or a "Sign up" button. - The confirmation page must be completed within 10 minutes. After that you see "Your sign-up session has expired. Please sign in again." - Repeated submissions of the confirmation page are rate-limited. The message is "Too many attempts to complete sign-up." - Accounts created through SSO: - The email address is marked verified automatically. - The provider's profile picture, if any, becomes the account's profile picture. - After sign-up you go to the `?next=` destination if one was given, otherwise to the upload page. - SSO accounts have no password. You can add one later in the profile (see "Changing or setting a password"). - An SSO sign-in with an address that already has an account signs you into that account. If the account has 2FA enabled, you must enter a 2FA code. - Signing in through SSO does not change the email-verification status of an existing account. To verify, use the email verification link. - With Google, if Google reports the email address as not verified, sign-in is refused: "Your email address is not verified by the provider. Please verify it and try again." - For a generic OpenID Connect provider, the account email is taken from the provider's email claim. If there is none, the user principal name or preferred username is used. - Error messages: - "Something went wrong. Please try again. If you cannot sign in, contact technical support." - "Authentication with this provider is temporarily unavailable. Please try again later, use another method, or contact technical support." ### Logging in (`/login`) - The login page shows SSO buttons ("Sign in with Google", "Sign in with Microsoft", "Sign in with "), the word "or", and the email/password form with **E-mail** and **Password**. - Links below the form: "No account? Create one" and "Forgot your password? Reset password". - With a wrong email or password, the message is "Invalid email address or password. Please check your login details and try again." A "Reset password" link is also shown. - An account created through SSO cannot sign in with a password until a password has been set in the profile. - Sign-in is temporarily locked after repeated failed attempts. The message is "Too many failed sign-in attempts." Password reset stays available while sign-in is locked. - Sessions are remembered, so you stay signed in after closing the browser. - You can add `?next=` to `/login` or `/signup`. After signing in you are taken to that page; otherwise you land on the projects list. - An already signed-in user who opens `/login` or `/signup` is sent to the `next` destination or to the profile. ### Two-factor authentication (2FA) - 2FA uses a time-based code from an authenticator app such as Google Authenticator. - To enable it, go to the profile, section **Two-factor authentication**, and click **Enable 2FA**. The page shows: - a QR code to scan; - the **Security key** as text, with a copy button, for manual entry. - The authenticator app lists the account under your email address and the platform's name. - Enter the 6-digit **Code** and click **Verify**. The form submits automatically once 6 digits are entered. - Results: - Success: "2FA enabled." - Wrong code: "Invalid 2FA token. Try again." - 2FA already on: "2FA is already active." - Signing in with 2FA: 1. After the correct password or a successful SSO sign-in, the **Verify 2FA** page asks for the 6-digit code. 2. A wrong code gives "Invalid 2FA token." 3. If the 2FA step is no longer valid, the message is "2FA session expired. Re-authentication is required." and you must sign in again. - When 2FA is active, a 2FA code is also required to: - change or set a password; - set a new password through a reset link; - disable 2FA; - delete the account. - To disable 2FA, click **Disable 2FA** and confirm the "Disable 2FA?" dialog. Enter your current password (if the account has one) and a 2FA code. On success the message is "2FA disabled." - SSO accounts without a password disable 2FA with the 2FA code alone. - Disabling 2FA discards the old secret. Enabling it again produces a new QR code. - Repeated wrong 2FA codes are temporarily locked out. The message is "Too many failed 2FA attempts." - A phone with a wrong clock produces wrong codes. ### Password reset (`/reset-password`) 1. Enter your **E-mail** and click **Reset password**. 2. The page always answers: "If an account with this email exists, a password reset link will be sent. The email may go to your spam folder." 3. Repeated requests for the same address, and many requests from one network, are rate-limited. The messages tell you to check your inbox and spam folder. 4. The emailed one-time link opens a **Set a new password** page with: - **New password**: at least 12 characters, 1 uppercase letter, and 1 digit; - **2FA code**, if 2FA is active. 5. Click **Set password and sign in**. You are signed in, the email address is marked verified, and the message is "Your password has been set." 6. You are taken to the profile. Other devices are signed out, and an email notifies you that the password changed. Link behavior: - The link works once. Re-opening a used or invalid link shows "This one-time link may already have been used." An expired link shows "The link has expired. Please request a new link." - Opening many invalid one-time links from one network is rate-limited. - If you open the link while already signed in, you see "You are already signed in as ." If the link was for another address, the page adds "This link was sent to a different address (). Sign out and open the link from the email again." Otherwise it adds "You can change your password in your profile." - The reset page cannot be used while signed in. Signed-in users change their password in the profile. - If the link belongs to an invited account that has never been used, it opens the invitation page instead. ### Accepting an invitation - When a project owner invites someone who has no account, the platform creates the account and emails an invitation link (`/invite?...`). - The invitation page is the sign-up form: - the email address is read-only; - the name may be pre-filled; - the SSO buttons read "Sign in with Google", "Sign in with Microsoft" and "Sign in with ". - To accept with a password, fill in **Name**, **Country**, **Time zone**, **Language** and **New password**, and accept the policy. This requires password sign-in to be enabled. - To accept through SSO, sign in with the invited email address, then complete the **Complete your sign-up** page. - After activation: - the email address is marked verified; - a welcome email is sent; - you are signed in and taken to your projects; - the invitation link is used up. - Invitations work even when public self-registration is closed. - Error messages: - "This invitation link is invalid or has expired." - "The invitation link has expired. Request a new invitation link." - "This account already exists. Please sign in instead." (for accounts that have already been used) ### Email verification - After sign-up, a verification link is emailed. It is valid for 1 day. - Opening the link requires being signed in to the same account. The **Email address verification** page shows the address and a **Confirm** button. - Results of clicking **Confirm**: - Success: "Thank you for confirming your email address." - Expired link: "The link has expired. A new verification email has been sent." - Broken link: "Invalid link. We have sent you a new verification email." - Link for a different account: "Invalid token. A new verification email has been sent." - On installations that require email confirmation, new users land on **Confirm your email address** (`/confirm-email`). The page: - shows the address the link was sent to and explains how to find the email in the Spam folder; - has a **Resend the link** button, which becomes available again after a short countdown; - has a **Wrong email address? Sign out** button; - continues automatically to the upload page once the email is verified, even if the link was opened on another device. - Resending gives "Verification email sent.", or "Email address is already verified." if it already is. - Verification emails are rate-limited. The message asks you to check your inbox and spam folder. ### Signing out - Signing out removes all of the platform's cookies from the browser and returns you to the home page. - **Sign out of all other devices** in the profile ends every other session. The current session stays active. ### Profile page (`/profile`) The profile is divided into collapsible cards. Each card can be reached with an anchor such as `/profile#security`. #### Subscription & billing (`#subscription`) - The card shows: - **My plan** and, for paid plans, **Paid through** ; - **Tours**: the number of your projects, with no upper limit; - **Storage period**: days, or unlimited; - **Storage**: used GB of the plan's GB, or unlimited; - **Panoramas**: "Up to N per tour", or unlimited; - whether **Offline projects**, **Dedicated server** and **Support** are included. - On installations with paid plans, the card also shows **Price**, as " per month" or " every N months". - Free-plan users see "Need more?" and **Upgrade your plan**. Paid-plan users see **Manage subscription**. For some regional plans, this button opens an email to sales@360-for-you.com. - **Tokens** (`#tokens`): - The section shows **Your balance** and **Total used**. - Token usage: CAD conversion costs 0.01 tokens per MB. - To buy tokens, enter a whole number of tokens (at least 1, default 10) at €1 per token and click **Pay**. - After payment, the page shows "Payment received. Your token balance will update shortly.", "Payment cancelled. No charge was made.", or "Could not start the payment. Please try again." #### Account & display (`#account`) - **Profile picture**: - Upload a .jpg, .jpeg, .png or .webp file, max 20 MB and up to about 25 megapixels (about 5000×5000). - The image is reduced to a round 100×100 picture. - Error messages: "Only JPG and PNG files are allowed.", "File is too large (max 20 MB).", "Could not process the image. Please try a different file." - **Delete profile picture** removes it. - **Name**: edit and click **Change**. The message is "Name changed." - **Language**: the interface language. The language switcher is also available to visitors who are not signed in. For signed-in users the choice is saved to the account. - **Standard measurement units (display unit)**: metric or imperial. - **Country**: if none is set, the page asks "Is your country X? Yes" based on your location. - **Time zone**: if none is set, the page asks "Is your time zone X? Yes" based on your browser. #### Branding & project defaults (`#branding`) - On installations with paid plans, the free plan cannot use custom logos, custom logo links, custom subdomains or custom tour CSS. These show "This feature is available only with a subscription". - **Custom logo in projects**: - Upload a .jpg, .jpeg, .png or .webp file, max 20 MB. The logo is scaled to at most 100 px high and 400 px wide. - **Delete custom logo** removes it. - **Custom logo link**: - Enter your website address, for example `https://www.your-website.com/`, and click **Set**. - A click on the logo in a project opens this address in a new tab. Without a link, the logo is only a picture. - Links are always stored as https. An invalid entry shows "Invalid URL". - **Show my logo on the public clients page**: - This switch is off by default. It is available where the installation has an "Our clients" page. - When it is on, your logo appears on the public "Our clients" page, linking to your projects portfolio or website. - You can turn it off at any time. - **Custom subdomains for your projects** (`#subdomain`), where enabled: - This creates branded links like `https://your-company-name./` for all your projects. - It also creates a portfolio page listing all your public projects: `https://your-company-name./public-projects`. The page offers copy and QR-code buttons for the portfolio link. - The subdomain must be 5–63 characters long. It may contain only Latin letters, digits and hyphens, and must not start or end with a hyphen. - Messages: "Subdomain created.", "Invalid subdomain. Try another.", "Sorry, this subdomain is already taken." - Saving a new value replaces the old subdomain. Saving an empty field deletes it ("Subdomain deleted."). - **Custom CSS for virtual tours** (`#tour-css`): - CSS applied to your virtual tours, for example `.sitemapName { background-color: orange; }`. - The CSS is sanitized before it is saved. - **Default frame-ancestors for new projects** (`#frame-ancestors`): - This is a space-separated whitelist of websites allowed to embed your projects in an iframe, for example `example.com another-site.com`. - `*` allows embedding on any website. This is the default. - An empty field prohibits embedding everywhere. - The value is the default for new projects. Each project can override it, and projects also need suitable privacy settings. #### Security (`#security`) - **Changing or setting a password**: - Accounts with a password use **Change password**. Enter the **Current password**, a 2FA code if 2FA is active, and the new password. The message is "Your password has been changed." - SSO accounts without a password see **Set password**: "Set a password so you can also sign in with your email address." A 2FA code is required if 2FA is active. The message is "Your password has been set." - The same password rules apply: 12+ characters, an uppercase letter and a digit. - Errors: "Current password is incorrect.", "Invalid 2FA token." - An email notifies you of the change. - Repeated wrong current passwords are temporarily locked out: "Too many incorrect password attempts." - This section is hidden when password sign-in is disabled on the installation. - **Active sessions** (`#sessions`): **Sign out of all other devices**, after a confirmation prompt. The message is "Signed out of all other devices." - **Two-factor authentication** (`#two-fa`): enable or disable 2FA, as described above. #### Integrations (`#integrations`) - **API keys** (`#api-keys`): - API keys let you upload files and create projects programmatically. The section links to `/api-guide` and `/api/v1/docs/`. - Create a key with the **+** button. Enter a **Label** (up to 100 characters, optional) and choose **Scopes**. Default scopes are pre-checked. - The full key is shown only once: "Copy your new API key now. It will not be shown again." - The key table shows Label, Key prefix, Scopes, Created, Last used, and Status (Active/Revoked). - **Revoke** disables a key permanently. - Creating keys requires a plan that allows API access. Otherwise the page shows "This feature is not available on your plan." - **Google Street View** (`#streetview`), where enabled: - Connect your Google account here. Then open the Street View panel in a project to publish its panoramas. - This depends on the plan. Otherwise the page shows "This feature is not available on your plan." - **Telegram notifications** (`#telegram`), where enabled: - You can receive all notifications in Telegram instead of by email. - Start a chat with @threehundredsixty_bot. The bot replies with a link and your chat ID. - Open the link, which pre-fills the ID and shows "Confirm your Telegram ID below and click Save.", or paste the numeric ID into the field. - Click **Change**. The message is "Your Telegram ID has been changed." and a test message is sent to Telegram. - If no test message arrives and the ID is correct, contact support. - To stop Telegram notifications, clear the field and save. #### Privacy & data (`#privacy`) - **Export my data**: - This downloads all your personal data as a JSON file named `user-data-.json`, under GDPR Articles 15 and 20. - Repeated exports are rate-limited. The message asks you to check your downloads folder. - **Email preferences** (`#email-preferences`), on installations with paid plans: - The switch is "Receive occasional tips and news about the service by email". - Service emails are always sent. These include password reset, project processing results and invitations. - **Delete account** (`#delete-account`): - Deletion removes all your personal data immediately and permanently. It cannot be undone. - Accounts with a password or 2FA confirm in the dialog with the current password and/or a 2FA code. - SSO accounts with neither a password nor 2FA confirm by signing in again with their provider: "Confirm with Google", "Confirm with Microsoft", or "Confirm with ". - The SSO confirmation must be completed within 10 minutes ("Confirmation timed out. Please try again."). - The SSO confirmation must use the same account. Otherwise the message is "You re-authenticated with a different account. Please try again." - After deletion you are taken to the home page. ### Unsubscribing from tips and news - Marketing emails contain an unsubscribe link (`/unsubscribe/`). The link keeps working indefinitely. - The page asks "Do you want to stop receiving tips and news emails from us?" and has an **Unsubscribe** button. - Mail clients that support one-click unsubscribe can unsubscribe directly. - After unsubscribing, the page shows "You will no longer receive tips and news emails from us." - Service emails are not affected. You can turn tips and news back on in the profile. ## Sharing and Collaboration ### Roles on a project - A project can have one or more **project owners**. Every owner has full owner rights on the project. - A project can have **project users**. These are people the owners have added to the project. - A project can be opened by the members of any **user group** that has been added to the project. Group members get the same access as project users. - Owner-only actions include editing project settings, changing the privacy mode, adding and removing owners and users, attaching user groups, linking projects and deleting the project. - Any owner can add or remove other owners and users. This is not limited to the person who created the project. - When a visitor tries an owner-only action without being an owner, the platform shows: "Only the project owner can do this." - When an action is limited to owners and added users, the platform shows: "Only the project owner and the users added to the project can do this." - A deleted project is no longer available to anyone. - A project may have nothing to display yet, for example when no content has been processed. In that case its first owner is taken to the project's settings page (`/projects//settings`) when opening the project address. - While a project is still processing, visitors see a processing page instead of the project. ### Privacy modes The project owner sets the privacy mode in the project settings. There are three modes: - **Public**: anyone can open the project. - **Via link**: anyone who has the link can open the project. - **Private**: only the project's owners, its project users and members of user groups added to the project can open it. Messages shown when a visitor cannot open a private project: - A visitor who is not signed in sees: "Please sign in to open this project." - A signed-in visitor without access sees: "You are already signed in as . This project is not shared with your account. Ask whoever sent you the link to give access to it, or sign in with the account the link was sent to." - The project owner's email address is never shown to visitors without access. ### Adding project owners 1. Open the project settings. 2. Enter the email address of the new owner. 3. Optionally tick the option to notify the person by email. 4. Optionally add a personal message to the invitation. The message can be up to 1000 characters. 5. Submit. Rules and behavior: - You must have a verified email address to add owners. - The email address is validated. Some addresses may be rejected. - If no account exists for the address, the platform creates one in the inviter's interface language. The invitation email then lets the new person set a password. - On some installations, creating new accounts through invitations is turned off. In that case the platform shows an error, and the recipient has to create an account first. - If the person is already an owner, the platform shows: "The user is already on the list." - Invitations are rate-limited. When the limit is reached, a message asks you to continue later. This limit is shared between adding owners and adding users. ### Adding project users Users are added the same way as owners, from the project settings: - Enter the email address. - Optionally tick the email notification option. - Optionally add a personal message of up to 1000 characters. The same rules apply as for owners: a verified email address is required, accounts are created automatically for new addresses, "The user is already on the list." is shown for duplicates, and invitations are rate-limited. There is an extra option to also add the user to all **linked projects** of this project: - The user is added only to linked projects that you own. - Linked projects the user is already on are skipped. - If a linked project cannot be processed, an error message starting with "Error with project:" is shown. ### Removing owners and users - An owner can remove any owner or user from the project settings. - When an owner is removed, any user groups owned by that person are detached from the project at the same time. ### Linked projects - In the project settings, an owner can enter linked projects as space-separated project codes. - Only codes of projects you own are kept. Other codes are dropped when saving. - The virtual tour's title bar shows the titles of the linked projects. ### Comment access The project owner can choose in the project settings which access level is required to comment on the project. ### Share popup The share button in the viewers opens a share popup. It contains: - The message "To share this project, copy the link and send it to anyone you want to share the project with". - A read-only box with the link. Clicking the box selects the whole link. - A **Copy to clipboard** button. After copying, the popup closes and a short notice "Copied to clipboard" appears at the bottom of the screen. - A **QR Code** button. It shows or hides a QR code for the link. The QR code is collapsed each time the popup is reopened. - Share channels: - **Email**: opens a new email. The page title is the subject and the link is the body. - **WhatsApp**: opens WhatsApp sharing in a new tab. - **Telegram**: opens Telegram sharing in a new tab. - In some viewers, an optional checkbox with an alternate link, for example "Start at 1:23" in a video. While it is ticked, the link box, the copy button, the QR code and all share channels use the alternate link. For private projects, the popup shows a warning: "This project is private. The link will only work for the project's owners and for users and groups added to the project. To make it available to everyone, change the privacy mode in the project settings." The popup closes with the close button, the Escape key or a click outside it. In offline packages: - The private-project warning is not shown. - If a QR code cannot be generated, the QR button and the QR area are hidden. ### QR codes - The QR code for a project is available as a PNG image at `/projects//qr/`. - A QR code for a specific page inside the project is available at `/projects//qr/`. - If the project's first owner has their own subdomain, the QR code points to the project on that subdomain: `https://./projects//...`. - `/service/qr?url=` generates a QR code for any link on the platform's own site. Links to other sites are refused with "Only links to this site." - Links longer than 512 characters are refused with "This link is too long to put in a QR code." - QR code generation is rate-limited. When the limit is exceeded, a message asks you to wait and try again. - The QR code may carry the platform's logo in its centre. ### User groups User groups let you give a fixed set of people access to several projects at once. #### Managing groups - Groups are managed on the **User groups** page at `/usergroups`. - Each group belongs to the user who created it. Only that user can rename it, delete it, or add and remove its members. - If you have no groups, the page shows "No groups have been created yet". - To create a group, use the **Create a new group** section. Enter a **Title** and click **Create group**. - Each group on the list shows its title, its members (name and email) and these controls: - an **Edit group** pencil icon - a **Delete group** trash icon - a trash icon next to each member to remove that member - a **+** button that opens the **Add member** dialog. In the dialog, enter the **E-mail** and click **Add**. #### Group edit page The edit page is at `/usergroups/`. It has these sections: - **Rename group**: change the **Title** and click **Save**. - **Members**: lists the members, each with a **Remove member** icon. If the group has no members, it shows "No members yet." New members are added by **E-mail** with **Add member**. - **Active projects**: lists the projects the group has been added to, with links to their settings. If there are none, it shows "This group has not been added to any projects yet." - **Delete group**: deletes the group after the confirmation "Delete group?". #### Member rules - A new member must already have an account on the platform. Otherwise the platform shows "User not found." - Members are not notified by email when they are added to a group. - Adding group members is rate-limited. - If a group owner's account is deleted, that owner's groups are deleted too. #### Attaching groups to projects - In the project settings, a project owner can add or remove any of their own groups for the project. The control toggles: selecting a group that is already attached removes it. - You must be both an owner of the project and the owner of the group. - All members of an attached group get access to the project, including when it is private. ### Embedding projects on other websites - By default, any website can show a project inside an iframe (`*`). New projects take the default from the owner's profile setting. - In the project settings, the owner can instead list the websites allowed to embed the project. Separate the entries with spaces. Only the listed sites can then show the project in an iframe. - An empty list forbids embedding everywhere. #### Virtual tour embedding API (messages from the tour) An embedded virtual tour sends messages to the parent page: - **`tourReady`**: sent once, when the tour has loaded. It contains: - `sceneId` and `name` of the first scene - `protocol` (currently `1`) - `scenes`: the list of navigable scenes, each with `id`, `name` and `links` (the IDs of linked scenes). Disabled scenes are not included. - **`sceneChanged`**: sent after every scene change, with `sceneId` and `name`. It covers every way of navigating, including scene switches the parent page requested. - **`cursorCoordinates`**: sent while the mouse moves over the panorama, at most about every 50 ms. Contains `sceneId`, `yaw` and `pitch`. - **`clickCoordinates`**: sent on a click on the panorama, with `sceneId`, `yaw`, `pitch` and `fov`. A drag of more than 5 pixels does not count as a click. Clicks on the info panel are ignored. - **`markerClicked`**: sent when a marker is clicked. Contains `id`, `sceneId`, `yaw`, `pitch`, the current view's `fov`, and the marker's `meta` if one was set. Yaw values are absolute. They are converted to and from each scene's rotation automatically. #### Virtual tour embedding API (commands to the tour) The parent page sends commands with `postMessage`, using an object with a `type` field. The commands are: - **`switchScene`**: switches to the scene given by `sceneId`. - **`setView`**: sets `yaw`, `pitch` and/or `fov` of the current scene. - **`getView`**: the tour answers with a `viewState` message. It contains: - `sceneId` - `x`, `y`, `z`: the scene's stored position, in the project's own coordinate system and units - the live `yaw`, `pitch` and `fov` - **`getScreenshot`**: renders a scene off-screen without changing what the visitor sees. The answer is a `screenshot` message with `sceneId`, `yaw`, `pitch`, `fov`, `width`, `height` and `image`. - Optional fields are `sceneId`, `yaw`, `pitch`, `fov`, `width`, `height` and `quality`. - Omitted view fields use the scene's own view: the live view for the current scene, and the stored initial view for other scenes. - The default size is the viewer's size. Width and height must be whole numbers from 1 to 4096. - The default quality is 85. The maximum is 100. - Screenshots are rendered one after another. A screenshot that does not finish within 15 seconds fails. - Hotspots and markers are not included in the image. - **`addMarker`**: adds a marker. Fields: - `id` (required) and `yaw`/`pitch` - `sceneId`: optional, defaults to the current scene - `size`: optional, default 28 px - `color`: optional, default red - `char`: optional, default `+` - `opacity`: optional - `icon`: optional, must be a `data:image/...` URL - `meta`: optional, any value, returned with `markerClicked` - Markers can be added to any scene at any time and stay through scene switches. - **`updateMarker`**: changes only the fields you send. Changing `sceneId` moves the marker to another scene. - **`removeMarker`**: removes the marker with the given `id`. #### Command results and error codes If a command includes a `requestId`, the tour answers with a `commandResult` message: `{type: 'commandResult', requestId, ok, error}`. The `requestId` is also copied into `viewState` and `screenshot` messages. Without a `requestId`, commands get no answer. A `commandResult` means the command was accepted and applied. It does not mean the transition has finished rendering. For `switchScene`, `sceneChanged` is sent first. For `getScreenshot`, the result follows the `screenshot` message. Error codes: - `unknown_scene` - `duplicate_marker_id` - `invalid_icon` - `unknown_marker_id` - `invalid_size` - `webgl_unavailable` - `screenshot_timeout` - `unknown_command` An older viewer that does not support a command replies `unknown_command`. #### Remote navigation for the point cloud viewer A parent page, for example one with an on-screen joystick, can move the camera of an embedded point cloud viewer. It sends messages like `{type: 'navKey', code: 'KeyW', down: true}`, with `down: false` to release the key. Supported key codes: - `KeyW`, `KeyA`, `KeyS`, `KeyD` - `KeyQ`, `KeyE`, `KeyR`, `KeyF` - `ShiftLeft`, `ShiftRight` - `ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight` - `PageUp`, `PageDown` Other codes are ignored. Repeated presses or releases of the same key are ignored. All held keys are released automatically when the page is hidden or loses focus. ### Own subdomain - A user can have one personal subdomain. Each subdomain belongs to only one user. - Projects are reachable under the subdomain at `https://./projects//`. - The subdomain's start page is titled **Public projects**. It shows the owner's public projects as cards. - The subdomain pages can show a custom logo. If a logo link is set, clicking the logo opens that link in a new tab. - QR codes for projects whose first owner has a subdomain point to the subdomain address. ## Comments and tasks ### Overview - Visitors of a virtual tour can leave comments on panoramas. A comment appears as a marker (hotspot) at the spot where it was placed. - You place a comment by right-clicking a point in the panorama. The comment stores the direction it points to: a horizontal angle (yaw) and a vertical angle (pitch). Pitch is negative above the horizon. - Each comment can have a type (marker shape), a colour, text, file attachments, and a thread of replies. - A comment of the task type can be marked as done. - The project owner can manage all comments of a project on the project's Comments page and can download them as a PDF report. ### Who can comment The project's comment access setting decides who may leave comments, reply and tick off tasks. The levels are: - Any visitor, including anonymous visitors who are not signed in. - Signed-in users only. Others see "Please sign in to leave a comment here." - Project users only, meaning people invited to the project. Others see "Only the people invited to this project can leave comments here." - The project owner only. Others see "Only the owner of this project can leave comments here." - No one. Everyone sees "Comments are turned off for this project." The comment form is only shown when the current level allows you to comment. If the owner changes the setting while your tab is open, sending a comment returns one of the messages above. Comment, reply and task-completion actions are rate-limited. If you send too many in a short time, you see "Too many comments in a short time. Please wait a minute and try again." ### Creating a comment The comment form contains: - **Text field** (placeholder "Your comment. Safe HTML is allowed"). - HTML is sanitized. - Comment text is limited to 20,000 characters. Longer text is cut to that length instead of being rejected. - **Type**: a row of marker shapes. - square - disc - triangleUp: the tip sits on the spot and the triangle hangs below it. - triangleDown: the tip sits on the spot and the triangle sits above it. - task: a square with a tick. - **Color**: a row of chips, each drawn in the selected shape. - red - orange - yellow - blue - green - **Attach files**: pick one or more files. - **Take photo**: shown only on touch devices such as phones and tablets. It opens the device camera directly. - Files and camera photos can be combined in one comment. - The pending attachments are listed next to the buttons. - The "Remove attachments" button clears them. - **E-mail notification**: shown only to the project owner, project users and group members. - It opens a list of project members with checkboxes. - The members you tick receive an e-mail about the new comment. - **Cancel** and **Create** buttons. "Sending..." is shown while the comment is being submitted. Error messages you may see: - "Unsupported comment type." - "Unsupported comment color." - "Part of the request was lost on the way to the server. Please check your connection and try again." This appears when an upload is cut short. - "This panorama is no longer part of the project. Please reload the page." ### Attachments - Attachments can only be added to the root comment of a thread. Replies cannot carry files. - You must be signed in to attach files. Otherwise you see "Sign in to attach files to a comment." - Projects where anonymous visitors may comment do not accept attachments from anyone. You see "This project does not accept attachments to comments." - Most file types can be attached. Types that run or install something when opened cannot: programs, scripts, installers, disk images, archives, web pages, SVG pictures and Office files that can carry macros (`.doc`, `.xls`, `.ppt`, `.docm`, `.xlsm` and similar). Modern Office files (`.docx`, `.xlsx`, `.pptx`) are fine. - If you pick a file of a blocked type, the error names it: "Files of this type cannot be attached to a comment: ...". The file selection is cleared, so pick the files again without it. - Files are uploaded in resumable parts, so large files such as point clouds can be attached. If an upload did not complete, you see "The attached file did not finish uploading. Please try again." - If a file with the same name already exists for that panorama, the new file gets a unique name. - Attachments count toward the project owner's storage quota. Owners on a plan with unlimited storage are not limited. When there is no storage left: - The project owner sees "There is no storage left on this project, so files cannot be attached. Free up space or upgrade your plan, then try again." - Other commenters see "There is no storage left on this project, so files cannot be attached. Please post the comment without the file, or ask the project owner to free up space." - In the marker's thread window, each attachment is a small icon that opens the file in a new tab. The file name appears in the icon's tooltip. - Specific icons are used for jpg, png, txt, pdf, doc, docx, xls and xlsx files. - Other files show a generic download icon. - Deleting a comment also deletes its attachments and frees the storage they used. ### Comment threads and replies - Clicking a marker opens its thread window. The root comment comes first, then its replies, oldest first. - Each message shows an author line with the date and the author's name. - The date is in DD.MM.YYYY format, in the viewer's time zone. - Messages from visitors who were not signed in are shown as "Anonymous". - When the project is set to display comments anonymously, author lines are hidden. - A reply must contain text. Otherwise you see "Please write something before sending the reply." - A reply can be sent with an e-mail notification. Everyone who wrote in the thread receives the e-mail, except the sender. - On projects where commenting is limited to project users or the owner, participants who no longer have access to the project are not notified. - If a comment or reply was deleted while your page was open, you see "This comment no longer exists. Please reload the page." or "This reply no longer exists. Please reload the page." ### Notification e-mails - The e-mail subject line says "New comment in the project """. - The e-mail shows the thread's messages, with author and date when authors are shown. The new message is highlighted and labelled "New". - Attachments appear as links. Pictures are also embedded in the e-mail. - The e-mail contains the link "Open the marker in the panorama to reply". - The footer explains why you received the e-mail: - "You are receiving this email because the author of the comment chose to notify you." - "You are receiving this email because you took part in this discussion." ### Tasks - A comment of the task type shows a tick icon in its thread window while the task is open. - Clicking the tick marks the task as done. The task's text is struck through and the tick disappears. - A task can be marked as done only once. - Anyone who is allowed to comment on the project can tick off a task. ### Deleting comments and replies - In the tour, each message has a trash icon ("Delete comment"). You are asked to confirm before it is deleted. - Deleting requires signing in as the project owner, a project user or a group member. - The project owner can delete any comment or reply. - Other members can delete only their own messages. Otherwise they see "You can only delete your own comments." - Deleting a root comment removes the whole thread, including all replies and attachments. ### Comments page (project owner) - The page is at `/projects//comments` and is available only to the project owner. - While the project is still processing, the page refreshes automatically. - The table lists every comment of the project, grouped by panorama in the project's panorama order. Its columns are: - Thumbnail button ("Set as project thumbnail") for the comment's panorama. - **id**: the panorama id. - **Name**: the panorama name. - **Type**: shown as the stored value, for example `disc20` or `task20`. - **Color**: shown as the stored value, for example `bg-red`. - **yaw** - **pitch** - **Text** - **files** - **Actions** - You can edit **Type** and **Color** inline by picking from a list. - You can edit **yaw**, **pitch** and **Text** inline. - Yaw and pitch are rounded to 3 decimal places. - If an edit fails, you see "Error. Check the values and try again." and the old value is restored. - Every column has a header filter. - Name and Text filters match a case-insensitive substring. - In the Name and Text filters, `*` works as a wildcard that matches the whole value. - The **Actions** column has two buttons: - **Show** opens the tour in a new tab at the comment's view, using `?scene=&pitch=&yaw=&fov=1.571`. - **Delete** asks "Are you sure you want to delete this?". It deletes the comment with its replies and attachments. - Clicking a row selects it. - "Selected: N" shows how many rows are selected. - **Deselect visible** clears the selection among the visible rows. - A "Visible:" counter shows how many rows the filters leave. ### Live sensor values in comments (project owner) The project owner can show live values from their own MQTT sensors inside comment text. How to embed a value: - Write `fallback text` in a comment, a reply, or the Text column of the Comments page. - The fallback text is shown until a value arrives. - Viewers then see each new value as the sensor publishes it. - Only the project owner can embed sensors, and only sensors under their own account. - If someone else writes the attribute, it is removed. - A topic pointing to another user's sensors is removed. - A malformed topic is removed. - Embedding a sensor lets viewers of that project read the whole sensor branch, including all of its subtopics. - When the last comment referencing a sensor is edited or deleted, that access is removed again. - When you switch scenes, the last known value is shown immediately. Optional attributes on the same span: - `data-mqtt-json`: a dotted path that picks one field from a JSON payload. - Array indices can be written as `arr.0.x` or `arr[0].x`. - If the payload is not valid JSON, the raw payload is shown. - If the path does not resolve, the value is empty. - `data-mqtt-suffix`: text appended to the value, for example a unit. - `data-mqtt-show-last-update="true"`: appends the time since the last update. - The time is shown as "just now", "Nm ago", "Nh ago" or "Nd ago". - `data-mqtt-stale-after`: a number of seconds. The value is marked as stale when no update has arrived for longer than that. - `data-mqtt-red`, `data-mqtt-yellow`, `data-mqtt-green`: value ranges that show a coloured indicator dot next to the value. - `X` are strict comparisons. - `<=X` and `>=X` include X. - `A-B` is an inclusive range, for example `30-70`. - `true`, `false`, `on` and `off` match the payload word, case-insensitively. - Several ranges can be separated with `;`. - Red takes priority over yellow, and yellow over green. Overlapping ranges are not checked. - Any of the three colours can be left out. - A value that matches no range shows no dot. - Relative-time labels and the stale state are refreshed every 5 seconds. ### Comments as point-cloud annotations - Some panoramas are synthesized from a scan. A comment placed on such a panorama also gets a 3D position, calculated from the distance to the clicked spot. - On photographed panoramas, a comment has only a direction and no position. - Comments with a position appear as annotations in the point-cloud viewer. Imported Leica geotags also appear as annotations. - The annotation title is the geotag name if there is one. Otherwise it is the comment text without formatting, cut to 60 characters (57 characters plus "..."). An empty comment shows "#". - Opening an annotation shows the comment text and its attachments. Pictures (jpg, jpeg, png, webp) are shown inline and other files appear as links. - Clicking the title moves the camera to the panorama the note was seen from most closely, looking at the note. - A geotag visible from several panoramas appears as a single annotation. ### PDF report (project owner) - Use the **PDF report (N)** button on the Comments page. Its tooltip reads "A PDF with a page for every comment shown in the table". - The report includes: - the selected rows among those the filters leave, or - all rows the filters leave, if no row is selected, or - every comment, including ones added after the page loaded, if no filter is set and nothing is selected. - N on the button shows how many comments the report will contain. - The report is prepared in the background. The page waits for it and then downloads it. - If there is nothing to include, you see "There are no comments to put in the report." - Report creation is rate-limited. If you request too many, you see "Too many reports in a short time. Please try again later." - The file is named `-comments-.pdf`. The timestamp uses your time zone. - The report is written in the language of the page it was ordered from. - The report uses A4 pages. - Each page header shows the project title and "Comments report". - Each page footer shows the site address, the creation time and "Page X of Y". - The PDF has bookmarks for every level map and every comment. **Cover page** - Title "Comments report" and the project title. - **Project**: a link to the project. - **Created**: the date and time, as DD.MM.YYYY HH:MM. - **Comments**: the number of comments, shown as "X of Y" when the report covers only some of them. - A table with these columns: - **#** - the marker - **Panorama** - **Comment**: an excerpt of up to 140 characters. Done tasks are struck through, and the reply count is shown as "(Replies: N)". - **Page** - The numbers and page numbers link to each comment's page. **Level map pages** - There is one page per level that has a plan image or more than one panorama station. The page is titled "Map: " and shows "Comments: N". - The page shows the level's plan images. If there are none, it shows a light coordinate grid. - Panorama stations are shown on the map. - Comments with a known position appear as markers labelled with their number. - Comments without a known position are counted in a bubble over their panorama, labelled with the panorama name. - Each marker and bubble links to the comment's page. **Comment pages** Each comment starts on a new page and may run over several pages. The page shows: - **Heading**: the comment number, the panorama name and the marker. - **Details line**: the date, the author (unless authors are hidden for the project), and "Task: open" or "Task: done" for tasks. - **View image**: the view as the tour shows it, a wide-angle 3:2 picture about 90° across, with the marker drawn at the centre. - For intensity panoramas, the intensity image is used. - If the image cannot be produced, the page says "The panorama image is not available." - **"Open in the virtual tour"**: a link that opens the same view in the tour. - **Level**: the level name. - **Panorama position**: shown as X, Y, Z. - **Comment position**: shown as X, Y, Z when the position is known. - X and Y use more decimal places for coordinate systems in degrees. - Z is shown with 3 decimal places. - **Comment text**, with its formatting kept: - Kept: bold, italic, underline, strikethrough, superscript and subscript, links, highlighting, coloured text, lists, quotes, headings and horizontal rules. - Table cells are separated by " | ". - Images in the text appear as their [alt text]. - Audio and video are left out. - **Replies (N)**: each reply with its date and author. - **Level plan**: shown beside the text when the level is mapped. - This panorama's station is highlighted. - An orange sector shows the direction of the view. - The comment's marker is shown where its position is known. - **Attachments (N)**: - Pictures (jpg, jpeg, png, webp) are printed inline, turned upright and scaled to fit. - Other files, unreadable pictures and pictures over 100 megapixels are listed by name only. ## Downloading and Exporting Data ### Prepared downloads (files built on demand) - Some downloads take a while to build. For these, the platform builds the file in the background, then hands it to the browser. - When you click such a download button, the button shows a spinner. It ignores further clicks until the download begins. - The page checks the build status once per second. When the file is ready, the browser saves it and the page stays where it is. - If the build fails, the page shows the message "Something went wrong". - If the request is rejected, the page shows an alert with the error. - Only the project owner can check the status of a prepared download and fetch the file. - The status is checked at `/projects//prepared//status`. The finished file is served from `/projects//prepared/`. Both require being logged in as the project owner. - A prepared file keeps the name it was built under. - A prepared file counts towards the project's stored size. - A prepared file is deleted automatically 24 hours after it is created. Its size is then removed from the project size again. ### Offline version of a project (offline tour) #### Who can create it - Only the project owner can create the offline version. - The owner's plan must include offline tours. Otherwise the platform answers "Unfortunately, this is not available in your plan." - The offline version is created from the project's settings page, `/projects//settings`. #### Creating the archive - The owner starts the build from the project settings. The project is then queued for processing. - The page shows: "File generation started. You will receive an email when processing is complete." - While the archive is being built, the project shows a progress percentage. The percentage is an estimate. It stays at 99% at most until the archive is finished, and then it reaches 100%. - If a build is already running, the page shows: "The file is still being created. You will be notified by email when it is ready." - When the archive is ready, the user who started the build receives an email. The email contains the download link and the file size. - If the build fails, the incomplete archive is removed and no download link is sent. - The archive is built in the language the user was using when they started the build. - The archive is a single `.zip` file named after the project title. - Each project has one offline archive. Creating a new one replaces any previous archive, including one built before the project was renamed. - The archive's size counts towards the project's stored size. #### Temporary or permanent link - By default the download link is temporary. The archive is deleted automatically 24 hours after it is created. - The owner can request a permanent link instead. A permanent archive is kept until the owner deletes it. #### Deleting the offline version - The project owner can delete the offline version from the project settings. - All stored archives of the project are deleted, including ones built under an older project title. - The page then shows: "The offline version of the project has been deleted." - The freed space is removed from the project size. #### Download link and access - The download link has the form `/downloads//.zip`. - Anyone who can access the project can use the link: the owner, project users, group members, visitors with a project link, or anyone if the project is public. - If the archive no longer exists, the link shows this message: "This download link no longer works: the archive has already been deleted. The archive is deleted automatically 24 hours after it is created." - The project owner is redirected to the project settings page with the added note "You can create the offline version again on this page." - Everyone else sees an error page with the added note "Ask the project owner to create a new offline version." The error page also offers the support contact form. ### What the offline archive contains - The archive has these top-level items: - `index.html` - a `projects` folder with the project data - a `static` folder with the viewers - `README.txt` with viewing instructions - three ready-made local servers: `start_server_windows.exe`, `start_server_macos` and `start_server.py` - The top-level `index.html` shows one button per available mode of the project: - "Virtual tour", if the project has enabled scenes - "Point cloud", if the project has a point cloud - "IFC", if the project has IFC models - "3DGS", if the project has 3D Gaussian splats - "Map", if the project has GeoTIFF or KML data - "PDF", if the project has PDF files - "360° video", if the project has 360° videos - The project owner's custom logo is included if one is set. Otherwise the default logo is used. - If the project has a coordinate system (EPSG code or proj4 definition), any required projection grid-shift file is included. - **Virtual tour:** the panoramas and the tour page are included. - **Point cloud:** - The main point cloud page is included. - If the project has a coordinate system, a "point cloud on map" page and a "point cloud on satellite" page are included as well. - A separate point cloud page is included for each enabled scene and each sitemap. - The point cloud viewer guide is included in the archive's language only. - **OBJ and GLB meshes:** included whenever the project has them, even without a point cloud. - **IFC:** the IFC models and the IFC viewer page are included. - **3DGS:** the splat data and the 3DGS viewer page are included. - **PDF:** - Every PDF file is included with its own viewer page and its annotations. - For PDFs with annotations, an annotated copy is included so that "Download with annotations" also works offline. - **360° video:** the video list page and a player page for each video are included. - **Vector layers:** included. - **Map:** - GeoTIFF layers and KML files are included. - The map page is the same page the platform serves at `/big-map`. It shows KML, scenes, sitemaps, measurements and video tracks, but without any connection to the platform. - The share popup is kept in the viewers. The local address from the browser's address bar can be shared within the local network. ### Viewing the offline archive - The archive cannot be opened by double-clicking `index.html`. Browsers block the requests the viewers use to load data from local files. - A small local web server is needed to serve the unpacked folder. Three options are included. #### Windows - Double-click `start_server_windows.exe` in the unpacked folder. - It starts a local server and opens `http://localhost:5005` in the browser. - If port 5005 is busy, the next free port is used. The console window prints the exact address. - Keep the console window open while viewing. Press Enter in it to stop the server. - No elevated rights are needed. It runs as the current user and installs nothing. #### macOS - `start_server_macos` is signed with an Apple Developer ID and notarized by Apple. It runs on Intel and Apple silicon Macs. - Start it from Terminal, in the unpacked folder: - `cd /path/to/this/folder` - `./start_server_macos` - Do not start it by double-clicking. Terminal would then start it in the home folder, and the server serves the folder it is started from. - On the first run, macOS may ask whether to open a file downloaded from the Internet. Click "Open". - Then open the address printed in Terminal. This is `http://localhost:5005` unless that port is busy, and it usually opens by itself. - Press Enter in the Terminal window to stop the server. - If macOS says it "could not verify" the file (for example, on a Mac that is offline at the first run), click "Done". Then do one of the following: - Allow it once in System Settings → Privacy & Security → "Open Anyway". - Run `xattr -d com.apple.quarantine start_server_macos` in Terminal and start it again. - If Terminal answers "permission denied", run `chmod +x start_server_macos` first. #### Script version (any system) - `start_server.py` contains the source code of the same server. Use it if you prefer not to run a prebuilt binary. - It needs Python 3 and the packages installed with `pip install waitress werkzeug`. Start it with `python start_server.py`. - It serves the folder it is started from at `http://localhost:5005`, or the next free port. - It prints nothing else, and no data leaves the computer. #### Hosting the archive on your own web server - The archive is a plain static site. No database or backend is needed. - Steps: 1. Unpack the archive. 2. Upload `index.html`, `projects/` and `static/` to the web server. Keep the folder structure exactly as it is. 3. Make sure the server uses `index.html` as the directory index. 4. Open `https://your-domain/`. - The pages reference their files by absolute paths (`/static/...`, `/projects/...`). - The archive must be served from the root of a domain or subdomain, for example `https://tour.your-domain.com/`. - A subfolder such as `https://your-domain.com/tour/` will not work. - The server must serve `.wasm`, `.glb`, `.mjs` and `.frag` files with correct MIME types. Add `application/octet-stream` for `.frag` if needed. - The server must allow range requests. Otherwise seeking in 360° videos does not work. Standard Apache and nginx configurations allow them. - The archive contains no protection. Access control, such as a password or IP restrictions, is entirely up to the hosting. ### Offline archive of all projects at once - The platform can prepare a single offline archive containing every project a user owns. Deleted and broken projects are left out. - Users cannot create this archive themselves. - The user may receive an email with the download link, the file size and the number of projects. - The archive has the same layout as a single-project archive. Every project sits in its own folder, so all viewer pages work the same way. - The top-level `index.html` is titled "Projects". It lists all projects sorted by title, each with buttons for its available modes. - If there are no projects, the page shows "No projects available." - The archive is built in the user's language. - If one project cannot be added, it is skipped and the rest of the archive is still built. - The download link has the form `/downloads/user-projects//.zip`. Only the owning user, logged in, can download it. - The archive is deleted automatically 24 hours after it is created. It does not count towards any project's size. - After that, the link shows: "This download link no longer works: the archive has already been deleted. The archive is deleted automatically 24 hours after it is created." ## Offer for educational institutions (page /education) ### Overview - The page at `/education` describes a free student plan for schools and universities. - An institution receives a single promo code. The code covers the entire institution. - With the code, teachers and students get extended access to the platform for free for one year. - No credit card is required, and there are no costs for teachers or students. - No installation, procurement, per-seat sign-up, or payment details are needed. - The student plan is intended for coursework on point cloud and BIM projects, including work by whole classes. ### How it works 1. The institution requests a promo code for its school or university. The platform issues a single code that stays valid for one year. 2. The institution shares the code with its teachers, who pass it on to their students. The platform requires no approvals or paperwork for this. 3. Each teacher and student enters the code once on the payment page. Their account switches to the student plan immediately. When online payment is available on the installation, the page shows a "Redeem a code" link that leads to the payment page. ### Student plan compared with the free plan | Feature | Free plan | Student plan | |---|---|---| | Projects | 3 | Unlimited | | Storage space | 1 GB | 10 GB | | Setups per project | 10 | 100 | | Project access | 30 days | 1 year, renewable | ### Requesting a promo code - Institutions request a code through the contact form at the bottom of the `/education` page. The page's "Request a promo code" buttons link to this form at `/education#contact`. - In the request, the institution should describe itself and give a rough number of students. The platform then sends a promo code. - The same form can be used for questions, ideas, and suggestions. - The platform is also open to taking part in academic and research projects run by institutions. ## Email notifications ### General rules - The platform sends emails about your account and your projects. These emails are part of the service and cannot be turned off. - To stop receiving account and project emails, you can delete your account on your profile page (`/profile#delete-account`). - Every email ends with a short note explaining why you received it. - Emails sent on someone else's behalf, such as invitations, tell you to ignore the email or contact support if you do not know the sender. Account emails tell you to ignore the email or contact support if the action was not yours. - Some optional content is sent only to users who agreed to receive marketing emails. This includes the first-project feedback survey and the offline-archive offer in deletion warnings. - "Manage your plan" links appear only on installations where online payment is available. ### Plan description in emails Several emails describe your current plan. The description lists the following: - Disk space, either "{N} GB of disk space" or "unlimited disk space". The new-project email also shows how many GB are already in use across all projects you own. - The project limit, either "up to {N} projects" or "unlimited projects". This line is omitted when the plan has no project limit value. - The panorama limit, either "up to {N} panoramas per tour" or "unlimited panoramas per tour". - "Your projects are available for {N} days", if the plan limits how long projects are kept. - "Offline projects", if the plan includes offline projects. - "Support", if the plan includes support. ### Registration email - This email is sent when you register. It greets you by name. Names longer than 40 characters are shortened. - If your account was created without a password, the email contains a one-time link to set your password (`/quick-login?email=...&key=...`). The link can be used only once. - If your email address needs confirmation, the email contains a confirmation link (`/verify-email?token=...`). The link is valid for 24 hours. - On installations with online payment, the email describes your basic plan and links to "Manage your plan" (`/pay`). ### Email confirmation - You can request a new email confirmation for your account. The platform then sends an email with a confirmation link (`/verify-email?token=...`). - The link is valid for 24 hours. ### Password reset and password change - When a password reset is requested, the platform sends a link to set a new password (`/quick-login?email=...&key=...`). - The reset link is valid for a limited number of hours, which the email states. It can be used only once. - If you did not request the reset, you can ignore the email. - When your password is changed, you receive a confirmation email. If you did not make the change, contact support immediately. ### New project email - The project owner receives this email when the processing of a project is complete. - If processing ran into a problem, the email says so. Error details are shown on the Project settings page. - The email links to each viewer the project contains: - "Virtual tour": `/projects//` - "Point cloud": `/projects//pointcloud` - "IFC": `/projects//ifc` - "3DGS": `/projects//3dgs` - "Map", for GeoTIFF or KML: `/projects//geotiff` - "PDF": `/projects//pdf` - "360° video": `/projects//video360` - "Project settings": `/projects//settings` - On installations with online payment, the email shows your plan, your disk usage and a "Manage your plan" link (`/stripe`). ### First-project feedback survey - A feedback survey email is sent once a day to users who created their very first project during the previous day (UTC). - You receive it only if your email address is verified and you agreed to receive marketing emails. ### Project invitations - When a user invites you to a project, you receive an email naming the inviter, their email address and the project title. - There are two kinds of invitation: - An invitation to join as an owner. - An invitation to view the project. - If the inviter added a personal message, it appears in the email as "Message from {name}:". - If you do not have an account yet, the email contains a sign-in link (`/invite?email=...&key=...`). The link is valid for a limited number of days, which the email states, and can be used only once. - If you already have an account, the email links directly to the project's viewers. Owner invitations also link to the Project settings page. ### Offline download emails - When the offline version of a project is ready, you receive an email with the download link and the file size. - If the platform has an FAQ, the email also links to "How to open and self-host the archive" (`/faq#faq-offline-archive`). - A link to a temporary offline version is valid for 24 hours. - A link to a permanent offline version stays available until you delete the offline version in the project settings, or until the project is deleted. - When the archive of all your projects is ready, you receive an email with the number of projects, the download link and the file size. This link is valid for 24 hours. ### Payment and plan change emails - **Payment received:** after a payment, you receive an email listing your new plan and its features. Your subscription remains active until you cancel it. You can cancel at any time via "Manage your plan" (`/stripe`). - **Plan changed:** when your account's plan changes, you receive an email with the new plan and the options now available to you. ### End of a plan or subscription - The platform checks plan end dates once a day. - **Paid subscriptions:** if a paid subscription is not renewed, the account keeps its plan for a short grace period of up to 2 days after the end date. After that, the account moves to the free plan and you receive a "subscription ended" email. The email: - Says that if you did not cancel, there may have been a problem with your payment. - Invites you to check your payment settings or reply to the email to contact support. - Links to "Manage your plan". - Lists the features of your new free plan. - If you own projects, states that all your current projects remain available for the free plan's storage period (in days) and are subject to the free plan's limits. - **Plans granted without payment:** a plan that was not paid for moves to the free plan on its end date. You receive a "plan changed" email. ### Free plan project expiry and deletion - Projects whose first owner is on the free plan are kept only for the free plan's storage period. - A project's age is counted in days from its creation date. If the owner's paid subscription ended more recently, the countdown starts at the subscription end date instead. - When a project reaches 28 days of age, the owner receives a warning email saying the project will be deleted in 3 days. - Warnings for several projects of the same owner are combined into one email. - A warning about a single project links to its viewers and its Project settings page. - A warning about several projects lists every project title, each linking to that project's settings page. - If you agreed to receive marketing emails, the warning also explains how to keep the data: - With any paid plan, you can download everything as an offline archive. The archive includes the virtual tour, the point cloud, the models and the viewers. - The archive is a plain website with a small web server included. It works without an internet connection, either on your own computer or on any web host. - The email states the lowest monthly price, in euros, of plans that include offline projects. You can start the download from the project settings page once the subscription is active. - When a project's age exceeds the free plan's storage period, the project and its files are deleted automatically. - Projects that no longer have any owner are deleted automatically. - Self-hosted installations may not run automatic project expiry, the deletion warnings or the feedback survey. ## Panorama editing: automatic anonymization, manual blur, colour correction, and adding panoramas ### Overview - The platform can blur people, faces, vehicles and license plates in panoramas automatically during processing. - Project owners can also edit a single panorama in the browser. They can paint blur over areas by hand, or adjust its colours with brightness, contrast and saturation. - Project owners can add a single extra panorama to an existing project, either at the current panorama's position or at a point clicked on the map. - All editing pages require the user to be logged in. Only the project owner can use them. ### Automatic anonymization - Automatic anonymization runs while panoramas are processed. It detects objects and blurs them. - Four object classes can be selected independently: - faces - people - license plates - vehicles - Only the selected classes are detected and blurred. If no class is selected, nothing is blurred. - Each detected object is covered by a strong blur over its whole bounding rectangle. - The whole panorama is processed, including the floor (nadir) and sky areas. - The built-in anonymization engine is free of charge. - Anonymization can be turned off. The panorama is then processed without blurring. - If detection fails for part of a panorama, processing still continues, and that part stays unblurred. Check sensitive panoramas after processing. Use the manual blur tool to cover anything that was missed. ### Manual blur editor - URL pattern: `/projects//blur?scene=&panoType=`. - `panoType` selects which version of the scene is edited: the colour (RGB) panorama or the intensity panorama. Other panorama types cannot be edited. A missing scene or an unsupported type returns "not found". - A "Loading..." indicator is shown while the panorama loads. - The control panel is titled "Blurring". On mobile devices the panel can be collapsed and expanded. #### Tools - "Shift+click: blur" paints blur onto the panorama. - "Ctrl+click: restore" paints the original, unblurred image back. - To use a tool, choose it and then drag over the image to paint. - Clicking a tool button keeps that tool active. Clicking the active tool again turns it off. - You can also hold Shift to blur or Ctrl to restore without selecting a button. A held key temporarily overrides the selected button. The selected button is kept for when the key is released. - While a tool is active, dragging paints instead of rotating the view. Camera navigation works again when no tool is active. - When a tool is active, the mouse cursor is replaced by a ring that shows the brush size. #### Brush - The "Brush size" slider ranges from 10 to 200, with a default of 60. The value is the brush radius in screen pixels. - While you move the slider, the brush outline is shown at its real size in the centre of the visible viewer area for a moment. - The brush has a soft edge. The effect is strongest at the centre and fades towards the rim. Repeated strokes strengthen the effect. - The blur is strong, about a 50-pixel blur radius on the full-resolution panorama. - Painting works with a mouse, a pen, or touch. With touch, only one finger paints. A second finger is ignored. A stroke that leaves the viewer still ends cleanly when released. #### Saving - Click "Save result" to save. The button changes to "Please wait...". Processing usually takes a few seconds. - On success, the message "Done! Close this page, then refresh your virtual tour page." is shown and the page closes. On failure, "Error!" is shown. - Warning: once you save, the blur becomes permanent. Blurred areas can no longer be restored. - Before saving, the restore tool brings back the original image in any painted area. ### Colour correction editor - URL pattern: `/projects//colors?scene=&panoType=`. It uses the same `scene` and `panoType` rules as the blur editor (colour or intensity panorama). - The control panel is titled "Color correction". On mobile devices it can be collapsed. #### Controls Three controls are available. Each has both a number field and a slider. The range is −1 to 1, in steps of 0.01. The default is 0, which means no change. - **brightness** adds the value to every colour channel. Positive values lighten the image and negative values darken it. - **contrast** scales colours around the mid-grey point. At 0 the image is unchanged. At −1 contrast is removed completely (flat grey). At 1 contrast is doubled. - **saturation**: at 0 the image is unchanged. At −1 the image becomes greyscale. At 1 saturation is doubled. Further details: - Changes are previewed live in the panorama. - The adjustments are applied in this order: brightness, then contrast, then saturation. - Resulting colour values are clipped to the valid range. #### Saving and limits - "Save result" works the same way as in the blur editor. The button shows "Please wait...". On success, "Done! Close this page, then refresh your virtual tour page." is shown and the page closes. On failure, "Error!" is shown. - The corrected panorama is saved as a JPEG at 85% quality. The change is permanent. - The panorama must fit within the maximum texture size supported by your device's graphics hardware. Otherwise the message "Image is too large. The maximum supported size is N by N pixels." is shown. - If the panorama cannot be loaded, "Unable to load image file." is shown. ### What happens after saving an edit - The edited panorama replaces the original version of that scene: the colour version or the intensity version, whichever was edited. - The viewing tiles, the preview image and the thumbnail are regenerated from the edited panorama. - The project's storage usage is updated to reflect the new file sizes. - Refresh the virtual tour page to see the result. ### Adding a single panorama to a project - Endpoint: `POST /projects//add-pano`. Only the project owner can use it. - Supported file extensions: `.jpg`, `.jpeg`, `.png`, `.insp`, `.dng`. Other files are rejected with "Only JPG, PNG, INSP and DNG panoramas are supported". - A missing file is rejected as "Missing image." - If the file cannot be processed, the error "The file could not be processed" is returned. #### Plan limit - The number of panoramas is limited by the project owner's plan. - When the project's enabled panoramas reach the plan's limit, the error "Your plan's panorama limit has been reached" is returned. - Plans with an unlimited panorama count have no such limit. #### Two ways to add a panorama - **"Add an alternative panorama"** (button in the tour): the new panorama is placed at the same position and on the same floor as the panorama currently on screen. - **"Add a panorama here"** (right-click on the map): the new panorama is placed at the clicked map point, with height 0. - The new panorama goes on the floor of the scene in view. - If there is no scene in view or the scene has no floor, it goes on the project's last floor. If the project has no floors yet, a first floor is created. - This option is also available on the `/geotiff` and `/big-map` pages. #### Processing - In both cases the new panorama is a colour (RGB) panorama. - It is processed like a normal image import, including automatic contrast. - It is tiled at the same resolution (cube face size) the project was last imported with, so it matches the surrounding scenes. - Its capture time is read the same way as in the project's last import: camera clock as local time and camera time zone. Projects imported before these settings existed keep times as recorded. - The panorama's rotation from the image's direction metadata is kept. The capture date taken from the file name is also kept. - Because the capture date is kept, the panorama appears in its own date group in comparison mode. - If a panorama with the same file name already exists in the project, a numeric suffix is added to the new name (for example `name-2`, `name-3`). ## Partnership Program for Equipment Manufacturers ### Overview - The page `/for-manufacturers` describes a partnership program for laser scanner manufacturers. - The program has four partnership tracks: native integration, advertising, joint promo campaigns, and a reseller program. - A manufacturer can choose one track or combine several. - Each partnership is tailored to the partner's goals. There is no fixed template. - Manufacturers apply through a contact form at the bottom of the page, at the `#contact` anchor. - In the form, the partner describes their hardware, their customers, and the tracks that interest them. - The platform replies within two business days. ### Track 01: Native Integration - The import pipeline gives first-class support to the manufacturer's proprietary scan formats. - The import process handles proprietary scan formats, vendor files, and mixed pipelines. - A white-label embeddable viewer is available. It can carry the manufacturer's brand on product pages and customer portals. - A full REST API supports programmatic uploads, embeds, and webhooks. - Live API documentation is at `/api/v1/docs/`. An integration guide is at `/api-guide`. - Partners take part in a joint feature roadmap. Their customers' requests help decide what is built next. - Partners get a dedicated technical contact during onboarding and afterwards. ### Track 02: Advertising - Every project owned by a free-plan user opens with a welcome screen before the 3D viewer loads. - The platform offers this welcome screen to scanner manufacturers as a contextual ad placement. The ad appears next to data produced with the manufacturer's equipment. - Placements run on free-plan projects only. - Other formats can be discussed: sponsored format pages, in-app spotlights, and top-of-funnel banners. - The platform reports impressions and engagement to the advertiser. ### Track 03: Joint Promo Campaigns - The manufacturer includes a promo code in the box with each scanner sold. - The buyer redeems the code for one to three months of the Expert plan on the platform. - The exact duration and the number of codes are agreed separately for each campaign. - The platform handles code generation, redemption, and analytics. - Codes can be single-use or multi-use. Each batch can have its own limit. - A co-branded redemption landing page is optional. - On installations with online payment, this section links to a page that shows what the Expert plan includes. ### Track 04: Reseller Program - Manufacturers can bundle platform subscriptions with their hardware. - Resellers earn up to 30% commission on every plan they sell. - Co-branded offers and joint quoting are available. - A dealer dashboard tracks referred customers. - Volume tiers and exclusivity are discussed case by case. ### Platform Commitments to Partners - All major scanner formats are supported out of the box. End users need no plugins and no manual conversion steps. - Customers keep full ownership of their scans. The platform does not lock their data in. - The viewer can be embedded into any website or CRM with a single iframe. ## Offer for surveyors and scanning companies (page `/for-surveyors`) ### Who it is for - The page `/for-surveyors` is aimed at surveyors and laser scanning companies. - These companies often store data from finished jobs at their own expense, because clients will not pay to keep it. - The offer lets the company hand each completed scan project over to the client who commissioned it. The client then decides whether to keep the data. - The handover is built into the platform. It needs no contract, no data migration and no extra tools. All steps are done in the project settings. ### Step 1: Keep the original files - Every upload is converted into a viewer. - By default, the uploaded source files are deleted after conversion. - If you tick **Save source files**, the original files are archived with the project instead. They can be downloaded at any time. - The **Save source files** option is included with any paid plan. - The supported file formats are listed on the platform's supported formats page. ### Step 2: Add the client as an owner - From the project settings, invite the client by email as a project owner. - The client receives an email with a link. - After signing in, the client has full access to the viewer, the project settings and the source file archive. ### Step 3: Remove yourself as an owner - Once the client is on the owner list, remove your own entry. - The project then leaves your account completely. - The storage space the project used no longer counts against your plan. ### Step 4: 30 days on the client's free plan - On a client's free account, the project is kept for 30 days from the date it was uploaded. - The client receives a reminder three days before the project expires. - The 30-day countdown starts at upload, not at transfer. Hand the project over early. ### Step 5: The client decides - If the client wants to keep the data, they subscribe to a paid plan. - On a paid plan, the client keeps the viewer and the original files for as long as they keep paying. - If the client does not subscribe, the project is deleted when the free period ends. Neither party pays anything. - Plans can be compared on the platform's plans page. ### Cost for the surveyor - The surveyor pays only for the plan they need to upload and process their work. - The cost does not grow with the amount of data from projects already handed over. - The client receives an interactive viewer link and the original scan files. A file-transfer download link usually expires after about a month. ### Contact - The page includes a contact form. - Surveying companies can describe how they deliver data today, and the platform team will help them set up the handover. ## Panoramas with a positions file and multi-camera rigs ### Single panorama images - The platform accepts panorama images in JPG, PNG, DNG, INSP (Insta360) and EXR format. - Each image becomes one panorama. The panorama takes the image's file name without the extension. **Position from GPS tags** - When the image carries GPS tags, the platform reads: - latitude and longitude, including the N/S and E/W references, - altitude, which becomes the panorama height, - GPS image direction, which becomes the panorama heading around the vertical axis. - When the project has a coordinate system (EPSG code), the GPS position is converted into it. - When the project has no coordinate system, the platform picks the UTM zone of the first positioned panorama. It records this zone (WGS 84 / UTM north or south) as the project coordinate system. - An image without GPS tags is placed at position 0, 0 with height 0 and heading 0. - Panoramas created from single images are enabled immediately. **Capture time** The platform takes the capture time from the first source that has one: 1. A camera-style file name: letters, an underscore, a date block `YYYYMMDD`, an underscore and a time block `HHMMSS`. For example, `IMG_20241218_212239_00_002`. The rest of the name is ignored. 2. EXIF `DateTimeOriginal`. 3. EXIF `DateTimeDigitized`. 4. EXIF `DateTime`. - For DNG files, the order is the file name, then `DateTimeOriginal`, then `CreateDate`. - Placeholder dates such as `0000:00:00 00:00:00` are ignored. **Time zone of the camera clock** - Cameras record the time in whatever zone their clock is set to. They almost never record the zone itself. For example, an Insta360 X4 `.insp` file has neither a time zone offset nor a GPS time stamp. - The user states the zone in the upload options: - If the camera clock was set to local time, the user selects the camera's time zone. The platform converts the capture times from that zone. If no zone is given, UTC is used. - If the camera clock is not marked as local, the times are taken as UTC without conversion. - Capture times are always stored in UTC. - The same convention applies to every panorama of one upload. ### Format-specific behavior **DNG** - Raw DNG panoramas are decoded with the camera's white balance and converted to 8-bit colour. - GPS position, altitude, direction and capture date are read from the DNG metadata. - If the metadata cannot be read, the panorama is still created. It has no GPS position. A capture time from the file name is still used. **Insta360 INSP** - An `.insp` file must be a side-by-side dual-fisheye image with a 2:1 aspect ratio. - Other sizes are rejected with the message "expected side-by-side dual fisheye (2:1), got x". - The platform converts the file into a 2:1 equirectangular panorama of the same pixel size. - It uses an ideal fisheye lens model. It does not apply factory calibration or parallax correction. - The two lenses are blended across a band of about 6° around the seam. - The seam is tuned as a compromise between near and far content. Objects very close to the camera can show a visible seam. - The panorama is rotated so that its orientation matches that of a plain equirectangular JPG. - The horizon is levelled automatically from the camera's accelerometer data stored in the file. The data is averaged over ±0.15 s around the moment of capture. - If the file has no accelerometer data, the horizon is not levelled. **EXR** - The RGB channels of an EXR panorama are used. - Values are clipped to the 0–1 range and converted to 8-bit colour. Brighter HDR values are clipped, not tone-mapped. ### Positions files: general behavior - A positions file is uploaded together with its panoramas. It places each panorama by its position (x, y, z) and orientation. - Each row is matched to a panorama by its image name. The folder part of the name and the extension are ignored. - Images inside folders are expected flat in the upload. For example, `pano/.jpg` in the file matches `.jpg` in the upload. - Positions are taken as they are in the file, in the file's own coordinates. - Several importers set navigation links between consecutive panoramas to "only forwards". The sections below state where this applies. ### CSV positions files The platform recognizes the CSV layouts below. If none matches, the import reports "Unknown csv file structure". **RIEGL `imagelist.csv`** (the file name ends with `imagelist.csv`) - The header must be exactly one of these two lines: - `Timestamp,Filename,Origin(X[m],Y[m],Z[m]),Direction(X[m],Y[m],Z[m]),Up(X[m],Y[m],Z[m]),Roll(X)[deg],Pitch(Y)[deg],Yaw(Z)[deg],Omega[deg],Phi[deg],Kappa[deg]` - `Timestamp,Filename,Origin(Easting[m],Northing[m],Height[m]),Direction(Easting[m],Northing[m],Height[m]),Up(Easting[m],Northing[m],Height[m]),Roll(X)[deg],Pitch(Y)[deg],Yaw(Z)[deg],Omega[deg],Phi[deg],Kappa[deg]` - Any other header gives the message "Wrong csv file structure". - The position comes from Origin. The orientation is built from the Direction and Up vectors. - A row is used only when a `.jpg` with the same name is in the upload. Other rows are skipped. **XGRIDS Lixel `panoramicposes.csv`** (the file name ends with `panoramicposes.csv`) - The file is space-separated with the columns `#timestamp imgname x y z qx qy qz qw`. - With the `#timestamp` column, the file is treated as a continuous walk: - The panoramas are thinned (see "Thinning of continuous walks"). - The capture time comes from `#timestamp`, in Unix epoch seconds (UTC). - The EXIF time of these panoramas is a local wall-clock time without a zone and is not used. - Without the `#timestamp` column, every row is imported as its own station without thinning. This suits a hand-made station list. **SLAM/RTK odometry track** (any file name, for example `odom_with_rtk_status.csv` or `odom-realtime.csv`) - The file is recognized when its first line starts with `#timestamp,x,y,z,q_x,q_y,q_z,q_w`. Any further columns, such as RTK status, are ignored. - `odom_with_rtk_status.csv` is the post-processed solution. `odom-realtime.csv` is the live solution. - The track has one row per device solution, not one row per panorama. - The panoramas must sit next to the track, named `.jpg` (`.jpeg` and `.png` also work), with the time in UTC. - Each panorama's pose is interpolated on the track at the panorama's timestamp. The position is interpolated linearly. The orientation is interpolated smoothly between track rows. - The capture time is the panorama's timestamp. - Panoramas outside the track's time range are skipped. The device usually starts taking images before its pose is available. - Positions are the device's local metres with Z up, taken as they are. - The panoramas are not levelled. The tilt at which the device was carried stays in the panorama orientation. - Panoramas are matched to the track by timestamp only: - The file names must use the same clock as the track. - A track recorded on a different clock is not realigned. Such a mix must be fixed in the export. - Error cases: - No `.jpg` panoramas next to the track: "ignored: no .jpg panoramas next to it". - No panorama falls into the track's time range: "ignored: none of the N panoramas fall into its time range (…); the panoramas are …". The message shows both UTC time ranges, and nothing is imported from that track. - Fewer than two distinct timestamps in the track: the track is ignored. - Missing or malformed columns: "Wrong csv file structure". - Navigation links are set to "only forwards". Thinning applies. - The control point list of the same export (`ctrl_points.csv`, header starting `id,sampling_timestamp(ns),time_stay(s)`) has no coordinates. It is recognized and skipped without an error. **Generic quaternion CSV** - The file is comma-separated with the columns `filename, x, y, z, qw, qx, qy, qz`. **`pano_pose_info.csv`** - The file is comma-separated with the columns `filename`, `pano_pose_x`, `pano_pose_y`, `pano_pose_z`, `pano_r_w`, `pano_r_x`, `pano_r_y`, `pano_r_z`. - Navigation links are set to "only forwards". **OmniSLAM CSV** - The file is comma-separated with the columns `file, x, y, z, rot_x, rot_y, rot_z`. - The rotations are in radians. **Space-separated quaternion file** - The columns are `imgname x y z qw qx qy qz`. **NavVis `pano-poses.csv` / `pano-poses-registered.csv`** - The file is semicolon-separated with the columns `filename`, `timestamp`, `pano_pos_x`, `pano_pos_y`, `pano_pos_z`, `pano_ori_w`, `pano_ori_x`, `pano_ori_y`, `pano_ori_z`. - The NavVis VLX3 `pano-poses.csv` is supported. - `timestamp` is in Unix epoch seconds (UTC) and becomes the capture time. These panoramas carry no EXIF. **Register360 export** - The delimiter (comma, semicolon, tab or pipe) is detected automatically. - Column names are case-insensitive: `SetupName`, `Position(X)`, `Position(Y)`, `Position(Z)`, `Orientation(W)`, `Orientation(X)`, `Orientation(Y)`, `Orientation(Z)`. ### TXT positions files **Tersus MVP S1 "imageMerage" export: `coordinates.txt`** - The panoramas are stitched 2:1 images named `left_right.jpg`. - The file is tab-separated. The header must be exactly `File Time Long Lat Alt course pitch roll`. Otherwise the import reports "Wrong txt file structure". - Despite the header names, `Long`, `Lat` and `Alt` are Earth-centred (ECEF, EPSG:4978) X, Y, Z coordinates in metres. - `course`, `pitch` and `roll` are in degrees. - The capture time comes from the left frame's nanosecond timestamp in the file name (UTC). - The panoramas are not levelled. - Thinning applies. Navigation links are set to "only forwards". **Mobile mapping `pose.txt`** (any file name; the first line is `# File_Type: Pose`) - The panoramas are flat `img.jpg` 2:1 images without EXIF, for example 11904×5952 pixels. - Coordinate system line: - The file contains a WKT line describing the coordinate system of the positions. It starts with `PROJCS[`, `GEOGCS[`, `COMPD_CS[`, `PROJCRS[`, `GEOGCRS[` or `COMPOUNDCRS[`. - This coordinate system becomes the project coordinate system when the project has none yet. - Column header line: - A line starting with `# frame_id` names the columns, for example `# frame_id filepath timestamp camera_id x y z qw qx qy qz pos_acc angle_acc`. - The columns `filepath`, `x`, `y`, `z`, `qw`, `qx`, `qy`, `qz` are required. Without them the file is "ignored: no column header". - `timestamp` is optional. It is in epoch seconds (UTC) and becomes the capture time. - The panoramas are not levelled. - Thinning applies. Navigation links are set to "only forwards". - The `imglist.txt` of the same export (first line `id,filePath,time,roll,pitch,heading,x,y,z`) has no poses. It is recognized and skipped without an error. **iQscene file** - The first line contains `iQscene`. - Each row holds a quoted image path, then x y z, a rotation axis (three values) and a rotation angle in degrees. **Leica per-setup text file** - The file contains `position = [x, y, z];` and `orientation = [w, x, y, z];`. - It places one panorama, which has the same name as the text file. - A file without a `position` line is ignored. ### Other positions files **Bundle adjustment report (`.out`)** - The station orientation comes from the section "Adjusted Rotation Parameters of Stations", as the quaternion q0 qx qy qz. - The station position comes from "Adjusted Translation Parameters of Stations", as tx ty tz. - Station names match the panorama names. **RMX file** - One file per panorama. The panorama has the same name as the file. - The file contains three sections: - "translation vector (millimeters)", which is converted to metres, - "rotation axis direction", - "rotation angle (radians)". **OmniSLAM binary pose file** - It holds a position and rotation for each `camera…jpg` image. - The platform enables its equirectangular panorama correction for this import. **RIEGL RiPano JSON** - Each entry in `positions` has a `title`, which is the panorama name, and a 4×4 `matrix`, which gives the position and rotation. - The coordinate system described in `coordinateSystems.prcs` is recognized automatically. It is used when the project has no coordinate system yet. **Tersus MVP S1 CloudStudio batch export: `manifest.json`** - The `schema` must start with `CloudStudioS1PanoramaBatch/`. Otherwise the import reports "ignored: unknown manifest schema". - The panoramas are stitched 2:1 images `panorama/.jpg`, named by the left frame's nanosecond timestamp (UTC) and uploaded flat. - The position comes from each row's `panoramaPose`, in the device's local east-north-up metres, taken as they are. The WGS 84 `gps` value of each row is not used. - The first frames, captured before the device's pose was available, have no `panoramaPose` and are skipped. - The capture time comes from the row's `timestamp` in nanoseconds. - The panoramas are not levelled; the device's tilt stays in the panorama orientation. - Thinning applies. Navigation links are set to "only forwards". ### Multi-camera rigs stitched by the platform Some rigs deliver separate photos per camera with a pose for each photo. The platform stitches each shot into an equirectangular panorama. **How stitching works** - The camera poses are used as they are. No control points are used and nothing is optimized. - The resulting panorama is level in the world frame. - Each overlap between two photos is cut along a line where the photos agree best. This reduces doubled near objects caused by the centimetre spacing between the cameras. - Photos with different exposures are joined with a multi-band blend. Coarse detail blends far across the seam and fine detail blends close to it. - Areas that no photo covers stay black, unless a colorized point cloud fills them (see Share below). The photos fade into such a fill over about 2° inside their borders. - Stitched panoramas are saved as JPG. - Their resolution follows the pixel density of the source photos, limited by the platform's maximum panorama resolution. - The import updates the project's progress as it goes. **CHCNAV RS10 (three cameras)** - The upload must contain: - three Metashape-format pose files whose names contain `_Camera1.`, `_Camera2.` and `_Camera3.`, each space-separated with the header `imageName X Y Z Omega Phi Kappa` (angles in degrees), - `Camera1Param.txt`, `Camera2Param.txt` and `Camera3Param.txt` next to them, with `fx`, `fy`, `cx`, `cy` in pixels as `key=value` lines. - Missing parameter files give the message "Camera1Param.txt, Camera2Param.txt and Camera3Param.txt are needed next to Metashape.txt". - A pose file with a different header gives "Wrong Metashape.txt file format". - The photos are expected to be undistorted. - A shot is stitched only when all three photos (`.jpg`) are present. Otherwise it is skipped. - Each panorama stands at the position of camera 1. - If the image names are Unix seconds, they give the capture time. Otherwise the import warns "Image names are not Unix seconds, no capture time". - Thinning applies. Navigation links are set to "only forwards". - No notice is sent about missing panoramas. **CHCNAV RS10 with an Insta360 camera** - A single Metashape-format file (header `imageName X Y Z Omega Phi Kappa`) places ready-made `.jpg` panoramas. - Decimal commas in the numbers are accepted. - Capture time and thinning work as for the three-camera RS10. - Navigation links are set to "backwards and forwards". - Equirectangular panorama correction is enabled. **Share S20, S20 SE, S100, C1 PRO and Tersus MVP S1: `ImgPose.txt`** - The first line of `ImgPose.txt` must contain `index x y z roll pitch yaw qx qy qz qw timestamp`. Otherwise the import reports "Wrong file format". - Rows whose image name contains `left` or `right` give the pose of each camera. - Each left/right pair becomes one panorama: - It is placed at the left camera's position. - It is named with a five-digit number. - Thinning applies. Navigation links are set to "only forwards". **Share cameras** - The frames are named `left_00001.jpg` and `right_00001.jpg`. - The camera model is taken from the EXIF Model tag. S20 frames carry no EXIF. - The focal length comes from the first available source: 1. `Left.opt` / `Right.opt` next to `ImgPose.txt` (S20, C1 PRO), 2. the EXIF focal length and focal plane resolution (S100), 3. a default of 1480 px. - The platform tells frame types apart automatically: - Undistorted (rectilinear) exports are stitched as pinhole images with their poses as they are. - S20 SE raw fisheye frames use a built-in S20 SE lens profile with their poses as they are. - Other frames are treated as S20/S100/C1 PRO fisheyes with a generic small mounting correction. The rig's own camera alignment is off by a few degrees and differs per unit, so small seam misalignments can remain. - Which S20 SE export to choose: - Undistorted frames (e.g. 2944×1840) carry the unit's own lens calibration and match the point cloud most closely. The two cameras barely overlap, so a seam can show where their exposures differ, and about 90° behind the operator stays black. - Raw fisheye frames (1920×1200) cover more of the sphere (a black sector of about 45°) and blend smoothly, but without the unit's calibration one camera half can be off the point cloud by up to about 2°. - Choose the undistorted export when the panoramas must line up with the point cloud. - Point cloud fill: - When a colorized LAS or LAZ point cloud of the capture is next to `ImgPose.txt`, areas the two cameras do not cover are filled from it. - Only files that carry RGB colours are used. - Large clouds are thinned evenly to fit the available memory. - If the cloud cannot be read, the import reports "Point cloud for the panoramas cannot be read (…): what the cameras do not see stays black". - The capture time comes from the first available source: 1. EXIF GPS date and time (S100), 2. EXIF `DateTimeOriginal`, which Share writes in UTC and which is taken as UTC whatever camera time zone the upload states, 3. the `ImgPose.txt` timestamp as Unix seconds (S20). **Tersus MVP S1 cameras** - The frames are named by their timestamps. - Left and right frames are paired when their timestamps differ by at most 0.05 s. Left frames without a partner are skipped. - An optional `calibration.json` next to `ImgPose.txt` gives the fisheye intrinsics of the `left` and `right` cameras (model `OPENCV_FISHEYE`). - How frames are treated: - Frames whose size matches the calibrated size are treated as raw fisheye photos. - Frames of any other size are treated as the vendor's undistorted 90°×90° views. - Without `calibration.json`, all frames are treated as undistorted 90° views. - Problems with `calibration.json`: - A file without both `left` and `right` cameras is ignored. - An unparsable file is ignored with "calibration.json: cannot parse (…). Ignored". - The capture time comes from the `ImgPose.txt` timestamp (UTC). ### Thinning of continuous walks - Mobile mapping walks produce many closely spaced panoramas. Thinning applies to: - the RS10 imports, - `ImgPose.txt`, - Tersus `coordinates.txt` and `manifest.json`, - `pose.txt`, - Lixel `panoramicposes.csv` with timestamps, - odometry tracks. - A station is skipped when it is closer than the upload's minimum distance (metres) to the last kept station. - A station is also skipped when it is closer than the minimum time interval (seconds), if the format provides times. - The first station is always kept. - The plan's panorama limit caps the number of panoramas created. When it is reached, the import stops with the message "The maximum number of panoramas (N) has been exceeded; the remaining lines in will be ignored." ## Leica LGS and LGSX files ### Overview - The platform imports Leica project files with the extensions `.lgs` and `.lgsx`. These are projects published from Leica Cyclone software, such as Cyclone REGISTER 360 PLUS. - LGS and LGSX use the same project container format. - From both formats, the platform reads: - the setups (scan stations) - links between setups - sitemaps - capture times - geotags - the floor plans stored behind sitemaps - the RGB and intensity panoramas of each setup - The point cloud is read only from LGSX files. An LGS file yields no point cloud. - Processing progress is shown as a percentage in the project status. ### Setups - Each Leica setup becomes a panorama in the project. The setup's name in the Leica project is used as the panorama name. - Each setup's position and rotation are taken from the Leica project. - Setups that no sitemap places are not imported. This includes imported unstructured clouds that have no position. - All imported setups are enabled. - Links between setups in the Leica project become links between panoramas. Links work in both directions. - Sitemaps of the Leica project become sitemaps in the platform project, with their Leica names. Sitemaps deleted in the Leica project are skipped. - When setups are added to an existing project, an imported setup replaces an existing setup with the same Leica setup ID. An existing sitemap with the same Leica ID is reused instead of being created again. - The capture time stored in a setup's metadata becomes the panorama's creation date. Leica RTC360 setups store this time. ### BLK2GO projects - The platform detects projects from a Leica BLK2GO. - Their links work only forwards. - All their setups are placed on the first sitemap. ### Coordinate systems - When the Leica project contains an applied control, all setups are moved into that control's coordinate system. - Otherwise, each sitemap's active user coordinate system (UCS) is applied to the setups on that sitemap. - When a sitemap has no active coordinate system, the active coordinate system of the project's first workspace is used. - Geotags are moved with the setups they are visible from, so they stay in the same coordinate frame. - The point cloud uses one coordinate transformation. If several are found in the project, the first is used and the rest are ignored. ### Files without a project database - Cyclone REGISTER 360 PLUS can publish a project without its database and without the point cloud. - For such a file, the platform takes each setup's name, position and rotation from the project information stored in the file. The panoramas are still imported. - The following exist only in the database and are lost in this case: - links - capture times - sitemaps - geotags - user coordinate systems - Links and sitemaps are then created the same way as for any other set of panoramas. - If the file contains neither a database nor setup information, processing fails with the error "Missing database in LGS file". ### Panoramas - Each setup can yield two panoramas: - the RGB camera panorama - the scan intensity panorama - Both are imported when present. A setup can have either one or both. - Panorama faces larger than the platform's maximum tile size are downscaled. - The black circle at the bottom (nadir) of the RGB panorama is masked. - Automatic anonymization, when enabled for the upload, runs on the panorama faces. - The equirectangular panorama correction option has no effect for Leica files. - The number of panoramas imported is limited by the user's plan. Processing stops once the plan's panorama count is reached. - A setup that appears in the file but is not in the project is skipped, together with its panoramas. ### Floor plans on sitemaps - The image Leica stores behind each sitemap is placed on the project map for that sitemap. - The image is chosen in this order of preference: 1. A floor plan that was uploaded into the Leica project. 2. Leica's overview image, which is a clean render of the point cloud. 3. Leica's acceptance image, which is a render with setup markers and links drawn into it. - Only JPEG XR images are used. Other image types are ignored. - The floor plan is georeferenced from the corner coordinates stored in the image. It is converted into the project's coordinate system using the positions of the setups on that sitemap. - The plan is placed only when all of these conditions are met: - At least 3 setups of the sitemap can be matched. - The matching error is at most 0.5 m. - The image corners form a rectangle within a 1% tolerance. - If any condition fails, that sitemap gets no floor plan from the file. - The black frame Leica draws around the picture is cropped. - Stretched (non-square) pixels are corrected. - The plan is rotated to match the project orientation. The empty corners left by the rotation are transparent. - When two sitemaps name the same image, the image is placed on both and stored only once. - The original JPEG XR file is kept in the project assets. A WEBP copy is stored next to it, because browsers and common image viewers cannot open JPEG XR. - A Leica render (overview or acceptance image) is only a stopgap. A floor plan the platform creates from the point cloud replaces it. An uploaded floor plan takes priority over the plan created from the point cloud. ### Geotags - Geotags are notes left on a point of the scene in Leica Cyclone FIELD 360. A geotag has a name, sometimes a description, and usually a photo. - Each geotag becomes a comment on every panorama it is visible from in Cyclone. A geotag visible from four panoramas appears as four comments, each with its own copy of the photo. - If the file does not say which panoramas show a geotag, the geotag is placed on its reference setup. - Imported geotags are shown as blue squares. Comments written on the platform are shown as red markers. - The comment's direction in each panorama is computed from the geotag's 3D point. - The comment title is the geotag name. In the point cloud, the name appears on the annotation's title bar. - The comment text is set as follows: - It is the geotag's description, or its label if there is no description. - With no description, the text is empty when a photo is attached. The photo's file name already carries the name. - With neither a description nor a photo, the geotag name is used as the text. - The geotag photo is attached to the comment as a file named after the geotag. Only JPEG and PNG photos are attached. Other attachments are ignored. - The comment's creation time is the geotag's own creation time. It is shown in the reader's timezone. - Imported comments are not attributed to any user, the same as a comment left by a visitor. - Each comment also stores the geotag's 3D point in project coordinates. In the point cloud, the copies of one geotag are combined into a single annotation at that point. - The following geotags are skipped: - geotags deleted in Cyclone - geotags without a point - geotags that appear on no setup - Geotags stored in Leica's older geotag format are not imported. ### Point cloud (LGSX only) - Each point of an LGSX point cloud provides: - X, Y, Z coordinates, stored in millimetres from an offset and converted to metres - intensity - RGB colour - point source ID - normals, when Cyclone computed them for the project - classification, when the project is classified - Cyclone computes normals per scan. A point that Cyclone gave no normal has the value (128, 128, 128). - The classification value is an index into the Leica project's classification model. - The project's coordinate transformation is applied to the point cloud. - The platform creates a floor plan for the map from the point cloud. ### Structured and unstructured LGSX clouds - When the number of clouds in the file equals the number of setups, the cloud is split by station: - Each station's cloud is named after its setup. - Each point's point source ID is set to the setup's Leica ID. - The scanner position of the setup is used, so normals can be computed. - The setup's capture time is written to every point of that station as adjusted GPS time. - Otherwise, the cloud is treated as an unstructured point cloud: - It is processed in parts of at most 250,000,000 points each. - Small clouds are combined and large ones are cut. - A single part is named after the file. Multiple parts are named `-1`, `-2`, and so on. - When there is more than one part, only the merged point cloud is built, whatever the upload settings ask for. ### Plan limits for point clouds - On the free plan of the hosted service, a cloud is read up to 1,000,000,000 points. A cloud that exceeds the limit is reported, and only the allowed points are imported. - A single station's cloud or part is also limited by the processing capacity for one read. Points beyond that limit are reported and not imported. - The number of point clouds per project is limited by the plan. Once the limit is reached, further clouds are ignored with the message "The point cloud limit per project has been exceeded". ### Additional files in LGSX projects - Files attached to the Leica project are stored in the project assets. These include images (JPEG XR, TIFF, JPEG, PNG) and XML files. - File names are sanitized. - The file extension is set from the actual file content. - When names clash, the extra files get the suffixes "_2", "_3", and so on. - A JPEG XR file also gets a WEBP copy. - A file whose content is identical to one already in the project assets is not stored twice. This also applies when several LGSX files are uploaded together and share the same attached models. - CAD models attached to the Leica project, such as IFC or OBJ, are extracted. They are processed like uploaded CAD files and added to the project. ## Pricing, plans, tokens, and payments ### Pricing page - The pricing page is at `/pay`. Its browser title is "Subscribe" and its heading is "Pricing". - Signed-in users see an embedded Stripe pricing table. They can choose a plan and check out directly from it. Their account email is prefilled. - Visitors who are not signed in do not see the checkout table. They see the plan comparison, the message "Please sign up or log in to subscribe", and the buttons "Sign up" and "Log in". After signing up or logging in, they return to the pricing page. - The page also contains a promo code box, information about the standalone (self-hosted) version, and the payment terms. - The full Terms and Conditions of Use are at `/terms-of-service`. ### Plans - Every account is on a plan. A free plan is available, and it includes 3 projects. - Paid plans are subscriptions for surveyors and companies. - Prices are in euros. - Each plan has a billing period. The comparison table shows the price as "€X / month" for monthly plans and "€X / N months" for plans billed over several months. - Plan prices exclude VAT. Invoices can include VAT on top of the plan price. ### Plan comparison table The "Plan comparison" table lists the plans available to customers, cheapest first. It compares these rows: - **Storage space**: the storage quota in GB, or in TB for whole multiples of 1024 GB. "∞" means unlimited. - **Projects**: the maximum number of projects. "∞" means unlimited. - **Setups per project**: the maximum number of setups (panoramas) per project. "∞" means unlimited. - **Storage period**: how many days data is kept, followed by "then deleted". "∞" means data is kept without a time limit. - **Offline projects**: whether the plan includes offline projects. - **Street View publishing**: plans that include it show "€1/panorama", meaning publishing to Google Street View costs €1 per panorama. Other plans show "—". - **API access**: whether the plan allows use of the API. - **Support**: whether the plan includes support. - **Dedicated server**: whether the plan includes a dedicated server. A check mark means "Yes". A dash (—) means "No". ### Subscribing and managing a subscription - To subscribe, sign in and choose a plan in the pricing table on `/pay`. Payment is processed by Stripe. - The plan is activated as soon as the subscription invoice is issued. This also applies to SEPA Direct Debit, which can take several days to settle. - When your plan changes after a payment, you receive a "payment received" email. - If you pay with an email address that has no account on the platform, an account is created for that address. You receive an email with a link to set your password. - Signed-in users with a paid subscription billed through Stripe can open `/stripe`. This page takes them to the Stripe billing portal, with their email prefilled, where they can manage the subscription. Users without such a subscription are redirected to `/pay`. ### Renewal and cancellation - Subscriptions renew automatically at the end of each billing period. The pricing page says subscriptions renew automatically each month. - At renewal, the payment method given when subscribing is charged. - Your payment information is stored in your Stripe account. - Stripe sends an email before each automatic charge. The email states the upcoming renewal, the amount, the date, and other details. - You can cancel at any time without notice. - After cancellation, paid features stay available until the current billing period ends. - When the subscription ends, the account moves to the free plan. You receive an email saying that your subscription has expired. ### Tokens - Tokens are account credit. You can buy them in the "Tokens" section of your profile page (`/profile#tokens`). You must be signed in. - 1 token costs EUR 1.00 net. VAT charged on top is not added to your credit. For example, buying 10 tokens adds 10 to your token balance. - You can only buy whole numbers of tokens, from 1 to 10000 per purchase. - If you enter something other than a whole number, you see "Please enter a whole number of tokens." - If the number is outside the allowed range, you see "The number of tokens must be between 1 and 10000." - Token purchases are rate-limited. - After you submit the amount, you are sent to a Stripe checkout page to pay. The invoice reads "1 Token × N", where N is the number of tokens. - After checkout, you return to your profile. If you cancel the checkout, you also return to your profile and nothing is charged. - If the payment cannot be started, you see "Could not start the payment. Please try again." - Tokens are credited to your balance when the payment succeeds, not when checkout starts. Each paid purchase is credited exactly once. - A token purchase is a one-time payment. It does not change your plan. ### Promo codes - Enter a promo code in the "Have a promo code?" box on `/pay`: type it into "Enter promo code" and click "Apply". - Promo codes are available only to signed-in users on the free plan. For everyone else, the box is disabled and shows "Available only to signed-in users on the free plan." - Promo codes may be provided by partners. - A promo code can have an expiry date and a limited number of uses. A code can also be disabled. - After you apply a code, you are taken to the subscription section of your profile (`/profile#subscription`). A success or error message is shown there. - Promo code attempts are rate-limited. After too many attempts, you are asked to try again later. ### Standalone version (self-hosted) - A standalone version of the platform can be installed on your own server. It is intended for users who are particularly concerned about data security. - It is delivered as a Docker container. The container includes detailed installation and startup instructions. No complex installation is required. - To get an offer, click "Request a commercial proposal" in the standalone section of `/pay` (`/pay#standalone`). The form has these fields, all required: - "Company" - "Address" - "Contact name": prefilled with your name when you are signed in. - "Email": prefilled and not editable when you are signed in. - By submitting the form, you agree that your details may be processed and that you may be contacted by email about your request and the offer. A link to the privacy policy (`/privacy-policy`) is shown when the installation has one. - Submissions may be rejected as spam. - A commercial proposal can be paid online through a Stripe checkout. The licensed plan is granted only after the payment has cleared. If the checkout is abandoned, nothing is granted. - The plan's period starts at the time of payment and runs for the plan's billing period. - For more information, contact the sales department at sales@360-for-you.com. ### Payment methods You can pay through Stripe or by direct bank transfer (IBAN). - **Stripe** supports these methods: Visa, Mastercard, American Express, Discover, Diners Club, China UnionPay, Apple Pay, Google Pay, Link, PayPal, BLIK, Bancontact, EPS, giropay, iDEAL, Sofort, Klarna, and SEPA Direct Debit. - **How Stripe handles payments:** - Payment information is transmitted and stored only in encrypted form. - Paid services can be used as soon as payment is made. - Subscriptions are charged automatically according to the subscription terms. - You receive a confirmation for each transaction. - **Bank transfer (IBAN)**: contact the platform by email to pay this way. ### Invoices and records - Each Stripe payment produces an invoice with an invoice number. - Invoice amounts include VAT where it applies. - Payment and invoice records are kept for accounting even if the user account is later deleted. ## Project map settings: sitemaps, basemaps, placing a PDF on the map, and coordinates ### Access and pages - Only the project owner can use the map settings and the coordinates settings. - The map settings page is at `/projects//map`. Its title is "Project: ''. Sitemaps". - The page has these sections in order: "Map", "Map settings", "Sitemaps", "Assign setups to sitemaps", and the "Regenerate basemaps for all sitemaps" button. - The coordinates page is at `/projects//coordinates`. - Add `?sitemap=` to the map page URL to open it with a specific sitemap selected. The URL updates automatically when you pick another sitemap. - While the project is processing, both pages refresh automatically. ### Sitemaps (levels / floor plans) - A sitemap is a level or floor of the project. Each setup belongs to one sitemap. - Each sitemap has an id, a name, a colour, a setup count, and an optional basemap (floor plan image). - The "Sitemaps" table shows the note "You can edit all fields except 'id'. The virtual tour will be updated automatically." - The table columns are: - drag handle - id - Name: editable, with a header filter - Setups: the number of setups on the sitemap - Color: editable with a colour picker - Actions - A "Visible:" counter above the table shows how many rows are visible. - In the Name filter, `*` works as a wildcard and the whole name must match. Without `*`, any name that contains the text matches. Matching is case-insensitive. - Click a name to edit it. Names are sanitized. - Click the colour cell to open a colour picker. In Chromium-based browsers and Safari, the picker suggests the 10 palette colours. Firefox does not show the suggestions. - After a successful edit, the page reloads. If the edit fails, the message "Error. Check the values and try again." appears and the old value is restored. - Drag rows by the handle to change the order of sitemaps. Reordering resets the setup-to-sitemap split points to their defaults. #### Adding a sitemap - The "Add" button creates a new sitemap named "Level N", where N is the new sitemap's id. Ids increase by one. - New sitemaps get colours from a 10-colour palette in turn: - #84a98c (sage green) - #7ea8be (steel blue) - #c9a87c (warm sand) - #b07aa1 (muted purple) - #e8927c (soft coral) - #6ba39c (teal) - #d4a843 (golden) - #8c9bbe (lavender blue) - #cf8a9e (dusty rose) - #a3a86b (olive) - If a previous sitemap exists, the new sitemap starts as a copy of the previous sitemap's underlays: - Image underlays are duplicated for the new sitemap. The copies count toward the project size. - Tiled GeoTIFF layers are shared rather than copied. - Adding a sitemap resets the setup-to-sitemap split points. #### Row actions - **Point cloud**: shown only if the project has a point cloud. It opens the point cloud for that sitemap in a new tab (`pointcloud?sitemap=`). - **Download**: shown only if the sitemap has a basemap. It downloads the basemap as a WebP image. - **Regenerate basemap**: regenerates that sitemap's basemap in the background. It is not shown for sitemaps whose basemap comes from a point cloud. - **Regenerate links**: opens the "Regenerate links" dialog for that sitemap only. - **Delete**: deletes the sitemap after the confirmation "Are you sure you want to delete this?". Deleting resets the setup-to-sitemap split points. You are then returned to the map page. #### Regenerating basemaps - "Regenerate basemaps for all sitemaps" regenerates the basemaps of every sitemap in the background. - While regeneration runs, the project is in a processing state. During that time, visitors see a processing page, and the project is temporarily hidden from public listings and the API. - When regeneration finishes, the project size is recalculated. #### Regenerate links dialog - The dialog shows "Only the setups of this sitemap are relinked: ". Setups on other sitemaps keep their existing links. - Methods to choose from: - "Sequentially (forward only)" - "Sequentially (backward and forward)" - "Occlusion filter (high filter strength)", described as optimal for indoor use - "Occlusion filter (low filter strength)", described as optimal for outdoor use - "Occlusion filter v2", marked as an experimental feature - "Delaunay triangulation" - "All-to-all": shows the field "Create links to setups within a radius of:". The radius is a whole number, minimum 1, default 10. - "Delete all": removes the links and asks for confirmation first. - After you submit, the map page opens with that sitemap selected. ### Assigning setups to sitemaps by height - The "Assign setups to sitemaps" section appears only when both of these are true: - the project has more than one sitemap - the enabled setups are not all at the same height (Z) - A slider covers the range from the lowest to the highest Z of the enabled setups. - The slider handles split this range into one height band per sitemap. Each band is shown in its sitemap's colour. - The bands follow the sitemap order in the table. - Handle tooltips and scale labels show values with 2 decimals. - By default, the handles split the height range into equal parts. - Click "Set" to apply. Each enabled setup is assigned to the sitemap whose height band contains the setup's Z. The split points are saved. ### The map view - A drop-down at the top selects the active sitemap. - With more than one sitemap, a "Show current sitemap only" checkbox appears. It is checked by default. - When checked, only the setups of the selected sitemap and its basemap are shown. - When unchecked, setups of all sitemaps are shown and the basemap is hidden. - If there are no sitemaps, or there is nothing to draw (no enabled setups and no basemap), the map shows "Map not found". - The map area is 600 px high. It shows: - a grid with coordinate labels in project units - each enabled setup as a coloured circle, labelled with its id; hovering shows the setup name - short lines from each setup toward the setups it links to - Setup circles take their sitemap's colour. - If coloured links by height are enabled for the project, setups are instead coloured by height (Z) and a legend is shown. The legend checkboxes show or hide setups by height range. - Navigation: - Drag with the mouse to pan. - Use the mouse wheel to zoom. The step is the "Scale" percentage if that field is shown, otherwise 20%. - On touch screens, drag with one finger and pinch with two to zoom. - Controls: - "Font size" −/+: changes label size. The default is 12 and the minimum is 1. - "Reset": fits the map to the view and resets the font size. - "Show names" / "Hide names": replaces the id labels with setup names, or hides the labels. - "Edit mode": lets you drag and drop setups on the map. It shows the message "You can now drag and drop setups". - "Reset coordinates": asks "Are you sure you want to reset coordinates?". It then places all enabled setups on a simple grid: 10 setups per row, 1 unit apart, starting at X = 0, Y = 0, with Z set to 0. ### Map settings - "Show links" switch, on by default: shows or hides the link lines between setups on the map. The page reloads after the change. ### Basemap (map background) - Each sitemap can have its own basemap image under the setups. - The upload area reads: - "Basemap: Tap to select files, or drag and drop them here (JPG / PNG / PDF)" - "FARO SCENE users can use a TIF background and a TXT file with coordinates" - "Alpha channel supported" - Accepted extensions: `.jpg`, `.jpeg`, `.png`, `.webp`, `.tif`, `.txt`, `.pdf`. - Each file can be at most 100 MB. - Hidden files (names starting with ".") are rejected. - The upload is submitted automatically once all files have finished uploading. - The upload area appears only when the selected sitemap has no basemap. Otherwise the "Delete basemap" button appears. - Uploading a new basemap replaces the existing basemap of the selected sitemap. - Basemaps are stored as WebP images. - Images larger than the maximum stored size are scaled down automatically. - Images of more than 1 billion pixels are refused. - Basemap files count toward the project size. - The size of the current basemap is shown next to "Delete basemap", for example "(123.4 KB)". #### Upload types - **FARO SCENE TIF + TXT**: upload a `.tif` image together with a `.txt` coordinates file. The basemap is placed automatically from the TXT file: - The scale is read from line 5, as the second space-separated value. - The image size in pixels is read from line 8, after the colon, as `width x height`. - The top-left corner coordinates are read from line 10, inside the parentheses, as `(x, y`. - The basemap width and height in project units are the pixel size divided by the scale. - If the TXT file cannot be read, the message "Invalid TXT file. The file was ignored." appears. - If the image cannot be read, the message "Could not process the image. Please try a different file." appears. - **Single PDF**: the first page is rendered as a preview to position on the map. - The PDF is also added to the project's PDFs. - A notice appears: "PDF drawing uploaded. To position it precisely using its scale and the coordinates of a reference point, open it in the PDF viewer and use the "Place on map" tool. Alternatively, position it manually below." - The "Open in PDF viewer" button opens `/projects//pdf?filename=`. - If rendering fails, the message "Failed to convert PDF." appears. - **Images (JPG, JPEG, PNG, WebP, TIF, TIFF)**: you can upload a folder. The first image file in it is used and other files are ignored. - If no usable image is found, the message "Could not process the image. Please try a different file." appears. #### Manual positioning of an uploaded image or PDF page 1. The uploaded image appears as a preview at the top-left of the map. 2. Pan and zoom the map so the setups line up with the drawing. Use the "Scale" −/+ buttons, which use a percentage step (default 5, range 0–100), or the mouse wheel. 3. Rotate the preview with the "Rotate" ↶/↷ buttons. They use a degree step (default 5, range 0–90). 4. Click "Set map position". The basemap is saved for the selected sitemap at the shown position, size and rotation. - Areas outside a rotated image become transparent. - The preview is removed. #### Deleting a basemap - "Delete basemap" removes the basemap of the selected sitemap. It also removes any pending preview that has not been positioned yet. #### Source line for PDF-placed basemaps - If the basemap was created with the PDF viewer's "Place on map" tool, a line under the map shows ", page · Edit in PDF viewer". - The link opens `/projects//pdf?filename=`, with `&page=` added for pages after the first. ### Placing a PDF page on the map precisely ("Place on map" in the PDF viewer) - The project owner can position a PDF page as a sitemap basemap using the drawing's scale and the coordinates of a reference point. - What you provide: - the PDF file and page number (1 or higher) - the target sitemap: an existing sitemap, or a new one - an anchor point on the page - the anchor point's X and Y in the project coordinate system - an optional rotation: how far the drawing, as you see it, must be turned counter-clockwise to line up with the project axes - the drawing scale (calibration): PDF points per unit, in one of the supported units - Supported units: metres (m), centimetres (cm), millimetres (mm), feet (ft), US survey feet (ftUS), inches (in). The calibration must be positive. - You can rotate the PDF viewer's display in 90° steps. This view rotation is taken into account, because you judge the angle on the rotated view. - The page is converted into project units using the project's coordinate unit. If the project has no supported unit, metres are used. - Processing runs in the background and takes from a few seconds to about a minute. The PDF viewer checks progress and reports the result. - The project stays online during PDF placement. Published tours are not interrupted. - If you chose a new sitemap, it is created with the default name "Level N". - Any previous basemap of the target sitemap is replaced. - A pending manually positioned preview for the project is discarded. - When finished, the result links to `/projects//map?sitemap=`. - A rotation that is not a multiple of 90° leaves transparent corners around the page. - Very large rendered pages are scaled down to at most 60 million pixels. The placement on the map stays the same. - Possible errors: - "PDF not found" - "sitemap not found" - "failed to convert PDF" - "project not found" (if the project was deleted in the meantime) ### Sitemap underlay layers - A sitemap can show several underlay layers, drawn from bottom to top. There are two kinds: - **Image layers**: images placed by their position and size in project units. Image layers are added through basemap upload, PDF placement or Leica import. - **Tiled GeoTIFF layers**: one GeoTIFF layer can be shown on several sitemaps. - Removing an image layer from a sitemap deletes its file and frees project space. - Detaching a GeoTIFF layer from a sitemap keeps the layer in the project. ### Coordinates page - The page shows the note "You can edit all fields except 'id'. The virtual tour will be updated automatically." - Table columns: id, Name, PosX, PosY, PosZ, RotW, RotX, RotY, RotZ. - All columns except id are editable and have header filters. The Name filter supports the `*` wildcard. - With more than 20 setups, the table scrolls. - The X/Y display precision depends on the project's coordinate system. - If an edit fails, the message "Error. Check the values and try again." appears and the old value is restored. #### Rotate setups - **"Set the view direction for all setups (degrees):"** then "Set": sets the same absolute view direction, a rotation around the vertical axis, on all setups. - **"Rotate the view direction for all setups (degrees):"** then "Rotate": adds the given angle to each setup's current direction. - Both forms have the option "Apply to enabled setups only". - **"Use GPS coordinates to calculate rotation"** then "Calculate": points each setup toward the next setup in sequence. The first setup is pointed from itself to the second; every other setup uses the direction from the previous setup to itself. Afterwards, links are regenerated sequentially, backward and forward. - If the project has more than one sitemap, a selector lets you apply this to "All setups" or to one sitemap only. - At least 2 setups are needed, otherwise nothing changes. ### Project coordinate system - You can set a project coordinate system as an EPSG code, with or without an `EPSG:` prefix, or as a PROJ or WKT string. - For a compound coordinate system, the horizontal part is used. - If a PROJ or WKT string matches a known EPSG code, the EPSG code is stored. - If a string cannot be interpreted, the platform may try to identify the matching EPSG code automatically, where this assistance is available. - Invalid input shows "Invalid EPSG code: " or "Invalid PROJ/WKT string". - An empty value clears the coordinate system. - When a coordinate system is set, the project's coordinate unit is set automatically from its horizontal axis unit: metre, centimetre, millimetre, foot, US survey foot or inch. - For geographic coordinate systems (degrees) or other units, the coordinate unit is left unchanged. - The coordinate system is also written into the project's point cloud data. ## Project settings: basic settings, interface, preview, assets, source files and setups ### Access and navigation - Only project owners can open the project settings pages. You must be signed in. Project users and visitors cannot open them. - Every settings page has a toolbar with buttons that open the project's viewers in a new tab. A button appears only when the project has that content: - Tour: `/projects//` - Point cloud: `/projects//pointcloud` - IFC: `/projects//ifc` - 3DGS: `/projects//3dgs` - Map: `/projects//big-map` - PDF: `/projects//pdf` - 360° video: `/projects//video360` - The "Settings" dropdown lists these pages: - Basic settings (`/settings`) - Preview (`/thumbnail`) - Interface (`/interface`) - Sitemaps (`/map`) - Setups (`/setups`) - Coordinates (`/coordinates`) - Point clouds (`/clouds`) - CAD (`/cads`) - Vector layers (`/vectors`) - 3DGS (`/3dgs-settings`) - GeoTIFF & KML (`/geotiff-settings`) - PDF (`/pdf-settings`) - 360° video (`/video360-settings`) - Comments (`/comments`) - Assets (`/assets`) - Source files (`/source-files`) - Google Street View (`/streetview`), on installations where this integration is enabled. - Most menu items show a badge with the number of items, for example the number of setups, sitemaps, point clouds or comments. The GeoTIFF & KML badge counts GeoTIFF files, KML files and saved map measurements together. - While a project is processing, the settings pages show a spinner with the progress percentage. They also show the messages "Processing may take a long time" and "You will receive an email when processing is complete." The page refreshes automatically until processing finishes. ### Basic settings page (`/projects//settings`) #### Project summary The summary table shows these columns: - Date: the creation date. - Project: the title. - Setups: the number of enabled setups. - Mode: public, via link or private. - Size (MB) - Last used - Views Resetting the view counter: - A reset button sits next to the view counter. - The confirmation reads: 'Are you sure you want to reset views? The "Last used" date will be cleared as well.' - After the reset, the views go to 0 and "Last used" shows "-". #### Action buttons - **Add files to the project**: opens `/projects//add-files-to-the-project`. - **Edit project settings**: opens the "Edit project" dialog (see below). - **Download the offline version of the project**: opens the offline archive dialog (see below). - **Duplicate project**: asks "Are you sure you want to duplicate this project?" and then creates a copy. - **Delete project**: asks "Delete project? This action cannot be undone." - **Delete project files**: replaces "Delete project" when the project redirects to another project. It asks "Delete project files? This action cannot be undone." #### Duplicating a project - The copy is titled " (copy)". It gets its own new project link. - You become the only owner of the copy. Project users are not copied. User groups and tags are kept. The view counter of the copy starts at 0. - Sitemaps, setups and all project files are copied. Other project settings are copied as well. - Copying runs in the background. The message "Copying started." appears, and you are taken to `/projects/`. The copy shows its copying progress as a percentage. - Duplication is refused when your plan's storage is full. The message is "Sorry, there isn't enough storage available to copy the project. Need more storage?" with an "Upgrade your plan" link to `/pay`. - Duplication is also refused when you have reached the project limit of your plan. The message is "Sorry, you have reached the maximum number of projects allowed by your plan. Need more projects?" with an "Upgrade your plan" link. #### Edit project dialog - **Name**: the project title. It is required. - **Privacy mode**: public, via link or private. New projects are private by default. - **Tag**: "None" or one of the project tags of the project's first owner. The "Manage tags" link opens `/projecttags`. - **Links to other projects**: project codes, separated by spaces. - **Redirect to another project**: a single project code. - **Start view**: the part of a viewer link after the last slash, for example `3dgs?x=1&y=2&z=3`. - You can save it from a viewer with the bookmark button, or paste it here. - It applies only when that same viewer is opened without any query parameters. - Leave the field empty to always open the default view. - An unsupported start view is rejected. - **EPSG code or PROJ4 string**: the project's coordinate system. - **Coordinate unit**: "The unit in which the project's source coordinates are stored". The default is meters. - **Sites where iframe embedding is allowed**: by default, embedding is allowed on any site. - **Commenters**: who may comment on the project. The options are: - "Any visitor (file uploads not allowed) — not recommended" - "Any user signed in to the website" - "Project users and project owners". This is the default. - "Only project owners" - "No one". This disables comments. - Click "Save changes" to apply the changes. #### Owners - The Owners section lists each owner's name and email. - When a project has more than one owner, each owner can be removed with the trash button. - **Add new owner** works only after you confirm your email address. Otherwise the dialog says "This feature is available only after you confirm your email address." - Enter the person's email. - "Notify by email" is checked by default. - When notification is on, you can add an optional "Message to the recipient" of up to 1000 characters. It is included in the invitation email. - The invited person receives an email invitation with the project name, your name and your email address. This happens whether or not they have an account. #### Users and groups - The section lists the user groups attached to the project. A group you do not manage shows "(managed by )". - For groups you manage, you can edit the group (`/usergroups/`) or detach it. - Project users are listed with a trash button to remove them. - **Add new user** has the same email verification requirement as adding an owner. It uses the same invitation email, the same "Notify by email" option and the same optional message of up to 1000 characters. - When the project has links to other projects, the option "Also apply to all linked projects" appears. It is checked by default. - **Add user groups**, inside the same dialog: - Tick or untick your groups to attach them to or detach them from the project. - A notification confirms "Group added" or "Group removed". - If you have no groups, the dialog says "You don't have any groups yet." - "Manage groups" opens `/usergroups`. #### Offline version of the project - The whole project, with all its data and the viewers, is packaged into a single ZIP archive. You can use it without an internet connection. - The archive includes a small local web server in three forms: - a ready-to-use program for Windows - a ready-to-use program for macOS - a Python script - When you start the server, the project opens in your browser at a local address and works as it does online. A README.txt file inside the archive has step-by-step instructions. - Building the archive takes a while. You receive an email with the link when it is ready, and the link also appears at the bottom of the Basic settings page. - The link requires no password. Anyone who has access to the project can download the archive. - **Permanent link** option: - Without it, the archive is deleted automatically 24 hours after it is created. - With it, the archive is kept until you delete it or delete the project. - In both cases, the archive counts toward the project size and your storage usage. - Once the archive exists, the page shows: - the download link and file size - the creation date and time - whether the link is permanent - a delete button, which asks "Delete the offline version of the project and its link?" - Where available, the help link "How to open and self-host the archive" points to the FAQ. #### Format-specific notices - **LGS projects**: point cloud import is available only for the LGSX format. You can convert LGS files to LGSX with the free Leica LGS Converter Tool. - **Insta360 tutorial**: a tutorial video link is shown for JPG projects in which all setups have no position. - **JPG projects**: JPG files do not contain the north direction. There are two ways to correct it: 1. Use the "Use GPS coordinates to calculate rotation" button on the Coordinates tab. This works if the images contain GPS coordinates, the camera always faced the direction of travel, and the capture positions are close together. 2. Set north manually. For each setup, rotate the view to face north and click "Set North". - **RMX projects**: RMX files contain incorrect north information. Set north manually with "Set North", or use a CSV file instead. #### Log - Owners see the error messages of the project's processing log, one line per error. - Times are shown in your timezone. The timezone name appears next to the "Log" heading. - Errors are shown in red and warnings in orange. - The "clear" button removes the current errors from the log view. #### Links to the project - This section appears when processing is complete and the project has viewable content. - In private mode, the section says the project is private. A "Switch to "via link" mode" button changes the privacy mode in one click. - Otherwise, each available viewer has its own entry: Tour, Point cloud, IFC, 3DGS, Map (`/projects//geotiff`), PDF and 360° video. Each entry has: - the link, with a copy button - a QR code button, which opens `/projects//qr/` - ready-made embed code: `` - If the project's first owner has a personal subdomain, the links and embed code use that subdomain address. #### Feedback - On installations with the contact form enabled, the page has a "Do you have any feedback on this project?" form with a "Send" button. ### Interface page (`/projects//interface`) #### Welcome overlay - Enter welcome text or safe HTML, then click "Set". - Plain links in the text are turned into clickable links. - HTML is sanitized. #### Virtual tour switches Each switch is saved immediately when you change it. If saving fails, the switch returns to its previous state and "Error!" is shown. The default state of each switch is in brackets: | Switch | Default | |---|---| | Left sidebar | on | | Title | on | | Display mode button | on | | Autorotate button | off | | Fullscreen button | on | | Map button | on | | VR button | on | | Date comparison button | on | | Device orientation button | on | | Share button | on | | Comment button | on | | Spheres button | on | | Point cloud buttons | on | | Show comment author | on | | Standard-quality panoramas in the virtual tour | on | | Show intensity panoramas | on | | Show north arrow on the floor | off | - If "Standard-quality panoramas in the virtual tour" is disabled, preview quality is used. - If "Show intensity panoramas" is disabled, only color panoramas are shown in the virtual tour. #### Point cloud switch - "Panoramas in the point cloud" is on by default. #### Applying settings to other projects - **Apply these settings to all my projects**: copies the current switch states to every project you own. - **Set as default for new projects**: saves the current switch states as your defaults for future projects. - Both actions show "Done!" when they succeed. #### Hiding interface elements in a single embed - The interface elements of the tour can also be switched off for a single embedded link with the `?ui=` or `?noUI=1` URL parameters. These elements are the sidebar, title, buttons, welcome overlay and logo. - These parameters do not change panorama quality or content settings. #### Settings saved from the viewers - The panorama sphere size is limited to values from 0.05 to 20. Values outside this range are set to the nearest limit. - Owners can save measurements and drawings on the project map, up to 500 items. - Polylines (length) and areas are measured and drawn on every map. - Lines, arrows, rectangles, circles and freehand drawings appear only on the standalone map (`/projects//big-map`). - Each item can have its own color. ### Preview page (`/projects//thumbnail`) - The page shows the current project thumbnail. This is the cover image used in project lists. - **Recreate**: generates the thumbnail again automatically. It runs in the background, and the project shows processing status until it finishes. - **Change thumbnail**: upload your own image, then click "Send". - Accepted file types: `.jpg`, `.jpeg`, `.png`, `.webp`. Other types are refused with "Only JPG and PNG files are allowed." - Transparent areas become white. - Plain white borders are cropped. - The image is scaled to fit 512 × 210 pixels, centered on a white background, and saved as JPEG. - Images up to 25 megapixels are accepted. Large JPEG images, such as big panoramas, are also accepted because they are read at reduced resolution. - If the image cannot be processed, the error is "Failed to process the uploaded image." - You can also set any setup's panorama preview as the project thumbnail from the Setups table. For intensity panoramas, the intensity preview is used. - The thumbnail counts toward the project size. ### Assets page (`/projects//assets`) - The page lists the files attached to the project's upload, with their sizes. For example, an LGSX file brings its attachments along. - Each file opens at `/projects//assets/`. - If there are none, the page shows "No assets found." ### Source files page (`/projects//source-files`) - The page lists the saved source archives, newest first. Each upload has its own archive. - Projects saved before September 2026 have a single archive that holds every upload. Some older archives are in 7z format. - Each archive shows: - "Uploaded": the upload date and time, in your timezone. - **Download ZIP (size)**: downloads the archive from `/projects//source-files/download/`. - **Delete source files**: deletes that archive and frees its storage. - **Create a new project from source files**: opens the upload page pre-filled with this archive's download link. - "ZIP file contents": a tree of the files inside the archive. - If there are none, the page shows "No source files found." - The project list shows the total size of a project's source files. ### Setups page (`/projects//setups`) A setup is one panorama or scan position in the virtual tour. #### Setups table - You can edit all fields except "id". The virtual tour updates automatically. - The table shows up to 20 rows at a time and scrolls for more. - Rows without a panorama are highlighted in red. The table has these columns: - **Drag handle**: drag rows to change the order of setups. - **Thumbnail**: click it to set this setup's panorama as the project thumbnail. - **Enabled**: a tick or cross. The column filter can show all, enabled only or disabled only setups. Disabled setups are hidden from the tour. - **id**: the setup number. It cannot be edited. Hover over the id to see the setup's capture time, or its import time if no capture time is known. - **Date**: shown as DD.MM.YYYY. - Editing changes only the calendar date, interpreted in your timezone. The time of day is kept. - **Name**: editable. - The filter is case-insensitive and matches any part of the name. - `*` works as a wildcard. When you use it, the whole name must match the pattern. - **Type**: RGB, intensity or RGB+intensity. The column can be filtered by type. - **Links**: the ids of the setups this setup links to in the tour, separated by commas. - **Sitemap**: chosen from the project's sitemaps. - **Actions**: - **Open**: opens the tour at this setup (`/projects//?scene=`). - **Download**: downloads the panorama as an equirectangular JPEG. A menu offers RGB or Intensity when both exist. - **Delete**: asks "Are you sure you want to delete this setup? Only the panorama will be deleted. The point cloud must be deleted separately." #### Selecting and batch editing - "Select visible" selects all rows that pass the current filters. "Deselect visible" deselects them. - The page shows the number of selected rows and the number of visible rows. - When rows are selected, changing Enabled, Date or Sitemap in one row applies the same value to all selected rows and to the edited row. - If a change is rejected, the message "Error. Check the values and try again." appears and the old value is restored. #### Sorting - **Sort by ID**: orders setups by ascending id. - **Sort by name**: natural order, so "Station 2" comes before "Station 10". - **Sort by time**: orders setups by capture time. - Setups with equal names or times keep their current relative order. - The order matters for sequential link generation and for the plan panorama limit. - "Add files to the project" is also available on this page. #### Enable or disable setups - **Enable all**: enables every disabled setup. - **Disable within a radius**: the field reads "Keep one setup every X meters along the trajectory, and hide any others that are too close:". Enter X and click "Disable". - The platform walks along the enabled setups in table order. - Setups that are closer than X (3D distance) to the last kept setup are disabled. - Afterwards, links are regenerated sequentially, backward and forward. - **Delete all disabled setups**: deletes all disabled setups and their panoramas, and frees storage. #### Regenerate links Choose a method: - **Sequentially (forward only)**: each setup links to the next one in table order. - **Sequentially (backward and forward)**: each setup links to the previous and the next one. - **Occlusion filter (high filter strength)**: optimal for indoor use. - **Occlusion filter (low filter strength)**: optimal for outdoor use. - **Occlusion filter v2**: an experimental feature. - It uses the project's merged point cloud. - It runs in the background, and the project shows processing status until it finishes. - **Delaunay triangulation**: links neighboring setups based on their X/Y positions. - A single setup gets no links. Two setups are linked to each other. - A group whose setups all lie on one line cannot be triangulated and is left unchanged. - **All-to-all**: links every setup to all other setups within a radius. - The radius field, "Create links to setups within a radius of:", appears when you choose this method. - The default radius is 10, and the minimum is 1. - **Delete all**: removes all links. It asks "Are you sure you want to delete this?" Choose a scope: - **All setups**: one group for the whole project. - **All setups within each sitemap**: each sitemap is processed separately, with no links between sitemaps. Setups that belong to no sitemap are left unchanged. Only enabled setups are considered when links are generated. A single sitemap can also be relinked from the sitemaps table on the Sitemaps page (`/map`). #### Blur people and vehicles This section appears on installations that offer anonymization. - The engine is "On-premises". It is free of charge. - Choose what to blur: - People's faces (including partial faces) - Entire person (full body) - License plates - Entire vehicles - All four options are on by default. - Clicking "Start" asks: "This action cannot be undone. Original panoramas will be overwritten." ### North orientation of setups - **Set North**: in the tour, rotate the view of a setup to face north and click "Set North". The setup's rotation is updated. - Existing comment markers on that panorama turn with it, so they keep pointing at the same spot. - Points of comments created on this platform are recalculated. Points of imported notes are not changed. - **Finding north using the sun**: the platform locates the sun in the panorama and compares it with the computed sun position at the capture time. - If it succeeds, the result shows the sun's azimuth and elevation in degrees and the capture time in UTC. The resulting rotation is applied through the same Set North flow. - It requires a project coordinate system (EPSG) and the panorama placed on the map. Otherwise the message is: "Finding north using the sun requires a project coordinate system and this panorama to be placed on the map. Set the coordinate system (EPSG) and place the panorama first." - It requires a capture date and time. Otherwise the message is: "This panorama has no capture date and time." - If the sun was below the horizon at the capture time: "The sun is below the horizon at the capture time, so it cannot be used to find north. Check the capture date and time." - If no sun is found, for example because of an overcast sky or an indoor capture: "Could not find the sun in this panorama. The sky may be overcast, or the panorama may have been captured indoors; this requires the sun to be clearly visible in the sky." - If the bright spot's height differs from the computed sun height by more than 25°: "The brightest spot does not match the sun's computed height, so the capture time is probably wrong or the bright spot is not the sun." - On the map, owners can drag a setup to a new position. This updates its X and Y coordinates. - On the Coordinates tab, positions (X, Y, Z) and rotations can be edited as numbers. - X and Y are shown with the precision of the project's coordinate system. - Other values are shown with 3 decimals. ### Setups and uploads - When you add image files to an existing project, files whose names match existing setups enable those setups. - A file also matches if its name is a setup's name followed by `_`, `-` or `.` and more text. - Files that match no setup are ignored. The log shows " not in setups. File ignored". - If several setups could match one file, the log shows a warning. - If an uploaded setup has the same file name as an existing setup, the log records whether the existing coordinates were overwritten. - If the number of enabled setups exceeds the panorama limit of the owner's plan, the setups beyond the limit, in table order, are disabled. Their panoramas are not processed. ### SQLite Viewer - The platform includes a SQLite file viewer (`/service/sqlite-viewer/`, for signed-in users). - In a file tree of the project, such as the "ZIP file contents" of a source archive, `.sqlite` files open in it directly. - You can also drop a SQLite file onto the page or click to choose one. The file is read in your browser and is not uploaded. - You can: - pick a table - run SQL queries - page through the results - The "Export" menu offers "All tables to CSV", "Selected table to CSV" and "Query table to CSV". ## Project management: project list, cards/table view, project tags, public projects ### Accessing the project list - Signed-in users who open the site root `/` are redirected to their project list. - The project list requires sign-in. - The project list has two layouts: **Cards** at `/my-cards` and **Table** at `/my-projects`. - The **Cards** and **Table** buttons in the top-right corner switch between the layouts. - The platform remembers the last layout you opened and uses it as your default. ### Creating a new project from the list - The list shows a **Create a new project** link that opens the upload page. In the Cards view it is a dashed card. In the Table view it is a button. - This link appears only if your plan includes storage space. If your plan has no storage space, the link is hidden. - If your plan has no storage space and you have no projects, the page shows "You don't have any projects yet." ### Privacy icons Each project shows an icon for its privacy mode. The public REST API uses the codes in brackets (`privacy_mode`): - Globe icon: public (0). - Link icon: accessible via link (1). - Lock icon: private (2). New projects are private by default. ### Cards view - Projects without tags appear first, in a grid. - Tagged projects appear below in collapsible sections, one section per top-level tag. Sections are sorted alphabetically by tag path. - Sub-tags appear as nested, indented sections inside their parent tag's section. - A sub-tag section appears only if it contains projects or further sub-tags. - A project with several tags appears in the section of each of its tags. - The **collapse all** and **expand all** links open or close all tag sections at once. They appear only when at least one of your projects is tagged. - If any project is still processing, the Cards page refreshes automatically at regular intervals. Each card shows: - **Preview image.** It links to the project, which opens in a new tab. - **While processing:** a spinner instead of the preview. Once processing has started, it also shows the progress as a percentage. - **Pin badge** (top-right of the image). It appears when the project has a coordinate system (an EPSG code or a Proj4 definition). - **View counter** (eye icon). - **Privacy icon and project title.** The title links to the project and opens in a new tab. - **Gear icon.** It links to the project settings at `/projects//settings`. It appears only for projects you own. - **Creation date** in the format DD.MM.YYYY. - **Number of enabled setups** (camera positions), if any. - **Viewer badges.** Each badge opens the matching viewer in a new tab: - **Tour** (virtual tour): `/projects//`. Shown when the project has enabled setups. - **Cloud** (point cloud): `/projects//pointcloud`. - **IFC** (Industry Foundation Classes model): `/projects//ifc`. - **3DGS** (3D Gaussian Splatting): `/projects//3dgs`. - **Map**: `/projects//geotiff`. Shown when the project has a GeoTIFF or KML. - **PDF**: `/projects//pdf`. - **360°** (360° video): `/projects//video360`. ### Table view The table has these columns: - **#**: the row number. - **Date**: the creation date (DD.MM.YYYY). You can sort by date. - **Project**: the privacy icon and the project title. The title links to the project and opens in a new tab. - A point cloud icon linking to `/projects//pointcloud`. It appears if the project has a point cloud. - A gear icon linking to the project settings. It appears only for projects you own. - **Setups**: the number of enabled setups. The footer shows the total. - **Size (MB)**: the project size, rounded to 0.1 MB. It includes offline download archives of the project. The footer shows the total. - **Source size (MB)**: the size of the saved source archives. This column appears only if at least one project has saved source files. The footer shows the total. - **Last used**: the date the project was last used (DD.MM.YYYY). If it has never been used, the creation date is shown. You can sort by this date. - **Views**: the view counter. The footer shows the total. Filtering and display: - Most columns have a filter field in the header. - The **Project** filter is case-insensitive and matches any part of the title. - In the **Project** filter, `*` works as a wildcard. When a `*` is used, the pattern must match the whole title. For example, `site*` matches titles that start with "site". - A **Visible:** indicator above the table shows figures for the currently visible rows. - Rows of projects that are not yet ready (still queued or processing) have a light red background. - With more than 20 projects, the table shows about 20 rows at a time and scrolls. - With no projects, the table shows "You don't have any projects yet." Grouping by tags: - The **Group by tags** checkbox appears only if at least one project has a tag. It is enabled by default. - When grouping is on, projects are grouped by the full path of their first tag, for example "Parent / Child". Groups start collapsed. - Projects without tags are grouped under **Untagged**. - A project with several tags appears in the table only under its first tag. - The **collapse all** and **expand all** links are shown while grouping is on. - The browser remembers whether grouping is turned on or off. Linking projects together: 1. Click rows in the table to select the projects you want to link. 2. Click **Link selected projects together**. 3. The platform shows "Done" on success, or "Error. Check the values and try again." on failure. If no rows are selected, the button does nothing. ### Project tags - Project tags organize projects into a hierarchy, like folders. You manage them at `/projecttags` on the **Project tags** page. - Tags are personal. Each user has their own tags, and only the owner can view, edit or delete them. - A tag's full path joins its parent tags with " / ", for example "Client A / Building 1 / Floor 2". Tag lists and parent choices are sorted by full path. The tag list: - Tags are shown as a tree of top-level tags with nested sub-tags. - Each tag shows the number of projects it is assigned to, in parentheses. - Each tag has a gear icon that opens its edit page at `/projecttags/`, and a trash icon that deletes it. - If you have no tags, the page shows "No tags have been created yet". Creating a tag: 1. Under **Create a new tag**, enter a **Title**. The title is required. 2. Optionally choose a **Parent**. The options are **None** for a top-level tag, or one of your existing tags, shown by full path. 3. Click **Create**. Editing a tag: 1. On the **Edit tag** page, change the **Title** and/or the **Parent**. 2. Click **Save**. Rules and restrictions: - A parent must be one of your own tags. You cannot nest a tag under another user's tag. - A tag cannot be its own parent or the parent of any of its sub-tags. Trying this shows the error "A tag cannot be its own parent or the parent of any of its descendants." - Deleting a tag also deletes all of its nested sub-tags. The projects themselves are not deleted. They only lose those tags. ### Public projects page - The page at `/public-projects` lists, as cards, projects whose owners have chosen to make them publicly accessible. - Listed projects can include virtual tours, point clouds, BIM models (RVT, IFC), 3D Gaussian splats and 360° videos, all viewable in the browser. - The page states that the website's developers are not responsible for information posted by users. - The cards show the same information as in the Cards view: preview, privacy icon, title, creation date, setups, views and viewer badges. - On a user's custom subdomain, `/public-projects` shows only that user's public projects. It also shows that user's custom logo and logo link. - This page may not be available on every installation. ## Public REST API v1, API keys, file upload API, and sensor data over MQTT ### Overview - The platform offers a public REST API, version 1. - The base URL is `https:///api/v1`, for example `https://360-for-you.com/api/v1`. - Every request authenticates with an API key sent as a Bearer token: `Authorization: Bearer sk_…`. - API keys start with `sk_`. You create them on your profile page at `/profile#api-keys`. - Responses are JSON. Errors look like `{"error": ""}`, and the HTTP status code carries the meaning. Some errors add extra fields such as `detail`, `limit`, `received`, `extension`, `allowed` or `required`. - Any HTTP client in any language can use the API. - An interactive reference is available at `/api/v1/docs/`. It lets you try every endpoint live and shows all project options. - A machine-readable OpenAPI spec is available at `/api/v1/apispec.json`. You can feed it to a code generator such as openapi-generator to scaffold a typed client. - A developer guide titled "File Upload API" describes the upload flow. It includes curl examples and a downloadable example script. ### Plan and account requirements - API access depends on your plan. If your plan does not allow the API, API requests fail with HTTP 403 `tariff_does_not_allow_api`. - On such a plan, the profile page shows "This feature is not available on your plan." when you try to create a key. - You need a verified email address to create an API key. - If the platform requires email confirmation, creating a project or adding files through the API also needs a confirmed email. Otherwise the request fails with HTTP 403 `email_not_verified`. - Upload sessions require a plan that includes storage space. Otherwise the request fails with HTTP 403 `tariff_forbids_upload`. - If your storage quota is used up, uploads and project creation fail with HTTP 402 `storage_quota_exceeded`. - If you have reached your plan's project limit, creating a new project fails with HTTP 403 `project_limit_reached`. Adding files to an existing project does not use a new project slot. - The option to save source files is available on paid plans only. ### API keys - Manage your keys on your profile page in the API keys section (`/profile#api-keys`). - When you create a key, you can give it a label of up to 100 characters. - You must select at least one scope. Otherwise the page shows "Select at least one scope for the API key." - After you create a key, the full key is shown once, with the message "API key created. Copy it now — it will not be shown again." Store it securely, for example in an environment variable rather than in code. - The platform records when each key was last used. - You can revoke a key at any time. The page confirms with "API key revoked." - A revoked key is rejected with HTTP 401 `invalid_api_key`. - If the revoked key had the `mqtt:publish` scope, the page also shows a warning: "Note: Existing MQTT connections that used this key will remain active until they disconnect or reconnect. The key is rechecked only when a new connection is established." The available scopes are: | Scope | Description | |---|---| | `projects:read` | List and read your projects via the v1 API | | `projects:write` | Create projects via the v1 API. Also required for all upload endpoints. | | `mqtt:publish` | Send MQTT messages from sensors (see "Sensor data over MQTT" below) | - The default scope set includes all three scopes. - For the file upload flow, a key needs `projects:write` to upload files and create projects. It needs `projects:read` to poll project status. ### Authentication errors | HTTP status | Error code | Meaning | |---|---|---| | 401 | `missing_bearer_token` | No `Authorization: Bearer …` header, or the header is empty | | 401 | `invalid_api_key` | The key is unknown or revoked | | 403 | `tariff_does_not_allow_api` | Your plan does not include API access | | 403 | `insufficient_scope` | The key lacks a required scope. The response includes a `required` list. | ### Rate limits When a limit is exceeded, the API returns HTTP 429. Back off and retry. | Endpoint | Limit | |---|---| | `GET /api/v1/projects` | 60 per minute | | `GET /api/v1/projects/{name}` | 60 per minute | | `POST /api/v1/projects` | 10 per hour | | `POST /api/v1/uploads` | 10 per hour | | `PUT /api/v1/uploads/{upload_id}/{filename}` | 1200 per minute | | `GET /api/v1/uploads/{upload_id}/{filename}` | 600 per minute | | `GET /api/v1/uploads/{upload_id}` | 120 per minute | | `DELETE /api/v1/uploads/{upload_id}` | 60 per minute | ### Project status values - `0` means queued. - `1` to `99` means processing. - `100` means ready. - While a project is not ready, the API returns only `{"name": …, "status": …}`. `name` is the project's URL slug. - Once `status` is `100`, the API returns the full project record. The record includes fields such as `title` and `privacy_mode`. - Date and time values in the full record are in ISO 8601 format. ### List your projects `GET /api/v1/projects` (scope `projects:read`) - Returns `{"projects": [...]}` with every non-deleted project you own. - Each item is minimal (`name`, `status`) while the project is processing. It becomes the full record once the project is ready. ### Get one project `GET /api/v1/projects/{name}` (scope `projects:read`) - `{name}` is the project's URL slug. - Returns the project summary: minimal while processing, full record once `status == 100`. - Returns HTTP 404 `project_not_found` if the project does not exist or was deleted. - Returns HTTP 403 `not_your_project` if you are not an owner of the project. ### Create a project `POST /api/v1/projects` (scope `projects:write`) **Request body** - The request body must be a JSON object. Otherwise the request fails with HTTP 400 `body_must_be_json_object`. - Provide exactly one source of files: - `upload_id`: the ID of an upload session whose files have all finished uploading. - `download_link`: a remote link to import files from. Supported links are direct download links, Google Drive, Dropbox, Yandex.Disk, WeTransfer and NavVis Ivion. Download links are used over HTTPS. - Example body: `{ "upload_id": "Bx0xyTjt", "title": "My project", "privacy_mode": 2 }`. - All files in the upload session must be complete before you create the project. **Response** - Success is HTTP 201 with the project summary plus `"message": "processing_started"`, for example `{"name": "Bx0xyTjt", "status": 0, "message": "processing_started"}`. - `name` is the project's URL slug and is authoritative. - When you create the project from an upload session, the slug is normally the `upload_id`. It may differ in rare cases. - The project opens at `/projects/`. - Processing settings sent through the API are not saved as your default upload settings. **Errors** | HTTP status | Error code | Cause | |---|---|---| | 400 | `upload_id_or_download_link_required` | Neither source was given | | 400 | `provide_either_upload_id_or_download_link` | Both sources were given | | 400 | `invalid_upload_id` | The `upload_id` is malformed | | 400 | `invalid_download_link` | The download link is invalid | | 400 | `invalid_input` | A parameter has a wrong value or type. Includes `detail`. | | 400 | `project_creation_failed` | Creation failed, for example because a file is not fully uploaded yet. Includes `detail`. | | 402 | `storage_quota_exceeded` | Your storage quota is used up | | 403 | `email_not_verified` | Email confirmation is required and pending | | 403 | `project_limit_reached` | Your plan's project limit is reached | | 404 | `upload_session_not_found` | No upload session with that `upload_id` exists | | 429 | — | Rate limit exceeded | ### Project creation options All options are optional. Many of them can also be changed later in Project settings. **General** | Option | Type and default | Description | |---|---|---| | `title` | string | Any characters are allowed, including emojis. Leave it blank to auto-generate a title from the filename or date. Can be changed later in Project settings. | | `privacy_mode` | integer, default `2` | `0` = public: anyone can access, and the project may appear in Public projects. `1` = via link: anyone with the link, including guests. `2` = private: only the owner and invited project users. Can be changed later. | | `projecttag` | integer or null | ID of an existing project tag to attach. Tags organize projects into folders and support a multi-level hierarchy. Can be changed later. | | `add_setups` | string | URL slug of an existing project you own. Files are added to that project instead of creating a new one. This is equivalent to the web flow at `/projects//add-files-to-the-project`. | | `autostart` | boolean, default `true` | Start processing immediately after the files or links are uploaded. | | `save_source` | boolean, default `false` | Save source files. Uploaded files are stored with the project and can be downloaded at any time. Paid plans only. | | `coordinate_system` | string, for example `EPSG:25832` | An EPSG code, a PROJ string or a WKT string. Required to link coordinates to the project's real position on the map. | | `new_levels` | integer, default `1` | Number of floors scanned, for multi-storey buildings. The platform creates the corresponding number of levels and assigns stations automatically based on elevation. Can be reconfigured later. | **Photo capture time** | Option | Type and default | Description | |---|---|---| | `camera_clock_is_local` | boolean, default `true` | Capture times are stored in UTC, but photos record the time without a timezone. On: the camera clock showed local time and is converted using `camera_timezone`. Off: the camera clock was already set to UTC, so the recorded time is used as-is. | | `camera_timezone` | string, for example `Europe/Berlin` | The IANA timezone the camera clock was set to. Used when `camera_clock_is_local` is true. Defaults to your profile timezone, and falls back to UTC when neither is set. | **Panoramas** | Option | Type and default | Description | |---|---|---| | `autocontrast` | boolean, default `true` | Auto-contrast panorama images. | | `correct_equirectangular_panorama` | boolean, default `true` | Apply orientation correction. The panorama is reoriented using the provided quaternion to remove tilt and align it with the global axes. | | `do_not_use_photos` | boolean, default `false` | Do not use embedded panoramic photos. Synthesize panoramas from the point cloud instead. | | `pano_max_tile_size` | integer, `2048`, `3072` or `4096`, default `2048` | Panorama quality as the cube face size in pixels. This is one third of the equirectangular width. `2048` = 19 megapixels (6144×3072, recommended). `3072` = 42 megapixels (9216×4608). `4096` = 76 megapixels (12288×6144). Panoramas are never upscaled, so a higher value only helps when the source images are large enough. A higher value also makes processing slower and uses more disk space. | | `pano2to1type` | integer, `0` or `1`, default `0` | How panoramas are adjusted to a 2:1 aspect ratio. `0` = enlarge canvas. `1` = stretch image. | | `canvas_size_factor` | number, default `1.0` | Canvas size factor for synthesized panoramas. If the generated panoramas have many empty pixels, try reducing it to `0.5`. | | `min_time_delta` | number, default `1.0` seconds | Minimum time interval between JPG panoramas from mobile laser scanners. Panoramas captured more frequently are ignored. | | `min_distance` | number, default `2.0` meters | Minimum distance between JPG panoramas from mobile laser scanners. Panoramas captured closer together are ignored. | **Anonymization (blurring in panoramas)** | Option | Type and default | Description | |---|---|---| | `detect_objects_engine` | string, `""` or `"anonymizer"`, default `""` | Engine for blurring people and vehicles in panoramas. `""` = off. `anonymizer` = on-premise blurring, free of charge. | | `detect_faces` | boolean, default `true` | Blur faces, including partial faces. | | `detect_people` | boolean, default `true` | Blur whole people (full body). | | `detect_plates` | boolean, default `true` | Blur license plates. | | `detect_vehicles` | boolean, default `true` | Blur whole vehicles: car, truck, bus, motorcycle and bicycle. | **Point clouds** | Option | Type and default | Description | |---|---|---| | `process_structured_pc` | boolean, default `true` | Process each point cloud separately. Applies to LGSX, RCP, RCS, E57, LAS, LAZ, PTX, PLY, PTS and XYZ. | | `process_merged_pc` | boolean, default `true` | Process the merged point cloud for the whole scene. | | `e57_ignore_invalid_state` | boolean, default `true` | For E57 files, load points marked as InvalidState. | | `decimate` | integer, default `1` | Simple thinning that keeps every N-th point. Allowed values are `1`, `2`, `4`, `8`, `16`, `32`, `64`, `128`, `256` and `512`. `1` means no thinning. | **Revit files** | Option | Type and default | Description | |---|---|---| | `rvt_converter` | string, default `"datadrivenconstruction"` | Converter for Autodesk Revit (`.rvt`) files. `datadrivenconstruction` is free of charge. The Autodesk Model Derivative API costs 0.01 tokens per MB. | | `rvt_extended` | boolean, default `false` | For the `datadrivenconstruction` converter, use extended mode. Extended mode rebuilds the IFC geometry as solids. It is slower, produces larger files, and may distort the model. | **360 video** | Option | Type and default | Description | |---|---|---| | `video_1080p` | boolean, default `false` | Generate a 1080p rendition (2160×1080, about 6 Mbps). Only generated if the source resolution allows. | | `video_2k` | boolean, default `false` | Generate a 2K rendition (2880×1440, about 10 Mbps). Only generated if the source resolution allows. | | `video_4k` | boolean, default `true` | Generate a 4K rendition (4320×2160, about 18 Mbps). Only generated if the source resolution allows. | | `video_5_7k` | boolean, default `false` | Generate a 5.7K rendition (5760×2880, about 30 Mbps). Not supported by iPhone. Only generated if the source resolution allows. | | `video_codec` | string, default `"h264"` | Video codec used for 360 video renditions. | | `video_preset` | string, default `"fast"` | Encoder preset that trades encoding speed against compression efficiency. `veryfast`: about 4× faster, about 25% larger files. `faster`: about 2× faster, about 15% larger. `fast`: about 1.5× faster, about 5% larger. `medium`: the reference point for the other presets. `slow`: about 1.5× slower, about 5% smaller. | ### File upload flow You can upload one large file or many files over plain HTTP, then create one project from them. 1. `POST /api/v1/uploads` creates an upload session and returns an `upload_id`. 2. `PUT /api/v1/uploads/{upload_id}/{filename}` uploads each file, either whole or in chunks. Repeat this for every file. All files share one session. 3. `GET /api/v1/uploads/{upload_id}` is optional. Use it to verify that all files are complete. 4. `POST /api/v1/projects` with `{"upload_id": "…"}` creates one project from the session. 5. `GET /api/v1/projects/{name}` lets you poll until `status == 100` (ready). - A single file is step 2 done once. Many files means repeating step 2 into the same `upload_id`. - You may also upload one archive (`.zip`, `.7z` or `.rar`). The platform unpacks it. ### Upload endpoints All upload endpoints require the `projects:write` scope. **Create an upload session: `POST /api/v1/uploads`** - Send no request body. - Success is HTTP 201, for example `{"upload_id": "Bx0xyTjt", "expires_in_seconds": 259200}`. - Treat `upload_id` as an opaque token. - Abandoned sessions are deleted after `expires_in_seconds`, which is about 72 hours. - Errors: HTTP 402 `storage_quota_exceeded`, HTTP 403 `tariff_forbids_upload`. **Upload a file or a chunk: `PUT /api/v1/uploads/{upload_id}/{filename}`** The request body is the raw bytes. Headers: | Header | Required | Value | |---|---|---| | `Authorization` | yes | `Bearer sk_…` | | `Content-Type` | yes | `application/octet-stream` | | `Content-Range` | for chunks only | `bytes -/` | - **Whole file in one request:** - Omit `Content-Range`. - Send the full body with a correct `Content-Length`. Without `Content-Length`, the request fails with HTTP 411 `length_required`. - This mode works for files up to 32 MB. Larger requests are rejected with HTTP 413. - **Chunked upload:** - Send `Content-Range: bytes -/`, for example `bytes 0-20971519/104857600`. - `end` is inclusive. `total` is the full file size. - The body length must equal `end - start + 1`. - Each chunk can be up to 32 MB. Success is HTTP 200: `{"received": , "total": , "complete": }`. - `received` is the number of bytes the platform now holds. It is the point to resume from. - `complete` becomes `true` when `received == total`. The file is finalized at that moment. Errors: | HTTP status | Error code | Notes | |---|---|---| | 400 | `invalid_upload_id` | | | 400 | `invalid_filename` | | | 400 | `invalid_content_range` | The header is malformed, the range is inconsistent, or `Content-Length` does not match the byte range | | 400 | `chunk_length_mismatch` | | | 404 | `upload_session_not_found` | | | 409 | `non_contiguous_chunk` | There is a gap before this offset. Includes `received`; resume from there. | | 411 | `length_required` | A single-request upload was sent without `Content-Length` | | 413 | `file_too_large`, `session_too_large` | Includes `limit` | | 415 | `extension_not_allowed` | Includes `extension` and the full `allowed` list | **Check one file's progress: `GET /api/v1/uploads/{upload_id}/{filename}`** - Returns `{"received": , "total": , "complete": }`. Use it to resume. - Returns HTTP 404 `file_not_found` or `upload_session_not_found`. **List the session's files: `GET /api/v1/uploads/{upload_id}`** - Returns `{"upload_id": "…", "files": [{"name": "…", "received": …, "total": …, "complete": …}]}`. - Returns HTTP 404 `upload_session_not_found`. **Discard a session: `DELETE /api/v1/uploads/{upload_id}`** - Discards the session and everything in it. - The call is idempotent. It returns `{"deleted": true}` even if the session is already gone. ### Chunking and resume rules - Chunks must be contiguous and in order. Each chunk's `start` equals the previous `received`. A gap is rejected with HTTP 409 and the current `received`. - Re-sending a chunk is safe. Overlapping bytes are overwritten in place. - Re-uploading a file that is already complete returns `complete: true` unchanged. - Send only one `PUT` at a time per file. To go faster, upload different files in parallel. Never upload parallel chunks of the same file. - To resume after any failure, `GET` the file status, then continue uploading from `received`. This pattern is recommended for desktop apps on unstable networks. - Retrying after a network error or a 5xx response is safe. - Stop and fix the request on other 4xx errors, such as 413 or 415. - Any chunk size up to 32 MB works. The examples use 8 MiB. ### Filenames, file types and size limits - Filenames are flattened. Path separators and unsafe characters are removed, and the file extension is lowercased. - Nested folders are not supported. Send a flat name, or upload an archive to keep a folder tree. - Do not send two files with the same name into one session. The second one is ignored. - The allowed extensions are configured on the platform. They include images, point clouds, CAD/BIM formats including `.ifc`, Gaussian splats, 360 video and archives. A disallowed file returns HTTP 415 with the full `allowed` list. - Size caps per file and per session are configured on the platform. Exceeding a cap returns HTTP 413 with the `limit` value. ### Example clients **curl: one big file, chunked and resumable** ``` KEY=sk_...; BASE=https://360-for-you.com/api/v1 ID=$(curl -s -X POST $BASE/uploads -H "Authorization: Bearer $KEY" | jq -r .upload_id) curl -X PUT "$BASE/uploads/$ID/scan.e57" -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/octet-stream" \ -H "Content-Range: bytes 0-104857599/524288000" --data-binary @scan.e57.part0 # resume after a drop: GET .../scan.e57 -> {"received": N}, continue from N curl -X POST $BASE/projects -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d "{\"title\":\"Big scan\",\"upload_id\":\"$ID\"}" ``` - Repeat the `PUT` for each slice of the file, advancing the range each time. **curl: many small files into one project** ``` ID=$(curl -s -X POST $BASE/uploads -H "Authorization: Bearer $KEY" | jq -r .upload_id) for f in *.jpg; do curl -X PUT "$BASE/uploads/$ID/$f" -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/octet-stream" --data-binary @"$f" done curl -X POST $BASE/projects -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d "{\"title\":\"Photoset\",\"upload_id\":\"$ID\"}" ``` - Each `PUT` here has no `Content-Range`, so each file is uploaded whole. **Downloadable example script** - The guide offers a downloadable Python script, `upload_ifc_via_api.py`. - It uploads one or many files into one session and creates a single project. It resumes interrupted uploads per file. - It reads its settings from environment variables: | Variable | Purpose | |---|---| | `API_KEY` | Required. Your API key. | | `API_BASE` | Default `https://360-for-you.com/api/v1`. | | `API_UPLOAD_ID` | Reuse an existing session to continue a previous run. | | `CHUNK_BYTES` | Chunk size. Default 8 MiB. | | `PROJECT_TITLE` | Project title. Auto-generated if unset. | | `MAX_RETRIES` | Retries per request after network errors or 5xx responses. Default 6. | - The script retries with exponential backoff of up to 30 seconds between attempts. - It refuses to run if two input files share the same name. - It checks that all files are complete before creating the project. - It then polls the project status every 5 seconds for up to 10 minutes. ### Sensor data over MQTT Sensors and IoT devices can publish live data to the platform's MQTT broker. The connection works like this: - **Endpoints:** - MQTT over TLS: `mqtts://:8883`. - Browser or WebSocket clients: `wss:///mqtt/`. - **Username:** your numeric user ID. The connection is rejected if the username does not match the key's owner. - **Password:** an API key with the `mqtt:publish` scope. The key must not be revoked, and your plan must allow API access. - **Where to find these values:** the `mqtt:publish` scope description on the profile page shows the host, your user ID, and the topic to use. Topics: - Publish under `users//sensors/`. Optional subtopics are allowed, for example `users//sensors//temperature`. - `sensor_id` is 1 to 64 characters long. It may contain letters, digits, underscore (`_`) and hyphen (`-`). - You can publish only to your own `users//sensors/...` branch. - With the same credentials, you can subscribe to and read your own branch, including MQTT wildcards such as `users//sensors/#`. Viewing sensors in projects: - Sensors can be embedded in projects. - Viewers of a project can receive live data from the sensors embedded in it, as long as they can access the project: - Public and via-link projects: anyone who can open the project. - Private projects: only owners, project users and members of groups with access. - If a project is made private, viewers who no longer have access stop receiving its sensor data shortly afterwards. - Viewers can subscribe only to specific sensor topics, not to wildcards. Revoked keys and MQTT: - The key is checked when a connection is established. - After you revoke a key, existing MQTT connections that used it stay active until they disconnect or reconnect. ## Point clouds in Autodesk Revit with the Qbitec plugin ### Overview - The page is at `/qbitec`. - Qbitec is a plugin for Autodesk Revit. Starting with version 1.8, it streams point clouds from the web directly into Revit. - Qbitec supports the platform's project links natively. You publish a scan on the platform, paste one link into Revit, and model with the full dataset. You do not download any files. - Qbitec is a product of Qbitec eGbR. Revit is a trademark of Autodesk, Inc. - The platform is independent of Qbitec. The integration uses only open formats and public links. ### How streaming works - The platform stores point clouds in the open Entwine Point Tile (EPT) format. EPT is a cloud-optimized format that splits a point cloud into an octree of small tiles. - The platform's browser point cloud viewer uses the same tiles. Qbitec reads the same data, so no second copy or proprietary bridge is needed. - Revit requests only the tiles the current view needs, at the level of detail that view needs. - A scan can be tens of gigabytes in size. It stays on the server, and the plugin pulls only the visible tiles. This lets laptops on site open datasets that would not fit on their disks. - The project link never changes. If you re-upload or extend the project, everyone gets the updated data in Revit, in the browser and on the construction site. - A streamed cloud behaves like a local one in Qbitec. You can use the same insert modes, X-ray view, cropping and quality checks. The data never touches your drive. ### Quick start 1. **Publish your scan on the platform.** Upload E57, RCP, RCS, LGSX, LAS, LAZ, PLY, PTS, PTX or XYZ files. The platform automatically converts them into the streamable format. 2. **Enable access via link.** In the project settings, set privacy to "public" or "via link". Qbitec streams over plain HTTPS without signing in or access tokens, so private projects cannot be streamed. 3. **Copy the point cloud link.** The link is the address of the project's point cloud viewer, in the form `/projects//pointcloud`. 4. **Paste it into Qbitec in Revit.** On the Qbitec ribbon, choose **Insert Point Cloud → Public URL**. Paste the link and pick an insert mode. The plugin finds the point cloud behind the link and starts streaming. If you already host point clouds on the platform, every hosted point cloud is ready to stream. This applies, for example, to Scan2BIM companies. Start at step 2. ### Requirements - Qbitec 1.8 or newer. Qbitec offers a free 14-day trial at https://qbitec.com/Trial. You can get the plugin at https://qbitec.com/. - Autodesk Revit 2022 or newer. - A project on the platform that contains a point cloud. The free plan is enough to start. - Project privacy set to "public" or "via link". - No exports, converters or extra servers are needed. - Self-hosted installations of the platform also work. Streaming works with any project that is publicly reachable. ## QGIS Plugin (360ForYou Uploader) ### Overview - The page `/qgis-plugin` describes the official QGIS plugin for the platform. - The plugin is named "360ForYou Uploader". - It uploads data from the current QGIS project to the platform and creates a viewer project that you can share by link. - It also works with self-hosted installations, because the server URL is configurable. - It handles three layer types: raster, vector and point cloud. You can also attach other files from disk. - Anyone with the project link can explore the project in a web browser. Viewers do not need GIS software. - The plugin is free and open source under the GPL-2.0-or-later license. - It needs no external dependencies. - The plugin is an independent, free add-on. QGIS and the QGIS logo are trademarks of the QGIS.org Association. - Current version: 1.0.1. It is a stable release and no longer marked experimental. ### Where to get it - QGIS plugin repository: https://plugins.qgis.org/plugins/uploader_360foryou/ - Source code: https://github.com/swell-d/qgis-360foryou-uploader - Issue tracker: https://github.com/swell-d/qgis-360foryou-uploader/issues - Support email: support@360-for-you.com ### Requirements - QGIS 3.40 or newer, up to QGIS 4.x. Both Qt5 and Qt6 builds of QGIS are supported. - An account on the platform with API access. - An API key with the scopes `projects:read` and `projects:write`. - Create the key under **Profile → API keys** (`/profile#api-keys`). - The default scopes of a new key are exactly what the plugin needs. ### Quick start 1. **Install the plugin.** In QGIS, open **Plugins → Manage and Install Plugins**, search for "360ForYou Uploader" and press **Install**. 2. **Create an API key** on your profile page under **Profile → API keys**. 3. **Connect.** Click the 360ForYou button on the QGIS toolbar, or use **Plugins → 360ForYou Uploader**. Paste the key and press **Test connection**. On self-hosted installations, enter your server address first. 4. **Pick layers and upload.** Tick the layers to publish and add files from disk if needed. Choose a title and a privacy level, then press **Upload**. 5. **Share the link.** When processing finishes, a notification lets you open the new project in your browser. ### What gets uploaded | QGIS layer / input | Sent to the platform as | |---|---| | Raster layer | GeoTIFF | | Vector layer | KML in EPSG:4326, with styling exported on a best-effort basis | | Point cloud layer | Its original LAS/LAZ source file, unchanged | | Additional files from disk | Any file type the platform accepts | ### Raster layers - **Sent unchanged:** a local 3- or 4-band 8-bit (RGB or RGBA) GeoTIFF (`.tif` / `.tiff`), when the layer's CRS matches the file's CRS. The "Will upload as" column shows "Source GeoTIFF uploaded as-is". - **Rendered export:** all other rasters are exported as a rendered RGBA GeoTIFF, exactly as they look in QGIS. - The export uses the layer's full native resolution. - Hillshades, styled DEMs and color ramps therefore arrive looking right. - The column shows "Rendered RGBA GeoTIFF export". - Rasters larger than 50 megapixels show an extra note such as "(~N Mpx — may take a while)". - **Cannot be uploaded:** - Rasters without a valid CRS. The reason shown is "Layer has no CRS — set one in Layer Properties, otherwise the server skips the GeoTIFF". - Web or remote raster layers, such as WMS, XYZ, ArcGIS MapServer, WCS and vector tile layers. - Rasters with an unknown size or without a data provider. ### Vector layers - Vector layers are exported to KML and reprojected to EPSG:4326. Styling is exported per feature on a best-effort basis. - KML is the one vector format that the platform shows in both places: - on the 2D project map, and - as 3D lines in the point cloud viewer. - **Cannot be uploaded:** - Tables without geometry - Layers without a valid CRS - Layers with no features ### Point cloud layers - Only local LAS or LAZ files are supported. This includes COPC point clouds stored as local `.laz` files. - The original files are uploaded unchanged. They are streamed in the built-in point cloud viewer without decimation. - EPT, VPC and remote point clouds cannot be uploaded. ### Additional files from disk - Use **Add files...** to attach any file type the platform accepts. Examples: - IFC BIM models - E57 laser scans - 360° panoramas, including DNG and INSP camera files - meshes - DXF, Shapefile, GeoPackage and GeoJSON drawings - DXF, Shapefile, GeoPackage and GeoJSON files added this way appear only as 3D lines in the point cloud viewer. They do not appear on the 2D project map. - When you pick the `.shp` file of a Shapefile, the plugin also adds its `.shx`, `.dbf`, `.prj` and `.cpg` sidecar files. A lone `.shp` cannot be read. - The file picker offers two filters: "Supported files" and "All files". - Files of unsupported types are skipped. A warning lists them: "These files were skipped — the server does not accept their type:". - The same file is not added twice. - Use **Remove** to take selected files off the list. - If a listed file no longer exists when you press Upload, it is skipped and reported as "File not found". - File names are converted to unique ASCII names in the project. - The plugin updates its list of accepted file types from the platform after an upload. ### The upload dialog The dialog is titled "Upload to 360ForYou". **Layers to upload** - The layer list is grouped into "Raster layers", "Vector layers" and "Point clouds". - It has two columns: "Layer" and "Will upload as". - Layers that are visible in the QGIS layer tree are checked by default. - Layers that cannot be uploaded are listed but greyed out. Their tooltip explains why. - Unsupported layer types, such as mesh and annotation layers, are not listed. **Additional files from disk** - A list of attached files, with the **Add files...** and **Remove** buttons. **Project section** - **Title:** - Defaults to the QGIS project name. - If the QGIS project has no name, it defaults to "QGIS upload" followed by the current date and time. - An empty title falls back to this default. - **Privacy:** - "Private (only you and invited users)" - "Via link (anyone with the link)" - "Public" - The last choice is remembered. These correspond to API `privacy_mode` values 2, 1 and 0. **Advanced section** (collapsed by default) - **Coordinate system:** optional. Accepts an EPSG code, PROJ or WKT. - The platform uses it to position point clouds that carry no CRS themselves. - It is prefilled with the EPSG code of the first uploadable point cloud layer that has one. **Server section** - **Server URL:** needed only for self-hosted installations. The default is the platform's main hosted service. - The URL must use HTTPS. Plain HTTP is accepted only for localhost development servers. - Other URL schemes are rejected. - **API key:** masked by default. Tick **Show** to reveal it. - **Get an API key...** opens `/profile#api-keys` in the browser. - **Test connection** verifies the server URL and the key. - On success it shows "Connected — the key works." and saves both values. - The Server section is collapsed when a key is already saved. **Buttons:** **Upload** and **Cancel**. ### Uploading - Pressing **Upload** without a server URL or key shows: "Enter the server URL and an API key (see "Get an API key...")." - Pressing it with nothing selected shows: "Nothing selected — check at least one layer or add a file." - The server URL, API key and privacy choice are saved when you upload. - The upload runs as a background task in the QGIS task manager: - QGIS stays responsive. - Progress is shown live in the task manager in the bottom bar. - The upload can be canceled. - Uploads are chunked and resumable. After a dropped connection, the transfer picks up where it left off. - The plugin respects the proxy and SSL settings configured in QGIS. - Transport is HTTPS only, so data is encrypted in transit. ### After the upload - **On success:** the QGIS message bar shows "Project "" created — processing started." with an **Open project** button. - **While processing:** the plugin periodically checks the processing status. - When the project is ready (API status 100), it shows "Project "<title>" is ready." with **Open project**. - If the project is still not ready after about 15 minutes, it shows "Project "<title>" is still processing — check it later." with **Open project**. - **If canceled:** "Upload canceled." - **If it fails:** an error message is shown. Long messages have a **Details** button with the full text. - The project page is at `/projects/<name>`. ### Using platform data back in QGIS - A project's GeoTIFF layers are also published as a WMTS service and as XYZ tiles. - You can add them to QGIS next to your own data. See the FAQ entries "Connect via WMTS" and "Connect via XYZ". ### Building your own integration - The plugin uses the platform's public REST API. Your own code can do everything the plugin does. - See the API guide. ### Version history highlights - **1.0.1:** - Accepts DXF, Shapefile, GeoPackage and GeoJSON drawings, plus DNG and INSP camera files. - Adding a `.shp` file also adds its sidecar files. - **1.0.0:** first stable release. - **0.1.1:** the server URL must use HTTPS. Plain HTTP is allowed only for localhost development servers. - **0.1.0:** initial release with these features: - Raster (GeoTIFF), vector (KML) and point cloud (LAS/LAZ) uploads - Files from disk - Resumable chunked uploads - Project creation and status tracking ## Publishing 360 virtual tours to Google Street View ### Overview - The platform can publish a project's 360° panoramas to Google Street View on Google Maps. - Publishing uses the user's own Google account. Published panoramas appear on that account's Google Maps profile. - Visitors can find the panoramas on Google Maps and move between them along the blue navigation line. - A step-by-step guide is available at `/faq/streetview-guide`. It is linked from the project's Street View page and from the Google Street View card as "How publishing to Street View works". - On some installations, Street View publishing is not set up. Trying to connect a Google account then shows the message "Street View publishing is not configured." ### Requirements - **Plan:** the user's plan must include Street View publishing. - Without it, the project's Street View page shows "This feature is not available on your plan." - The "Connect Google account" button is also disabled. - **Role:** only the project owner can open a project's Street View page and publish or remove its panoramas. - **Google account:** a Google account is needed. It only has to be connected once. - **Coordinate system:** the project must have a coordinate system that gives real-world GPS coordinates. - Tours shot on a phone qualify. - Projects with a coordinate system set on the Coordinates page also qualify. - Without one, the page shows: "This project has no coordinate system (no GPS), so its panoramas cannot be placed on Google Maps. Set a coordinate system on the Coordinates page first." - **Panoramas:** the project must have at least one enabled panorama. ### Connecting a Google account - Each user can connect one Google account. - The connection belongs to the user and works for all of that user's projects. - You can connect from two places: - the Google Street View card on the Profile page - the project's Street View page - Steps: 1. Click **Connect Google account**. 2. Approve access on the Google consent screen. 3. You return to the page you started from. The message "Google Street View account connected." appears. - Once connected, the card shows "Connected as" followed by the Google account's email address. - If Google does not grant offline access, the platform shows: "Google did not grant offline access. Remove this app at myaccount.google.com/permissions and connect again." - If the connection fails for another reason, the platform shows: "Something went wrong. Please try again or contact technical support." - If the Google account's access is later revoked, the account counts as not connected. You must connect it again before you can publish or remove panoramas. - Connecting and disconnecting are rate-limited. ### Disconnecting a Google account - Click **Disconnect** on the Google Street View card and confirm. - The confirmation text reads: "Disconnect this Google account? Panoramas you've already published will remain on your Google Maps profile." - Disconnecting does not remove panoramas that are already published. - After disconnecting, the message "Google Street View account disconnected." appears. ### The project's Street View page - Open the project, then go to **Settings → Street View**. The URL path is `/projects/<url>/streetview`. - The Settings menu shows this page to every project owner. The plan check happens on the page itself. - The page shows the Google Street View connect card and a link titled "Read the Street View publishing guide". - If the Google account is not connected, the page shows: "Connect your Google account above to publish this tour to Google Street View." - When all requirements are met, the page shows a table of the project's enabled panoramas with these columns: - a selection checkbox - **id** - **Name** - **Latitude** - **Longitude** - **Status** - **Link** - Latitude and longitude are calculated from the project's coordinate system. They are shown with 6 decimal places. A dash (—) appears when they cannot be determined. - All panoramas are selected by default. The header checkbox (**Select all**) selects or clears every row. - When a panorama is published, the **Link** column shows an icon titled "Open on Google Maps". It opens the panorama on Google Maps. ### Publishing statuses - **Not published**: the panorama has not been sent to Street View. - **Pending**: the panorama is waiting to be processed. - **Created**: the photo has been uploaded to Street View, but its navigation connections have not been added yet. - **Published**: the photo is uploaded and its connections are synced. - **Failed**: the upload failed. Hover over the badge to see the error message. ### How to publish 1. Select the panoramas you want to publish, or leave them all selected. 2. Click **Publish selected**. - If no panorama is selected, all enabled panoramas are published. 3. Publishing runs in the background. The message "Publishing to Street View has started. This can take a while; refresh to see progress." appears. Refresh the page to see each panorama's status. How the background process works: - It first uploads every selected panorama. - It then creates the navigation connections between them. - It skips panoramas that are already Created or Published. - It retries panoramas that previously Failed. - Progress and errors are recorded in the project log. - Publishing is rate-limited. ### Tokens - On installations with token billing, publishing deducts 1 token per panorama from the user's balance. The Street View page states this. - A panorama is charged only once, when it is successfully uploaded. - Failed uploads are not charged. - Panoramas that are already published are not charged again when you publish again. - If your balance is below 1 token when you click **Publish selected**, publishing does not start. The message reads: "You do not have enough tokens to publish. Each panorama costs 1 token." - If the balance runs out during publishing, the process publishes as many panoramas as it can and then pauses. Top up your balance and click **Publish selected** again to continue. ### Navigation line (connections) - The blue navigation line on Google Maps is built from the links between panoramas in the project. - A panorama is connected only to linked panoramas that are also uploaded to Street View. - A panorama with no uploaded linked neighbours is marked Published without connections. - If creating the connections fails, the panoramas stay in the Created status. Click **Publish selected** again to retry the connections. - Google may adjust, reposition or recreate photos and connections to keep the tour realistic. ### How the platform prepares the images - The platform prepares each panorama automatically. You do not need to export anything. - Each panorama is generated from the processed panorama, not from the originally uploaded file. - The orientation correction from the platform's viewer is applied to the image. - Each image is a full 360° sphere with a 2:1 aspect ratio and valid Photo Sphere metadata. Google uses this metadata, not the image pixels, to recognize a photo as 360°. - Google's limits are 75 MB and 100 megapixels per image. - Images are generated at up to 12288 × 6144 pixels. - If a file would exceed 75 MB, the platform first compresses it more strongly. - If it is still too large, the platform reduces the resolution until it fits. - Each panorama's position is sent to Google as latitude and longitude derived from the project's coordinate system. - The capture time sent to Google is the panorama's capture time, or its upload time when the source files do not record one. ### Removing panoramas from Street View 1. Select the panoramas on the project's Street View page. - If no panorama is selected, all of the project's Street View panoramas are removed. 2. Click **Remove from Street View**. 3. Confirm the prompt "Remove the selected panoramas from Google Street View?" What happens next: - The message "Removal from Street View has started." appears. - Removal runs in the background. - It deletes the photos from Google Street View and resets their status to Not published. - Removal requires a connected Google account. Without one, nothing is removed. - Removal is rate-limited. ### Google's publishing rules Google reviews uploaded panoramas. Panoramas that do not meet Street View's technical and content requirements may be rejected. Technical requirements: - A full 360° sphere with a 2:1 aspect ratio and Photo Sphere metadata. The platform handles this automatically. - A maximum of 75 MB and 100 megapixels per image. - Real GPS coordinates. Without a position, a panorama cannot be placed on the map. Content requirements: - Publish only your own photography. Third-party or copyrighted imagery is not allowed. - Photos must look realistic. Heavy editing, collages and visible stitching artefacts are not allowed. - Advertising, logos, watermarks, borders and added text are not allowed. - Respect privacy. Google automatically blurs faces and license plates, but do not rely on this when deciding what to upload. - Do not upload private, offensive or illegal content. - Content must genuinely represent the real-world location where it is placed. Positioning: - Accurate coordinates keep panoramas in the right spot on the map. ### Good to know - Street View photos are public on Google Maps. Publish only tours you want to be publicly discoverable. - The first time you publish, Google may ask you to accept the Street View contributor terms in the Google Maps app. - After publishing, Google reviews and processes the panoramas before they appear on the map. This often takes days and can take weeks. The blue dots and the navigation line also appear only after this processing. - Google emails you when a panorama goes live. Google does not report review progress back to the platform. - Google limits how many photos can be uploaded per day. Very large projects are therefore published in batches over several days. Click **Publish selected** again the next day to continue where the process left off. ## Supported file formats and processing ### Overview - The platform visualizes and lets users collaborate on virtual tours, point clouds, meshes, 3D Gaussian Splatting (3DGS), BIM models, 360° video, PDF and GeoTIFF. - Files are uploaded when a project is created. The platform converts them into virtual tour panoramas, a point cloud, meshes, BIM models, map overlays or PDF documents, depending on the file type. - A single upload can contain several file types, for example panoramas together with a position file and a point cloud. - Some formats depend on optional conversion services. These are marked "where available" below and may be missing on some installations. ### Accepted file extensions **Panoramas and images:** - `jpg`, `jpeg`, `png`, `insp`, `dng`, `tif`, `tiff`, `exr` **Position and metadata files:** - `db`, `txt`, `csv`, `json`, `out`, `dat`, `opt`, `rmx` **Point clouds and scans:** - `e57`, `las`, `laz`, `pts`, `ptx`, `xyz`, `ply`, `lgs`, `lgsx` **Autodesk ReCap (where available):** - `rcp`, `rcs`, `diff`, `llt`, `rcc`, `thumbnail`, plus the accompanying `png` and `txt` files **3D Gaussian Splatting:** - `ply`, `spz`, `splat`, `ksplat`, `sog`, `rad` **360° video:** - `mp4`, with an optional `gpx` track **Map overlays:** - `kml`, `kmz` **Vector drawings and GIS layers:** - `dxf`, `shp`, `gpkg`, `geojson` - Shapefile companion files: `shx`, `dbf`, `prj`, `cpg` **Documents:** - `pdf` **Archives:** - `zip`, `7z`, `rar` **Meshes and CAD/BIM:** - `ifc`, `glb`, `stl`, `obj`, `mtl`, `frag` - `rvt` (where Revit conversion is available) - Where Autodesk conversion is available: `asm`, `f3d`, `fbx`, `iam`, `ipt`, `neu`, `prt`, `sldasm`, `sldprt`, `smb`, `smt`, `step`, `stp`, `stpz`, `wire`, `x_b`, `x_t` ### Archives - You can upload files inside `zip`, `7z` or `rar` archives. - When an archive is unpacked, its contents are flattened into one folder. Files in subfolders end up next to each other. - Because of this, two files with the same name in different subfolders can collide. - References such as texture paths are resolved by file name only. ### Supported data by source "panos" means one of the following: - equirectangular panoramas in JPG, PNG, EXR or DNG format, or - dual-fisheye panoramas in INSP format. Rows marked with * depend on how the file was created. "Tour" means the files can produce a virtual tour. "Cloud" means they can produce a point cloud. **Universal file formats:** | Files | Tour | Cloud | |---|---|---| | Autodesk ReCap RCP / RCS (where available) | yes* | yes | | E57 (the recommended "best choice" format) | yes* | yes | | PTX | yes | yes | | LAS / LAZ | no | yes | | PTS | no | yes | | XYZ | no | yes | | PLY | no | yes | | JPG / INSP / DNG with GPS data (equirectangular or dual-fisheye) | yes | no | | JPG / PNG / EXR / INSP / DNG without GPS data (equirectangular or dual-fisheye) | yes, with limitations (orange mark in the table) | no | **Terrestrial laser scanning:** | Brand | Required files | Tour | Cloud | |---|---|---|---| | RIEGL | PTX + panos + ImageList.csv | yes | yes | | RiPANO | panos + project.json | yes | no | | Leica | LGSX | yes* | yes* (where Leica support is available) | | Leica | LGS | yes* | no (see below) | | Leica | panos + DB | yes | no | | Leica | panos + TXT / CSV | yes | no | | Z+F | panos + OUT | yes | no | | Trimble | panos + CSV | yes | no | | FARO | panos + iQscene TXT | yes | no | - To get a point cloud from LGS files, convert them to the newer LGSX format with the free Leica LGS Converter tool. - If your scanner is not listed, contact support. **Mobile laser scanners:** | Brand | Required files | Tour | Cloud | |---|---|---|---| | OmniSLAM | LAZ + panos + camera.dat | yes | yes | | Lixel | LAZ + panos + panoramicPoses.csv | yes | yes | | CHCNAV RS10 | the CoPre "Export" folder, archived | yes | yes | | Share S20 / S20 SE / S100 / C1 PRO | LAS + left_*.jpg + right_*.jpg + ImgPose.txt | yes | yes | | Tersus MVP S1 | LAS + left/*.jpg + right/*.jpg + ImgPose.txt + calibration.json | yes | yes | | Tersus MVP S1 | LAS + panos + coordinates.txt | yes | yes | | Tersus MVP S1 | LAS + panorama/*.jpg + manifest.json | yes | yes | If your scanner is not listed, contact support. **Hydrographic survey:** | Brand | Required files | Tour | Cloud | |---|---|---|---| | EIVA | NaviModel DB | no | yes | ### Panoramas - Panoramas can be equirectangular (JPG, PNG, EXR, DNG) or dual-fisheye (Insta360 INSP). - **INSP files:** The platform uses the Insta360 gyroscope data to level the panorama. It stitches the images from the two fisheye lenses into a single equirectangular image. The leveling and stitching quality is slightly lower than that of the native Insta360 Studio app. - **Panorama types:** - RGB (colour) - intensity (grayscale) - RGB + intensity, when both exist for the same position - Grayscale panoramas are treated as intensity panoramas. - The number of panoramas (setups) in one project is limited by the user's plan. ### Point limits - On the free plan of the hosted service, one point cloud is read up to 1,000,000,000 points. Other plans and self-hosted installations read as many points as the server can hold in memory at once. - Points beyond the limit are not imported, and the processing log reports how many were loaded. ### E57 files E57 is the recommended format. One E57 file can contain several point clouds and several 2D images. **Plan limits:** - If the project has already reached the setup limit of the user's plan, the file is ignored. The message reads: "The limit on the number of setups in one project has been exceeded, file ignored". - The number of point clouds per project is limited by the same plan value. Extra clouds are skipped with the message: "The point cloud limit per project has been exceeded; ignored". **Unreadable files:** - An unreadable file produces the message "File can not be read". **Embedded 2D images:** - **Spherical (equirectangular) images** become virtual tour setups at the position and rotation stored in the file. - **Six square pinhole images forming a cube** (up, down and four sides) are combined into one panorama. - **Rotating-camera photos:** Posed photos taken from one station by a camera turning on top of the scanner are stitched into one panorama. This applies, for example, to a RIEGL VZ-400i with a mounted camera. The photo centres must lie within 1 cm of each other, and the photos must cover a full circle. Otherwise they are not stitched. - **Other images:** Non-square pinhole images and "visual reference" images are not used as panoramas. They are attached to a comment instead. The comment is a red square marker on the first panorama, or on the panorama of the cloud when the file has a single cloud. The attachments are named `pinholeRepresentation1.jpg`, `pinholeRepresentation2.jpg` and so on. - Embedded photos are skipped when the upload options say not to use photos. **Related upload settings:** - **"Orientation correction":** If this setting is disabled while panoramas are imported from an E57 file, the platform shows: "'Orientation correction' is disabled. It is recommended to enable it." - **"Adjust panoramas to 2:1":** If a spherical image is wider than 2:1, the platform warns that the canvas size is incorrect. It suggests changing this setting in the project creation options to "Stretch image" if the panoramas look strange. **Capture time:** - The image's acquisition date and time becomes the capture time of its panorama. **Point clouds in the file:** - Each cloud is named after the name stored in the file. - If the name is missing or already used, a default name is used, such as "<file name> - cloud1". - Clouds with fewer than 2 points are ignored. - If only part of a cloud can be read, the platform warns: "Only N points loaded (x%)". - A cloud and a panorama at the same position (within 1 cm) are linked to the same setup. **Synthesized panoramas:** - When a scan has no photo, the platform synthesizes panoramas from the points at the scan position: - an RGB panorama when the points have colours - an intensity panorama when the points have intensity - A depth map is also created for each position. It needs at least 648 points and has a resolution of up to 360 × 180. - A synthesized panorama that is less than 4% filled is ignored. - Synthesis is skipped for clouds with more than 350,000,000 points. **Mobile/SLAM files:** - A file with a single cloud and several images is treated as a mobile (SLAM) scan. - An intensity panorama and a depth map are created for every image position from the merged cloud. - The cloud is reduced to at most 350,000,000 points for this step. - Panoramas synthesized for SLAM scans are at most 4096 pixels wide. **Coordinate system:** - If no coordinate system is set for the project, it is taken from the E57 coordinate metadata. - Files declaring EPSG 4979 store degrees. These coordinates are converted to UTM. **GPS time:** - GPS time comes from the point time stamps. - Files that give absolute Unix times are converted, for example CHCNAV RS10 files. - A scan without per-point times gets its acquisition start time for all its points. - If the scan has no start time either, it gets the time of the photos taken with it. **Normals:** - Normals stored in the file (the E57 `nor:normalX/Y/Z` fields) are imported. - A single-station scan without them gets normals computed, since the scanner position is known. Merged and SLAM clouds without stored normals get none. **Scanner-specific handling:** - NavVis panoramas are sorted by capture time. - Panoramas from old FARO scans are rotated 180°. - Galois P4 exports without image poses use the pose of the associated point cloud. - RIEGL VZ-600i, FARO, Matterport and NavVis files are recognised automatically. ### LAS and LAZ files The platform reads: - X, Y, Z coordinates - intensity, scaled to 0–255 - RGB colours - classification, kept when it is not all zero - point source ID - normals (NormalX/NormalY/NormalZ, as unit vectors or bytes) - GPS time, with the standard (adjusted) GPS time flag respected Times above 1,000,000,000 seconds are treated as full GPS seconds and converted to adjusted GPS time. **Coordinate system:** - If none is set for the project, it is taken from the WKT stored in the file header or its records. - Local coordinate systems (LOCAL_CS) are ignored. **Empty files:** - An empty file produces the message "Empty LAS". ### PTS, PTX and XYZ files **Header lines:** - PTS: the first line (the point count) is skipped. - PTX: the 10-line scan header is read. The scanner position and rotation in the header are used to place the points. Normals can be computed because the scanner position is known. - XYZ: up to 100 leading non-numeric header lines are skipped. **Separators:** - Columns can be separated by commas, or by spaces and tabs. **Column layouts by count:** | Columns | Content | |---|---| | 3 | X Y Z | | 4 | X Y Z intensity | | 6 | X Y Z R G B | | 7 | X Y Z intensity R G B | | 9 | X Y Z R G B NX NY NZ | | 10 | X Y Z intensity R G B NX NY NZ | **Named header (XYZ files):** - When a header line names every column and includes X, Y and Z, columns are read by name and other columns are skipped. - CloudCompare style example: `//X,Y,Z,R,G,B,Intensity,Gps Time`. - PDAL style uses quoted names. - Recognised names: - X, Y, Z - R / Red / Rf, G / Green / Gf, B / Blue / Bf - Intensity - Nx / Ny / Nz and NormalX / NormalY / NormalZ - GpsTime / Gps Time - In this mode, colours can be 0–1, 0–255 or 16-bit. **Other rules:** - Other column counts produce the message "No implementation for N columns". - Points at exactly 0, 0, 0 are removed. - If the intensity column cannot be interpreted as intensity, it is dropped and the points are still imported. ### PLY point clouds A PLY file that is neither a textured mesh nor a Gaussian splat is imported as a point cloud. The platform reads: - vertex positions - vertex colours - normals, from properties named `nx/ny/nz`, `normalx/normaly/normalz` or `normal_x/normal_y/normal_z` - GPS time, from a `gpstime` or `scalar_Gps_Time` property **Axis conversion:** - PLY coordinates are treated as Y-up and turned to Z-up. **GPS time precision:** - GPS time stored as 32-bit float loses precision, rounding to about 32 seconds. CloudCompare writes it this way. - Use 64-bit GPS time for accurate values. PDAL writes it this way. **Empty files:** - An empty file produces the message "Empty PLY". ### Autodesk ReCap files (where available) - Upload RCP projects or RCS scans together with their accompanying files. - Each scan becomes a setup at its scan origin. - Panoramas stored in structured scans are imported as RGB or intensity panoramas. They are skipped when photos are disabled. - Point clouds are imported with intensity, colours and normals. A panorama is synthesized when none is stored. - If the upload is incomplete or unreadable, the platform shows "Wrong ReCap source data. Please check the files you upload to the site" or "Error with RCP export. No data could be extracted from the RCP-project". ### EIVA NaviModel databases - A NaviModel sounding database (`.db`) is imported as a point cloud of multibeam soundings, with the surveyor's cleaning applied. - Rejected soundings are excluded. - Depth (positive down) is converted to elevation. - Each survey line gets its own point source ID. - Backscatter becomes intensity, using a logarithmic stretch so that the seabed stays visible. - A NaviModel database does not store its coordinate system. Set it in the upload form or the project settings. The platform warns if it is missing. - Blocks in an unknown layout are skipped with a warning. - If every sounding is rejected, nothing is imported. ### Point cloud output (all formats) **Precision and colour:** - Converted clouds are stored with 1 mm coordinate precision. - Clouds with intensity but no colour are displayed in grey, based on intensity. **Thinning:** - The upload setting "Keep every [n]th point" thins the cloud. **Disabled processing:** - If point cloud processing is turned off in the upload settings, no point cloud is created. **Point source IDs:** - Points of a scan linked to a panorama carry that setup's ID. - Other clouds keep the file's own IDs, or get a per-upload number. **Classification:** - Classification is kept when it contains more than one value. **Duplicate names:** - A cloud whose name is already used in the upload is ignored with the message "File ... already exist, cloud ignored". **Very large clouds:** - If a cloud has more points than the processing server can hold, only part of it is imported. A message reports this. - If there is not enough temporary disk space, the cloud is ignored. The message suggests freeing space or enabling thinning ("Keep every [n]th point"). ### 3D Gaussian Splatting - Supported formats: PLY, SPZ, SPLAT, KSPLAT, SOG and RAD. ### Meshes Supported formats: - GLB - STL - OBJ + MTL + textures - PLY + textures **STL:** - STL files are converted for display and simplified by size: | STL file size | Maximum faces | |---|---| | over 100 MB | 300,000 | | over 50 MB | 500,000 | | otherwise | 1,000,000 | **MTL and textures:** - An MTL file needs an OBJ with the same name (`.obj` or `.OBJ`). Otherwise it is skipped with the message "<name>.obj not found. <name>.mtl skipped." - Textures referenced in the MTL are looked up by file name next to the MTL. Paths inside the MTL are ignored. Textures in archive subfolders are still found because archives are flattened. - Textures are converted for web display. **Textured PLY meshes:** - This applies to typical photogrammetry exports. - The file must be binary little-endian PLY. It must contain triangles with per-face texture coordinates and an optional atlas number. The texture atlases are named in the header as `comment TextureFile <name>`. - The atlas images must be uploaded next to the PLY. - Atlases are embedded and scaled down to a maximum side of 4096 pixels. They are displayed unlit, because lighting is already in the photographs. - Georeferenced meshes far from the origin (beyond 10,000 units) keep their exact position. - A missing atlas produces the message "Texture not found: <name>". - The mesh and its textures must stay under 4 GB. - PLY files that do not match this layout are treated as point clouds or splats. ### CAD and BIM files **IFC:** - IFC is processed free of charge. - IFC is shown in the BIM viewer. FRAG files are also accepted. **Revit (RVT):** - RVT files are converted to IFC where Revit conversion is available. - Where only Autodesk conversion is available, RVT is converted by Autodesk's model conversion service. This is charged like the other CAD formats below. **Other 3D CAD formats (where Autodesk conversion is available):** - Formats: ASM, F3D, FBX, IAM, IPT, NEU, PRT, SLDASM, SLDPRT, SMB, SMT, STEP, STP, STPZ, WIRE, X_B and X_T. - They are converted to OBJ by Autodesk's model conversion service. - On installations with paid plans, this conversion costs 0.01 tokens per MB of the source file. The cost is debited from the user's prepayment balance. - It is not available on the free plan. The message reads: "Processing of this file type is not available on free plan". ### Orthophotos, map overlays and vector drawings **Orthophotos and map overlays:** - Formats: TIF / TIFF (orthophoto / GeoTIFF), KML / KMZ. **Vector drawings and GIS layers:** - Formats: DXF, SHP (with SHX, DBF, PRJ and optionally CPG), GPKG, GeoJSON, KML / KMZ. - These are shown together with the point cloud. **DWG:** - DWG files are not imported directly. Save them as DXF in your CAD application. ### 360° video - Upload an equirectangular MP4 video. - A GPX track is optional. ### PDF - Uploaded PDF files are added to the project's PDF viewer. ### Comment attachments **Allowed attachment file types:** - jpg, jpeg, png, txt, pdf, doc, docx, xls, xlsx, dwg, e57, ply, lgs, lgsx, ifc **Marker shapes:** - square, disc, triangle up, triangle down, task **Marker colours:** - red, orange, yellow, blue, green ### API uploads - Files uploaded through the public REST API can be up to 1 TiB each. - One upload session can total up to 1 TiB. ## Uploading files to the platform ### Where to upload - The **New project** page is at `/upload`. You use it to create a new project from source files. - The **Add files to the project** page is at `/projects/<url>/add-files-to-the-project`. You use it to add files to an existing project. Only a project owner can open it. - Both pages require you to be logged in with a verified email address. - If your plan includes no storage, opening either page sends you to your projects list. - If your storage is used up, the **New project** page shows: "Sorry, there isn't enough storage to create a new project. Need more storage?" with an **Upgrade your plan** link to `/pay`. - If your storage is used up, the **Add files to the project** page shows: "Sorry, there isn't enough storage to add new files. Need more storage?" with an **Upgrade your plan** link. - If you have reached your plan's project limit, the **New project** page shows: "Sorry, you have reached the maximum number of projects allowed by your plan. Need more projects?" with an **Upgrade your plan** link. - Both pages link to the **Supported files** page at `/supported-files`. - Files can be compressed using ZIP, 7-Zip or RAR. Archives are unpacked automatically, including archives nested up to three levels deep. ### Project fields on the New project page - **Project title** is optional. - Any characters are allowed, including emojis. - If you leave it blank, the title is generated from the file name or the date. The date uses your profile timezone. - You can change it later in Project settings. - **Privacy mode** has three options. You can change it later in Project settings. - **public**: anyone can access the project, and it may appear in Public projects. - **via link**: anyone with the link can access the project, including guests. - **private**: only the owner and invited project users can access the project. - Without a remembered setting, new projects are private. - **Project tag** offers **None** or one of your project tags, shown with their full path. - Tags organize projects into folders and support a multi-level hierarchy. - The field is disabled if you have no tags. - You can change the tag later in Project settings. - The **Add files to the project** page does not show these three fields. Adding files does not change the project title. ### Uploading files from the browser - Click the drop area ("Tap to select files, or drag and drop them here") to pick files. You can also drag files anywhere onto the page; the page highlights while you drag. - Only file types from the supported list are accepted. - Files or folders whose names start with a dot (hidden files) are rejected. - A single file can be up to about 1,000,000 MB (roughly 1 TB). - Files upload one at a time, in 20 MB pieces. - A piece that fails to upload is retried automatically. - Each file shows its upload progress as a percentage with one decimal place. - Above the drop area, a counter shows **Uploaded: X / Y** files. While the upload runs, it also shows an estimated time remaining (**ETA**). - To remove a file or cancel its upload, click the **×** on that file. Removed files are deleted from the upload. - If you try to leave or close the page during an upload, the browser asks you to confirm. - If you upload a different file with the same name in the same session, it replaces the earlier file. ### Interrupted uploads and resuming - If an upload is interrupted for any reason, upload the same set of files again. - Data that has already been uploaded is skipped automatically if you retry within 24 hours of the initial upload. - Data is reused only when its content is identical. A file with the same name and size but different content is uploaded in full. - When the content of a file differs from an earlier upload, that file is uploaded from the point of difference onward. - If your browser cannot verify file contents, for example when the page is not opened over HTTPS, files are uploaded in full. ### Starting processing - The **Start processing immediately after files are uploaded** switch is on by default. - When it is on, processing starts about one second after all files have finished uploading. - If the only file uploaded is an RCP file, processing does not start. Instead you see: "To process the project, uploading the RCP file alone is not sufficient. All files from the 'Support' folder must also be uploaded." - When the switch is off, start processing yourself: - Click **Create a new project** on the New project page. - Click **Update project** on the Add files to the project page. - These buttons are disabled while files are uploading and become active once all uploads finish. - After you submit, you return to your projects list. The project's status shows processing progress. - When processing completes, the project owner receives an email. - If the form contains invalid values, you see "Invalid form input". ### Uploading from a link (cloud storage, WeTransfer) - Instead of uploading files, you can paste a download link into the **URL** field. The field is below the text "Or, if you have a link to download the file, paste it into the box below:". - The page lists these supported sources: direct download link, Google Drive, Dropbox, Yandex.Disk, WeTransfer, NavVis Ivion. - Once a URL is entered, the **Download and create a new project** button becomes active. On the Add files page, the button is **Download and update project**. - Links are always fetched over HTTPS. A malformed link shows "Invalid URL". - You can prefill the field by opening `/upload?download_link=<link>`. - Behaviour for specific sources: - **Dropbox**: shared links are converted to direct download automatically. - **Google Drive**: file sharing links (`.../d/<file id>/...`) and `drive.usercontent.google.com` links are supported. The confirmation step for large files is handled automatically. - **Yandex.Disk**: public links (`disk.yandex.ru`) are supported. - **Yandex 360 Disk** (`disk.360.yandex.ru`): - A shared folder is downloaded as a whole, including subfolders, with its folder structure. - Each file is retried several times if the connection drops. - A file that still fails is skipped and noted in the processing log. - Several failures in a row stop the download. - **Mail.ru Cloud** (`cloud.mail.ru`): public links are supported. - **WeTransfer** (`wetransfer.com` and `we.tl` links): - The entire transfer is downloaded. - Password-protected transfers are not supported. - Expired or deleted transfers fail with "Link not found or expired (404/410)." - **The platform's own source archives**: you can paste a link to a saved source archive of one of your projects (`/projects/<name>/source-files/download/<archive>`). Only owners of that project can use such a link. - The downloaded file's name comes from the server's response or from the link. - While the file downloads, the project status shows download progress. - If the download fails, processing ends and the error appears in the project's processing log. ### Creating an empty project - The New project page has a **Create an empty project with a map** button. - It creates a project without files and opens its map page at `/projects/<name>/geotiff`. - It requires a plan with storage and is subject to your plan's project limit. ### Remembered settings and defaults - The upload settings you used last time are prefilled on your next upload. - These fields are not carried over: project title, coordinate system, levels, RVT converter and download link. - The **Restore default values** button resets all settings to their defaults. It does not affect files already uploaded. - On the Add files page, **Coordinate system** is prefilled with the project's existing coordinate system. ### Basic project settings - **Save source files — uploaded files are stored with the project and can be downloaded at any time** - This is available only on paid plans. On the free plan, the switch is disabled and labelled "(Only on paid plans)". - Each upload is saved as a separate ZIP archive named `<project>-source-<date>_<time>.zip`. - The timestamp is in UTC. The source files page shows it in your timezone. - **Coordinate system** accepts an EPSG code, a PROJ string or a WKT string. It links coordinates to the project's real position on the map. - **Levels** is a whole number, minimum 1, default 1. - For multi-storey buildings, enter the number of floors scanned. That number of levels is created in the project. - Setups are assigned to levels automatically by elevation. The height range of all setups is divided evenly between the levels. - When possible, an orthophoto is generated for each level. - Levels help create links between setups. - You can configure levels after the project is created. ### SLAM settings These settings apply only to projects with JPG panoramas from mobile laser scanners. - **Min. time (sec)**: default 1.0, minimum 0.5, step 0.5. Panoramas captured at intervals shorter than this are ignored. - **Min. distance (m)**: default 2.0, minimum 0.5, step 0.5. Panoramas captured less than this distance apart are ignored. ### Panorama settings - **Auto contrast** is on by default. - **Apply orientation correction** is on by default. It reorients the panorama using the provided quaternion to remove tilt and align it with the global axes. - **Do not use embedded panoramic photos. Panorama synthesis from a point cloud** is off by default. - **Panorama quality** has three options: - "19 megapixels, 2048 px cubemap (recommended)" (default) - "42 megapixels, 3072 px cubemap" - "76 megapixels, 4096 px cubemap" - Panoramas are never upscaled, so a higher setting helps only if the source images are large enough. - Higher quality means slower processing and more disk space. - **Blur people and vehicles** appears only where the installation offers it. Options are **Off** and **On-premises** (marked "free of charge" on the hosted service). - Sub-options, all on by default: - People's faces (including partial faces) - Entire person (full body) - License plates - Entire vehicles - **Canvas size factor**: default 1.0, minimum 0.1, step 0.1. If the panoramas generated by the platform have many empty pixels, try reducing it to 0.5. ### Insta360 settings - **Convert local time to UTC for JPG/INSP panoramas** is on by default. - Capture times are stored in UTC, but photos record the time without a timezone. - Turn this off if the camera clock was already set to UTC. The time is then used exactly as recorded. - **Camera clock timezone** is shown only while the conversion is on. - It defaults to your profile timezone. - If your profile has no timezone, the browser's timezone is suggested. If that is unavailable, UTC is used. ### Point cloud settings - **Process each point cloud separately** is on by default. Its label lists the formats it covers: E57, LAS, LAZ, PTX, PLY, PTS and XYZ, plus LGSX, RCP and RCS where the installation supports them. - **Process the merged point cloud** is on by default. - **For E57 files, load points marked as InvalidState** is on by default. - **Simple thinning**, field **Keep every [n]th point**: "no thinning" (default), 2, 4, 8, 16, 32, 64, 128, 256 or 512. ### CAD settings - **RVT converter** options depend on the installation: - "datadrivenconstruction.io - free of charge" (default) - "Autodesk Model Derivative API - 0.01 tokens per MB" - **Extended mode for the datadrivenconstruction converter** is off by default. It rebuilds IFC geometry as solids, but it is slower, produces larger files and may distort the model. ### 360° video settings Under **Generate renditions**, you choose which versions of a 360° video to create: - 1080p (2160×1080, ~6 Mbps) - 2K (2880×1440, ~10 Mbps) - 4K (4320×2160, ~18 Mbps), on by default - 5.7K (5760×2880, ~30 Mbps), not supported on iPhone Only renditions that do not exceed the source resolution are generated. Higher resolutions take significantly longer to transcode and require more disk space. ### How uploaded files are handled - `Thumbs.db` files are removed automatically. - Files are sorted by name, with numbers in names sorted in numeric order. - If an upload contains only Leica LGS/LGSX files, each file becomes its own separate project. - Files with unsupported extensions are skipped, and the log shows `File "<name>" ignored`. - If nothing usable is found, the log shows "No files found to process." - RCP projects need all files from the "Support" folder. Only one RCP file is allowed per upload. Otherwise processing stops with: - "To process a project, it is not enough to load only the RCP file. All files from the "Support" folder are also needed." - "Only one RCP-file is allowed." - Panorama images (JPG, PNG) must be wider than they are tall. Otherwise they are skipped with "Wrong panorama size (W×H)". - When an upload contains only images (JPG, JPEG, PNG, EXR, INSP, DNG), each image becomes a setup. - Its position and capture time come from the image's EXIF data. - INSP and DNG files carry their own GPS and date. - When a Leica project database (`project_*.db`) is uploaded, only JPG, JPEG, PNG, EXR and DB files are used from that upload. - Only Leica project databases are supported. - Otherwise the log shows "Database error. Only Leica project databases are currently supported". - Recognized files include: - **Point clouds**: E57, LAS, LAZ, PTS, PTX, XYZ and PLY. - **PLY files** are treated in one of three ways: Gaussian splats, textured meshes (converted to a 3D model) or point clouds. - **Gaussian splats**: SPZ, SPLAT, KSPLAT, SOG and RAD. - **Leica**: LGS and LGSX. Autodesk ReCap: RCP and RCS, where supported. - **Panoramas**: JPG, PNG, EXR, DNG and INSP. - **Trajectory and pose files**: TXT, CSV, RMX, OUT and `camera.dat`. Also `project.json`, Share `ImgPose.txt`, Tersus MVP S1 CloudStudio `manifest.json` and RS10 Metashape TXT files. - **3D models**: STL and GLB, plus That Open fragments (FRAG). - **Documents and maps**: PDF, GeoTIFF (TIF/TIFF), KML/KMZ and vector files such as Shapefile with its companion files. - **CAD files.** - **360° video**: MP4. A GPX track with the same name is attached to the video. A GPX file uploaded on its own is attached to an already processed video. ## Vector layers (DXF, Shapefile, GeoPackage, GeoJSON, KML/KMZ) in the point cloud viewer ### Overview - Vector drawings are shown as overlays in the point cloud viewer of a project. - Supported formats are DXF, Shapefile, GeoPackage, GeoJSON, KML and KMZ. - You upload vector files through the "Add files to the project" page, like other project files. - Each uploaded file is converted once into a single drawing in the project's coordinate system. - A project that contains only a vector drawing, with no point cloud, still opens in the point cloud viewer at `/projects/<url>/pointcloud`. - Uploading a file with the same file name as an existing vector layer replaces that layer. ### Coordinate systems - A file with its own coordinate system is reprojected into the project's coordinate system. This applies to Shapefile (from its `.prj` file), GeoPackage, GeoJSON and KML/KMZ. - A DXF file has no coordinate system. Its coordinates are used as they are, so the drawing must already be in the project's coordinates. - If the project has no coordinate system: - Layers in projected coordinates are used as they are. - Layers in geographic coordinates (longitude/latitude in degrees) are skipped, because degrees cannot be placed in a scene measured in local metres. - If every layer is skipped, nothing is shown in the point cloud viewer. - Coordinates are kept to 3 decimal places. In a metric coordinate system this is millimetre precision. ### KMZ files - The platform reads the main KML document inside the KMZ archive. - If the archive contains `doc.kml` at its root, that file is used. - Otherwise the `.kml` file nearest to the root of the archive is used. - A KMZ that contains no `.kml` file cannot be imported. ### What is drawn - Lines are drawn with a constant width of 2 pixels at every zoom level. - Points are drawn as dots with a fixed size of 5 pixels. - Each feature keeps the colour stored in the file. A feature with no colour is drawn in white. - Colours are shown exactly as stored in the file, even when 3D models in the scene change the overall rendering. - Curved geometries are converted to straight segments. This covers GeoPackage curves and DXF arcs. - Geometry types that cannot be drawn are skipped. - A file with no drawable features is not added as a vector layer. ### DXF specifics - **Model space only:** Only model space is drawn. Paper space (the print sheet with its frame and title block) is ignored. - **Hidden layers:** Entities on hidden or frozen CAD layers are not drawn. - **Blocks:** Block contents keep their own layer and colour, as AutoCAD draws them. They do not take the layer and colour of the block insert. - **Character encoding:** DXF files from AutoCAD 2007 onward are read as UTF-8, so accented layer names and texts display correctly (for example "Fenêtre"). - **Layer colours:** Colours set "by layer" are resolved to the layer's colour. - **AutoCAD colour 7:** Colour 7 ("white/black") is drawn white on a dark background and black on a white background, as CAD programs draw it. It switches when you change the viewer background. - **Linetypes:** - Dashed and dotted linetypes are drawn with their pattern lengths in drawing units, like CAD linetypes. - The drawing's global linetype scale and each entity's own linetype scale are applied. - A dot in a pattern is drawn as a short dash, 5% of the pattern length. - The pattern starts with a dash at the beginning of every polyline. - **Hatches and fills:** - Solid hatches and SOLID entities are drawn as filled areas without an outline. - Pattern hatches are drawn as their boundary outlines only. The hatch pattern lines are not drawn. - A solid fill that cannot be built is drawn as an outline instead. - Lines lying in the same plane as a fill stay visible on top of it. - **Texts:** TEXT, MTEXT and ATTRIB entities are drawn as text lying flat in the drawing plane. - Text height is the capital letter height in drawing units. - Rotation angle, width factor and justification point (anchor 1–9, from bottom left to top right) are applied. - MTEXT formatting codes are removed. Multi-line MTEXT is drawn with a line spacing of 5/3 of the text height, AutoCAD's default. - Texts are drawn in a sans-serif font (Arial or Helvetica). - Empty texts and texts with zero height are skipped. - At most 2,048 different characters are rendered per drawing. ### GIS formats specifics (Shapefile, GeoPackage, GeoJSON, KML/KMZ) - Polygons are drawn as outlines. Every ring is drawn, including holes. Polygons are not filled. - Labels and text features are not drawn. ### Layers - A DXF file is split into its CAD layers. - For the other formats, each layer of the file becomes a layer, for example each table of a GeoPackage. - A feature without a layer name is placed in layer "0". ### Vector layers page - The page is at `/projects/<url>/vectors` and is listed in the project settings menu. - Only the project owner can open it. - The page states: "Vector drawings (DXF, Shapefile, GeoPackage, GeoJSON, KML) are shown in the point cloud viewer. You can edit the insertion offset (x, y, z)." - While the project is still processing, the page refreshes automatically. - A "Visible:" counter above the table shows how many rows are currently displayed. - If there are no vector layers, the table shows "No data available". - The "Add files to the project" button below the table opens the upload page. - The table has these columns: - **#:** row number. - **Name:** the original file name. The filter accepts plain text or `*` as a wildcard. - **Type:** the file extension in capitals, for example DXF, SHP, GPKG, GEOJSON, KML or KMZ. It can be filtered. - **Layers:** the number of layers. - **Features:** the number of drawn features. - **Size (MB):** the size of the converted drawing, with a total at the bottom. - **x, y, z:** the insertion offset. These columns are editable and can be filtered. - **Actions:** the Open, Download and Delete buttons. - **Open:** opens the project's point cloud viewer in a new tab. - **Download:** downloads the converted drawing as a GeoJSON file in the project's coordinate system. - **Delete:** removes the vector layer after the confirmation "Are you sure you want to delete this?". The storage it used is freed from the project size. - Deleting a KML or KMZ vector layer does not remove a map layer that may exist for the same file. ### Editing the insertion offset - Click an x, y or z cell and enter a number. The value is saved immediately. - The offset moves the whole drawing by that amount along the axis, in project coordinate units. - The default offset is 0, 0, 0. - If the value cannot be saved, the message "Error. Check the values and try again." appears and the old value is restored. ### In the point cloud viewer - Each vector file appears in the scene tree of the sidebar. - Each file has its own checkbox, with one child checkbox per layer. Hovering over an entry shows its full name. - Unchecking a file hides the whole drawing. Unchecking a layer hides only that layer. - Checking a layer under an unchecked file shows that file again. - Fitting the view to the scene includes the vector drawings. - **Clip boxes:** When "Clip Targets" is set to **Everything**, clip boxes cut the drawings too. When clipping applies to the point cloud only, the drawings stay whole. ### Measuring and snapping - The measuring tools snap to visible vector lines and points under the cursor. - A line is picked when the cursor is within about 8 pixels of it. - Near the end of a segment, within about 12 pixels, the exact end point is used. This lets you measure from vertex to vertex as the drawing states it. - Elsewhere on the line, the point on the line itself is used. - Filled areas and texts are not snapped to. - Hidden files, hidden layers and parts removed by clip boxes are not snapped to. - A drawing usually lies on the scanned surface. A line is treated as hidden behind the point cloud only when the point cloud is clearly nearer to the camera (more than 1% nearer). ### Saved views - The share link and the project's start view store the visibility of each vector drawing and of each of its layers. - Opening the view restores those checkboxes. - Views saved before vector layers existed keep the default visibility, with all drawings and layers shown. ## 3D Gaussian Splatting viewer ### Overview - The platform displays 3D Gaussian Splatting (3DGS) scenes in the browser. - The viewer page of a project is at `/projects/<url>/3dgs`. - The page title is "<project title> — 3DGS". - The canonical address of the viewer is `/projects/<url>/3dgs`. - The project logo is used as the link preview image, except for projects with privacy_mode 2. ### Supported files - 3DGS files can be uploaded in these formats: `.ply`, `.spz`, `.splat`, `.ksplat` and `.sog`. - A `.ply` file counts as a 3DGS file when its header contains the Gaussian properties `f_dc_0`, `scale_0`, `rot_0` and `opacity`. - `.spz` files of version 4 are supported. They are repacked to an older version of the format without loss. - Some `.ply` files contain a non-standard number of spherical-harmonic colour coefficients (`f_rest_*` properties). The standard totals are 0, 9, 24 or 45. - For binary little-endian PLY files, a non-standard count is padded up to the next standard degree. The existing coefficients are kept and the gap is filled with zeros, so no data is lost. - If the `f_rest` count is not divisible by 3, the extra colour coefficients are dropped. The splats then keep only their base colour. - An already optimized `.rad` file can also be uploaded as it is. ### Processing after upload - Each uploaded 3DGS file is converted into an optimized level-of-detail file with the `.rad` extension. The converted file has the same base name as the upload. - After a successful conversion, only the `.rad` file is kept. The original upload is not retained. - Optimized files load faster. The viewer streams them progressively with level of detail. - If the conversion fails, the original file is kept. The viewer still displays it, but it is downloaded in full before it is shown. - During processing, the platform calculates the scene's extent from the splat positions. It uses this extent to frame the opening view. - The extent is calculated for `.spz`, `.ply`, `.splat` and `.rad` files. - It uses the 2nd to 98th percentile of the positions on each axis. This ignores stray splats that 3DGS reconstructions often place far from the scene. - No extent is calculated for `.ksplat` and `.sog` uploads. For these, the opening view may fall back to a default camera position that does not frame the scene. ### Opening the viewer - `/projects/<url>/3dgs` loads all 3DGS files of the project together in one scene. Each file keeps its own rotation setting. - When a file exists both as an optimized `.rad` and as an original with the same base name, only the `.rad` is loaded. - `/projects/<url>/3dgs?filename=<name>` opens a single file. - If the requested file does not exist, the page returns "not found". - If the project has no 3DGS files, the page returns "not found". - The `noUI` query parameter (for example `?noUI=1`) opens a clean view for embedding. It hides: - the toolbar - the welcome overlay - the platform logo - the share popup - The background is white in `noUI` mode and dark blue otherwise. ### Loading indicator - A spinner with a percentage is shown while the files load. - The percentage is based on the combined size of all files. It stays at no more than 99% until everything is loaded. - When loading is finished, the spinner disappears. - If loading fails, the indicator shows "Error". ### Opening view and camera - The opening view looks at the centre of the scene from a diagonal position, with equal offsets along all three axes. - The camera distance is 0.6 times the diagonal of the scene's extent. - If no extent is known, the camera looks at the origin from a default distance. - The vertical angle of view is 60°. - The far viewing distance adapts to the size of the scene, so large city-sized scenes are not cut off. ### Navigation with the mouse and touch - **Left button drag:** turns the view about the pivot. - **Right button drag:** shifts the view in the plane of the screen. - **Mouse wheel:** zooms towards or away from the point under the cursor. - One notch of the wheel towards the pivot leaves 90% of the distance to it. - The zoom step is the same on all operating systems and browsers. - A partial notch, such as a trackpad scroll, gives a proportionally smaller step. - **Pinch:** zooms about the point under the fingers. - **Middle button drag:** looks around. The camera turns where it stands and the scene follows the cursor. - The pivot stays where it is. - Looking up and down stops just short of the vertical. - The look continues when the cursor leaves the view. - **Double click of the middle button:** fits the whole scene into view while keeping the current viewing direction. The two clicks must come within 300 ms. If the scene's extent is not known, it returns to the opening view instead. - **Short click or tap in place:** moves the pivot to the nearest splat under the cursor. - This works with the left button, a pen or one finger. - The press must move no more than 5 pixels and last no longer than 400 ms. - A second finger turns the touch into a gesture instead. - **Minimum distance:** the camera keeps at least 2 scene units (metres) from the pivot. Zooming in closer pushes the pivot ahead, so the camera can keep moving forward through the scene. ### Pivot indicator - While the camera moves, the pivot is shown as a small green ball. - The ball is always 14 pixels across on screen, at any distance. - It stays visible while a button or finger is held down. - It disappears 300 ms after the camera stops. - Parts of the scene in front of the ball hide it. ### Keyboard navigation - **W / S:** move towards / away from what is under the cursor, like the wheel. If the cursor is not over the view, they move towards the middle of the view. - **A / D:** move left / right. - **E or R:** move up. - **Q or F:** move down. - The camera moves at 5 metres per second while a key is held, regardless of the distance to the pivot. - Holding Shift makes it 3 times faster. - Keys are ignored while Ctrl, Cmd or Alt is held. - Keys are also ignored while typing in an input field. ### View in the address bar - Each time the camera comes to rest, the current view is written into the page address. This makes the address shareable. - The address uses nine query parameters, each with 3 decimals: - `x`, `y`, `z`: the camera position - `yaw`: the turn to the right, in radians - `pitch`: the tilt downward, in radians - `fov`: the vertical angle of view, in radians - `tx`, `ty`, `tz`: the pivot - Opening an address with these parameters restores that view. - If `yaw` and `pitch` are missing, the camera looks at the pivot. - `fov` is applied only when it is greater than 0 and less than π. ### Toolbar - **Reset View** (house icon): returns the camera to the opening view. - **Share:** opens a share popup with the current address, which includes the camera view. - **Set the current view as the project's start view** (bookmark icon): visible only to the project owner. - It saves the current view as the project's start view. - On success it shows "Start view saved". On failure it shows "Error!". ### 3DGS settings page (project owner) - The page is at `/projects/<url>/3dgs-settings`. - It requires login and is available only to the project owner. - The page heading is "Project: '<title>'. 3DGS". The page says: "You can edit the 3DGS mesh rotation angle (in degrees) for each file". - A table lists the project's 3DGS files. A "Visible:" counter shows how many rows are currently displayed. If there are no files, the table shows "No data available". - Table columns: - **#:** the row number. - **Name:** the file name. - The filter field matches text anywhere in the name and ignores case. - `*` acts as a wildcard, and the pattern must then match the whole name. - **Size (MB):** the file size with one decimal. The total of all files is shown at the bottom. - **X rotation (°):** the rotation of the file about the X axis in degrees. The default is 0. - Click the cell to edit it. The new value is saved immediately. - The value is added to the viewer's default orientation. - It also affects how the opening view frames the scene. - If saving fails, the message "Error. Check the values and try again." appears and the previous value is restored. - **Actions:** contains three buttons: - **Open:** opens the viewer with only this file, in a new tab. - **Download** (download icon): downloads the stored file. This is the optimized `.rad` file when the conversion succeeded. - **Delete** (trash icon): deletes the file after the confirmation "Are you sure you want to delete this?". - Deleting a file also removes its rotation and extent settings. The freed space is subtracted from the project's size. - When the last 3DGS file is deleted, the project no longer has 3DGS content. - The **Add files to the project** button leads to `/projects/<url>/add-files-to-the-project`. - While the project is still being processed, the settings page refreshes automatically. ## GeoTIFF and KML Map Viewer, GeoTIFF Layers from Point Clouds, XYZ and WMTS Tile Addresses ### Overview - The platform shows a project's GeoTIFF layers and KML/KMZ overlays on a 2D map page. - GeoTIFF layers come from two sources: - GeoTIFF files the user uploads. - Rasters the platform builds from the project's point clouds. - Every GeoTIFF layer is cut into map tiles. The tiles are available in the map viewer, as an XYZ tile service and as a WMTS service for GIS programs such as QGIS. - The project owner manages layers on the project settings page "GeoTIFF & KML". ### Map page - The map page is available at `/projects/<url>/geotiff` and at `/projects/<url>/big-map`. Both addresses show the same map. - The map page returns "not found" when the project has no map data to show. - The page title is "<project title> — Map". - The map shows these items: - GeoTIFF layers - KML/KMZ overlays - setups (panorama positions) - sitemaps - GPS tracks of 360° videos - When the project has a geographic coordinate system, the map runs in geographic mode with base map tiles (OpenStreetMap/Esri). - When the project has no coordinate system, the map uses a local fallback. This fallback has a white background and no base map tiles. - If the project has no coordinate system but does have 360° video GPS tracks, the map assumes WGS84 (EPSG:4326). The map then stays geographic. - By default the map shows these controls: - zoom - attribution - scale bar - fullscreen - mouse position - layer switcher - opacity slider - measuring tools - The layer panel is expanded by default. - The standalone map page also offers the full annotation toolset. - `?layer=<layer name>` opens the map for a given GeoTIFF layer. The "Open" button in the settings uses this parameter. - The map keeps the current view in the address: latitude, longitude, scale and base map. A copied address reopens the same view. #### Hiding the interface - Adding `?noUI=1` (any non-empty value of `noUI`) to the map address hides these elements: - zoom, attribution, scale bar, fullscreen and mouse position controls - layer switcher and opacity slider - measuring tools - colour gradient and connections - the welcome overlay, the Share button and the logo - With `noUI` the owner's "Add a panorama here" action is also unavailable. #### Share button - A Share button sits at the bottom-left, above the scale line. - It opens the share popup with the current map address, including the current view. - A `pip` parameter is removed from the shared address. #### Pop-out from a viewer - A viewer's "pop out the map" button opens the map page with `?pip=1`. - The popped-out map stays linked to the viewer that opened it. Linking works only in the same browser profile. - In a linked map: - The viewer's camera arrow is shown. - The map recenters when the active setup changes. - The layer panel starts collapsed. - The tab title is prefixed with 🗺. - Clicking or hovering a setup on the map is passed to the viewer. - Changes to these settings are synchronized in both directions: - colour gradient - visible floors - hidden panorama types - When the project owner enables or disables a setup, or adds or deletes a link between setups, from the viewer's context menu, the popped-out map shows the change. - A pop-out from a geographic source may carry `?epsg=4326`. The map then runs in full geographic mode with base map tiles. #### 360° video GPS tracks - Each 360° video that has a GPS track is drawn on the map. - The first track is the primary track. The other tracks are drawn as neighbour lines. - `?video=<video name>` makes that video's track the primary one. Pop-outs from a 360° video player use this parameter. - A track needs at least 2 points to be shown. - On the standalone map, these clicks open a video page at the clicked moment (`/projects/<url>/video360/<video>#t=SECONDS`): - Clicking the primary track opens its video at the clicked moment. - Clicking a neighbour line opens that video at the clicked moment. - On a map popped out of a 360° video player: - Clicking the primary track seeks the linked player. - Clicking a neighbour line switches the player to that video. The map reloads, linked to the new video. #### Adding a panorama from the map (project owner) - The project owner can right-click an empty spot on the map and choose "Add a panorama here". - The uploaded panorama is tiled into a new setup at the clicked coordinates, on the last sitemap. - A busy overlay with a spinner blocks the map while the upload is processed. This takes a few seconds, and longer for `.insp` files. - The page then reloads and shows the new setup. ### Uploaded GeoTIFF files - GeoTIFF files (`.tif`, `.tiff`) are added through "Add files to the project". - Files are read only as GeoTIFF. - A GeoTIFF must have a coordinate system. A file without one is skipped. - The data must fall inside the web map tile grid: latitude within ±85.0511° and longitude within ±180°. - Data outside this range is rejected with a coordinate system mismatch error. - This usually means the file is tagged with the wrong coordinate system. Check the coordinate system. - A GeoTIFF with more than 4 bands is shown using bands 1–3 as red, green and blue. - The platform cuts each GeoTIFF into map tiles: - Tiles are 256 × 256 pixels in Web Mercator (EPSG:3857). - Zoom levels start at 0. - Empty tiles are skipped. - Tiles are stored as lossy WebP. If WebP tiles cannot be made, the platform uses PNG instead. - The layer's name comes from the file name. It is converted to a safe name. ### GeoTIFF layers from point clouds #### Layers built automatically at upload - When point clouds are processed, the platform builds an "xray" layer from them. - A map background is made only from terrestrial laser scans. For any other point cloud (LAS, PLY, SLAM and mobile scans), or a scan that is too big, the platform builds a plan-view layer instead. - It uses the first type for which the cloud has values, in this order: RGB, intensity, elevation. - A cloud with neither colour nor intensity is shown by elevation. #### Creating a layer manually (project owner) 1. Open the settings page "GeoTIFF & KML". 2. Enter a name in "Layer from the point cloud" (placeholder "Layer name"). - The name is required and has a maximum of 100 characters. - The name is converted to a safe file name. 3. Choose a "Type". Only the types for which every point cloud in the project has data are offered: - **RGB**: the colours of the points. - **Intensity**: point intensity as greyscale. - **Elevation**: point height on the Spectral colour ramp. Low to high runs violet → blue → green → pale yellow → orange → red. - **X-ray**: black ink whose opacity grows with the number of points in each cell, on a logarithmic scale. Empty cells are transparent. Vertical structures that stack many points show up dark. 4. Optionally enter "Z min" and/or "Z max". - Only points with Z min ≤ Z ≤ Z max are used. - Leave a bound empty for no limit. - The form help text reads: "A top-down view of the points between Z min and Z max; leave a bound empty for no limit." 5. Click "Create layer". - The layer is built in the background. The project is queued, and the settings page refreshes while the project is being processed. - The "Create layer" form appears only when the project has point clouds with data for at least one layer type. - The form can show these messages: - "Z min must not exceed Z max." - "There are no point clouds in this project." - "The point clouds have no data for this layer type." - "A layer with this name already exists." - Invalid requests are rejected with: - "Layer name is required." - "Z bounds must be numbers." - "Unknown layer type." #### How point-cloud layers are rendered - The source is the merged point cloud when the project has one. Otherwise all point clouds of the project are used. - RGB, intensity and elevation layers show what is visible from above. Each cell takes its value from the highest point in that cell, so a roof is not blended with the floors under it. - RGB, intensity and elevation values are stretched together to the full 8-bit range. 16-bit LAS colours are reduced to 8-bit. - Cells that contain points are opaque. Cells without points are transparent. - In RGB, intensity and elevation layers, isolated empty cells are filled with the average colour of their neighbours. - A cell is filled when at least 4 of its 8 neighbours have points, or 3 on the raster edge. - Lines and straight edges do not thicken. - Layers with at least 98% coverage are not filled. - X-ray layers are never gap-filled. An empty cell means "no data". - A layer type is skipped when the cloud's values for it are all zero. For example, a cloud without colour gets no RGB layer. - Resolution adapts to the data: - The raster is kept within 64 megapixels. - The pixel size is kept between 2 cm and 5 m. These limits are converted when the coordinate system uses feet. - For sparse clouds the resolution is made coarser so that a typical covered cell holds about 4 points. This prevents a speckled look. - For very large clouds the resolution may be made coarser so the points fit the processing limits. #### Projects without a coordinate system (synthetic layers) - If the project has no coordinate system, point-cloud layers use the cloud's local metre coordinates in place of EPSG:3857. - Such layers are marked "Synthetic" in the settings table. - On the map they keep the planar view but have no base map. - When a coordinate system is later set for the project, synthetic layers are rebuilt in that coordinate system. Each rebuilt layer keeps: - the same name - the same type - the same Z range - its level assignments - If a layer cannot be rebuilt, it is removed. Create it again from the point clouds. - A synthetic layer whose type is unknown is left as it is. ### GeoTIFF settings (project owner) - The settings page is at `/projects/<url>/geotiff-settings`. - The page is available only to the project owner. It is titled "Project: '<title>'. GeoTIFF & KML". #### The GeoTIFF table The GeoTIFF table has these columns: - **#** - **Name** - **Size (MB)**, with a total at the bottom. - **Format**: `webp` or `png`. - **Zoom**: the range from minimum to maximum zoom level, for example `0-20`. - **Z**: the Z range used for a point-cloud layer, for example `10 … 20`, `10 …` or `… 20`. - **Synthetic** - Header tooltip: "Built from the point cloud while the project had no coordinate system: its local coordinates stand in for EPSG:3857. Rebuilt in the project's coordinate system once one is set." - **XYZ**: a button that copies the layer's XYZ address. Its tooltip is "Copy XYZ address". - **Actions**: - **Levels**: a layers icon with the number of assigned levels. It is shown only when the project has sitemaps. - **Open**: opens the map with this layer in a new tab. - **COG**: downloads the layer as a Cloud Optimized GeoTIFF. - **Delete**: asks "Are you sure you want to delete this?" first. Filtering: - Column header filters match by substring. - `*` in a filter acts as a wildcard. - A "Visible:" counter shows column statistics. #### Levels - The Levels button opens a dialog titled "Levels: <layer name>". - The dialog has one checkbox per sitemap, plus "Cancel" and "Save" buttons. - A layer attached to some levels is shown only on those levels. - With no levels checked, the layer is shown project-wide. - If saving fails, the message "Something went wrong" appears. #### COG download - The COG button builds one Cloud Optimized GeoTIFF from the layer's tiles at the highest zoom level. - The file is prepared in the background. The page downloads it automatically when it is ready. - The file name is `<project>-<layer>.tif`. - The file's compression follows the tile format: - WebP tiles stay WebP-compressed. - PNG tiles are stored losslessly with DEFLATE compression. - The file has an alpha band for transparency. - Colour layers have red, green, blue and alpha bands. Single-band layers have grey and alpha bands. - The file is in EPSG:3857. - A synthetic layer's COG has no coordinate system, because its coordinates are local. #### Deleting a layer - Deleting a layer removes its tiles. - The layer is detached from all levels. - Its size is subtracted from the project size. ### XYZ tile addresses - Each GeoTIFF layer is an XYZ tile service for QGIS and other GIS programs. - The address is `https://<host>/projects/<project>/geotiff/<layer>/{z}/{x}/{y}.<webp|png>`. Copy it with the button in the XYZ column. - Tiles use the XYZ convention: Web Mercator with the origin at the top left, 256 px tiles. - XYZ addresses work for public projects and for projects accessible via link. - The settings page links to FAQ entries on how to connect XYZ and WMTS, where the FAQ is enabled. ### WMTS service - All GeoTIFF layers of a project together form an OGC WMTS 1.0.0 (RESTful) service. - The address is `https://<host>/projects/<project>/wmts/1.0.0/WMTSCapabilities.xml`. - The settings page shows it in a "WMTS" field when the project has at least one GeoTIFF layer. - Copy it with the button titled "Copy WMTS address". - QGIS can use this address as is. - Clients that add `SERVICE=WMTS&REQUEST=GetCapabilities` to the address receive the same document. - WMTS works for public projects and for projects accessible via link. - Fetching the capabilities document does not count as a project view. - The capabilities document contains: - **Service title**: the project title. - **Layer title and identifier**: each layer's name and folder name. - **Bounding box**: each layer's WGS84 bounding box. The whole world is used when the bounds are unknown. - **Style**: `default`. - **Format**: `image/webp` or `image/png`. - Tile matrix sets: - Sets are named `WebMercatorQuad-<max zoom>`. - They use EPSG:3857 with 256 × 256 tiles. - Each set covers zoom 0 to the layer's maximum zoom. - When a client zooms in past a layer's last level, it enlarges that level's tiles instead of finding no tiles. - Each layer has tile limits per zoom level, from its minimum to its maximum zoom. - WMTS tiles are the same files as the XYZ tiles. The WMTS tile address is `.../geotiff/<layer>/{TileMatrix}/{TileCol}/{TileRow}.<format>`. ### KML/KMZ overlays - KML (`.kml`) and KMZ (`.kmz`) files are added through "Add files to the project". - They are shown as overlays on the map. - Each KML is also converted into a 3D vector layer for the point cloud viewer. - Overlay names and map extents: - The overlay's name is the first non-empty `<name>` element in the KML, such as the document name. If there is none, the file name is used. - The map extent comes from all coordinates in the KML: points, lines, polygons and rings. - For KML files over 32 MB, the name and extent are not read. The file name is used as the name. The file is still stored and shown as usual. - Uploading a KML/KMZ with the same name again replaces the previous overlay. - KMZ files: - The main KML is `doc.kml` at the archive root. If there is none, the platform uses the first `.kml` file found, preferring files closer to the root. - Icons and image overlays inside the KMZ are kept. - A KMZ without any `.kml` file fails to import. - KMZ limits: - max 256 MB uncompressed in total - max 128 MB per file inside the archive - max 1,000 files - An archive with more than 1,000 files is rejected. Content beyond the size limits is not extracted. #### The KML/KMZ overlays table - The "KML/KMZ overlays" table has these columns: - **#** - **Name** - **Type**: KML or KMZ. - **Size (MB)**, with a total at the bottom. - **Actions**: - **Download**: downloads the main KML as `<layer>.kml`. - **Delete**: asks for confirmation first. - The main KML file's path is `/projects/<url>/kml/<layer>/<main KML path>`. - Deleting an overlay also deletes its 3D vector layer. The freed space is subtracted from the project size. - The "Add files to the project" button links to `/projects/<url>/add-files-to-the-project`. ### Exporting annotations as KMZ (project owner) - The "Export annotations" section shows the number of saved map annotations. - The "Save annotations as KMZ" button downloads the annotations as `<project>-annotations.kmz` from `/projects/<url>/annotations.kmz`. - The button is always shown. It is disabled in these cases: - With no saved annotations. The tooltip reads "No annotations to export". - When the project is not georeferenced. The tooltip and a note read "KMZ export is available only for georeferenced projects". Local scene coordinates cannot be mapped to WGS84. ## IFC/BIM model viewer ### Overview - The IFC viewer displays a project's IFC (BIM) models in 3D in the browser. - The viewer page is at `/projects/<url>/ifc`. - The browser tab title reads "<project title> — IFC". - By default the viewer loads all IFC models of the project together. They are loaded in alphanumeric order of their file names. - To show a single model, add `?filename=<name>` to the URL, for example `/projects/<url>/ifc?filename=building.ifc`. The `.ifc` and `.frag` extensions are both accepted. - If the requested model does not exist, or the project has no IFC models, the page returns "not found". - IFC lengths are always shown in metres, whatever coordinate unit the project uses. ### Loading - A spinner with a percentage shows download progress across all models. - The percentage stays at 99% at most until loading has finished. - When loading finishes, the view automatically fits all models to the screen. ### Several models and the insertion point - Each model has an insertion point (x, y, z), which you edit on the project's CAD page. - When the viewer shows several models together, each model is offset by its insertion point so that the models line up. - When only one model is shown, either because the project has one model or because `?filename=` is used, the insertion point is not applied. ### Navigation - **Orbit:** the view rotates around an orbit pivot. - **Pan:** drag with the middle mouse button. Dragging with the right mouse button also pans. - **Zoom:** each mouse-wheel notch zooms by a fixed 10% of the distance to the orbit pivot. The step is the same on every platform. Trackpad scrolling zooms proportionally. - The closest zoom distance is 2 m. There is no maximum distance, so large models can always be framed. - **Fit to screen:** double-click the middle mouse button. - The fit keeps the current viewing direction. - Stray elements far away from the main model are ignored when fitting, so the building fills the screen. Revit exports, for example, sometimes contain family instances hundreds of metres from the building. - **Selecting an element** makes its centre the orbit pivot. The camera does not move. - **Keyboard movement** works in first-person style, moving in the horizontal plane: - W: forward - S: backward - A: left - D: right - R or E: up - Q or F: down - Normal speed is 15 m per second. Hold Shift to move at 45 m per second. - Keys are ignored while you type in an input field. - **View cube:** the view cube sits in the top-right corner. Its faces are labelled U (up), D (down), L (left), R (right), F (front) and B (back). Clicking a face views the models from that side and fits them to the screen. ### Touch devices - Tap and hold, keeping your finger still, to do what a right-click does with a mouse. - Tap and hold works on iPhone and iPad as well as on Android. - If no element is selected, tap and hold creates a cross-section plane. - If an element is selected, tap and hold opens the context menu. - Tap and hold also finishes an area measurement. ### Bottom toolbar The toolbar at the bottom of the screen has these buttons: - **Cross section** - Clicking it shows the hint "Double-click or tap and hold to create a cross-section of the model". - **Measure length** - **Measure area** - **Reset all** - **Share** - Opens the share dialog with the current page URL. - The URL includes the camera position and the hidden categories. - **Set the current view as the project's start view** - Only the project owner sees this button. - It saves the current view as the project's start view. - It confirms with "Start view saved", or shows "Error!" if saving fails. ### Cross sections (clipping planes) - Double-click the model to create a section plane. This does not work while a measurement tool is active. - You can also create a section plane with **Section plane** in the context menu, or by tap and hold on touch devices. - You can drag section planes to move them. - Measurements follow the visible clipping. - Press Escape to remove all section planes, when no measurement tool is active. - **Reset all** also removes all section planes. ### Measurements - **Measure length** 1. Click the button. 2. Click two points on the model. - The distance is shown together with its rectangular (axis-aligned) component dimensions. - The tool switches off automatically after each measurement. - Press Escape to cancel a measurement in progress. - **Measure area** 1. Click the button. 2. Click the points of the area. 3. Finish with a right-click, tap and hold, or Escape. - Element selection is paused while a measurement tool is active. - **Reset all** clears all measurements. - **Units** follow the viewer's profile setting, metric or imperial. Anonymous viewers see the project owner's setting. - Length labels: - Metric: metres with 2 decimals. From 1,000 m, kilometres with 3 decimals. - Imperial: feet with 2 decimals. From 5,280 ft, miles with 3 decimals. - Area labels: - Metric: m² with 2 decimals. From 1,000,000 m², km² with 4 decimals. - Imperial: ft² with 2 decimals. From 43,560 ft², acres (ac) with 2 decimals. From 27,878,400 ft², mi² with 4 decimals. ### Selection and context menu - Click an element to select it. Selected elements are highlighted in bright green. - Press Escape to clear the selection and close the context menu. - Right-click without dragging to open the context menu. A right-drag pans instead of opening the menu. - Context menu items: - **Isolate elements:** hides everything except the selected elements. - **Hide elements:** hides the selected elements. - **Section plane:** creates a cross-section plane. - **Properties:** opens the Properties panel. - When nothing is selected, the context menu shows only **Properties**. - **Reset all** clears the selection and shows all hidden elements again. ### Properties panel - **For a single selected element**, the panel shows these groups: - **Attributes:** the element's attributes, including its IFC class (for example IfcWall) and a "Type" row with the name of its type. - The element's own property sets and quantity sets, each in a group named after the set. Predefined property sets without a name are labelled by their IFC class. - The property sets of the element's type, labelled "<set name> (type)". - Supported property values: - Single values - Enumerated values - List values, shown separated by commas - Bounded values, shown as "lower – upper" - Non-integer numbers are shown with up to 12 significant digits. - **For several selected elements**: - The heading reads "Attributes (N selected)". - Only the groups and rows that all selected elements share are shown. - Values that differ between the elements read "(varies)". - If an element has no properties, the panel shows "No properties". - While the panel is open, it updates whenever the selection changes. - **With nothing selected**, the panel shows file information for each loaded model, titled "<model name>.ifc". The information can include: - Size: the original IFC file size. - Schema. - File description entries. Entries such as "ViewDefinition [ … ]" are shown as a key and a value. Other entries are labelled "Description". - File header fields: Name, Timestamp, Author, Organization, Preprocessor, Originating system and Authorization. If the header does not follow the standard layout, these appear as a single "File name" row. - Coordinate reference system: CRS, CRS description, Geodetic datum, Vertical datum, Map projection, Map zone and Map unit. - If no models are loaded, the panel shows "No models". ### Categories panel - Open the panel with the **Categories** button. Close it with ×. - The panel lists every IFC category that has visible geometry, for example IfcWall or IfcDoor. - Categories are sorted alphabetically. - Each category shows the number of elements it contains, counted across all loaded models. - Category names follow the IFC2X3, IFC4 and IFC4X3 schemas. - Tick or untick a category's checkbox to show or hide it. - Click a category name to select all of its elements. - **Hide all** and **Show all** switch every category at once. - Opening elements (IfcOpeningStandardCase) and spaces (IfcSpace) are hidden by default. - **Reset all** shows all categories again. ### URL parameters - `filename=<name>`: show only this model. - `noUI`: show only the model, with navigation. - This hides the toolbar, context menu, panels, view cube, welcome overlay and logo. - It is suitable for embedding. - `hidden=<CATEGORY1>,<CATEGORY2>`: categories to hide. - Use upper-case IFC names, for example `IFCWALL,IFCSPACE`. - `hidden=` with no value shows all categories. - Without this parameter, the default hidden categories apply. - The viewer keeps this parameter up to date as you toggle categories. - `x`, `y`, `z` (camera position) and `tx`, `ty`, `tz` (point the camera looks at): - These restore the saved view when the page opens. - The viewer updates them, to 3 decimals, after each drag, touch or zoom. - As a result, the current URL always reproduces the current view. ### CAD files page (project owner) - The CAD files page is at `/projects/<url>/cads`. It requires login and is available only to the project owner. - The page explains: "You can edit the CAD insertion point (x, y, z)." - The table lists the project's model files of type IFC, FRAG, OBJ and GLB. - Table columns: - **#** - **Name** - **Type** - **Size (MB):** the stored, compressed size, with a total at the bottom. - **x**, **y**, **z:** the editable insertion point, in project coordinate units. - **Actions** - Filtering: - Column header filters are case-insensitive substring matches. - In the Name filter, `*` works as a wildcard. - Editing the insertion point: - Click a cell to edit it. Values must be numbers. - If a value is invalid, the page shows "Error. Check the values and try again." and restores the old value. - An IFC file and its converted FRAG file appear as separate rows but share one insertion point. - **Open**: - FRAG files open in this IFC viewer (`/projects/<url>/ifc?filename=...`). - OBJ, GLB and IFC files open in the point cloud viewer (`/projects/<url>/pointcloud?filename=...`). - **Download**: - OBJ files download as a ZIP containing the OBJ, its MTL file and its textures. - Other files download directly. - **Delete**: - Deleting asks "Are you sure you want to delete this?" - Deleting an OBJ also deletes its MTL file and any textures that no other OBJ in the project uses. - Deleted files free project storage. - The shared insertion point is removed only when both the IFC and the FRAG file are deleted. - When the last file of a type is deleted, the project no longer offers that model type. - The page refreshes automatically while the project is still processing. - **Add files to the project** links to `/projects/<url>/add-files-to-the-project`. - **Model-to-cloud deviation analysis**: - This section appears when the project has a point cloud and an IFC or OBJ model. - The **Calculate deviations** button starts the analysis. ### Partner service: IFC to Revit conversion - On the platform's main hosted service, the CAD page offers a partner service from Vitamin-B Club. - Vitamin-B Club converts IFC files into native Autodesk Revit (.rvt) models. - The resulting models contain editable, parametric elements instead of imported generic geometry. - How it works: - You send your IFC file. It is processed with the partner's proprietary workflow, with no installation or configuration needed on your side. - You receive a video proof of the result and the native .rvt file within 48 hours. - Your own Revit templates, families and company standards can be used as input. - The service starts with a free IFC check and a quote with no obligation. - The **Free IFC → Revit check** button opens https://vitamin-b.club/ifc-check/. - vitamin-b.club is an external website operated by the partner. It is not part of the platform. ## Map Panel in the Viewers ### Where the map appears - The map panel appears in the panorama viewer as a floating window over the panorama. It is also used on the project's GeoTIFF page (`/projects/<url>/geotiff`) and on the standalone big map page (`/projects/<url>/big-map`). - A project has map content when it has GeoTIFF or KML overlays, setups, sitemaps (floor plans), a coordinate system, or a geocoded 360 video track. - The map runs in one of two modes: - **Geo mode** applies when the project has a coordinate system (an EPSG code or a PROJ4 definition), a GeoTIFF or KML overlay, or a 360 video with a GPS track. Online base maps are available in this mode. - **Local mode** applies when none of these are present. The map uses the project's own scene coordinates on a plain White or Black background. ### Consent for external map services - In geo mode, an overlay is shown before any external map service loads. It states that services such as OpenStreetMap may collect personal data, including the IP address and browser metadata (User-Agent, language, screen size). It also states that this data may be processed outside the European Union. - Clicking **Show map** gives consent under Article 6(1)(a) GDPR/DSGVO. The browser remembers the choice. - To revoke consent, clear this site's data in the browser. ### Floating map window in the panorama viewer - The floating map has its own header. It can be dragged, resized and collapsed into a button. - Header controls are **Hide map**, **Show map**, **Toggle compact mode**, **Fullscreen** and **Open in a separate synced window**. - The map starts in compact mode. - A map button in the viewer's action button row opens and closes the map. On mobile, this button folds behind the "+" button together with the other action buttons. - On small screens (width up to 900 px or height up to 500 px), the map starts collapsed. The map button pulses until the user opens the map for the first time. - The floating map shifts sideways so that it does not overlap the panorama scene list. - A camera indicator on the map shows the current panorama's position, viewing direction and field of view. - The dot of the currently open setup is drawn larger. Hovering a dot on the map highlights the matching row in the scene list and the matching link sphere in the panorama, and the reverse also works. - Clicking a setup dot opens that panorama with its initial view. - The panorama type selector (RGB / Intensity / auto) also filters the map dots: - **RGB** hides intensity-only setups. - **Intensity** hides RGB-only setups. - **auto** shows all setups. ### Map controls - **Zoom** in and out. - **Rotate**: the button resets the rotation. To rotate the map, hold Alt+Shift and drag with the left mouse button. The project owner's map rotation is saved to the project. Other visitors see the saved rotation, but their own rotation changes are not saved. - **Scale bar**: shows metric or imperial units. - Logged-in users get the units from their profile setting. - Anonymous visitors get the project owner's setting. - The default is metric. - **Fullscreen**: hidden in browsers that do not support it, such as Safari on iOS. - **Cursor coordinates**: shows the cursor position with 3 decimals and space-grouped thousands. - With a project coordinate system, coordinates are shown in that system and labeled with the EPSG code or "PROJ4". Hovering the readout shows the full coordinate system definition. - Without a project coordinate system, geo-mode maps show "(EPSG:3857)" coordinates. Local-mode maps label the coordinates with the project's coordinate unit, for example "(m)". - The URL keeps the map view in the query parameters `x`, `y` (map center), `scale` (zoom level) and `base` (the name of the active base map). Sharing or reloading the URL restores the view. ### Base maps - Geo mode offers these base maps: **White**, **Black**, **OpenStreetMap** (the default), **OpenTopoMap** (zoom up to level 17), **Satellite (Esri)** and **Satellite (Bing)**. - Local mode offers only **White** (the default) and **Black**. - On a dark background, dark density overlays are drawn inverted so that they stay visible. ### Layers panel Open the panel with the **Layers** button. It is collapsed by default in the floating map and expanded on standalone map pages. It is hidden when there is nothing to show. The panel has these sections: - **Base maps**: a radio list. It appears only when more than one base map is available. - **Overlays**: one checkbox per GeoTIFF or KML layer. Overlays are listed by name in natural sort order. - **Sitemaps**: one checkbox per floor plan, with the sitemap's color swatch and the number of setups on it. - **Show all** and **Hide all** buttons appear when there is more than one sitemap. - The color swatches are hidden while **Height gradient** is on. - Most visitors see the number of enabled setups. The project owner sees "enabled / total" when some setups are disabled. - Sitemaps without setups and without a floor plan image are not listed. - The **Opacity** slider appears at the end of this section. - **Opacity**: this section appears on its own when the project has no sitemaps. The slider (0 to 100%) sets the opacity of GeoTIFF overlays and floor plan images. The default is 80%. - **Options** (see below). - An owner-only section (see below). ### Options - **Connections**: shows the links between setups. Each link is drawn as a short stub, one fifth of the distance, from each setup toward its linked setup. Links involving a disabled setup are drawn faded and dashed. - This option appears only when setups have links. - The initial state follows the project's stored preference. - If the project has more than 1000 link lines, connections start switched off. The user can switch them back on for the session. - **Height gradient**: colors the setup dots on a rainbow scale by height instead of by sitemap color. - The project can have this option enabled by default. - In the panorama viewer, switching it also recolors the link spheres in the panorama. - **Follow location changes**: recenters the map when the current setup changes. In 360 video, it keeps the playback marker in view. - **Auto-switch sitemap**: on every setup switch, shows only the sitemap of the current setup. - **Show all** shows all sitemaps until the next switch. - Turning this option off keeps the user's own sitemap selection. - This option appears only when there is more than one sitemap. - **Show measurements**: shows or hides the saved measurements and the measuring tool tray. - It is on by default. - The project owner's choice is saved with the project. - **Group overlapping setups**: merges dense dots into blue badges that show a count at low zoom levels. The groups break apart above zoom level 16. - It is off by default. - The browser remembers the choice. ### Setup dots - Setup dots use the color of their sitemap. The default color is a sage green. - Setups at exactly the same position, such as alternative panoramas of one spot, show a dark badge with the number of stacked setups. Clicking the stack opens a picker to choose one of them. - Disabled setups are never shown to visitors other than the project owner. ### Floor plans, overlays and tracks - Each sitemap's floor plan image is placed at its scene coordinates. In geo mode, the image is rotated so that the project's grid aligns with true north on the base map. - GeoTIFF overlays are drawn only within their data area. - KML overlays are drawn as vector layers. - A 360 video GPS track is drawn as a line colored by speed: green for slower, yellow, red for faster. - White markers show the start and the end. - An orange marker shows the current playback position. - Clicking the track jumps the video to the nearest point. - Neighbouring video tracks are drawn in cyan. Clicking one opens that video at the nearest point in time. - Track information includes Track, Speed, Position, Time and Track length. - The big map page shows all geocoded video tracks. The first track is the primary track, and the others are neighbour tracks. ### Search - Click the magnifier button, type a query, then press Enter or click the arrow button. - Results that match setup names appear first. Matching is a case-insensitive substring search, with up to 8 results. - Address results from the OpenStreetMap address search follow, with up to 5 results. - Choosing a setup zooms the map to the setup (at least zoom level 18) and opens it. Choosing an address zooms to the address area, or to zoom level 16 if no area is available. - Esc or a click outside the search field closes the search. ### Measuring and annotations - **Measure length** and **Measure area** are available in the tool tray. - Click on the map to add points. Help text follows the cursor: "Click to start drawing", "Click to continue the line" or "Click to continue the polygon". - Each segment shows its own length label, and the shape shows its total value. - To finish a shape, right-click, press Esc, or click the green **Finish** check button. The Finish button is shown while a tool is active and is the way to finish in VR. - A line needs at least 2 points and an area needs at least 3 points. Otherwise the drawing is canceled. - Clicking the active tool again turns it off. - Units follow the measurement units setting: - Metric: m, or km from 1000 m; m², or km² from 1,000,000 m². - Imperial: ft, or mi from 5280 ft; ft², or ac from 43,560 ft², or mi² for larger areas. - In geo mode, distances are measured on the earth's surface. In local mode, distances are calculated from the project's coordinate unit. - On the standalone big map page, more drawing tools are available: **Line**, **Arrow**, **Rectangle**, **Ellipse**, **Freehand drawing** and **Color**. The default color is red. Measured shapes are drawn in indigo. - **Reset all** appears once shapes exist. It removes all shapes. - The project owner's measurements and annotations are saved to the project and shown to all visitors. Other visitors can draw, but their shapes are not saved. - The project owner can delete a single shape. Right-click the shape, or long-press it on touch and VR devices, then choose **Delete measurement**. - Annotations of geo-referenced projects can be exported as a KMZ file. Each shape becomes a placemark named by type and number, for example "Length 1" or "Area 2", and keeps its color. KMZ export is not available for projects that use only local scene coordinates. ### Project owner tools The owner-only section of the Layers panel contains these tools: - **Show unlinked setups**: the panorama shows link spheres to all enabled setups, not only to linked ones. The point cloud viewer shows all image spheres, even while a panorama is focused. - **Show disabled setups**: shows disabled setups as faded dots with dashed outlines. This tool appears only when disabled setups exist. - **Selection mode**: a click on a setup selects it instead of opening it. This tool is not offered in the point cloud viewer, where clicks open panoramas. - **Edit mode**: drag setup dots to new positions ("You can now drag and drop setups"). Each drop is saved. - **Project settings**: a link to the project settings page. Right-clicking a setup dot, or long-pressing it on touch and VR devices, opens a context menu for the owner: - **Add link to this setup** or **Delete link to this setup**. The link is made relative to the current setup, which is the open panorama or the setup chosen in Selection mode. - **Disable this setup** or **Enable this setup**. - Changes appear immediately in both the map and the panorama. - On a group badge with several setups, zoom in first. In the panorama viewer, right-clicking or long-pressing an empty spot on the map offers **Add a panorama here**. It uploads an alternative panorama at that position. The floor, height and panorama type are taken from the panorama currently in view. ### Second-screen sync - **Open in a separate synced window** opens `/projects/<url>/big-map?pip=1` in a separate browser window or tab. Clicking the button again reuses the same window. - The viewer sends its camera indicator, active setup, floor filter, panorama type filter and height gradient to the separate window. - The separate window sends setup clicks, hovers, owner actions, filter changes and track clicks back to the viewer. - Sync works only between windows of the same browser and browser profile. A window moved to another monitor stays in sync. - When the viewer page closes, the separate window is notified. ## PDF viewer with annotations, measurements, calibration, and flatten export ### Overview - The platform displays a project's PDF files in a built-in viewer. The viewer supports page navigation, zoom, rotation, drawing annotations, comments, scale calibration, length and area measurements, and downloading the PDF with annotations burned in. - The project owner can also place a PDF page on the project map as a level underlay ("Place on map"). - PDF files are added to a project through **Add files to the project** (`/projects/<url>/add-files-to-the-project`). Each uploaded PDF is stored in the project under a sanitized file name. - Only files with the `.pdf` extension are listed. Files appear in alphanumeric order of their names. ### Opening the viewer - The viewer opens at `/projects/<url>/pdf`. - Without parameters, the viewer opens the first PDF in alphanumeric order. - `?filename=<name>` opens a specific PDF of the project. - `?page=<N>` opens page N. If N is out of range, page 1 opens. The page number in the URL updates as you change pages. On page 1 the parameter is removed. - `?noUI=1` shows only the PDF and its saved annotations. It hides the toolbars, page navigation, file selector, welcome overlay, and logo. Pan and zoom still work. - If the project has no PDF files, or the requested file does not exist, the page returns "not found". - Anyone who can view the project can open the viewer, see saved annotations, and download the files. - When a project has more than one PDF, a file selector appears in the top-right corner. Choosing another file reloads the viewer with that file. On screens 700 px wide or narrower, the selector collapses into a compact menu (three-line) button. ### Navigation, zoom, pan and rotation - The top panel shows **Previous page**, the page counter ("current / total"), **Next page**, the current zoom percentage, **Rotate left**, and **Rotate right**. - For single-page PDFs, the page buttons and page counter are hidden. - Each page opens fitted to the window, at 95% of the available space, and centred. - Zoom uses the mouse wheel, centred on the cursor, or a two-finger pinch on touch screens. Zoom ranges from 30% to 1000%. - Panning with a mouse uses the middle button at any time, or the left button when no tool is active. - Panning on touch screens uses one finger when no tool is active, or two fingers at any time. - Pens and VR controller pointers can also pan. - **Rotate left** and **Rotate right** turn the view in 90° steps and re-fit the page. - Rotation is stored per page. It is saved with the annotations and counts as an unsaved change. - Annotations rotate together with the page. New text and comments are placed upright in the current view orientation. ### Toolbar The bottom toolbar contains, in order: - **Select** - **Calibrate scale**. The button shows the current page's scale, for example "1:100". - **Place on map** (project owner only) - **Measure length** - **Measure area** - **Freehand drawing** - **Line** - **Arrow** - **Rectangle** - **Ellipse** - **Text** - **Comment** - **Color** - **Save changes** - **Clear all** - **Download**, with a menu: **Download original** and **Download with annotations** - **Share** How the toolbar behaves: - Clicking a tool activates it. Clicking the active tool again turns it off. Pressing Escape turns off the active tool. - When no tool is active, mouse and touch input pans the page. - On screens 700 px wide or narrower, the toolbar wraps onto several rows. - **Share** opens the share popup for the current viewer URL. The URL includes the current file and page. ### Drawing annotations - The default colour is red (#ef4444). The **Color** picker sets the colour for annotations drawn after the change. - Lines and outlines are drawn 2 pixels thick at the zoom level used when drawing. Shapes are outlines without fill. - **Freehand drawing**: draw freely with the mouse, finger, or pen. - **Line**, **Arrow**, **Rectangle**, **Ellipse**: press and drag. The shape previews while dragging. Drags shorter than 3 pixels on screen create nothing. The ellipse fits inside the dragged rectangle. The arrow has a filled arrowhead at the end point. - **Text**: click to place a text label reading "Text" at 14 px. It opens in editing mode immediately. The viewer then switches to the **Select** tool. - **Comment**: click to place a note reading "Comment". The note has a pale yellow background, dark brown text, a rounded brown border, and a width of 120 px. The viewer then switches to the **Select** tool. Comments can be resized only in width. - **Select**: select annotations and measurements to move, resize, or rotate them. Press Delete or Backspace to remove the selected objects, except while editing text. Scale calibration lines and "Place on map" pins cannot be selected. - **Clear all** removes all drawings, text, comments, and measurements from the current page. The page's scale calibration is kept. ### Saving annotations - Annotations are stored per PDF file and per page. They include drawings, measurements, calibration, view rotation, and the "Place on map" reference point. - **Save changes** saves all pages of the current file. The button briefly shows a green outline on success. - Saving requires being logged in as the project owner, a project user, or a member of a group with access to the project. Other visitors can draw in the viewer, but saving fails with "Could not save the annotations." Their edits stay marked as unsaved. - In the project's offline copy, saving fails with "Annotations cannot be saved in the offline copy." - Switching pages keeps edits in the current session, but nothing reaches the server until you press **Save changes**. - With unsaved changes: - Leaving or reloading the page triggers the browser's leave-page warning. - Switching to another file, or choosing **Download with annotations**, asks "You have unsaved changes. Save them before downloading?". **OK** saves first. **Cancel** continues with the last saved version. - Saved annotations count toward the project's storage size. ### Scale calibration - Calibration is set per page with **Calibrate scale**. The **Set scale** dialog offers two methods. - **Scale ratio**: "Enter the scale ratio:" with a sheet value (default 1) and unit, "=", and a real-world value (placeholder 100) and unit. - Units for both sides: mm (default), cm, m, in, ft. - Example: 1 mm = 100 mm gives 1:100. - Both values must be greater than 0. - If the page already has a scale, the dialog is pre-filled with it. - **Known distance**: click **Or set the scale using a known distance on the sheet**. 1. The dialog closes. 2. Click two points on the drawing. Red dots and a dashed red line mark them. 3. The dialog asks "Enter the real-world distance between the two points:". Units: m, cm, mm, ft, in. 4. The distance must be greater than 0. 5. After **OK**, the reference line is shown as a green dashed line labelled with the distance and unit. - **Cancel** closes the dialog without changes. - The **Calibrate scale** button shows the scale as "1:N", rounded to a whole number. Enlargements show as "N:1". Pages without calibration show "1:1". - Calibration is an unsaved change until you press **Save changes**. - The calibration line and its label are never included in the annotated download. ### Measurements - **Measure length**: click two points. The result is a line with end markers and a distance label at its midpoint. You can measure repeatedly while the tool stays active. - **Measure area**: click the corner points of the polygon. Each new point is connected to the previous one. - Finish with a double-click or right-click. On touch screens and with a pen, finish with a still long press of about half a second. - At least 3 distinct points are needed. A repeated point from the double-click is ignored. - The result is a semi-transparent polygon, the total area at its centre, and the length of every side. - After one area is finished, the tool stops adding points. Turn **Measure area** off and on again to measure another area. - On touch screens and with a pen: - An area point is added when a short tap is released. - Moving the finger before release, or touching with two fingers, adds no point. - Without calibration, results are in PDF points: "pt" and "pt²", where 1 pt = 1/72 inch. - With calibration and metric project measurement units: - Lengths below 1 m show in mm with 1 decimal. - Lengths from 1 m to below 1000 m show in m with 2 decimals. - Lengths of 1000 m or more show in km with 3 decimals. - Areas show in m² with 2 decimals, or in km² with 4 decimals from 1,000,000 m². - With calibration and imperial project measurement units: - Lengths show in ft with 2 decimals, or in mi with 3 decimals from 5,280 ft. - Areas show in ft² with 2 decimals, or in acres ("ac") with 2 decimals from 43,560 ft². - Measurements are saved with the annotations and are included in the annotated download. ### Place on map (project owner only) - **Place on map** georeferences one PDF page and uses it as the underlay of a map level. - The tool is shown only to the project owner. It is not available in `noUI` mode or in the offline copy. - The page needs a scale first, because the underlay size on the map comes from it. Without a scale, the dialog shows "Set the drawing scale first — the underlay size on the map is derived from it." with **Set scale** and **Cancel**. **Set scale** opens the calibration dialog. After calibrating, **Place on map** resumes automatically. Workflow: 1. The hint "Click a reference point on the drawing whose coordinates you know." appears. Click the point. A blue crosshair pin marks it. 2. The **Place on map** dialog opens. It shows: - The page scale, for example "1:100". Non-integer scales show one decimal. - "Coordinates of the selected point in the project coordinate system:" with **X** and **Y** fields and the project's coordinate unit (default m). - **Rotation** in degrees, counter-clockwise. The note reads "Leave 0° if the drawing axes already match the project axes." - **Level**: an existing level of the project, or **New level**. 3. Click **Place on map** or press Enter. - The platform renders the page, rotates it into the project axes, and stores it as the underlay of the chosen level. - The current view rotation of the page is taken into account. - This takes from a few seconds to about a minute. A spinner replaces the button label. **Cancel** stays available. 4. On success, the dialog shows "The drawing has been placed on the map. Check that the panorama positions line up with it." with **Open map**, which opens in a new tab, and **Close**. Results and errors: - On failure, the dialog shows an error, for example "Failed to place the drawing on the map." - If another placement for the same project starts meanwhile, the earlier one reports "superseded by another placement". - After success, the pin gets a label "X … Y … <unit>". The pin, coordinates, rotation, and level are saved automatically with the page annotations. - A newly created level is added to the **Level** list. - Opening the tool again pre-fills the previous values. - The pin and its label are never included in downloads. ### Downloading - **Download original** downloads the PDF file unchanged from `/projects/<url>/pdf/<filename>`. - **Download with annotations** uses `/projects/<url>/pdf/<filename>/download`. - The file keeps the original file name. - It reflects the last **saved** state of the annotations. - If no page has drawings or a view rotation, the original file is returned. - Otherwise, the saved annotations are burned into the PDF pages. This includes freehand drawings, lines, arrows, rectangles, ellipses, text, comments (as yellow boxes), and measurements. - Calibration lines and labels, "Place on map" pins and labels, and hidden objects are left out. - Each page's saved view rotation is applied, so the file opens in the orientation shown in the viewer. - Annotations already embedded in the PDF are merged into the page content: form fields, sticky notes, markups, and stamps. - Text supports non-Latin characters. - If the PDF has more than 500 pages, the original file is downloaded instead. The same happens if the annotations cannot be applied, take too long, or the saved annotation data is too large. - In the offline copy, **Download with annotations** points to a copy with the annotations already applied, when the file has any. ### PDF settings page (project owner only) - The project owner manages PDF files at `/projects/<url>/pdf-settings`. - The table has these columns: - **#** - **Name**, sortable and filterable - **Size (MB)**, with one decimal and filterable. The total size appears at the bottom. - **Actions** - A "Visible:" counter shows how many rows match the filters. - The **Actions** column offers: - **Open**: opens the file in the viewer in a new tab. - **Download**: downloads the original file. - **Delete**: asks "Are you sure you want to delete this?". - Deleting a PDF also deletes its saved annotations. The freed space is subtracted from the project size. - When the last PDF is deleted, the PDF viewer is turned off for the project. - **Add files to the project** leads to the upload page. - While the project is still processing, the settings page refreshes automatically. ## Point cloud viewer ### Overview - The point cloud viewer shows a project's point clouds in the browser. It can also show 360° panorama spheres, annotations, CAD/BIM models (IFC, OBJ, GLB) and vector drawings in the same 3D scene. - The viewer is based on the open-source Potree viewer, version 1.8.2. Most of its functionality has been reworked and extended by the platform. The sidebar's About section credits Potree (author Markus Schütz, FreeBSD 2-clause BSD license) and links to its GitHub page. - A changelog of the viewer's extensions is published at `/faq/potree-changelog`. The About section links to it with **View changelog**. - The viewer follows the language you browse the site in. Supported languages: English, Czech, Dutch, French, German, Italian, Polish, Portuguese (Portugal and Brazil), Romanian, Russian and Spanish. - Rendering happens only when something changes, such as camera motion, points streaming in, animations or panorama transitions. A still view puts almost no load on the graphics card. - Rendering pauses in background tabs and resumes when you return. VR headsets always render every frame. - If a piece of the point cloud fails to download, it is retried. A failed piece does not block further detail. ### Viewer pages and URLs - `/projects/<url>/pointcloud` is the standard viewer. Its page title reads "<project title> — Point cloud". - `/projects/<url>/pointcloud-on-map` shows the point cloud on a 3D globe ("Point cloud on map"). - `/projects/<url>/pointcloud-on-satellite` also shows the point cloud on the globe ("Point cloud on satellite imagery"). - The globe is shown only if the project is georeferenced, meaning it has a coordinate system (EPSG or projection) set. Otherwise these pages show the standard viewer. - Older addresses redirect to `/projects/<url>/pointcloud` and keep their query parameters: - `/projects/<url>/potree/pointcloud.html` - `/projects/<url>/potree/pointcloud-<id>.html` - `/projects/<url>/potree/pointcloud-sitemap-<id>.html` - The viewer is available to anyone who may view the project: owners, project users, group members, visitors with the project link, and everyone on a public project. - If the project has nothing to show, the page returns "not found". This happens when there is no point cloud and no IFC, OBJ, GLB or vector file. ### URL parameters - `?scene=<id>` - Opens the point cloud and 360° sphere of one panorama (scene) only. - Only that scene's annotations are shown. - The sidebar is toggled when the page opens. - An unknown scene id returns "not found". - `?sitemap=<id>` - Opens the point clouds and spheres of all enabled panoramas of one sitemap. - An unknown sitemap id returns "not found". - `?cloud=<name>` - Opens a single point cloud by its name, as listed on the project's point clouds page. - A missing cloud returns "not found". - `?filename=<file name>` - Opens only the named CAD model (IFC, OBJ or GLB), without point clouds. - A missing model returns "not found". - If a scene or sitemap has no point cloud of its own, the viewer loads the project's merged point cloud instead. If there is no merged cloud, it loads all of the project's point clouds. - Without these parameters, the viewer loads: - the merged point cloud, if one exists; - otherwise every structured point cloud, in alphanumeric order of their names. - `?x=…&y=…&z=…&pitch=…&yaw=…&fov=…` - Sets the camera position, its orientation, and the field of view. - Pitch, yaw and field of view are in radians. - `fov=NaN` means orthographic projection. - If x, y and z match a panorama's position (to 3 decimals), that panorama opens. - Without coordinates, the camera fits the whole scene into view. - `?settings=<id>` opens a saved share link (see "Share links"). - `?noUI` hides the interface for embedding: - no sidebar, buttons, help, fullscreen toggle or navigation cube; - no welcome overlay and no logo; - no project description; - a white background. - `?engine=1` or `?engine=2` lets project owners preview the legacy or the new viewer engine on any project. Other visitors always get the engine chosen for the project. - The address bar updates with the current x, y, z, pitch, yaw and fov whenever you: - release the mouse button or your finger; - use the mouse wheel; - switch the projection. You can copy the address to link to the current view. ### On-screen controls These controls are at the top right: - **Frequently Asked Questions** opens the viewer guide as a PDF. German-language users get a German version. - **Fullscreen** / **Exit fullscreen** toggles fullscreen mode. - **Switch between RGB and intensity** switches all point clouds between RGB colour and intensity. It is shown only when point clouds are loaded. - A cloud without intensity is coloured by elevation instead. - In that case the viewer shows "This point cloud has no intensity data, so it is colored by elevation." - **Switch between perspective and isometric** toggles perspective and orthographic projection. - A **FOV** slider is always visible. It is hidden in orthographic projection, where the field of view has no effect. - The navigation cube sits below these buttons. - It has eight diagonal corner views and a horizon ring. - It highlights the face or corner under the mouse. Action buttons sit at the bottom left, beside the sidebar: - **Map** opens the mini-map. - The mini-map offers OpenStreetMap, topographic and satellite layers, plus KML/KMZ and GeoTIFF overlays. - It asks for consent before loading third-party map tiles. - **Globe Mode** opens the current view on the globe page in a new window. - It is shown only on georeferenced projects. - It is not shown on the globe page itself or with `noUI`. - **Enter VR** is shown only when the browser supports immersive VR. - **Share** creates a share link (see "Share links"). - **Enable or disable 360° spheres** shows or hides the panorama markers. It appears only when spheres are loaded. - The small **+** button doubles the size of the spheres ("Double the size of 360° spheres"). - The small **−** button halves it ("Reduce 360° sphere size by half"). Mouse shortcut: - Double-clicking the middle mouse button fits the whole scene into view. ### Default view settings - The default field of view is 90°. - Eye-Dome-Lighting is on by default. - Default point budget: - 25,000,000 points on desktop; - 10,000,000 points after the first touch on a touch device; - 1,000,000 points on VR headset browsers. - The point budget slider ranges from 1 million to 100 million points. - Default navigation mode: - **Earth control** on desktop; - **Orbit control** after the first touch; - **Orbit control** when the project has only CAD models and no point cloud. - Clipping defaults to showing what is inside the clip volume. - With the new engine, **High Quality** splats are on by default if the device supports them, except on VR headsets. - The **Coordinate unit** is preset to the project's coordinate unit. - The **Display unit** is preset to ft for projects using imperial measurement units, and to m otherwise. - On load, the first point cloud in the Scene tree is selected so that its panel is visible. ### Sidebar All sections are expanded when the viewer opens. **Appearance** - **Point budget** and **Field of view** sliders. - **Background**: Sky, Gradient, Black or White. - **Eye-Dome-Lighting**: Enable, Radius, Strength, Opacity. - **Other**: - Splat Quality: Standard or High Quality. High Quality is drawn when the view rests; while you move, standard splats are used. - **Min node size**. - **Bounding boxes**. - **Lock view**. - **Expert mode** reveals fine-tuning options: point size and shape, attribute weights, RGB gamma and similar settings. **Measurements** - Tools: - Angle measurement - Point measurement - Distance measurement - Height measurement - Height, distance and slope measurement - Circle measurement - Azimuth measurement - Area measurement - Volume measurement - Sphere volume measurement - Floor flatness - Height profile - Annotation - Remove all measurements - Export measurements to DXF - Labels: Show or Hide. - **Coordinate unit** (the unit the scene is stored in): m, cm, mm, ft, ftUS, in. - **Display unit** (the unit readouts use): m, cm, mm, ft, ftUS, in. - The coordinate unit and the display unit are independent of each other. **Clipping** - Tools: - Volume clip - Polygon clip - Draw a selection box ("Requires you to be in orthographic camera mode!") - Remove all clipping volumes - **Clip Task**: No clipping, Highlight, Inside, Outside. - **Clip Method**: Inside any volume, Inside all volumes. - **Clip Targets**: - **Everything**: point clouds, CAD models and vector drawings. - **Point cloud**: point clouds only. **Navigation** - Modes: - Earth control - Fly control - Helicopter control - Orbit control - Avatar control - **Full extent** fits the whole scene into view. - **Camera Animation**. - **Speed** slider. **Scene** - The export/share icon. - The object tree with these branches: - Point clouds - Annotations - Vector layers - CAD files - Images - 360° spheres - Panorama image - Camera - **Properties** of the selected object. **Filters** - **Classification filter**, with All classes and Invert options. - **Returns**: Return Number and Number of Returns. - **Point Source ID**. - **GPS Time**. **About** - Credits for the viewer. **Project owner section** - Project owners get an extra section at the top of the sidebar, before Scene. It has two buttons: - **Set as start view** saves the current view as the project's start view. It shows "Start view saved", or "Error!" on failure. - **Project settings** opens `/projects/<url>/settings` in a new tab. ### Point colouring and display - The sidebar offers only options that the loaded data supports. - There is no Intensity option for a cloud without intensity. - There is no return filter for a cloud without returns. - With the new engine, a cloud without RGB opens coloured by intensity. - A cloud without intensity falls back to elevation colouring. - Available attributes, depending on the data: - RGB - Intensity - Elevation - Color - Indices - Level of detail - Composite - Normals - Classification - Return Number - Number of Returns - Point Source ID - GPS Time - Deviation - Classification flags - Scan angle - User data - Extra attribute - Point settings: - **Point size** and **Minimum size**. - **Point sizing**: Fixed, Attenuated or Adaptive. - **Shape**: Square, Circle or Paraboloid. - **Opacity** makes the cloud truly see-through, and panorama markers show through it. - **Backface Culling** ("hide the backs") hides points facing away from you. It works on clouds that carry normals. - **X-ray** lets points glow through each other. - It opens as a view from above and restores your camera when you switch it off. - Its options are **X-ray strength** and **Octree levels**. - **Normals** shading colours points by surface orientation. It works on clouds with per-point normals, for example from E57 scans. - **Deviation** colours points by their signed deviation value, from blue (below) through white to red (above). - **Scale:** sets the colour scale. - **Hide points outside the scale** hides points outside the chosen tolerance. - When a cloud carries deviation data, the coordinate label of a point measurement shows the deviation value. - **GPS Time** values read as a calendar date and time. Colouring and filtering by time span the whole cloud. - Further options: - **Scalar range** and **Elevation range**. - **Gradient scheme** with Clamp, Repeat or Mirrored repeat. - **Attribute weights**: RGB, Intensity, Elevation, Classification, Return number and Point source ID. - **Gamma**, **Brightness** and **Contrast**. - The classification filter lists only the classes present in the data, under their LAS 1.4 names: - Never classified, Unclassified, Ground - Low vegetation, Medium vegetation, High vegetation - Building, Low point (noise), Key point, Water, Rail, Road surface, Overlap - Wire guard (shield), Wire conductor (phase), Transmission tower, Wire-structure connector (insulator) - Bridge deck, High point (noise), Overhead structure, Ignored ground, Snow, Temporal exclusion - Other: a fallback class for codes outside this list ### Measurements - Measurements are reported to three decimals, with thousands separators. - All readouts, panels and the circle's radius use the display unit. - The azimuth is measured from true north, even on projected grids. - The height, distance and slope tool also reports the horizontal projection and the angles of the run. - Measurement panel options, depending on the tool: - **Create profile from measurement** - **Use as clip volume** - **Reset orientation** - **Make all sides equal** - The volume panel shows Length, Width and Height. Its **Statistics** section has a **Calculate** button, which reports Points, Mean, Standard deviation, Minimum and Maximum. - **Export measurements to DXF** exports your measurements. If there are none, it shows "No measurements to export". - The measuring tools snap to vector drawing lines and their end points. - **Remove all measurements** leaves clip volumes in place. - Touch use: - Each tap places a measurement point. - A long press finishes the measurement. A measurement with too few points is dropped. - You can still move the camera between taps. - Measurement points and clip box handles can be dragged with a finger. - A tap opens a panorama. - Releasing the mouse button or your finger outside the canvas ends the drag. ### Height profile - The **Height profile** window shows **Number of Points**. - Controls: - A rotation amount field (default 10), with rotate clockwise and counter-clockwise buttons. - Move forward and move backward buttons. - Downloads: - `profile_2D.dxf` (2D DXF) - `profile_3D.dxf` (3D DXF) - `profile.csv` (CSV) - `profile.las` (LAS) - Each point is counted once in profile exports. ### Floor flatness - Floor flatness is available only with the new viewer engine. - Click a point on a floor to start a flatness check: - The view switches to an orthographic view from above, centred on the picked point. - Points farther above or below the base height than the chosen band are cut away. - The remaining points are coloured blue (too low), white (on level) or red (too high). - Settings: - **Base height:** and **Deviation range:** step in 1 mm. The default band is ±10 mm. - Imperial users get inches. - **Grid:** sets the grid step and **Contour interval:** the spacing of contour lines. - Statistics are computed from the full-density cloud, not only the points on screen. They include: - mean, standard deviation, minimum and maximum; - number of points; - covered area. - While points load, the viewer shows "Loading points:". **Cancel** stops loading. - **Download PDF** creates an A4 report with the view, the colour scale, the base height and the statistics. In plan view it adds a scale bar and a north arrow. - **Download DXF** creates a DXF file in project coordinates containing: - grid cells coloured and labelled with their mean deviation; - contour lines on the scale's ticks; - a legend. - Messages: - "Too many grid cells for this area: choose a larger grid step." - "No points within the deviation range." - "Some points could not be loaded. Try again later." - Shared and saved views reopen with the same base height and band. ### Clipping - Box and polygon clip volumes are saved with shared views, including each volume's inside/outside mode. - Clip boxes do not block orbiting or panning past them. - CAD models, measurements and vector layers follow the same inside/outside setting as the points. - Panorama markers and annotations outside the clip box disappear. - Clip boxes are computed in full precision, so they stay exact on UTM and national-grid coordinates. ### Navigation and the walkable avatar - Fly mode keys: - W, A, S, D move. - E rises and Q descends. - The mouse wheel zooms the same way in every mode, including orthographic. - Held keys are released when the window loses focus. - **Avatar control** places a 3D character in the scene. The camera follows it over the shoulder. - Avatar keys: - W, A, S, D move the avatar. - Q/E or R/F change its height. - The mouse looks around. - Shift runs at three times the walking speed. - On touch devices, an on-screen joystick does the walking. - Avatar dimensions: - The avatar is about 1.75 m tall, with head height 1.6 m. - The camera starts 3 m away. The minimum distance is 1 m. - These sizes are scaled correctly in projects stored in feet or other units. - The avatar starts at the centre of the scene, at the lowest elevation plus the map offset. - The avatar stands on the scanned surface under its feet, so it follows floors, ramps and terrain. - In avatar mode, the **Map offset** slider appears. It moves with the avatar's height, and dragging it moves the avatar. - The avatar hides when you choose another navigation mode. - The avatar's position is saved in share links. - **Camera Animation** offers Duration, Time, Play, Insert control point and Keyframe. ### 360° panoramas in the viewer - Panoramas of the project appear as 360° spheres, if spheres are enabled in the project's interface settings. - The full-project view shows the spheres of all enabled panoramas. - Owners also get disabled panoramas, loaded hidden. - If an owner re-enables a panorama from the map's context menu, its sphere appears without a page reload. - Intensity panoramas show their intensity image. - Sphere orientation includes pitch and roll only if the project is set to use them. - Opening a panorama: - Double-click a sphere to step inside. - A low-resolution preview appears at once, and high-resolution faces fade in as they download. - Only the panoramas linked to your current position stay visible. - Inside a panorama: - The view locks to perspective. - Your previous projection and field of view are restored when you leave. - A panorama frees its high-resolution images when you leave it. This lets phones and headsets visit many panoramas in a row. - Related buttons and switches: - **Switch to the point cloud** - **Open the nearest panorama** - **Back to 3D view** - The spheres and the panorama image each have their own switch in the Scene tree. - Sphere colour adapts to light or dark backgrounds. - The number of point clouds and 360° spheres loaded is capped at the number of panoramas the project owner's plan allows. The cap does not apply on plans with unlimited panoramas. ### Annotations - Two kinds of notes appear in the scene as annotations at their 3D position: - imported Leica geotags; - comments left on scanned panoramas. - Per-scene and per-sitemap pages show only the annotations of those panoramas. - The annotation title is visible as soon as the page opens. - Clicking the title opens the description, with its photo. Hovering does not open it. - A click outside the box closes it. Dragging the camera does not close it. - Moving to an annotation, from its label or from the sidebar's annotation list, first leaves any open panorama. - Annotation descriptions may contain formatted text. HTML in them is sanitized. ### CAD and BIM models - IFC, OBJ and GLB models load into the scene alongside the point cloud. - OBJ models use a matching `.mtl` material file, if one is present. - GLB models may be Draco-compressed. - Models appear under a **CAD files** branch of the Scene tree. - They are listed in alphanumeric order of file name. - Each model has its own visibility checkbox. - Models are placed at the insertion point given in the project's CAD table. - IFC models are scaled into the project's coordinate unit, so they line up in projects stored in feet or inches. - IFC models placed far from the origin (survey offsets) are shown without jitter. - All models and the avatar share one lighting setup. - GLB models without a texture are brightened. - A loading percentage is shown while models download. - A model that fails to load is skipped, and the remaining models still load. - The loading spinner disappears when all models and drawings have loaded. ### Vector layers - DXF, Shapefile, GeoPackage, GeoJSON and KML drawings load as constant-width lines under the **Vector layers** branch of the Scene tree. - Each file and each CAD layer has its own visibility switch. - Drawings keep their colours, line types, solid fills and text. - Clip boxes cut drawings along with the rest of the scene. - A shared view or start view remembers which layers were switched off. ### Globe (point cloud on map) - The point cloud is shown on a 3D globe. The globe camera follows the viewer's camera, in both perspective and orthographic projection. - A layer chooser offers **OpenStreetMap** and **Satellite (Esri)**. Satellite is selected by default. - The project's KML/KMZ overlays are shown on the globe. - GeoTIFF overlays are shown only on the 2D mini-map. - The **Map offset** slider at the bottom adjusts the height at which the cloud sits on the terrain. - It has **−** and **+** buttons and steps of 0.1. - Its range runs from 0 to the height span of the scene. - For project owners, the map offset is saved to the project a few seconds after the last change. - The globe is not drawn in a VR headset. ### Share links - The **Share** button saves the current scene and creates a link of the form `/projects/<url>/pointcloud?settings=<id>`. You can copy the link. - Who can create share links: anyone who can view the project, including visitors of public or link-shared projects who are not signed in. - A share link stores: - the camera, including orthographic projection; - material settings: colour gradient, gamma, brightness, contrast, and RGB/intensity/elevation weights; - visibility of point clouds, measurements, annotations, 360° spheres, CAD models and vector layers; - box and polygon clip volumes; - splat quality and display units; - floor flatness settings; - the avatar's position. - A shared view only restores view settings. It cannot make the viewer download files from elsewhere or create arbitrary objects. - Views saved with older versions of the viewer still open. - Opening a share link: - The link reopens on the same viewer page it was created on: standard, map or satellite. - Links keep working after the project is renamed. - The `settings` parameter is removed from the address bar after loading. - The view is restored after CAD models and drawings have loaded. - If the saved camera stands at a panorama's position, that panorama opens. - An unknown or unusable share link opens the viewer without restoring settings. - Share links are stored in the project and count toward the project owner's storage. - If the owner has no storage left, saving fails with "There is no storage left on this project, so the link could not be saved." - Creating share links is rate-limited. If too many are created in a short time, the viewer asks you to wait and try again. - The Share button is not available in offline packages of the project. ### Offline packages - In an offline package of the project: - there is no Share button; - the map offset is not saved; - the Globe Mode button is absent on per-scene and per-sitemap pages. ### Point clouds page (project owners) - `/projects/<url>/clouds` is available to project owners only. It lists the project's point clouds: - a **Merged point cloud** table, if a merged cloud exists; - a **Structured point clouds** table. - Columns: #, Name, Points, Size (MB) and Actions. - The Name, Points and Size (MB) columns have header filters. The Name filter supports `*` as a wildcard. - The structured table shows totals of points and size at the bottom. - Actions per cloud: - **Open** opens the viewer with `?cloud=<name>`. - **Thin out** is not available for merged clouds that cannot be thinned. - **Delete** asks "Are you sure you want to delete this?" - Deleting a point cloud does not delete the corresponding panorama. - **Add files to the project** links to `/projects/<url>/add-files-to-the-project`. - **Delete all point clouds** asks "Are you sure you want to delete ALL point clouds? This action cannot be undone." - It deletes the structured point clouds. - The merged point cloud and the created share links remain. - **Process structured point clouds into the merged point cloud** combines separate structured clouds into one merged cloud. - It appears when there is more than one structured cloud. - It runs in the background. - While a background task runs, the page refreshes periodically to show progress. ### Thinning out a point cloud - Thinning deletes the finest detail levels to free disk space. The point cloud stays in place. - To restore the removed detail, you must process the source files again. The action cannot be undone. - How to thin out a cloud: 1. Click **Thin out** for the cloud. 2. Choose a **Detail level**. Each option reads "≈ {spacing} — {points} points, {size}". The gentlest option is preselected. 3. Check the summary: "Now: {points} points, {size}. After: {points_after} points, {size_after}. Frees up {freed}." 4. Confirm with **Thin out**, or close the dialog with **Cancel**. - Thinning runs in the background. - The periodic page refresh pauses while the dialog is open. - If the cloud has a single detail level, the dialog says "This point cloud has a single detail level, so there is nothing to thin out." - An invalid choice shows "There is nothing to thin out in this point cloud." ### Viewer engine (project owners) - The **Viewer engine** setting on the point clouds page offers two engines: - **Legacy bundle**: the previous engine. It stays available but receives no further changes. - **New bundle**: required for floor flatness and the full touch support. - Click **Save** to apply. The page confirms with "Viewer engine saved." - New projects use the new engine. Existing projects keep the legacy engine until switched, and can be switched back at any time. - Owners can preview either engine without saving by adding `?engine=1` or `?engine=2` to the viewer URL. ### Model-to-cloud deviation analysis (project owners) - The **Model-to-cloud deviation analysis** section appears on the point clouds page when the project has a point cloud and an IFC or OBJ model. Its **Calculate deviations** button starts the analysis in the background. - Which model is used: the first IFC model, or the first OBJ model if the project has no IFC. - Which cloud is measured: the merged point cloud. Without a merged cloud, the project must have exactly one structured point cloud. - Every point gets a **Deviation** value: its signed distance to the model surface. - Values are stored in millimetres, whatever the project's coordinate unit. The viewer converts them for display. - Points inside the model's solids get negative values. Points outside get positive values. - Values are limited to ±32,767 mm. - The model's insertion point from the CAD table is taken into account. - The cloud remains viewable while the analysis runs. Progress is shown in the project status. - Running the analysis again replaces the previous values. - Results are viewed with the Deviation colour mode, the deviation filter, and the deviation readout in point labels. ### Created links (project owners) - The **Created links** section of the point clouds page lists all share links of the project, ordered by creation date. - Each entry shows the creation date and time (YYYY-MM-DD HH:MM, in your time zone) and a link that opens the shared view. - The **Delete** button removes a link and frees its storage. ### Messages - "The WebGL context was lost." means the browser's graphics context failed. - "Copied to clipboard" confirms a copy. - "Switch the camera to orthographic projection before drawing a selection box." appears when you try to draw a selection box in perspective projection. ## Virtual tour viewer (360° panoramas) ### Overview - The virtual tour shows a project's 360° panoramas ("setups") and lets visitors move from one setup to the next. - The tour opens at `/projects/<name>/`. - The page title shows `<scene name> :: <project title>`. - Visitors see only enabled setups. - Project owners also see disabled setups. These are listed after the enabled ones, so owners can re-enable them. - If the project's interface settings switch off intensity panoramas, intensity-only panoramas are left out of the tour. - The number of panoramas shown is capped by the panoramas-per-project limit of the project owner's plan. On plans without a limit, all panoramas are shown. - If a project has no panoramas to show, the tour is not displayed. - If the project owner's account has custom tour CSS, it is applied to the tour. ### URL parameters and view state - `?scene=<id>` opens a specific setup. Without it, the tour opens on the first enabled setup. - `pitch`, `yaw` and `fov` restore a camera direction and zoom. All three must be given together with `scene`. - The URL updates as you move between setups and change the view. Copying the address keeps the current setup and view. - The browser Back and Forward buttons move between previously visited setups. - `?autorotate=1` starts auto-rotation, even if the project hides the autorotate button. - `?compare=<YYYY-MM-DD>&cmode=split` or `&cmode=curtain` opens date comparison directly (see "Compare dates"). - `?noUI=1` hides all tour interface elements. This is useful for bare iframe embeds. - `?ui=<key1>,<key2>,...` keeps only the listed interface elements. - `ui` and `noUI` only remove elements. Anything the owner switched off in the project's interface settings stays off. - The same tour can be embedded bare in one place and shown in full elsewhere. - Offline exports of the project ignore `ui` and `noUI`. ### Interface elements controlled by project settings The project's interface settings can switch each of these on or off: - Mini-map button - Welcome overlay - Scene list (left sidebar) - Title - Display-mode button - Autorotate button (off by default) - Fullscreen button - VR button - Device orientation button - Share button - Comments button - 360° spheres button - Compare dates button - Point cloud buttons - Logo - North arrow (off by default) - High-quality panoramas (on by default). When switched off, only low-resolution imagery is loaded. - Intensity panoramas (on by default) ### Title bar - **Scene list** toggle: opens and closes the scene list. - **Title**: shows the current setup name and the project title. - **Project switcher**: if the project is linked to other projects, the project title becomes a dropdown. Choosing another project opens its tour. - **Display mode** button: cycles through three modes. The button shows the short label, and the tooltip shows the full label. - **Auto** ("RGB or Intensity"): intensity-only panoramas show intensity imagery; all others show RGB. - **RGB** ("RGB only"): spheres leading to intensity-only setups are hidden. Intensity-only setups show a placeholder. - **Intensity** ("Intensity only"): spheres leading to RGB-only setups are hidden. RGB-only setups show a placeholder. - The button appears when the project has more than one panorama type, or when its panoramas contain both RGB and intensity. - **Autorotate** (play/pause), when enabled: - Rotates the view slowly. - Resumes after 3 seconds of inactivity. - Runs a slideshow that advances to the next setup every 60 seconds. - **Fullscreen** / **Exit fullscreen**. - **Virtual tour settings** (gear icon): project owners only. ### Scene list - Lists all enabled setups by name. - Setups with comments show a comment icon and "x N", where N is the number of comments. - When the project has more than one sitemap, setups are grouped under sitemap names. - Setups without a sitemap are grouped under "No sitemap". - Each group can be collapsed and expanded by clicking its name. - Clicking a setup opens it. On phones, the list closes after you choose a setup. - Hovering a setup in the list highlights the matching sphere in the panorama and the matching dot on the mini-map. Hovering a sphere or a map dot highlights the matching row in the list. ### Navigating with link spheres - Linked setups appear in the panorama as spheres. - Clicking a sphere moves to that setup, facing the direction of travel. - A sphere's tooltip shows the target setup's name and its distance. - Distances are shown in metres or feet, depending on the user's metric or imperial measurement setting. - Supported project coordinate units are m, cm, mm, ft, US survey ft and in. - Links to disabled setups are not shown. - When several linked setups lie in nearly the same direction (within 10°), only the closest sphere is shown. - When a setup opens, the camera faces a linked "next" setup by default. - Sphere size adapts to the project's scale: - At the project's typical link distance, a sphere takes about 4% of the viewport height. - Closer spheres appear larger and farther ones smaller. - A sphere never grows beyond 5× the typical size. - When the project has a coordinate system (EPSG), sphere directions and distances are measured on the ground relative to true north. The tour looks the same whichever coordinate system the project uses. - Sphere colour: - Normally, a sphere takes the colour of its target setup's sitemap. Without a sitemap colour, it uses a default green. - When coloured links (height gradient) are enabled for the project, spheres are coloured on a rainbow scale by the target setup's elevation. - The mini-map's "Height gradient" checkbox switches the height gradient on and off. ### Controls - Drag to look around. Use the vertical mouse wheel or pinch to zoom. - The maximum field of view is 160°. - Horizontal scrolling (or Shift+wheel) rotates the view. In the Meta Quest browser, the controller thumbstick turns the view. - **Device orientation**: on phones and tablets, moving the device turns the view. On iOS, the browser asks for motion permission first. - **Enter VR**: appears only on devices that support immersive VR, such as VR headsets. - **Share**: opens the share popup with the current URL, including the setup and view. - **360° spheres**: - The main icon ("Enable or disable 360° spheres") hides or shows all spheres. - "+" ("Double the size of 360° spheres") doubles the sphere size. - "−" ("Reduce 360° sphere size by half") halves it. - When a project owner changes the size, it is saved for the project. - **Comments** button: shows the hint "Right-click or tap and hold to create a comment." - The button is visible only to users allowed to comment on the project. - On narrow screens (500 px wide or less), the action buttons collapse behind a "+" ("Controls") button. Tapping outside folds them back. - Clicking outside an open popup closes it. ### Point cloud buttons These buttons are shown when the project has a point cloud and the point cloud buttons are enabled: - **Full point cloud**: opens the whole point cloud in a new tab. - **Point cloud at this setup**: opens the point cloud in a new tab at the current setup's position, with the current view direction and zoom. ### Mini-map - The map button opens a map embedded in the tour. It shows: - Setups as dots - The active setup - The camera direction and field-of-view cone - The project's GeoTIFF and KML overlays, if any - Clicking a map dot opens that setup. - The "Height gradient" checkbox recolours the dots and the panorama spheres by elevation. - Project owners can use the map's context menu to: - Add and delete links - Enable and disable setups - "Add a panorama here" - Project owners can also toggle "Show unlinked stations" and "Show disabled setups" (see "Editing links and setups"). ### Compare dates - Available when the visible setups span more than one capture day. - The capture day is the panorama's capture time when available, otherwise its upload time. - Days are calculated in the viewer's profile timezone, or UTC when no timezone is set. - The **Compare dates** button opens a second pane. This pane shows the setup from the selected date that is closest to the current setup's position. - The **Compare with** dropdown chooses the date. By default, the latest date that differs from the current setup's date is selected. - Each pane is labelled with its date. - **Split screen** mode: - The two panes are shown side by side. - **Camera sync** can be switched on or off. It is on by default. - With sync off, the second pane keeps its own heading. - **Curtain** mode: - The panes overlap with a draggable divider. The divider can be moved between 5% and 95% of the screen width. - Camera sync is always on. - The mode toggle switches between Split screen and Curtain. - The second pane follows every navigation in the main pane: spheres, the scene list, the mini-map, the Back button and the slideshow. - Auto-rotation is turned off when comparison starts. - **Exit comparison** closes the second pane. Going back in browser history past the point where comparison started also exits it. ### Comments - **Who can comment**: users whose access level meets the project's comment access setting. - **Creating a comment**: 1. Right-click (or tap and hold on touch devices) a point in the panorama. 2. Fill in the form: - Text: "Your comment. Safe HTML is allowed". - **Type**: marker shape (square, disc, triangle up, triangle down, or task). - **Color**: marker colour. - Each picker previews the selected marker. 3. Click **Create** to save, or **Cancel** to close. - An empty comment is allowed. It creates a bare marker. - **Attachments**: - **Attach files** accepts multiple files. It is available only to logged-in users. - Attachments are not accepted on projects whose comments are open to any visitor. - **Take photo** opens the camera on phones and tablets. Each photo is named `photo_<date>_<time>`. - Files and photos can be combined in one comment. **Remove attachments** clears them. - While attachments upload, the form shows "Sending..." and "Uploading attachments N%". The comment is saved after all files have uploaded. - Large attachments, such as point clouds, can be uploaded. If the connection drops, attaching the same file again resumes the upload. - Attached files open from `/projects/<name>/tiles/<folder>/files/<file name>`. JPG images open in a popover. - **E-mail notification**: - Members can pick other project members to notify by e-mail. - The list includes the project's owners, users and group members, excluding yourself. - The list is shown only to project members. - **Form behaviour**: - Dismissing the form (Cancel or clicking outside) keeps the draft text but drops attachments. - If saving fails, an error message is shown. The text is kept and the attachments are dropped. - On phones, the form appears as a sheet at the top of the screen. - **Replies**: - Users allowed to comment can reply with the "+" button under a comment. - Enter sends the reply and Escape closes the reply field. - The "Notify participants by email" checkbox sends a notification. - **Deleting**: - Project owners can delete any comment. - Other users can delete their own messages. - Deleting asks "Are you sure you want to delete this?". - In the anonymous-comments display mode, only project owners see delete buttons. - **Display**: - Plain `https://` links in comment text become clickable. Long links are shortened for display. - Comments can embed live MQTT sensor values, which update in the tour. ### Welcome overlay The overlay appears when any of these applies: - The project has welcome text. - The owner is on the free, trial or student plan. A note says the project was created with that version of the platform. - The owner's plan limits how long projects stay available: 'Projects on the "<plan>" plan are available for N days after publication'. - The project has reached the plan's setup limit: 'The "<plan>" plan is limited to N setups per project'. Other details: - Welcome text can be HTML or plain text. In plain text, line breaks are kept. - The **Start** button closes the overlay. - The overlay can be switched off in the project's interface settings. ### Virtual tour settings panel (project owners only) The panel is labelled "This panel is visible only to project owners." It contains: - **Blurring**: opens the blurring tool for the current setup and display mode in a new tab. - **Color correction**: opens the colour correction tool for the current setup and display mode in a new tab. - **Add an alternative panorama**: - Uploads a panorama and places it at the same position as the current one. - Accepted formats are .jpg, .jpeg, .png, .insp and .dng. - Processing takes a few seconds, longer for .insp. The tour then opens the new panorama. - Errors are shown as a message. - From the mini-map, "Add a panorama here" places the new panorama at the clicked map position. - **Set North**: rotate the view to face north (the top of the map), then click "Set North" to save. - Confirmation message: "This will change the panorama orientation. This action cannot be undone. Continue?" - The confirmation is asked once per browser session. - Spheres and comment markers keep their correct positions after the change. - **Show arrow**: shows or hides a north arrow in the panorama. - **Determine north using the sun**: - Finds the sun in the panorama and calculates its real position from the panorama's coordinates and capture time. It then rotates the tour so north points to the top of the map. - It uses the same confirmation as Set North. - It requires: - The sun clearly visible. It does not work in overcast conditions or indoors. - A project coordinate system (EPSG), with the panorama placed on the map. Without one, the button is disabled. - A correct capture date and time, read from EXIF or the file name at import. A few minutes off is fine; an hour off shifts north by about 15°. - An upload timezone that matches the camera clock's timezone. If they differ, the panorama must be re-imported with the correct timezone. - Accuracy is best when the sun is low (morning or evening) and poor when it is nearly overhead. - Check the result against the north arrow. You can fine-tune it with Set North. - **Set as start view**: saves the current view as the project's start view. A message confirms with "Start view saved", or shows "Error!". - **Project settings**: opens the project settings in a new tab. ### Start view - When a project has a start view, visitors who open the viewer URL without their own view parameters land on the saved view. - The `noUI` and `ui` parameters do not stop the redirect; they are carried along with the start view. - A start view can be saved from these viewers: - Virtual tour - 3D Gaussian splatting viewer (`3dgs`) - IFC viewer (`ifc`) - Point cloud (`pointcloud`) - Point cloud on map (`pointcloud-on-map`) - Point cloud on satellite (`pointcloud-on-satellite`) - A start view applies only to the viewer it was saved from. A start view saved in the point cloud does not change where the virtual tour opens. - For point clouds, the start view also keeps measurements, clip volumes and layer visibility. - In the offline archive, the start view's page opens on the saved view. ### Editing links and setups (project owners only) - Right-click (or tap and hold) a sphere to open the context menu: - **Add link to this setup** - **Delete link to this setup** - **Disable this setup** - **Enable this setup** - A disabled setup offers only "Enable this setup". - An enabled setup offers "Disable this setup" plus either Add or Delete, depending on whether it is already linked. - Links work in both directions. Adding or deleting a link updates both setups. - Disabling a setup removes the links leading to it from the tour. Re-enabling it restores them. - Changes appear immediately in the panorama and on the mini-map, without reloading the page. - "Show unlinked stations" (mini-map toggle) shows spheres for all other setups, so new links can be added. - "Show disabled setups" (mini-map toggle) shows disabled setups as spheres, so they can be re-enabled. - Unlinked and disabled targets appear as dashed outlines. Disabled targets are also faded. ## 360-Degree Video Viewer with GPS Track Minimap and Quality Switcher ### Overview - The platform plays 360° videos in equirectangular format (2:1 aspect ratio) inside an interactive panoramic viewer. - A video can have a GPS track. When it does, a minimap shows the route and the current position, synchronized with playback. - The viewer offers a quality switcher, a playback speed selector, sharing with a start time, fullscreen, and VR headset support. - Project owners manage the project's 360° videos on a dedicated settings page. ### Uploading 360° Videos - Upload 360° videos through **Add files to the project** (`/projects/<url>/add-files-to-the-project`). - Only the MP4 container is accepted. - The video's title is the original file name without the extension. - Uploading a file with the same name as an existing 360° video replaces that video. - Processing progress appears as the project's status percentage. #### Quality versions (renditions) The platform converts each upload into one or more quality versions. Each version is a separate MP4 file. | Quality | Resolution | Target bitrate | |---|---|---| | 1080p | 2160×1080 | 6000 kbps | | 2K | 2880×1440 | 10000 kbps | | 4K | 4320×2160 | 18000 kbps | | 5.7K | 5760×2880 | 30000 kbps | - You can choose which quality versions to produce at upload time. - Videos are never upscaled. Only versions whose height does not exceed the source height are produced. - If you select a version above the source resolution, the platform automatically adds the highest version that fits the source. - If none of your selected versions fit the source, the platform produces all versions that fit. - If the source is smaller than 1080 pixels high, the platform produces a single version at the source resolution. #### Encoding options - **Codec:** H.264 (default) or H.265. H.265 produces files about 40% smaller at similar visual quality. H.265 files are encoded so they play in Safari and on iOS. - **Encoding preset:** ultrafast, superfast, veryfast, faster, fast, medium, slow, slower or veryslow. The default is fast. #### What every converted video includes - A keyframe every 1 second, which gives precise seeking. - Streaming support: playback can start before the whole file has downloaded. - Audio, if the source has it: the first audio track, converted to AAC stereo at 128 kbps. - A poster image in WebP format, at most 2048 pixels wide. - The poster is the frame at 1 second. For videos of 2 seconds or less, the middle frame is used. ### GPS Tracks A video gets a GPS track from one of two sources, checked in this order. #### 1. A paired GPX file - Upload a GPX file with the same file name as the MP4, for example `ride.mp4` and `ride.gpx`. - The name and the extension are matched case-insensitively. - The platform uses track points that have a time, a latitude and a longitude. - If the GPX file has no tracks, it uses route points that have a time. - At least 2 points are required. - Points that share the same timestamp are averaged into one point. Some cameras (for example Insta360) record about 10 samples per second but round their times to the second; averaging reduces GPS jitter. - Elevation is kept when present. - Speed is calculated from the distance and time between consecutive points. - The time of the first GPS point is the track's start time. - The first GPS point is aligned with the start of the video. #### 2. GPS telemetry embedded in the MP4 - If no usable GPX file is found, the platform reads GPS latitude, longitude, altitude and GPS date/time (or sample time) embedded in the MP4. - At least 2 GPS samples are required. - If the samples have no usable timestamps, the points are spread evenly over the video's duration. In that case the track has no start time. #### Adding or replacing a track later - You can upload a GPX file on its own. It attaches to, or replaces the track of, an existing 360° video with the same name. - A GPX file with no matching 360° video is ignored. #### Duration mismatch warning - If the GPX duration differs from the video duration by more than 5%, the minimap shows a warning in this form: "GPX duration Xs differs from video duration Ys by Z%". ### The 360° Video List - URL: `/projects/<url>/video360`. - If the project has no 360° videos, the page returns "not found". - If the project has exactly one 360° video, the page redirects straight to its player. - Otherwise, the page shows the project title and "360° videos — N", followed by a grid of cards. - Cards are sorted alphanumerically by title. - Each card shows: - the poster thumbnail - the duration (m:ss, or h:mm:ss for videos of an hour or more) - the source resolution (width×height) - a **GPS** badge ("GPS track available") when the video has a track - the video title - Adding `?noUI` to the URL hides the welcome overlay and the logo. ### The 360° Video Player - URL: `/projects/<url>/video360/<video-name>`. - The page title is "<project title> — <video title>". - When the page is shared on social media, the poster is used as the link preview image. The exception is projects with privacy mode 2 (`privacy_mode` = 2 in the REST API). - Before playback starts, the poster is shown on the panorama, so you can already look around. #### Looking around - Drag with the mouse, finger or stylus to look around. - You can look straight up and straight down, but not beyond. - Use the mouse wheel or a two-finger pinch to zoom. - The field of view ranges from 5° to 140°. - It starts at 90°. - Each wheel step changes it by 3°. - The initial view is turned 90° to the left of the video's front direction. - A short click or tap without dragging toggles play/pause. - On first view, a hint appears: "Drag to look around" and "Use the mouse wheel or pinch to zoom". It disappears on your first drag or wheel action, or after 6 seconds. #### Controls - The control bar is always visible, even before the first play. - The fullscreen button takes the whole panorama fullscreen. - There is no picture-in-picture button. #### Quality menu - The quality button in the control bar shows the current quality: 5.7K, 4K, 2K, 1080p, 720p, or `<height>p` for other sizes. - The menu lists the available versions from highest to lowest. - Switching quality keeps the current playback position. It also keeps the playing or paused state. - There is no automatic or adaptive quality switching. You pick the quality yourself. - By default, the player starts with the highest version your device's graphics can display. - On iPhone and iPad, the default is limited to versions at most 4096 pixels wide. In practice, 2K is the highest default there. - You can still select a higher quality manually. #### Playback speed - The playback speed button sits just left of the quality button. - Available speeds: 0.25×, 0.5×, 1×, 1.5× and 2×. The default is 1×. - The chosen speed stays the same when you switch quality. #### Starting at a specific time - Add `#t=<seconds>` to the player URL to jump to that second and start playing, for example `#t=123.45`. #### Sharing - The bottom-left strip of buttons holds, in order: the map toggle (if the video has a track), **Enter VR** (if available), and **Share**. - **Share** opens a share popup with the page address. - If playback is past 0 seconds, the popup also offers a **Start at m:ss** toggle. The toggle adds `#t=<seconds>` to the link. - Offline project packages: - The list and the player also work there. - Links point to `player.html` pages inside the package. - Share uses the local address shown in the browser, so other devices on the same local network can open it. - The QR code option is not available. #### VR headsets - The **Enter VR** button appears only in browsers that support immersive VR, for example the Meta Quest browser. - Clicking **Enter VR** starts playback and enters VR mode. - In VR mode: - The starting heading matches the direction you were looking in the 2D view. - The controller trigger or a hand pinch toggles play/pause. - Flicking the thumbstick left or right seeks back or forward 10 seconds. Each flick performs one seek; return the stick to the center before the next one. - An **Exit VR** button appears in the top-right corner. The headset's system gesture also exits VR. - Leaving VR restores the previous 2D view. #### Hiding the interface - Adding `?noUI` to the player URL hides the onboarding hint, the logo, the welcome overlay, the **Enter VR** and **Share** buttons, and the GPS minimap. ### GPS Track Minimap The minimap appears when the video has a GPS track with at least 2 points. #### Opening and arranging the map - The map is a floating window. You can drag it, resize it and collapse it. - It opens at a compact 400×400 size. - On small screens (width up to 900 px or height up to 500 px): - The map starts collapsed. - The map toggle button pulses until you use it. - When opened, the map fills the screen. - The map's privacy consent prompt appears only when you open the map. - On larger screens, the map opens immediately. - The map toggle button in the bottom-left corner opens and closes the map. #### What the map shows - The video's route. - A position marker that follows playback. - The project's KML layers, shown as overlays. - The GPS tracks of other 360° videos in the same project, drawn as dimmed lines. #### Interacting with the map - Clicking the route jumps the video to that moment and starts playback. - Clicking another video's track opens that video at the matching moment. - A pop-out larger map window is available. In it, this video's route is the main track. - Clicking this video's route in the pop-out seeks the player. - Clicking another video's track in the pop-out opens that video at the matching second. #### Information panel An information panel below the map updates during playback: - **Time:** the date and time of the current moment, as YYYY-MM-DD HH:MM:SS in your local time zone. It is shown only when the track has a start time. - **Position:** latitude and longitude with 5 decimals, for example `48.12345°, 11.54321°`. - **Speed:** in km/h or mph, with one decimal. - **Track length:** distance covered so far / total distance. - Metric: meters, switching to kilometers with 2 decimals from 1000 m. - Imperial: feet, switching to miles with 2 decimals from 5280 ft. - The duration mismatch warning, if the track has one. Metric or imperial units follow the measurement units set in the viewer's profile. For viewers who are not logged in, the project owner's setting is used. ### Managing 360° Videos (Project Owner) - URL: `/projects/<url>/video360-settings`. - The page requires login and is available only to the project owner. - It refreshes automatically while the project is still processing. #### Video table | Column | Content | |---|---| | # | Row number | | Name | Video title | | Duration | m:ss or h:mm:ss | | Resolution | Source width×height | | Size (MB) | Storage used by the video, with a total at the bottom | | Quality | Produced versions: 1080p, 2k, 4k, 5_7k | | Track | A location pin if the video has a GPS track, otherwise "—" | | Actions | Open, Download, Delete | - Columns have header filters. Use `*` as a wildcard in the Name, Resolution and Quality filters. - A "Visible:" counter shows how many rows match the current filters. - **Add files to the project** opens the upload page. #### Actions - **Open** opens the player in a new tab. - **Download** downloads a quality version as MP4. - With one version, the button downloads it directly as `<name>.mp4`. - With several versions, the button opens a menu of versions. Each file is named `<name>-<version>.mp4`. - Download links have the form `/projects/<url>/video360/<name>/<version>.mp4?download=<file name>`. - **Delete** removes the video after the confirmation "Are you sure you want to delete this?". - Deleting a video frees its storage in the project. - Deleting the last 360° video removes 360° video from the project. ## Virtual tours in VR headsets (WebXR) ### Overview - You can view a virtual tour in a VR headset directly from the browser, with no app to install. - VR mode uses the browser's immersive VR support (WebXR). - Phones placed in a Cardboard-style viewer are supported. - Single-display (mono) devices are also supported. They show the same image to both eyes. ### Entering VR - The virtual tour's action bar has an **Enter VR** button with a headset icon. - The button appears only when the browser and device support immersive VR. On other devices it stays hidden. - A project can be configured to hide the **Enter VR** button. - The VR session starts at the scene the regular viewer is showing. If that scene cannot be loaded, it starts at the tour's first scene. - A new VR session starts facing the scene's default orientation. - VR mode uses the same panorama images as the regular viewer. Scenes that show an intensity image in the regular viewer show the same image in VR. ### What you see in VR - A small white dot, the gaze reticle, is fixed at the centre of your view. You aim at things by looking at them. - **Station links** appear as coloured discs in the direction of each linked station. Their colours match the 360° spheres in the regular viewer. - **Comments** appear as small amber dots at their positions in the panorama. - Station links and comments are the only overlays shown in VR. Other on-screen elements of the regular viewer are not visible in the headset. ### Moving between stations - Look at a link disc to focus it. You must look within about 7° of the disc. - A label below the focused disc shows the linked station's name and the distance to it. - **Gaze to teleport:** after you hold your gaze on a link for 1 second, a white loading ring appears around the disc. The ring fills clockwise from 12 o'clock over 2 seconds, and then you teleport to that station. Teleporting by gaze takes 3 seconds in total. - If you look away before the ring completes, the teleport is cancelled. - If you land facing a link, nothing starts until you have held your gaze for the 1-second delay. - **Teleport instantly:** pull the controller trigger, or pinch with hand tracking, while a link is focused. - The VR session stays active across teleports. The panorama switches in place. ### Reading comments - Look at a comment dot to open a text panel below it with the comment's text. - A focused comment dot gets a softly pulsing white halo. - The panel shows the comment as plain text without formatting. - Long comments are shortened to 280 characters and end with "…". - The panel shows at most 8 lines. ### Turning with the thumbstick - Push either controller's thumbstick left or right to turn your view in that direction. Pushing right turns right. - Each flick turns the view by 30°. - Holding the stick to one side repeats the turn about every 350 ms. - Let the stick return to near the centre before the next single flick. - Your turn is kept when you teleport, so you keep facing the direction you turned to. ### Exiting VR - An **Exit VR** button appears in the top-right corner inside the headset, when the browser supports page overlays in VR. - You can also exit with the headset's own system controls. - After you exit, the regular viewer shows the scene where you ended your VR session. ### Virtual tour action bar - The virtual tour viewer has a row of action buttons. A project can be configured to hide each of them individually. - **Controls (+)**: on mobile devices, a single "+" button collapses the action buttons into the corner. Tap it to expand the row. On desktop the row is always shown. - **Enter VR**: starts VR mode, as described above. It is shown only on supported devices. - **Device orientation**: enables or disables controlling the view by moving your device. - **Share**: opens the share popup. - **Comments**: shows the hint "Right-click or tap and hold to create a comment." - **360° spheres**: "Enable or disable 360° spheres". The small plus and minus icons "Double the size of 360° spheres" and "Reduce 360° sphere size by half". - **Compare dates**: shown only when a date comparison is available for the project.