LogoLogo
HomeAcademyLoginTry for free
  • Welcome
  • What's new
    • Q2 2025
    • Q1 2025
    • Q4 2024
    • Q3 2024
    • Q2 2024
    • Q1 2024
    • Q4 2023
    • Q3 2023
    • Q2 2023
    • Q1 2023
    • Q4 2022
    • Q3 2022
  • FAQs
    • Accounts
    • Migration to the new platform
    • User & organization setup
    • General
    • Builder
    • Workflows
    • Data Observatory
    • Analytics Toolbox
    • Development Tools
    • Deployment Options
    • CARTO Basemaps
    • CARTO for Education
    • Support Packages
    • Security and Compliance
  • Getting started
    • What is CARTO?
    • Quickstart guides
      • Connecting to your data
      • Creating your first map
      • Creating your first workflow
      • Developing your first application
    • CARTO Academy
  • CARTO User Manual
    • Overview
      • Creating your CARTO organization
      • CARTO Cloud Regions
      • CARTO Workspace overview
    • Maps
      • Data sources
        • Simple features
        • Spatial Indexes
        • Pre-generated tilesets
        • Rasters
        • Defining source spatial data
        • Managing data freshness
        • Changing data source location
      • Layers
        • Point
          • Grid point aggregation
          • H3 point aggregation
          • Heatmap point aggregation
          • Cluster point aggregation
        • Polygon
        • Line
        • Grid
        • H3
        • Raster
        • Zoom to layer
      • Widgets
        • Formula widget
        • Category widget
        • Pie widget
        • Histogram widget
        • Range widget
        • Time Series widget
        • Table widget
      • SQL Parameters
        • Date parameter
        • Text parameter
        • Numeric parameter
        • Publishing SQL parameters
      • Interactions
      • Legend
      • Basemaps
        • Basemap selector
      • AI Agents
      • SQL analyses
      • Map view modes
      • Map description
      • Feature selection tool
      • Search locations
      • Measure distances
      • Exporting data
      • Download PDF reports
      • Managing maps
      • Sharing and collaboration
        • Editor collaboration
        • Map preview for editors
        • Map settings for viewers
        • Comments
        • Embedding maps
        • URL parameters
      • Performance considerations
    • Workflows
      • Workflow canvas
      • Results panel
      • Components
        • Aggregation
        • Custom
        • Data Enrichment
        • Data Preparation
        • Generative AI
        • Input / Output
        • Joins
        • Parsers
        • Raster Operations
        • Spatial Accessors
        • Spatial Analysis
        • Spatial Constructors
        • Spatial Indexes
        • Spatial Operations
        • Statistics
        • Tileset Creation
        • BigQuery ML
        • Snowflake ML
        • Google Earth Engine
        • Google Environment APIs
        • Telco Signal Propagation Models
      • Data Sources
      • Scheduling workflows
      • Sharing workflows
      • Using variables in workflows
      • Executing workflows via API
      • Temporary data in Workflows
      • Extension Packages
      • Managing workflows
      • Workflows best practices
    • Data Explorer
      • Creating a map from your data
      • Importing data
        • Importing rasters
      • Geocoding data
      • Optimizing your data
    • Data Observatory
      • Terminology
      • Browsing the Spatial Data Catalog
      • Subscribing to public and premium datasets
      • Accessing free data samples
      • Managing your subscriptions
      • Accessing your subscriptions from your data warehouse
        • Access data in BigQuery
        • Access data in Snowflake
        • Access data in Databricks
        • Access data in Redshift
        • Access data in PostgreSQL
    • Connections
      • Google BigQuery
      • Snowflake
      • Databricks
      • Amazon Redshift
      • PostgreSQL
      • CARTO Data Warehouse
      • Sharing connections
      • Deleting a connection
      • Required permissions
      • IP whitelisting
      • Customer data responsibilities
    • Applications
    • Settings
      • Understanding your organization quotas
      • Activity Data
        • Activity Data Reference
        • Activity Data Examples
        • Activity Data Changelog
      • Users and Groups
        • Inviting users to your organization
        • Managing user roles
        • Deleting users
        • SSO
        • Groups
        • Mapping groups to user roles
      • CARTO Support Access
      • Customizations
        • Customizing appearance and branding
        • Configuring custom color palettes
        • Configuring your organization basemaps
        • Enabling AI Agents
      • Advanced Settings
        • Managing applications
        • Configuring S3 Bucket for Redshift Imports
        • Configuring OAuth connections to Snowflake
        • Configuring OAuth U2M connections to Databricks
        • Configuring S3 Bucket integration for RDS for PostgreSQL Exports in Builder
        • Configuring Workload Identity Federation for BigQuery
      • Data Observatory
      • Deleting your organization
    • Developers
      • Managing Credentials
        • API Base URL
        • API Access Tokens
        • SPA OAuth Clients
        • M2M OAuth Clients
      • Named Sources
  • Data and Analysis
    • Analytics Toolbox Overview
    • Analytics Toolbox for BigQuery
      • Getting access
        • Projects maintained by CARTO in different BigQuery regions
        • Manual installation in your own project
        • Installation in a Google Cloud VPC
        • Core module
      • Key concepts
        • Tilesets
        • Spatial indexes
      • SQL Reference
        • accessors
        • clustering
        • constructors
        • cpg
        • data
        • http_request
        • import
        • geohash
        • h3
        • lds
        • measurements
        • placekey
        • processing
        • quadbin
        • random
        • raster
        • retail
        • routing
        • s2
        • statistics
        • telco
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
        • Working with Raster data
      • Release notes
      • About Analytics Toolbox regions
    • Analytics Toolbox for Snowflake
      • Getting access
        • Native App from Snowflake's Marketplace
        • Manual installation
      • Key concepts
        • Spatial indexes
        • Tilesets
      • SQL Reference
        • accessors
        • clustering
        • constructors
        • data
        • http_request
        • import
        • h3
        • lds
        • measurements
        • placekey
        • processing
        • quadbin
        • random
        • raster
        • retail
        • s2
        • statistics
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
        • Working with Raster data
      • Release Notes
    • Analytics Toolbox for Databricks
      • Getting access
        • Personal (former Single User) cluster
        • Standard (former Shared) cluster
      • Reference
        • lds
        • tiler
      • Guides
      • Release Notes
    • Analytics Toolbox for Redshift
      • Getting access
        • Manual installation in your database
        • Installation in an Amazon Web Services VPC
        • Core version
      • Key concepts
        • Tilesets
        • Spatial indexes
      • SQL Reference
        • clustering
        • constructors
        • data
        • http_request
        • import
        • lds
        • placekey
        • processing
        • quadbin
        • random
        • s2
        • statistics
        • tiler
        • transformations
      • Guides
        • Running queries from Builder
      • Release Notes
    • Analytics Toolbox for PostgreSQL
      • Getting access
        • Manual installation
        • Core version
      • Key concepts
        • Tilesets
        • Spatial Indexes
      • SQL Reference
        • h3
        • quadbin
        • tiler
      • Guides
        • Creating spatial index tilesets
        • Running queries from Builder
      • Release Notes
    • CARTO + Python
      • Installation
      • Authentication Methods
      • Visualizing Data
      • Working with Data
        • How to work with your data in the CARTO Data Warehouse
        • How to access your Data Observatory subscriptions
        • How to access CARTO's Analytics Toolbox for BigQuery and create visualizations via Python notebooks
        • How to access CARTO’s Analytics Toolbox for Snowflake and create visualizations via Python notebooks
        • How to visualize data from Databricks
      • Reference
    • CARTO QGIS Plugin
  • CARTO for Developers
    • Overview
    • Key concepts
      • Architecture
      • Libraries and APIs
      • Authentication methods
        • API Access Tokens
        • OAuth Access Tokens
        • OAuth Clients
      • Connections
      • Data sources
      • Visualization with deck.gl
        • Basemaps
          • CARTO Basemap
          • Google Maps
            • Examples
              • Gallery
              • Getting Started
              • Basic Examples
                • Hello World
                • BigQuery Tileset Layer
                • Data Observatory Tileset Layer
              • Advanced Examples
                • Arc Layer
                • Extrusion
                • Trips Layer
            • What's New
          • Amazon Location
            • Examples
              • Hello World
              • CartoLayer
            • What's New
      • Charts and widgets
      • Filtering and interactivity
      • Integrating Builder maps in your application
      • Summary
    • Quickstart
      • Make your first API call
      • Visualize your first dataset
      • Create your first widget
    • Guides
      • Build a public application
      • Build a private application
      • Build a private application using SSO
      • Visualize massive datasets
      • Integrate CARTO in your existing application
      • Use Boundaries in your application
      • Avoid exposing SQL queries with Named Sources
      • Managing cache in your CARTO applications
    • Reference
      • Deck (@deck.gl reference)
      • Data Sources
        • vectorTableSource
        • vectorQuerySource
        • vectorTilesetSource
        • h3TableSource
        • h3QuerySource
        • h3TilesetSource
        • quadbinTableSource
        • quadbinQuerySource
        • quadbinTilesetSource
        • rasterSource
        • boundaryTableSource
        • boundaryQuerySource
      • Layers (@deck.gl/carto)
      • Widgets
        • Data Sources
        • Server-side vs. client-side
        • Models
          • getFormula
          • getCategories
          • getHistogram
          • getRange
          • getScatter
          • getTimeSeries
          • getTable
      • Filters
        • Column filters
        • Spatial filters
      • fetchMap
      • CARTO APIs Reference
    • Release Notes
    • Examples
    • CARTO for React
      • Guides
        • Getting Started
        • Views
        • Data Sources
        • Layers
        • Widgets
        • Authentication and Authorization
        • Basemaps
        • Look and Feel
        • Query Parameters
        • Code Generator
        • Sample Applications
        • Deployment
        • Upgrade Guide
      • Examples
      • Library Reference
        • Introduction
        • API
        • Auth
        • Basemaps
        • Core
        • Redux
        • UI
        • Widgets
      • Release Notes
  • CARTO Self-Hosted
    • Overview
    • Key concepts
      • Architecture
      • Deployment requirements
    • Quickstarts
      • Single VM deployment (Kots)
      • Orchestrated container deployment (Kots)
      • Advanced Orchestrated container deployment (Helm)
    • Guides
      • Guides (Kots)
        • Configure your own buckets
        • Configure an external in-memory cache
        • Enable Google Basemaps
        • Enable the CARTO Data Warehouse
        • Configure an external proxy
        • Enable BigQuery OAuth connections
        • Configure Single Sign-On (SSO)
        • Use Workload Identity in GCP
        • High availability configuration for CARTO Self-hosted
        • Configure your custom service account
      • Guides (Helm)
        • Configure your own buckets (Helm)
        • Configure an external in-memory cache (Helm)
        • Enable Google Basemaps (Helm)
        • Enable the CARTO Data Warehouse (Helm)
        • Configure an external proxy (Helm)
        • Enable BigQuery OAuth connections (Helm)
        • Configure Single Sign-On (SSO) (Helm)
        • Use Workload Identity in GCP (Helm)
        • Use EKS Pod Identity in AWS (Helm)
        • Enable Redshift imports (Helm)
        • Migrating CARTO Self-hosted installation to an external database (Helm)
        • Advanced customizations (Helm)
        • Configure your custom service account (Helm)
    • Maintenance
      • Maintenance (Kots)
        • Updates
        • Backups
        • Uninstall
        • Rotating keys
        • Monitoring
        • Change the Admin Console password
      • Maintenance (Helm)
        • Monitoring (Helm)
        • Rotating keys (Helm)
        • Uninstall (Helm)
        • Backups (Helm)
        • Updates (Helm)
    • Support
      • Get debug information for Support (Kots)
      • Get debug information for Support (Helm)
    • CARTO Self-hosted Legacy
      • Key concepts
        • Architecture
        • Deployment requirements
      • Quickstarts
        • Single VM deployment (docker-compose)
      • Guides
        • Configure your own buckets
        • Configure an external in-memory cache
        • Enable Google Basemaps
        • Enable the CARTO Data Warehouse
        • Configure an external proxy
        • Enable BigQuery OAuth connections
        • Configure Single Sign-On (SSO)
        • Enable Redshift imports
        • Configure your custom service account
        • Advanced customizations
        • Migrating CARTO Self-Hosted installation to an external database
      • Maintenance
        • Updates
        • Backups
        • Uninstall
        • Rotating keys
        • Monitoring
      • Support
    • Release Notes
  • CARTO Native App for Snowflake Containers
    • Deploying CARTO using Snowflake Container Services
  • Get Help
    • Legal & Compliance
    • Previous libraries and components
    • Migrating your content to the new CARTO platform
