Skip to content
English
  • There are no suggestions because the search field is empty.

How can I use Mapcreator vector tiles in my own mapstyle?

This article describes how to use our vector tiles in your own mapstyle.

You can render maps with our vector tiles using mapping engines such as Maplibre or Mapbox. To make it easier for you to style this data, we’ve created our Maputnik version. Enter your Mapcreator vector token to access it. If you don’t already have one, please contact our team at info@mapcreator.io

This guide introduces the basics of working with our data in your map styles. The examples include both raw JSON snippets and screenshots from Maputnik. For more advanced details on styling, we recommend consulting the official documentation for Maplibre or Mapbox, depending on your chosen rendering engine.

This article is organized into the following sections:

Examples to Get You Started

     -  Adding Disputed Area
     -  Highlight a Country
     -  Hide (Parts of) a Specific Label
o  Overview of Our Vector Tile Sets and Their Source Layers
     -  Base
     -  Administrative
     -  Hillshading
     -  Landcover
Text Field Translations


Examples to Get You Started

If you’re working outside of our Maputnik version, you’ll need to enter your token separately for each data source.

In our Maputnik version, you only need to enter your vector token once to access all data sources. In this case, don’t forget to verify that Include Mapcreator Access Tokens is checked when saving your style. This option should be enabled by default, and ensures that your access token is included in the saved mapstyle wherever it is needed.

save

Don’t forget to add the glyphs URL:
https://vapi.mc-cdn.io/fonts/{fontstack}/{range}.pbf?access_token=YOUR_ACCESS_TOKEN. This will give you access to the fonts. In Maputnik, you can do this in the Style Settings menu.

style settings

In the following section, we’ll go through both workflow options: one using Maputnik and one working directly with the style JSON file.

Adding Layers Using Our Base Data

To use our tiles, you'll need to include our tiles as a source in the sources section of your mapstyle. Use the following URL: https://vapi.mc-cdn.io/dataset/base-v2/json?access_token=YOUR_ACCESS_TOKEN. Don't forget to replace YOUR_ACCESS_TOKEN with a valid access token.

"mc-base-v2": {
"type": "vector",
"url": "https://vapi.mc-cdn.io/dataset/base-v2/json?access_token=YOUR_ACCESS_TOKEN"
}

In Maputnik, you can add one of our default map styles and modify it, or choose an Empty style to start from scratch. To do this, go to Open and click on the desired style.

open map style menu

For this example, we’ll add an Empty style, then go to Data Sources and add the mc-base-v2 source.

mc data sources

Once the data source is added to Maputnik, you can toggle the View in the top bar from Map to Inspect. This will provide you with an interface showing all the layers and features in your data sources. You can inspect the properties of features by hovering over them.

inspect mode

Next up, you'll need to add layers that use this data source. Let's create a background layer first, showing a blue oceanic color.

{
  "id": "Landuse-background",
  "type": "background",
  "layout": {"visibility": "visible"},
  "paint": {
    "background-color": "#85CBFA"
  }
}

In Maptunik, add a new layer using the Add Layer button in the top-left. Set the type to Background and give it an informative ID (for example, Landuse-background):

Now, let's add a layer to show all land.

{
  "id": "Landuse-land",
  "type": "fill",
  "source": "mc-base-v2",
"source-layer": "land_polygons",
"filter": ["==", ["get", "categ"], "land"],
  "layout": {"visibility": "visible"},
  "paint": {
  "fill-color": "rgba(255, 255, 229, 1)",
    "fill-antialias": false
  }
}

This looks as follows in Maputnik. To add the layer:

land_polygons

And then to edit the color:

landuse-land

Let's add a line layer next that shows us the boundaries of all countries. The filter will ensure we only show administrative boundaries with level 2, and that they are not maritime. This makes sure we do not draw other boundaries in this source layer. We also adapt the line width depending on the zoom level.

{
  "id": "Boundary-country",
  "type": "line",
  "source": "mc-base-v2",
  "source-layer": "administrative_boundaries",
  "filter": [
    "all",
    ["==", ["get", "level"], 2],
    ["!", ["has", "is_maritime"]]
  ],
  "paint": {
    "line-color": "rgba(154, 154, 154, 1)",
    "line-width": [
      "interpolate",
      ["linear"],
      ["zoom"],
      0,
      0.5,
      4,
      1,
      6,
      1.3,
      8,
      2,
      12,
      2.5,
      16,
      3,
      23,
      25
    ]
  }
}

