SDK Embedding
Required roles:
AIS Map SDK Access— Roles
Base endpoint:https://ais-map.ibosoft.net.tr/ais-map-loader.js
Reference documents: none
Attribution: showibonav.aerowherever this data is displayed
Data sources: see the ibonav.aero User Guide; each layer's source is shown in the map's attribution
Last updated: 18 OCT 2026Depending on your use, the original data sources may also need to be credited.
This page embeds the complete ibonav.aero Interactive Map. If you only need the map tiles or the aeronautical data (to show them in your own map or application), see the Tile Server (Layer Lists) and Geo Server sections instead.
SDK embedding builds the ibonav.aero Interactive Map directly in your own page, in a <div> you choose. Unlike frame embedding, the map runs inside your page: you can change its defaults with overrides, reach the OpenLayers map object and add your own layers and interactions on top of it.
One script, ais-map-loader.js, loads all SDK modules and the stylesheet. The map needs OpenLayers on the page and an API access token from your server.
1. Get an access token on your server
-
On your account at
https://auth.ibosoft.net.tr, the responsible person needs the AIS Map SDK Access (ais-data:map-sdk) role. In the ibonav.aero - API & Data Access card they create a personal API token (ibp_…). Keep it on your server only. -
Your server exchanges it for a 1-hour access token:
POST https://auth.ibosoft.net.tr/api/gateway/token Authorization: Bearer ibp_...{ "success": true, "token": "...", "expires_in": 3600, "roles": [] } -
Give your page an endpoint of your own (e.g.
/my-server/ais-map-token) that returns{ token, expires_in }.
Details of tokens and roles: Authorization.
2. Add the map to your page
<!-- OpenLayers (window.ol) — must be loaded BEFORE the loader -->
<link rel="stylesheet" href="https://ais-map.ibosoft.net.tr/openlayers/ol.css">
<script src="https://ais-map.ibosoft.net.tr/openlayers/ol.js"></script>
<div id="map" style="width: 100%; height: 600px;"></div>
<script>
// 1. Overrides — defined BEFORE the loader
window.AisMapConfigOverrides = {
// Required: returns Promise<{ token, expires_in }> from your own server
getAccessToken: function () {
return fetch('/my-server/ais-map-token', { method: 'POST' })
.then(function (r) { return r.json(); });
},
defaultDim: 30,
addDefaultLayers: ['atsairspace_ctr', 'navaid_navaids']
};
// 2. Called once, after every SDK module has loaded
window.AisMapOnReady = function () {
AisMap.init({ target: 'map' });
};
</script>
<!-- 3. The loader: all SDK modules + CSS -->
<script src="https://ais-map.ibosoft.net.tr/ais-map-loader.js"></script>
- OpenLayers: the SDK uses the full OpenLayers build as the global
window.ol(the map itself uses OpenLayers 10.8.0, served athttps://ais-map.ibosoft.net.tr/openlayers/). You may load your own copy instead if it provides the same global. - Token: the SDK adds the token to every data request and calls
getAccessToken()again about 5 minutes before it expires, or when a request is rejected. WithoutgetAccessTokenno data is loaded and the console shows[AisMap] SDK mode needs AisMapConfigOverrides.getAccessToken(). - Roles: in SDK embedding roles are always off. Only the role locks that have an override (Surveillance, ATC broadcasts) can be opened; Google Earth / HGM base maps and the NATO charts stay locked.
- Query strings are read from your page's address (
window.location.search). Avoid using the same parameter names for your own purposes.
3. Wait for the map
The loader loads the modules asynchronously and calls AisMapOnReady once, after all of them have run. Code placed right after the loader tag cannot assume the map is ready. Put every use of AisMap inside AisMapOnReady, or behind a promise it resolves:
<script>
var aisMapReady = new Promise(function (resolve) {
window.AisMapOnReady = function () {
AisMap.init({ target: 'map' });
resolve(AisMap.getMap());
};
});
</script>
<script src="https://ais-map.ibosoft.net.tr/ais-map-loader.js"></script>
<script>
aisMapReady.then(function (olMap) {
// olMap is the ol.Map instance: add your own layers, listen to events …
olMap.on('moveend', function () {
console.log(olMap.getView().getCenter());
});
});
</script>
API
| Call | Description |
|---|---|
AisMap.init(options) |
Builds the map. Call it once, inside AisMapOnReady. |
AisMap.getMap() |
Returns the OpenLayers ol.Map instance (after init). |
init options:
| Option | Type | Description |
|---|---|---|
target |
string |
Required. id of the element the map is drawn in. |
center |
[lon, lat] |
Opening centre in decimal degrees. Wins over everything else, also over the remembered position and mapSetCenter. |
resolution |
number |
Opening resolution (m/px, EPSG:3857). Wins over zoom. |
zoom |
number |
Opening zoom level. |
Overrides
window.AisMapConfigOverrides changes the SDK defaults without touching any SDK file. Define it before the loader. Unknown fields and wrong value types are ignored.
Access
| Field | Type | Description |
|---|---|---|
getAccessToken |
function → Promise<{token, expires_in}> |
Required. Returns an access token from your server (step 1). |
Map view
| Field | Type | Description |
|---|---|---|
defaultCenter |
[lon, lat] |
Opening centre (decimal degrees). |
defaultResolution |
number |
Opening resolution (m/px, EPSG:3857). |
defaultZoom |
number |
Opening zoom level (used when no resolution is set). |
rememberLastPosition |
boolean |
Default true: the viewer's last centre and zoom are saved and restored at the next opening. false: every opening starts from the defaults. |
maxPixelRatio |
number |
Upper limit of the canvas pixel ratio. Default: 2 on desktop, 1 on touch devices (lighter rendering). |
Layers
| Field | Type | Description |
|---|---|---|
overrideDefaultLayers |
boolean |
true: all layers that are on by default start off. |
addDefaultLayers |
string[] |
Layers that start on. Same values as mapLayersAdd: layer code, or for layers without a code the title or Group/Layer path. |
defaultBaseMap |
string |
Base map that starts selected (code as in mapLayersSelectBaseMap). |
overrideDefaultLayers, addDefaultLayers and defaultBaseMap can be combined: first everything is turned off, then the listed layers are turned on.
Display
| Field | Type | Description |
|---|---|---|
defaultDim |
number |
Opening value of the dimmer, 0–100 (%). |
defaultGrid |
boolean |
true: the latitude/longitude grid starts on. |
disableProjectionSelection |
boolean |
true: projection choices in Settings are disabled ("Disabled by application."); the map stays in Web Mercator (EPSG:3857). |
disableContext |
boolean |
true: the map's right-click menu is off; the browser's menu is shown. |
Surveillance (ADS-B)
| Field | Type | Description |
|---|---|---|
disableSurveillance |
boolean |
true: the Surveillance module is removed completely (no button, no layer, no engine scripts loaded). |
surveillanceRequiredRoles |
string[] |
Roles that unlock Surveillance (any one is enough). [] = no lock. Default ['atc-user', 'atc-permanent'], which is never met in SDK embedding, so set [] to offer it (see ATC data). |
surveillanceDataBase |
string |
Base address of the surveillance data feed, without trailing /. Default: the ibonav.aero feed. |
ATC broadcasts
| Field | Type | Description |
|---|---|---|
disableAtcChannels |
boolean |
true: the ATC broadcasts module is removed (no ATC button, no BROADCASTS tab data). |
atcChannelsRequiredRoles |
string[] |
Roles that unlock ATC broadcasts (any one is enough). [] = no lock. Default ['atc-user', 'atc-permanent']. |
atcChannelsUrl |
string |
Address of the channel list (channels.json). Default: https://ibonav.aero/atc-files/configurations/channels.json. |
atcChannelsMax |
number |
Maximum number of channels played at the same time. Default 10. |
Feature listing
| Field | Type | Description |
|---|---|---|
disableBackendCapabilities |
boolean |
true: the layer capabilities are read directly from the Geo Server instead of the PIB API cache (Geo Server Capabilities). Slow when the geo server cache is cold; leave it false unless told otherwise. |
Server addresses
Normally not needed; all default to the ibonav.aero servers.
| Field | Default |
|---|---|
wmsUrl |
https://ais-geoserver.ibosoft.net.tr:2087/cgi-bin/qgis_mapserv.fcgi.exe |
mapproxyUrl |
https://ais-mapproxy.ibosoft.net.tr:2087 |
pibApiUrl |
https://ais-pib-api.ibosoft.net.tr:2087 |
websiteBase |
https://ibonav.aero |
baseUrl |
https://ais-map.ibosoft.net.tr (SDK assets and media) |
Order of precedence
AisMap.init(options) highest (centre / zoom)
query strings one-time, not saved
AisMapConfigOverrides your page
viewer's saved preferences layers, dimmer, projection, last position
SDK defaults lowest
For layers: overrideDefaultLayers and defaultBaseMap apply only to layers the viewer has not changed; a saved choice wins. addDefaultLayers (and mapLayersAdd) always turn their layers on, also over a saved choice. When the viewer resets the layer settings, the saved choices are cleared and the overrides apply in full again.
ATC data
Surveillance (ADS-B) and live ATC broadcasts come through the same access token. The person who created the personal token needs the matching developer role as well:
| Data | Role |
|---|---|
| Surveillance | ATC Surveillance Access (ais-data:atc-surveillance) |
| ATC broadcasts | ATC Broadcasts Access (ais-data:atc-broadcasts) |
Then turn off the map's own role locks, since access is checked by the server from the token:
window.AisMapConfigOverrides = {
getAccessToken: function () { /* … */ },
surveillanceRequiredRoles: [],
atcChannelsRequiredRoles: []
};
D-ATIS and DCL in the aerodrome ATC tab need no extra role.
Examples
Start empty, satellite base map, a few layers:
window.AisMapConfigOverrides = {
getAccessToken: getToken,
overrideDefaultLayers: true,
defaultBaseMap: 'web_esri_imagery',
addDefaultLayers: ['navaid_navaids', 'atsairspace_ctr', 'atsairspace_tma']
};
Fixed view centred on Istanbul, no projection change, no remembered position:
window.AisMapConfigOverrides = {
getAccessToken: getToken,
defaultCenter: [28.97, 41.01],
defaultResolution: 300,
rememberLastPosition: false,
disableProjectionSelection: true
};
Coverage of one group only (the same 10000 ft title exists in several groups, so the path is used):
window.AisMapConfigOverrides = {
getAccessToken: getToken,
addDefaultLayers: [
'Ibosoft ATC 1090 MHz Coverage/10000 ft',
'Ibosoft ATC 1090 MHz Coverage/30000 ft'
]
};