Powered by GitBook
On this page
  • CREATE_TILESET
  • CREATE_POINT_AGGREGATION_TILESET
  • Relationship between tile\_resolution and max\_tile\_features/max\_tile\_size\_kb
  • CREATE_SPATIAL_INDEX_TILESET
  • CREATE_SIMPLE_TILESET
  • Relationship between tile\_resolution and max\_tile\_features/max\_tile\_size\_kb

Was this helpful?

Export as PDF
  1. Data and Analysis
  2. Analytics Toolbox for BigQuery
  3. SQL Reference

tiler

PrevioustelcoNexttransformations

Last updated 8 months ago

Was this helpful?

We currently provide procedures to create the following kind of tilesets:

  • Spatial index tiles (aggregates spatial indexes into tiles at specific resolutions)

  • Geometry-based MVT tiles of two types:

    • simple tilesets to visualize features individually

    • aggregation tilesets to generate aggregated point visualizations

Visit the to learn more about tileset types and which procedures to use in each case.

CREATE_TILESET

CREATE_TILESET(input, output_table, options)

Description

Creates a simple tileset. It differs from in that the procedure performs a previous analysis in order to find automatically the right options for the tileset. It is done by extracting all the properties to be included within the tileset and sampling the data in order to avoid BigQuery limitations. Therefore, only input and output_table are mandatory and options can be set to NULL.

  • input: STRING that can either be a quoted qualified table name (e.g. `project-id.dataset-id.table-name`) or a full query contained by parentheses (e.g.(SELECT * FROM `project-id.dataset-id.table-name`)).

  • output_table: Where the resulting table will be stored. It must be a STRING of the form `project-id.dataset-id.table-name`. The project-id can be omitted (in which case the default one will be used). The dataset must exist and the caller needs to have permissions to create a new table on it. The process will fail if the target table already exists.

  • options: STRUCT<name STRING, description STRING,legend STRING, zoom_min INT64, zoom_max INT64, geom_column_name STRING, zoom_min_column STRING, zoom_max_column STRING, max_tile_size_kb INT64, tile_feature_order STRING, drop_duplicates BOOL, extra_metadata STRING>|NULL containing the different options. Valid options are described in the table below.