admin_boundaries

boundary-country

By default, Maputnik shows the function builder, which is a legacy way to define mapstyle filters in Mapbox/Maplibre. We recommend using expressions instead. To convert a field into an expression, click the fx button. This will allow you to type your expressions as shown in the previous screenshot.

Next up, let's add a label layer to show all country names.

{
  "id": "World-country-name",
  "type": "symbol",
  "source": "mc-base-v2",
  "source-layer": "administrative_names",
  "filter": ["==", ["get", "level"], 2],
  "layout": {
    "text-field": [
      "coalesce",
      ["get", "name:en"],
      ["get", "name"]
    ],
    "symbol-sort-key": [
      "-",
      ["get", "area"]
    ],
    "text-font": ["Arial-BoldMT"],
    "text-size": [
      "interpolate",
      ["linear"],
      ["zoom"],
      6,
      15,
      8,
      18
    ],
    "text-letter-spacing": 0.1
  },
  "maxzoom": 8,
  "minzoom": 0,
  "paint": {
    "text-color": "rgba(110, 110, 110, 1)",
    "text-halo-color": "rgba(255, 255, 255, 1)",
    "text-halo-width": 0.5
  }
}

admin_names

world-country-names

At the time of writing, there is no symbol-sort-key option in the Maputnik interface, so the expression needs to be added manually in the layout section of the JSON. See lines 13 to 16 in the image below:

sort-key

More information about the various source layers within our base data can be found below, as well as recommendations for the expression to be used with the text field property.

Adding Disputed Areas

In the example above, we added all country boundaries. However, if you need more flexibility, you can further filter them to show either disputed or undisputed boundaries. In this case, the setup remains the same as before, but you add one of the following filters.

For disputed boundaries: 

["has", "is_disputed"]

For undisputed boundaries:

["!", ["has", "is_disputed"]]

Additionally, you can apply different styling based on the boundary type. For example, add a dashed line to disputed boundaries: 

 {
  "id": "Boundary-country-disputed",
  "type": "line",
  "source": "mc-base-v2",
  "source-layer": "administrative_boundaries",
  "filter": [
    "all",
    ["==", ["get", "level"], 2],
    ["!", ["has", "is_maritime"]],
    ["has", "is_disputed"]
  ],
  "paint": {
    "line-color": "rgba(154, 154, 154, 1)",
    "line-width": [
      "interpolate",
      ["linear"],
      ["zoom"],
      0,
      0.5,
      4,
      1,
      6,
      1.3,
      8,
      2,
      12,
      2.5,
      16,
      3,
      23,
      25
    ],
    "line-dasharray": [
      "literal",
      [3, 2]
    ]
  },
  "layout": {
    "line-cap": "butt",
    "visibility": "visible",
    "line-join": "round"
  }
}

boundary-country-disputed

Highlight a Country

To highlight a country, we will first add a World Countries source, with URL https://vapi.mc-cdn.io/dataset/saga-countries/json?access_token=YOUR_ACCESS_TOKEN. Don't forget to replace YOUR_ACCESS_TOKEN with your personal access token.

"mc-countries": {
"type": "vector",
"url": "https://vapi.mc-cdn.io/dataset/saga-countries/json?access_token=YOUR_ACCESS_TOKEN&include_token=true"
}

If you work in Maputnik, select the source in the Data Sources menu.

mc-countries

Next up, we add a new polygon layer using this data source and source layer data. We add a filter on the ISO-code property iso. Make sure to add the layer above the background, landuse, and other polygons, but below our lines and labels.

{
  "id": "Italy",
  "type": "fill",
  "source": "mc-countries",
  "source-layer": "data",
  "filter": [
    "all",
    ["==", "iso", "IT"]
  ],
  "paint": {
    "fill-color": "rgba(20, 80, 79, 1)"
  }
}

add layer mc-countries

edit layer mc-countries

Hide (Parts of) a Specific Label

Let's say we have a layer with labels for Iraqi governorates. This might look as follows:

{
  "id": "Iraq-governorates-boundary",
  "type": "line",
  "source": "mc-base-v2",
"source-layer": "administrative_boundaries",
 "filter": [
    "all",
    [
      "match",
      ["get", "level"],
      [3, 4],
      true,
      false
    ],
    ["!", ["has", "is_maritime"]],
    ["==", ["get", "iso_code"], "IQ"]
  ],
  "layout": {"visibility": "visible"},
  "paint": {
    "line-color": "rgba(208, 208, 208, 1)",
    "line-width": [
      "interpolate",
      ["linear"],
      ["zoom"],
      0,
      0.5,
      4,
      1,
      6,
      1.3,
      8,
      2,
      12,
      2.5,
      16,
      3,
      23,
      25
    ]
  }
},
{
  "id": "Iraq-governorates-labels",
  "type": "symbol",
  "source": "mc-base-v2",
  "source-layer": "administrative_names",
  "filter": [
    "all",
    ["==", "level", 4],
    ["==", "iso_code", "IQ"]
  ],
  "layout": {
    "text-field": ["get", "name:en"],
  "text-font": ["Arial-BoldMT"]
}

IQ labels

Even though the word "governorate" is officially part of the administrative divisions, we might want to hide those. We can use an expression for the text field as follows to display the names differently:

[
  "slice",
  ["get", "name:en"],
  0,
  [
    "-",
    ["length", ["get", "name:en"]],
    12
  ]
]

Let's say we want to change a single name on the map. We can use an expression like this:

[
  "match",
  ["get", "name:en"],
  ["Karbala"],
  "Karbala Governorate",
  ["get", "name:en"]
]

Karbala

Overview of Our Vector Tile Sets and Their Source Layers

Base Data

URL: https://vapi.mc-cdn.io/dataset/base-v2/json?access_token=YOUR_ACCESS_TOKEN

The base data is divided into source layers, each belonging to one of three geometry types: polygons, lines, or points. Each source layer has properties derived from OpenStreetMap. These properties can be used to filter the data. For your convenience, a list of these properties per source layer is provided below.

polygons

land_polygons
Property Explanation/value
iso_code  The iso code 
of the country this line is located in. 

 

land_use
Property Explanation/value
type airport, ice, sand, grassland, recreation, park, forest, heath, university, education, hospital, transport, cemetery, residential, retail, industrial, pitch, playground, stadium, golf_course, sports_centre, national_park, protected_area, cape, island, parking, greenhouse, square, bridge, piste, winter_sports, horse_racing, brownfield, construction.

 

water_bodies
Property Explanation/value
is_intermittent If present, indicates that a body of water can regularly fall dry. 
rank 0 till 5, where 0 denotes the most important lakes and 5 the least important ones, based on the area of the polygons in pixels
type lake, strait, canal, reef, bay, or river.

 

buildings
Property Explanation/value
colour The colour of the building (#RGB or textual)
hide_3d Present for building outlines that should not be rendered in 3D, has no value.
render_height The building height in meters.
render_min_height The start rendering height in meters (for building parts which do not start on the ground). 

The properties render_min_height and render_height can be used as the extrusion base and height, respectively. This is useful when rendering buildings in 3D. When hide_3d is present, the building should not be rendered. This is usually the outline of a building that should not be part of the 3D model.

lines

This group includes source layers with both the lines and the labels that run along them. 

administrative_boundaries
Property Explanation/value
is_disputed If present, indicates that the administrative boundary is disputed. 
is_maritime If present, indicates that the administrative boundary lies in the ocean.
iso_code The iso code 
of the country this line is located in. 
level Integer values from 2 to 10 correspond to administrative levels in OSM.

 

roads
Property Explanation/value
name* see the Text Field Translations
bridge_level A whole number indicating the level of elevation. Using this value, bridges and tunnels can be rendered in the correct order.
is_tunnel If present, indicates that the line is a tunnel.
is_construction If present, indicates that the road or track is under construction.
is_private If present, indicates that the road or track is not publicly accessible.
is_one_way If present, indicates this is a unidirectional road.
is_indoor If present, indicates that the road is inside a building.
iso_code The iso code 
of the country this line is located in. This is mainly useful to render road shields and road numbers conditionally.
is_connector If present, indicates that the road is a connector.
is_ramp If present, indicates that the road is a ramp.

international_road_number_cardinal

The numeric part of an international road number (e.g. 105 in "E105"). The property is numeric.

international_road_number_is_non_latin

If present, indicates that the international number contains non-Latin characters.

international_road_number_prefix

The letter prefix of an international road number (e.g. "E" in "E105").

international_road_number_separator

The symbol or character used to separate the prefix and value in an international road number, if applicable (e.g. "–" in "E–105").

international_road_number_value

The numeric part of an international road number (e.g. "105" in "E105"). The property is a string.

road_number_cardinal

The numeric part of a national road number (e.g. 6 in "A6"). The property is numeric.

road_number_is_non_latin

If present, indicates that the national number contains non-Latin characters.

road_number_prefix

The letter prefix of a national road number (e.g. "A" in "A6").

road_number_separator

The symbol or character used to separate the prefix and value in a national road number, if applicable (e.g. "–" in "A–6").

road_number_value

The numeric part of a national road number (e.g. "6" in "A6"). The property is a string.
type motorway, highway, throughway, main, minor, local, service, track, bridleway, pedestrian, cycleway, footway, steps, corridor, platform, raceway, busway, cycleway, footway, bridleway, path.

 

rails
Property Explanation/value
name* see the Text Field Translations
bridge_level A whole number indicating the level of elevation. Using this value, bridges and tunnels can be rendered in the correct order.
is_tunnel If present, indicates that the line is a tunnel.
is_construction If present, indicates that the road or track is under construction.

colour

The colour of the track is commonly used with metros/subways.
is_side_rail If present, indicates that the line is a side rail.
type rail, tram, subway, monorail, narrowrail.

 

aerialways
Property Explanation/value
name* see the Text Field Translations
bridge_level A whole number indicating the level of elevation. Using this value, bridges and tunnels can be rendered in the correct order.
is_indoor If present, indicates that the road is inside a building.
iso_code The iso code 
of the country this line is located in.

 

runways
Property Explanation/value
name* see the Text Field Translations
bridge_level A whole number indicating the level of elevation. Using this value, bridges and tunnels can be rendered in the correct order.
is_construction If present, indicates that the road or track is under construction.
is_indoor If present, indicates that the road is inside a building.
is_one_way If present, indicates this is a unidirectional road.
is_tunnel If present, indicates that the line is a tunnel.

 

waterways 
Property Explanation/value
name* see the Text Field Translations
length The length of the river or stream in meters (in Web Mercator).
area The area of the lake in square meters (in Web Mercator).
bridge_level A whole number indicating the level of elevation. Using this value, bridges and tunnels can be rendered in the correct order.
is_indoor If present, indicates that the road is inside a building.
is_intermittent If present, indicates that a body of water can regularly fall dry.
is_tunnel If present, indicates that the line is a tunnel.
type river, canal, ditch, stream, bay, lake.

 

ski_slopes
Property Explanation/value
name* see the Text Field Translations
difficulty (on pistes) Values like easy, novice, intermediate, advanced, expert, freeride, and more (see OSM).
is_construction If present, indicates that the road or track is under construction.
is_indoor If present, indicates that the road is inside a building.

 

ferry_lines
Property Explanation/value
name* see the Text Field Translations

 

mountain_ranges
Property Explanation/value
name* see the Text Field Translations

 

island_groups
Property Explanation/value
name* see the Text Field Translations

 

plateaus
Property Explanation/value
name* see the Text Field Translations

 

points

place_names
Property Explanation/value
name* see the Text Field Translations
capital_level The capital level of the place. Corresponds to the admin_level values used by OSM. For example, capital_level = 2 usually means it's a country capital, level 4 means it's a state capital in the US and a Bundesländ capital in Germany.
iso_code Only present for places that also have capital_level 2. Contains the iso code of the country the capital belongs to.
population This value should be taken with a grain of salt. It varies in quality and is not always up to date. It can be useful to sort places.
scale_rank Sorting value from natural earth.
sort_order Value between 0 (most important) and 400 (least important) within each tile.
type One of (from large to small) city, town, village, hamlet, borough, suburb, quarter, or neighbourhood.

To order place labels properly, there are a few properties that can help you: sortorder, scalerank, and population. The sortorder is a value between 0 and 400 giving the most important places in each tile. The lower the sortorder, the more cartographically relevant the place. To influence how busy the map looks without leaving desolate areas completely empty, we suggest setting a filter on the sortorder. For example: "filter": ["<=", ["get", "sortorder"], 60]. It is advisable to use the same threshold on every layer with placenames. More importantly, do not use a less strict sortorder on a layer with less important places. The scalerank property comes from Natural Earth and rates the importance of places from 0 to 10. Lastly, the population property can be used. It is recommended to use this as a symbol sort key: "symbol-sort-key": ["-", ["get", "population"]].

 

land_use_names
Property Explanation/value
name* see the Text Field Translations
area  Denotes the area of the source polygon in square meters (in Web Mercator).
type bridge, cemetery, construction, education, forest,
golf_course, grassland, heath, hospital, ice, industrial, national_park, park, pitch, playground, 
protected_area, recreation, residential, retail, sand, square, stadium, transport, university, winter_sports.

 

water_names
Property Explanation/value
name* see the Text Field Translations
area  Denotes the area of the source polygon in square meters (in Web Mercator).
is_intermittent If present, indicates that a body of water can regularly fall dry.
type ocean, sea, bay, cape, lake, reef, river, strait.

 

administrative_names
Property Explanation/value
name* see the Text Field Translations
area  Denotes the area of the source polygon in square meters (in Web Mercator).
iso_code Only present for places that also have capital_level 2. Contains the iso code of the country the capital belongs to.
level Denote the administrative boundaries. Usually, level 2 is the country level, level 4 the first level below that (states in the USA, bundesländer in Germany, etc). For more information, see the OSM wiki.

 

island_names
Property Explanation/value
name* see the Text Field Translations
area  Denotes the area of the source polygon in square meters (in Web Mercator).

 

building_names
Property Explanation/value
name* see the Text Field Translations
area  Denotes the area of the source polygon in square meters (in Web Mercator).

 

motorway_junctions
Property Explanation/value
name* see the Text Field Translations
reference A number or value indicating the exit/junction. See example here.

 

mountain_peaks
Property Explanation/value
name* see the Text Field Translations
elevation Elevation in meters.

 

house_numbers
Property Explanation/value
name* see the Text Field Translations

 

points_of_interest
Property Explanation/value
name* see the Text Field Translations
type pharmacy, clinic, doctors, dentist, veterinary, horse_riding, wildlife_hide, bird_hide, beach_resort, surfing, scuba_dive, sport_centre, fitness, camping, playground, swimming_pool, dog_park, skiing, community_centre, minigolf, casino, arcade, cinema, fountain, theatre, place_of_worship, horse_racing, monument, memorial, castle, museum, artwork, attraction, zoo, theme_park, monastery, archaeological_site, water_park, information, viewpoint, mountain_pass, volcano, grave_yard, marina, marketplace, lighthouse, aquarium, picnic_site, fast_food, restaurant, pub, cafe, bar, apartment, chalet, guest_house, hostel, hotel, motel, thermal, alpine_hut, wilderness_hut, shelter, library, caravan, shop, airport, subway_station, lightrail_station, monorail_station, railway_station, tram_station, bus, ferry, parking, bicycle_parking, park_ride, traffic_light, charging_station, helipad, hospital, dam, recycling, post_office, police, fire_department, bank, atm, kindergarten, dog_toilet, gas_station, ranger_station, diplomatic, government, ngo, townhall, courthouse, mines, power, wind_turbine, crematorium, watermill, windmill, fort.

 

Administrative Data

The Landuse-land layer we added in the first example is a single polygon, which means it can only be styled with one color. If you want to assign different colors to individual countries, you can use the following source: https://vapi.mc-cdn.io/dataset/saga-countries/json?access_token=YOUR_ACCESS_TOKEN.

"mc-countries": {
      "type": "vector",
      "url": "https://vapi.mc-cdn.io/dataset/saga-countries/json"
}

mc-countries data sources

The World Countries source contains separate country polygons that can be filtered by name or iso. For example, you can add one country and assign it a different color from the Landuse-land layer to make it stand out. Let’s assign a unique color to Brazil.

{
    "id": "Brazil",
    "type": "fill",
    "source": "mc-countries",
     "source-layer": "data",
    "filter": ["==", ["get", "iso"], "BR"],
     "layout": {"visibility": "none"},
    "paint": {"fill-color": "rgba(255, 255, 189, 1)"}
   }

Brazil

This layer can be used on top of the Landuse-land layer or independently.

In addition to countries, you can also add regions, municipalities, and other subdivisions. You can explore all available datasets here. Click on a country and check the dropdown to see all the data it contains.

For instance, you can add the states of Brazil by creating a new source in the Data Sources section with the following URL: https://vapi.mc-cdn.io/dataset/saga-brazil/json?access_token=YOUR_ACCESS_TOKEN

Brazil states

Hillshading

You can enrich your map with additional data by including extra data sources. To create a relief effect, you can add a raster data source: https://vapi.mc-cdn.io/dataset/jaxa_terrainrgb/{z}/{x}/{y}?access_token=YOUR_ACCESS_TOKEN. 

"hillshading": {
     "type": "raster-dem",
     "tiles": ["https://vapi.mc-cdn.io/dataset/jaxa_terrainrgb/{z}/{x}/{y}?access_token=YOUR_ACCESS_TOKEN"],
     "minzoom": 0,
     "maxzoom": 12,
     "attribution": "<a href=\"https://earth.jaxa.jp/en/data/policy\" target=\"_blank\">&copy AW3D30 (JAXA)</a>"
    }

In Maputnik, you can add it from the Data Sources menu.

hillshading-3

You can adjust the shades by specifying color values for shadow and accent

The exaggeration parameter controls the layer’s visibility, with values ranging from 0 (fully transparent) to 1 (fully opaque). If you want the hillshading to gradually fade as you zoom in on the map, you can add an interpolation to the value.

{
      "id": "Hillshading",
    "type": "hillshade",
    "source": "hillshading",
      "maxzoom": 24,
      "paint": {
        "hillshade-illumination-anchor": "map",
        "hillshade-exaggeration": [
          "interpolate",
          ["linear"],
          ["zoom"],
          4,
          0.3,
          8,
          0.15
        ],
        "hillshade-shadow-color": "rgba(70, 70, 70, 1)",
        "hillshade-accent-color": "rgba(70, 70, 70, 1)"
      }

hillshading layer


Landcover

To create a natural cover, add the following data source: https://vapi.mc-cdn.io/dataset/landcover/json?access_token=YOUR_ACCESS_TOKEN.

 "landcover": {
      "type": "vector",
      "url": "https://vapi.mc-cdn.io/dataset/landcover/json?access_token=YOUR_ACCESS_TOKEN&include_token=true""
    }

Select it from the Data Sources menu if you work in Maputnik.

landcover-2

Landcover allows you to create layers with different land_type values such as snow, barren, crop, grass, shrub, forest, moss, mangrove, wetland, and urban

As an example, let’s create a layer with the forest.

{
      "id": "Landuse-cover-forest",
    "type": "fill",
      "source": "landcover",
      "source-layer": "data",
      "minzoom": 0,
      "maxzoom": 24,
      "filter": ["==", ["get", "land_type"], "forest"],
      "layout": {"visibility": "visible"},
      "paint": {
      "fill-color": "rgba(230, 248, 223, 1)",
        "fill-antialias": false,
        "fill-opacity": 1
      }

landcover

As you can see, the only required parameters are land_type and color. To create smooth transitions between different types of landcover on the map, we recommend using similar colors for forest, shrub, and grass, with slight variations in brightness or lightness.

Pro tip: The mc-base-v2 source also includes similar categories such as ice, sand, grassland, park, forest, and nationalpark. For better results, you can combine these data sources.

Text Field Translations

Many of our data sources have labels in various translations. We generally support these languages (with the abbreviated ISO-639 language codes in brackets) on top of the native name:

o  English (en)
o  Danish (da)
o  Dutch (nl)
o  Finish (fi)
o  French (fr)
o  German (de)
o  Italian (it)
o  Norse (no)
o  Polish (pl)
o  Portuguese (pt)
o  Spanish (es)
o  Swedish (sv)
o  Japanese (ja)
o  Chinese (zh)
o  Russian (ru)
o  Ukrainian (uk)
o  Latvian (lv)
o  Kazakh (kk)
o  Arabic (ar)

Most of our source layers that have a name property (containing the native name) also have various other properties in the format name:language_code where the language code is either of the language codes listed above. In our base data, there is an additional property name_is_latin that is only present if the native name property contains only Latin characters.

We recommend using this to your advantage in the following way. For each symbol layer with labels, use a coalesce expression as follows. If your desired language uses the Latin script:

"text-field": [
'coalesce',
['get', 'name:language_code'],
['case', ['has', 'name_is_latin'], ['get', 'name'], ['get', 'name:en']],
]

This will make sure that the label will be shown in your desired language, if available. If not, it will fall back to the native name if that uses the Latin script, or English otherwise.

Alternatively, you can simply specify the label order manually like this:

['coalesce', ['get', 'name:language_code'], ['get', 'name:en'], ['get', 'name']]