warning

If a query is passed in input, it might be evaluated multiple times to generate the tileset. Thus, non-deterministic functions, such as should be avoided. If such a function is needed, the query should be saved into a table first and then passed as input, to avoid inconsistent results.

Option
Description

name

description

legend

zoom_min

Default: 0 for POINTS datasets and 2 for POLYGON/LINESTRING datasets. A NUMBER that defines the minimum zoom level for tiles. Any zoom level under this level won't be generated.

zoom_max

Default: 12. A NUMBER that defines the maximum zoom level for tiles. Any zoom level over this level won't be generated.

geom_column_name

Default: "geom". A STRING that contains the name of the geography column that will be used. It must be of type GEOGRAPHY.

zoom_min_column

Default: NULL. It is the column that each row could have to modify its starting zoom. It can be NULL (then zoom_min will be used). It must be a positive number between zoom_min and zoom_max.

zoom_max_column

Default: NULL. It is the column that each row could have to modify its end zoom level. It can be NULL (then zoom_max will be used). It must be a positive number between zoom_min and zoom_max.

max_tile_size_kb

Default: 512. Maximum allowed: 6144. A NUMBER setting the approximate maximum size for a tile in kilobytes. For every zoom level, a consistent fraction of features will be dropped in every tile to make sure all generated tiles are below this maximum.

tile_feature_order

Default: NULL. A STRING defining the order in which properties are added to a tile. This expects the SQL ORDER BY keyword definition, such as "aggregated_total DESC", the "ORDER BY" part isn't necessary. Note that in aggregation tilesets you can only use columns defined as properties, but in simple feature tilesets you can use any source column no matter if it's included in the tile as property or not. This is an expensive operation, so it's recommended to only use it when necessary. If no order is provided, a custom dropping depending on the geometry type is performed. In case of POINT geometries, features are dropped randomly. In case of POLYGON geometries the features are added ordered by their area, while for LINESTRING geometries the criteria is the feature length.

drop_duplicates

Default: false. A BOOLEAN to drop duplicate features in a tile. This will drop only exact matches (both the geometry and the properties are exactly equal). As this requires sorting the properties, which is expensive, it should only be used when necessary.

extra_metadata

Default: {}. A JSON object to specify the custom metadata of the tileset.

tip

Any option left as NULL will take its default value. This also applies for geometry type dependant options such as zoom_min or tile_feature_order.

tip

A fraction_dropped_per_zoom property will be included in the TileJSON, containing an estimate of the percentage of the features that have been dropped per zoom level as a result of applying the drop_fraction_as_needed strategy. Please bear in mind that the exact percentages can be up to 5% higher.

warning

It should be taken into account that CREATE_TILESET will not be executed for any level that reaches more than 10 millions tiles. This threshold is set in order to avoid some BigQuery limitations. This could occur if the input dataset is very sparse or zoom_max is quite large.

warning

There are some cases where capacity pricing is the only option to create a tileset. Some tables containing huge geographies might trigger a Query exceeded resource limits error because of the high CPU usage.

Examples

CALL `carto-un`.carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  NULL
);
CALL `carto-un-eu`.carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  NULL
);
CALL carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  NULL
);

If any of the options introduced above are required, the remaining fields should also be provided or set to NULL. Here is an example of a valid structure for the options parameter (the field alias can be ignored):

CALL `carto-un`.carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  STRUCT(
    "Tileset name" AS name,
    "Tileset description" AS description,
    NULL AS legend,
    0 AS zoom_min,
    10 AS zoom_max,
    "geom" AS geom_column_name,
    NULL AS zoom_min_column,
    NULL AS zoom_max_column,
    1024 AS max_tile_size_kb,
    "RAND() DESC" AS tile_feature_order,
    true AS drop_duplicates,
    R'''
      {
        "custom_metadata": {
          "version": "1.0.0",
          "layer": "layer1"
        }
      }
    ''' AS extra_metadata
  )
);
CALL `carto-un-eu`.carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  STRUCT(
    "Tileset name" AS name,
    "Tileset description" AS description,
    NULL AS legend,
    0 AS zoom_min,
    10 AS zoom_max,
    "geom" AS geom_column_name,
    NULL AS zoom_min_column,
    NULL AS zoom_max_column,
    1024 AS max_tile_size_kb,
    "RAND() DESC" AS tile_feature_order,
    true AS drop_duplicates,
    R'''
      {
        "custom_metadata": {
          "version": "1.0.0",
          "layer": "layer1"
        }
      }
    ''' AS extra_metadata
  )
);
CALL carto.CREATE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  )
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  STRUCT(
    "Tileset name" AS name,
    "Tileset description" AS description,
    NULL AS legend,
    0 AS zoom_min,
    10 AS zoom_max,
    "geom" AS geom_column_name,
    NULL AS zoom_min_column,
    NULL AS zoom_max_column,
    1024 AS max_tile_size_kb,
    "RAND() DESC" AS tile_feature_order,
    true AS drop_duplicates,
    R'''
      {
        "custom_metadata": {
          "version": "1.0.0",
          "layer": "layer1"
        }
      }
    ''' AS extra_metadata
  )
);

warning

Additional examples

CREATE_POINT_AGGREGATION_TILESET

CREATE_POINT_AGGREGATION_TILESET(input, output_table, options)

Description

Generates a point aggregation tileset.

  • input: STRING that can either be a quoted qualified table name (e.g. project-id.dataset-id.table-name) or a full query wrapped in parentheses (e.g.(Select * FROM `project-id.dataset-id.table-name`)).

  • output_table: Where the resulting table will be stored. It must be a STRING of the form project-id.dataset-id.table-name. The project-id can be omitted (in which case the default one will be used). The dataset must exist and the caller needs to have permissions to create a new table on it. The process will fail if the target table already exists.

  • options: STRING containing a valid JSON with the different options. Valid options are described the table below.

warning

Option
Description

geom_column

Default: "geom". A STRING that marks the name of the geography column that will be used. It must be of type GEOGRAPHY.

zoom_min

Default: 0. A NUMBER that defines the minimum zoom level for tiles. Any zoom level under this level won't be generated.

zoom_max

Default: 12. A NUMBER that defines the maximum zoom level for tiles. Any zoom level over this level won't be generated.

zoom_min_column

Default: NULL. It is the column that each row could have to modify its starting zoom. It can be NULL (then zoom_min will be used). When provided, if its value is greater than zoom_min, it will take precedence and be used as the actual minimum.

zoom_max_column

Default: NULL. It is the column that each row could have to modify its end zoom level. It can be NULL (then zoom_max will be used). When provided, if its value is lower than zoom_max, it will be taken as the real maximum zoom level.

target_partitions

target_tilestats

  • Number: MIN, MAX, AVG, SUM and quantiles (from 3 to 20 breaks).

  • String / Boolean: List of the top 10 most common values and their count.

For aggregation tilesets, these statistics refer to the cells at the maximum zoom generated.

tile_extent

Default: 4096. A NUMBER defining the extent of the tile in integer coordinates as defined by the MVT spec.

tile_buffer

Default: 0 (disabled). A NUMBER defining the additional buffer added around the tiles in extent units, which is useful to facilitate geometry stitching across tiles in the renderers. In aggregation tilesets, this property is currently not available and always 0 as no geometries go across tile boundaries.

max_tile_size_kb

Default: 1024 * 4 = 4096 @ tile_resolution of 1. Maximum allowed: 6144. A NUMBER specifying the approximate maximum size for a tile in kilobytes.

max_tile_size_strategy

Default: "throw_error". A STRING that determines what to do when the maximum size of a tile is reached while it is still processing data. There are three options available:

  • "throw_error": The process will throw an error cancelling the aggregation, so no tiles or table will be generated.

  • "drop_fraction_as_needed": For every zoom level, this process will drop a consistent fraction of features in every tile to make sure all generated tiles are below the maximum size set in max_tile_size_kb. This could lead to features disappearing at different zoom levels. Features will be dropped according to the tile_feature_order parameter, which becomes mandatory when using this strategy.

max_tile_features

Default: 0 (disabled). A NUMBER that sets the maximum number of features a tile might contain. This limit is applied before max_tile_size_kb, i.e., the tiler will first drop as many features as needed to keep this amount, and then continue with the size limits (if required). To configure in which order features are kept, use in conjunction with tile_feature_order. The provided value scales by max_tile_features * 4 * tile_resolution^2. See section below.

tile_feature_order

Default: "" (disabled). A STRING defining the order in which properties are added to a tile. This expects the SQL ORDER BY keyword definition, such as "aggregated_total DESC", the "ORDER BY" part isn't necessary. Note that in aggregation tilesets you can only use columns defined as properties, but in simple feature tilesets you can use any source column no matter if it's included in the tile as property or not. This is an expensive operation, so it's recommended to only use it when necessary.

aggregation_type

aggregation_resolution

Default: 6 + 1 => 7 @ tile_resolution of 1. A NUMBER that specifies the resolution of the spatial aggregation. For quadgrid the aggregation for zoom z is done at z + resolution level. For example, with resolution 6, the z0 tile will be divided into cells that match the z6 tiles, or the cells contained in the z10 tile will be the boundaries of the z16 tiles within them. In other words, each tile is subdivided into 4^resolution cells. Note that adding more granularity necessarily means heavier tiles which take longer to be transmitted and processed in the final client, and you are more likely to hit the internal memory limits.

aggregation_placement

Default: "cell-centroid". A STRING that defines what type of geometry will be used for the cells generated in the aggregation. For a quadgrid aggregation, there are currently four options:

  • "cell-centroid": Each feature will be defined as the centroid of the cell, that is, all points that are aggregated together into the cell will be represented in the tile by a single point.

  • "cell": Each feature will be defined as the whole cell, thus the final representation in the tile will be a polygon. This gives more precise coordinates but takes more space in the tile and requires more CPU to process it in the renderer.

  • "features-any": The point representing a feature will be any random point from the source data, that is, if 10 points fall inside a cell it will use the location of one of them to represent the cell itself

  • "features-centroid": The feature will be defined as the centroid (point) of the points that fall into the cell. Note that this only takes into account the points aggregated under a cell, and not the cell shape (as "cell-centroid" does).

metadata

properties

tile_resolution

Default: 1. A FLOAT which determines final tile resolution. Valid values are 0.25, 0.5, 1, 2 and 4 which corrospond to tile sizes of 256px, 512px, 1024px, 2048px and 4096px respectively.

warning

There are some cases where capacity pricing is the only option to create a tileset. Some tables containing huge geographies might trigger a Query exceeded resource limits error because of the high CPU usage.

In web map tilesets, each additional zoom level has 4 times the amount of tiles as the previous zoom. Level 0 has 1 tile, level 1 has 4, level 2 has 16, etc.

For the map viewer, tile_resolution is really a way of using an offset zoom level to load 'large' but few tiles , or 'small' but many tiles. For example, at zoom level 2 we might have to load 16 tiles to fill our screen. By increasing tile_resolution one step (eg. 0.5 to 1), we artificially use one z-level less (zoom level of 1) to load 4 (larger) tiles. Or we could increase tile_resolution two steps (eg. from 0.5 to 2), to artificially use two z-levels less (zoom level of 0) and thus load just one (even larger) tile. Here is a table which illustrates the real requested Z levels based on a tileset's tile_resolution.

Map Zoom
TR 0.25 (256px)
TR 0.5 (512px)
TR 1 (1024px)
TR 2 (2048px)
TR 4 (4096px)

1

2

1

0

0

0

2

3

2

1

0

0

3

4

3

2

1

0

4

5

4

3

2

1

As shown, tile_resolution of 0.5 is where the tileset zoom level and map zoom levels match, so we use 0.5 as our baseline even though the default tile_resolution is 1. Other tile_resolution values (eg, 1, 2, 4) will use offset z-levels when loaded on the map.

Relationship between tile\_resolution and max\_tile\_features/max\_tile\_size\_kb

In the web map viewer, tile_resolution is really a way of using an offset zoom level to load 'larger' but less tiles. For example, at zoom level 3 we might have to load 16 tiles to fill our screen. By increasing tile_resolution one step (eg. 1 to 2), we artificially use one z-level less (zoom level of 2) to load 4 (larger) tiles. Or we could increase tile_resolution two steps (eg. from 1 to 4), we artificially use two z-levels less (zoom level of 1) to load just one (even larger) tile. Here is a table which illustrates the real requested Z levels based on a tilesets tile_resolution.

UI Zoom
TR 0.25 (256px)
TR 0.5 (512px)
TR 1 (1024px)
TR 2 (2048px)
TR 4 (4096px)

1

2

1

0

0

0

2

3

2

1

0

0

3

4

3

2

1

0

4

5

4

3

2

1

As shown, tile_resolution of 0.5 is where the tileset zoom level and map zoom levels match. Other tile_resolution values will need offset z-levels.

At the default tile_resolution of 1, any value set for max_tile_features or max_tile_size_kb will be multiplied by 4. For example, at tile_resolution of 1, a specified value for max_tile_features of 10000 x 4 = 40000. This factor increases to 16 for tile_resolution of 2 and 64 for tile_resolution of 4. Likewise, it decreases to 1 (ie. no change) at tile_resolution 0.5, and 0.25 at tile_resolution of 0.25 (ie. divide by 4).

Although this is somewhat unintuitive, the offset ensures that tilesets generated using the same options (but different tile_resolutions) will always appear the same on the map.

Examples

CALL `carto-un`.carto.CREATE_POINT_AGGREGATION_TILESET(
  R'''(
    SELECT ST_CENTROID(geometry) as geom
    FROM `bigquery-public-data.geo_openstreetmap.planet_features`
    WHERE 'building' IN (SELECT key FROM UNNEST(all_tags)) AND geometry IS NOT NULL
  )''',
  '`your-project.your-dataset.osm_buildings_14_7`',
  R'''
    {
      "zoom_min": 0,
      "zoom_max": 14,
      "aggregation_resolution": 7,
      "aggregation_placement": "cell-centroid",
      "properties": {
        "aggregated_total": {
          "formula": "COUNT(*)",
          "type": "Number"
        }
      }
    }
  ''');
CALL `carto-un-eu`.carto.CREATE_POINT_AGGREGATION_TILESET(
  R'''(
    SELECT ST_CENTROID(geometry) as geom
    FROM `bigquery-public-data.geo_openstreetmap.planet_features`
    WHERE 'building' IN (SELECT key FROM UNNEST(all_tags)) AND geometry IS NOT NULL
  )''',
  '`your-project.your-dataset.osm_buildings_14_7`',
  R'''
    {
      "zoom_min": 0,
      "zoom_max": 14,
      "aggregation_resolution": 7,
      "aggregation_placement": "cell-centroid",
      "properties": {
        "aggregated_total": {
          "formula": "COUNT(*)",
          "type": "Number"
        }
      }
    }
  ''');
CALL carto.CREATE_POINT_AGGREGATION_TILESET(
  R'''(
    SELECT ST_CENTROID(geometry) as geom
    FROM `bigquery-public-data.geo_openstreetmap.planet_features`
    WHERE 'building' IN (SELECT key FROM UNNEST(all_tags)) AND geometry IS NOT NULL
  )''',
  '`your-project.your-dataset.osm_buildings_14_7`',
  R'''
    {
      "zoom_min": 0,
      "zoom_max": 14,
      "aggregation_resolution": 7,
      "aggregation_placement": "cell-centroid",
      "properties": {
        "aggregated_total": {
          "formula": "COUNT(*)",
          "type": "Number"
        }
      }
    }
  ''');

Here is an example of valid properties for a Point Aggregation Tileset:

R'''
{
    "properties": {
        "new_column_name": {
            "formula": "COUNT(*)",
            "type": "Number"
        },
        "most_common_ethnicity": {
            "formula": "APPROX_TOP_COUNT(ethnicity, 1)[OFFSET(0)].value",
            "type": "String"
        },
        "has_other_ethnicities": {
            "formula": "COUNTIF(ethnicity = 'other_race') > 0",
            "type": "Boolean"
        },
        "name": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(name), NULL)",
            "type": "String"
        },
        "address": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(address), NULL)",
            "type": "String"
        }
    }
}
'''
R'''
{
    "properties": {
        "new_column_name": {
            "formula": "COUNT(*)",
            "type": "Number"
        },
        "most_common_ethnicity": {
            "formula": "APPROX_TOP_COUNT(ethnicity, 1)[OFFSET(0)].value",
            "type": "String"
        },
        "has_other_ethnicities": {
            "formula": "COUNTIF(ethnicity = 'other_race') > 0",
            "type": "Boolean"
        },
        "name": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(name), NULL)",
            "type": "String"
        },
        "address": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(address), NULL)",
            "type": "String"
        }
    }
}
'''
R'''
{
    "properties": {
        "new_column_name": {
            "formula": "COUNT(*)",
            "type": "Number"
        },
        "most_common_ethnicity": {
            "formula": "APPROX_TOP_COUNT(ethnicity, 1)[OFFSET(0)].value",
            "type": "String"
        },
        "has_other_ethnicities": {
            "formula": "COUNTIF(ethnicity = 'other_race') > 0",
            "type": "Boolean"
        },
        "name": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(name), NULL)",
            "type": "String"
        },
        "address": {
            "formula": "IF(COUNT(*) <= 1, ANY_VALUE(address), NULL)",
            "type": "String"
        }
    }
}
'''

In the example above, for all features we would get a property "new_column_name" with the number of points that fall in it, the "most_common_ethnicity" of those rows and whether there are points whose ethnicity value matches one specific value ("has_other_ethnicities"). In addition to this, when there is only one point that belongs to this property (and only in that case) we will also get the column values from the source data: "name" and "address".

Additional examples

CREATE_SPATIAL_INDEX_TILESET

CREATE_SPATIAL_INDEX_TILESET(input, output_table, options)

Description

Creates a tileset that uses a spatial index (H3 and QUADBIN are currently supported), aggregating data from an input table that uses that same spatial index.

Aggregated data is computed for all levels between resolution_min and resolution_max. For each resolution level, all tiles for the area covered by the source table are added, with data aggregated at level resolution + aggregation resolution.

  • input: STRING that can either be a quoted qualified table name (e.g. `project-id.dataset-id.table-name`) or a full query contained by parentheses (e.g.(SELECT * FROM `project-id.dataset-id.table-name`)).

  • output_table: Where the resulting table will be stored. It must be a STRING of the form `project-id.dataset-id.table-name`. The project-id can be omitted (in which case the default one will be used). The dataset must exist and the caller needs to have permissions to create a new table on it. The process will fail if the target table already exists.

  • options: STRING containing a valid JSON with the different options. Valid options are described the table below.

warning

Option
Description

resolution_min

Default: 0. A NUMBER that defines the minimum resolution level for tiles. Any resolution level under this level won't be generated.

resolution_max

Default: 12 for QUADBIN tilesets, 6 for H3 tilesets. A NUMBER that defines the maximum resolution level for tiles. Any resolution level over this level won't be generated.

spatial_index_column

A STRING in the format spatial_index_type:column_name, with spatial_index_type being the type of spatial index used in the input table (can be quadbin or h3), and column_name being the name of the column in that input table that contains the tile ids. Notice that the spatial index name is case-sensitive. The type of spatial index also defines the type used in the output table, which will be QUADBIN (for spatial index type quadbin) or H3 (for spatial index type h3).

resolution

A NUMBER defining the resolution of the tiles in the input table.

aggregation_resolution

Defaults: 6 for QUADBIN tilesets, 4 for H3 tilesets. A NUMBER defining the resolution to use when aggregating data at each resolution level. For a given resolution, data is aggregated at resolution_level + aggregation resolution.

properties

A JSON object containing the aggregated properties to add to each tile in the output table. It cannot be empty, since at least one property is needed for aggregating the original values

metadata

tile_resolution

Default: 1. A FLOAT which determines final tile resolution. Valid values are 0.25, 0.5, 1, 2 and 4 which corrospond to tile sizes of 256px, 512px, 1024px, 2048px and 4096px respectively.

tip

Any option left as NULL will take its default value if available.

warning

There are some cases where capacity pricing is the only option to create a tileset. Some tables containing huge geographies might trigger a Query exceeded resource limits error because of the high CPU usage.

Examples

CALL `carto-un`.carto.CREATE_SPATIAL_INDEX_TILESET(
  'YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_QUADBIN_LEVEL14',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_QUADBIN_LEVEL14',
  R'''{
    "spatial_index_column": "quadbin:index",
    "resolution": 14,
    "resolution_min": 0,
    "resolution_max": 8,
    "aggregation_resolution": 6,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);
CALL `carto-un-eu`.carto.CREATE_SPATIAL_INDEX_TILESET(
  'YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_QUADBIN_LEVEL14',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_QUADBIN_LEVEL14',
  R'''{
    "spatial_index_column": "quadbin:index",
    "resolution": 14,
    "resolution_min": 0,
    "resolution_max": 8,
    "aggregation_resolution": 6,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);
CALL carto.CREATE_SPATIAL_INDEX_TILESET(
  'YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_QUADBIN_LEVEL14',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_QUADBIN_LEVEL14',
  R'''{
    "spatial_index_column": "quadbin:index",
    "resolution": 14,
    "resolution_min": 0,
    "resolution_max": 8,
    "aggregation_resolution": 6,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);
CALL `carto-un`.carto.CREATE_SPATIAL_INDEX_TILESET(
  '(SELECT * FROM YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_H3_LEVEL10)',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_H3_LEVEL10',
  R'''{
    "spatial_index_column": "h3:index",
    "resolution": 10,
    "resolution_min": 0,
    "resolution_max": 6,
    "aggregation_resolution": 4,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);
CALL `carto-un-eu`.carto.CREATE_SPATIAL_INDEX_TILESET(
  '(SELECT * FROM YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_H3_LEVEL10)',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_H3_LEVEL10',
  R'''{
    "spatial_index_column": "h3:index",
    "resolution": 10,
    "resolution_min": 0,
    "resolution_max": 6,
    "aggregation_resolution": 4,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);
CALL carto.CREATE_SPATIAL_INDEX_TILESET(
  '(SELECT * FROM YOUR_DATABASE.YOUR_SCHEMA.INPUT_TABLE_H3_LEVEL10)',
  'YOUR_DATABASE.YOUR_SCHEMA.OUTPUT_TILESET_H3_LEVEL10',
  R'''{
    "spatial_index_column": "h3:index",
    "resolution": 10,
    "resolution_min": 0,
    "resolution_max": 6,
    "aggregation_resolution": 4,
    "properties": {
      "population": {
        "formula": "SUM(population)",
        "type": "Number"
      }
    }
  }'''
);

warning

Additional examples

CREATE_SIMPLE_TILESET

CREATE_SIMPLE_TILESET(input, output_table, options)

warning

Description

Generates a simple tileset.

  • input: STRING that can either be a quoted qualified table name (e.g. `project-id.dataset-id.table-name`) or a full query contained by parentheses (e.g.(SELECT * FROM `project-id.dataset-id.table-name`)).

  • output_table: Where the resulting table will be stored. It must be a STRING of the form `projectI-id.dataset-id.table-name`. The project-id can be omitted (in which case the default one will be used). The dataset must exist and the caller needs to have permissions to create a new table on it. The process will fail if the target table already exists.

  • options: STRING containing a valid JSON with the different options. Valid options are described the table below.

tip

warning

Option
Description

geom_column

Default: "geom". A STRING that marks the name of the geography column that will be used. It must be of type GEOGRAPHY.

zoom_min

Default: 0. A NUMBER that defines the minimum zoom level for tiles. Any zoom level under this level won't be generated.

zoom_max

Default: 12. A NUMBER that defines the maximum zoom level for tiles. Any zoom level over this level won't be generated.

zoom_min_column

Default: NULL. It is the column that each row could have to modify its starting zoom. It can be NULL (then zoom_min will be used). When provided, if its value is greater than zoom_min, it will take precedence and be used as the actual minimum.

zoom_max_column

Default: NULL. It is the column that each row could have to modify its end zoom level. It can be NULL (then zoom_max will be used). When provided, if its value is lower than zoom_max, it will be taken as the real maximum zoom level.

target_partitions

target_tilestats

  • Number: MIN, MAX, AVG, SUM and quantiles (from 3 to 20 breaks).

  • String / Boolean: List of the top 10 most common values and their count.

In Simple Tilesets, these statistics are based on the source data.

tile_extent

tile_buffer

Default: 16. A NUMBER defining the additional buffer added around the tiles in extent units, which is useful to facilitate geometry stitching across tiles in the renderers.

max_tile_size_kb

Default: 1024 * 4 = 4096 @ tile_resolution of 1. Maximum allowed: 6144. A NUMBER specifying the approximate maximum size for a tile in kilobytes.

max_tile_size_strategy

Default: "throw_error". A STRING that determines what to do when the maximum size of a tile is reached while it is still processing data. There are three options available:

  • "throw_error": The process will throw an error cancelling the aggregation, so no tiles or table will be generated.

  • "drop_fraction_as_needed": For every zoom level, this process will drop a consistent fraction of features in every tile to make sure all generated tiles are below the maximum size set in max_tile_size_kb. This could lead to features disappearing at different zoom levels. Features will be dropped according to the tile_feature_order parameter, which becomes mandatory when using this strategy.

max_tile_features

Default: 0 (disabled). A NUMBER that sets the maximum number of features a tile might contain. This limit is applied before max_tile_size_kb, i.e., the tiler will first drop as many features as needed to keep this amount, and then continue with the size limits (if required). To configure in which order features are kept, use in conjunction with tile_feature_order. The provided value scales by max_tile_features * 4 * tile_resolution^2. See section below.

tile_feature_order

Default: "" (disabled). A STRING defining the order in which properties are added to a tile. This expects the SQL ORDER BY keyword definition, such as "aggregated_total DESC", the "ORDER BY" part isn't necessary. Note that in aggregation tilesets you can only use columns defined as properties, but in simple feature tilesets you can use any source column no matter if it's included in the tile as property or not. This is an expensive operation, so it's recommended to only use it when necessary.

drop_duplicates

Default: false. A BOOLEAN to drop duplicate features in a tile. This will drop only exact matches (both the geometry and the properties are exactly equal). As this requires sorting the properties, which is expensive, it should only be used when necessary.

generate_feature_id

metadata

properties

Default: {}. A JSON object that defines the extra properties that will be included associated to each cell feature. Each property is defined by its name and type (Number, Boolean or String). Check out the examples included below.

calculate_geoids

Default: false. Generates an additional geoids column that contains the geoid value from each row in the input data that intersects with the tile. The input table must have a column named geoid. This option is required to use the resulting tileset as a boundary.

tile_resolution

Default: 1. A FLOAT which determines final tile resolution. Valid values are 0.25, 0.5, 1, 2 and 4 which corrospond to tile sizes of 256px, 512px, 1024px, 2048px and 4096px respectively.

tip

If drop_fraction_as_needed is used, a fraction_dropped_per_zoom property will be included in the TileJSON, containing an estimate of the percentage of the features that have been dropped per zoom level. Please bear in mind that the exact percentages can be up to 5% higher.

warning

There are some cases where capacity pricing is the only option to create a tileset. Some tables containing huge geographies might trigger a Query exceeded resource limits error because of the high CPU usage.

In web map tilesets, each additional zoom level has 4 times the amount of tiles as the previous zoom. Level 0 has 1 tile, level 1 has 4, level 2 has 16, etc.

For the map viewer, tile_resolution is really a way of using an offset zoom level to load 'large' but few tiles , or 'small' but many tiles. For example, at zoom level 2 we might have to load 16 tiles to fill our screen. By increasing tile_resolution one step (eg. 0.5 to 1), we artificially use one z-level less (zoom level of 1) to load 4 (larger) tiles. Or we could increase tile_resolution two steps (eg. from 0.5 to 2), to artificially use two z-levels less (zoom level of 0) and thus load just one (even larger) tile. Here is a table which illustrates the real requested Z levels based on a tileset's tile_resolution.

Map Zoom
TR 0.25 (256px)
TR 0.5 (512px)
TR 1 (1024px)
TR 2 (2048px)
TR 4 (4096px)

1

2

1

0

0

0

2

3

2

1

0

0

3

4

3

2

1

0

4

5

4

3

2

1

As shown, tile_resolution of 0.5 is where the tileset zoom level and map zoom levels match, so we use 0.5 as our baseline even though the default tile_resolution is 1. Other tile_resolution values (eg, 1, 2, 4) will use offset z-levels when loaded on the map.

Relationship between tile\_resolution and max\_tile\_features/max\_tile\_size\_kb

In the web map viewer, tile_resolution is really a way of using an offset zoom level to load 'larger' but less tiles. For example, at zoom level 3 we might have to load 16 tiles to fill our screen. By increasing tile_resolution one step (eg. 1 to 2), we artificially use one z-level less (zoom level of 2) to load 4 (larger) tiles. Or we could increase tile_resolution two steps (eg. from 1 to 4), we artificially use two z-levels less (zoom level of 1) to load just one (even larger) tile. Here is a table which illustrates the real requested Z levels based on a tilesets tile_resolution.

UI Zoom
TR 0.25 (256px)
TR 0.5 (512px)
TR 1 (1024px)
TR 2 (2048px)
TR 4 (4096px)

1

2

1

0

0

0

2

3

2

1

0

0

3

4

3

2

1

0

4

5

4

3

2

1

As shown, tile_resolution of 0.5 is where the tileset zoom level and map zoom levels match. Other tile_resolution values will need offset z-levels.

At the default tile_resolution of 1, any value set for max_tile_features or max_tile_size_kb will be multiplied by 4. For example, at tile_resolution of 1, a specified value for max_tile_features of 10000 x 4 = 40000. This factor increases to 16 for tile_resolution of 2 and 64 for tile_resolution of 4. Likewise, it decreases to 1 (ie. no change) at tile_resolution 0.5, and 0.25 at tile_resolution of 0.25 (ie. divide by 4).

Although this is somewhat unintuitive, the offset ensures that tilesets generated using the same options (but different tile_resolutions) will always appear the same on the map.

Examples

CALL `carto-un`.carto.CREATE_SIMPLE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  ) _input
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  R'''
  {
    "properties":{
      "type": "String"
    }
  }'''
);
CALL `carto-un-eu`.carto.CREATE_SIMPLE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  ) _input
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  R'''
  {
    "properties":{
      "type": "String"
    }
  }'''
);
CALL carto.CREATE_SIMPLE_TILESET(
  R'''(
    SELECT geom, type
    FROM `carto-do-public-data.natural_earth.geography_glo_roads_410`
  ) _input
  ''',
  R'''`cartobq.maps.natural_earth_roads`''',
  R'''
  {
    "properties":{
      "type": "String"
    }
  }'''
);

In Simple Tilesets, the properties are defined by the source data itself. You only have to write the name of the column (as defined in the source query or table) and its type. It doesn't support any extra transformations or formulae since those can be applied to the source query directly.

R'''
{
    "properties": {
        "source_column_name": "Number",
        "source_column_name_2": "String"
    }
}
'''
R'''
{
    "properties": {
        "source_column_name": "Number",
        "source_column_name_2": "String"
    }
}
'''
R'''
{
    "properties": {
        "source_column_name": "Number",
        "source_column_name_2": "String"
    }
}
'''

Here is an example of a valid JSON for the options parameter:

R'''
{
    "geom_column": "geom",

    "zoom_min": 0,
    "zoom_max": 0,

    "tile_extent": 4096,
    "tile_buffer": 0,

    "max_tile_size_kb": 1024,
    "max_tile_size_strategy": "drop_fraction_as_needed",
    "max_tile_features": 10000,
    "tile_feature_order": "total_pop DESC",

    "target_partitions": 4000,
    "target_tilestats" : true,

    "drop_duplicates": true,
    "properties": {
        "geoid": "String",
        "total_pop": "Number"
    }
}
'''
R'''
{
    "geom_column": "geom",

    "zoom_min": 0,
    "zoom_max": 0,

    "tile_extent": 4096,
    "tile_buffer": 0,

    "max_tile_size_kb": 1024,
    "max_tile_size_strategy": "drop_fraction_as_needed",
    "max_tile_features": 10000,
    "tile_feature_order": "total_pop DESC",

    "target_partitions": 4000,
    "target_tilestats" : true,

    "drop_duplicates": true,
    "properties": {
        "geoid": "String",
        "total_pop": "Number"
    }
}
'''
R'''
{
    "geom_column": "geom",

    "zoom_min": 0,
    "zoom_max": 0,

    "tile_extent": 4096,
    "tile_buffer": 0,

    "max_tile_size_kb": 1024,
    "max_tile_size_strategy": "drop_fraction_as_needed",
    "max_tile_features": 10000,
    "tile_feature_order": "total_pop DESC",

    "target_partitions": 4000,
    "target_tilestats" : true,

    "drop_duplicates": true,
    "properties": {
        "geoid": "String",
        "total_pop": "Number"
    }
}
'''

Additional examples

Default: "". A STRING that contains the name of tileset to be included in the .

Default: "". A STRING that contains a description for the tileset to be included in the .

Default: "". A STRING that contains a legend for the tileset to be included in the .

In case of input is set as a query, it should be taken into account that are not allowed. Also, the query should be as simple as possible in order to avoid BigQuery limitations about the complexity of the final query.

If a query is passed in input, it might be evaluated multiple times to generate the tileset. Thus, non-deterministic functions, such as should be avoided. If such a function is needed, the query should be saved into a table first and then passed as input, to avoid inconsistent results.

Default: 3999. Max: 3999. A NUMBER that defines the maximum number of partitions to be used in the target table. The partition system, which uses a column named carto_partition, divides the available partitions first by zoom level and spatial locality to minimize the cost of tile read requests in web maps. Beware that this does not necessarily mean that all the partitions will be used, as a sparse dataset will leave some of these partitions unused. If you are using consider that it supports a maximum of 500 partitions per table.

Default: true. A BOOLEAN to determine whether to include statistics of the properties in the metadata. These statistics are based on and depend on the property type:

Default: "quadgrid". A STRING defining what kind of spatial aggregation is to be used. Currently only is supported.

Default: {}. A JSON object to specify the associated metadata of the tileset. Use this to set the name, description and legend to be included in the . Other fields will be included in the object extra_metadata.

Default: {}. A JSON object that defines the properties that will be included associated with each cell feature. Each property is defined by its name, type (Number, Boolean, String, etc.) and formula to be applied to the values of the points that fall under the cell. This formula can be any SQL formula that uses an supported by BigQuery and returns the expected type. Note that every property different from Number will be casted to String.

If a query is passed in input, it might be evaluated multiple times to generate the tileset. Thus, non-deterministic functions, such as should be avoided. If such a function is needed, the query should be saved into a table first and then passed as input, to avoid inconsistent results.

Default: {}. A JSON object to specify the associated metadata of the tileset. Use this to set the name, description and legend to be included in the . Other fields will be included in the object extra_metadata.

In case of input being set as a query, it should be taken into account that are not allowed. Also, the query should be as simple as possible in order to avoid BigQuery limitations about the complexity of the final query.

is capable of finding the right configuration for your input data, whereas this procedure requires you to set them yourself. Please use this procedure only if you need a really specific configuration for your tileset or need to tweak a particular option that it's not available in .

To avoid issues in the process when building the queries that will be executed internally against BigQuery, it is highly recommended to use when passing long queries in the input that might contain special characters.

If a query is passed in input, it might be evaluated multiple times to generate the tileset. Thus, non-deterministic functions, such as should be avoided. If such a function is needed, the query should be saved into a table first and then passed as input, to avoid inconsistent results.

Default: 3999. Max: 3999. A NUMBER that defines the maximum amount of partitions to be used in the target table. The partition system, which uses a column named carto_partition, divides the available partitions first by zoom level and spatial locality to minimize the cost of tile read requests in web maps. Beware that this does not necessarily mean that all the partitions will be used, as a sparse dataset will leave some of these partitions unused. If you are using consider that it supports a maximum of 500 partitions per table.

Default: true. A BOOLEAN to determine whether to include statistics of the properties in the metadata. These statistics are based on and depend on the property type:

Default: 4096. A NUMBER defining the extent of the tile in integer coordinates as defined by the .

Default: false. A BOOLEAN used to add a unique numeric id in the .

Default: {}. A JSON object to specify the associated metadata of the tileset. Use this to set the name, description and legend to be included in the . Other fields will be included in the object extra_metadata.

This project has received funding from the research and innovation programme under grant agreement No 960401.

CTEs
Creating simple tilesets
ROW_NUMBER
Creating aggregation tilesets
ROW_NUMBER
CTEs
Creating spatial index tilesets
raw strings
ROW_NUMBER
Creating simple tilesets
Tilesets section
ROW_NUMBER
CREATE_SIMPLE_TILESET
CREATE_TILESET
CREATE_TILESET
TileJSON
TileJSON
TileJSON
BigQuery BI Engine
mapbox-tilestats
quadgrid
TileJSON
aggregate function
TileJSON
BigQuery BI Engine
mapbox-tilestats
MVT specification
MVT tile
TileJSON
European Union’s Horizon 2020