Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
In this example, we will locate and select features on the map, for a given postal code.
In the example dataset, we will use the layer "Places", id=6. We will search on the postal code attribute (CODE_POSTA), and return all places having the given postal code.
Try it out in Codepen.io
Extensions are plug-ins for JMap NG App that extend its functionalities. With the JMap NG API, you can develop your own extensions.
Extensions can add their own UI, typically an icon and a side panel. It is possible to have extensions with a different UI and even with no UI at all.
NG Extensions are javascript objects that respect an interface (either JCoreExtension or JAppExtension) and that are loaded by NG at application startup or project load, depending on the type of the extension. Every extension must have a unique id
property, a initFn
implementation, if implementing JCoreExtension, and a onPanelCreation
implementation if implementing JAppExtension.
Extension life cycle
Extensions are being "registered" by NG in 2 different ways:
if included in the JMap NG startup options, they will be automatically registered by NG.
If loaded from a javascript <script>
tag or via a project load, the extension must register itself. This is typically done in the extension "entry point" by calling the JMap.Extension.register method, for a Core extension, or JMap.Application.Extension.register method, for an Application extension.
The registering process most importantly includes incorporating your extension's redux reducers, if provided, your translation bundle, if provided, and the extension service to expose, if provided.
When NG registers your extension, it automatically calls your extension's initFn
and onPanelCreation
methods. In your initFn
or onPanelCreation
method, you can handle all your extension's initializing process. Once the initFn
method is called, you can start calling NG's API to communicate with it.
Extension unique ID
The Extension Unique ID serves a dual purpose for NG: it used by NG to identifiy and manage the loading process of extensions, while also establishing a connection with a server-side extension. This connection can link your extension to specific JMap projects, optionally allowing for the transmission of configuration data to your extension during project loading. The nature of your unique id thus depends on your way of deploying it.
How to deploy your extension
Once your extension is ready to deploy, you can compile it and host it on any CDN of your choice. If your extension is loaded via a project, the URL of your CDN will be configured in the server-side part of your extension. If you include your extension as a <script>
tag in an HTML page, you will be able to use the CDN's url. In all cases, this url should always be accessible from the location where NG will run.
You can see a full extension example here.
You can provide startup options to the JMap NG Core library or the JMap NG App.
Those options let you customize the behaviour of JMap NG at startup.
You can pass those options as URL parameters:
Or pass them as a JS object, through a globally scoped JS variable named JMAP_OPTIONS, like this:
All options are available as JS parameters, and some are also available as URL parameters. All URL query parameters are prefixed with "ng", to avoid naming collisions with eventual third-party query parameters (especially true if JMap NG is embeded in a div for instance).
The following tables present the list of JMap NG Core library's startup options:
Map options are gathered in a "map" json object in the javascript configuration.
The following table presents the list of JMap NG App's startup options:
You can start JMap NG Core in a div of your website, or as a full page application.
To use the JMap NG Core library, simply import the JMap NG Core Javascript library from our CDN link.
Make sure the version of the library matches the version of your JMap Server instance.
You have to specify options to the library:
More information about startup options here
Try it out in Codepen.io
Instead of running JMap NG Core inside a DIV, you can start it directly in the body of the web page for a full page experience.
Try it out in Codepen.io
This manual is for developers who want to use JMap NG to create map visualization applications for the web, integrate mapping capabilities into their web applications or extend existing JMap NG tools. JMap NG connects to your instance of JMap Server and opens JMap projects.
Depending on the needs, one of two different approaches may be selected: using JMap NG Core or using JMap NG App.
Both JMap NG Core and JMap NG App can be easily embedded in you web applications or web sites. This manual explains how to do it and provides running examples that you can use to get started.
It’s a library for building map visualization applications for the web. It connects to a JMap Server instance to load and display a map project. It is based on the MapLibre GL JS open source project. It does not include any UI except for the mouseover popups and basic map controls. It is useful when you need only the map but want to build your own UI around it.
JMap NG Core provides a JavaScript API to perform simple tasks and JMap related tasks like getting a JMap Project, managing layers and accessing feature attributes. It also exposes the full MapLibre GL JS API for other tasks.
The latest version of the JMap NG Core Javascript API documentation is available here.
It’s a complete map visualization application based on JMap NG Core. It provides a complete UI with many ready to use tools such as measuring, selecting, editing features, printing. It does not require any programming but provides a JavaScript API and can be extended by writing JMap NG extensions. JMap NG extensions are modules that plug easily into JMap NG to extend its capabilities, perform custom tasks or to support the integration of JMap NG into another web application.
The latest version JMap NG App Javascript API documentation is available here.
You can start JMap NG App in a div of your website, or as a full page application.
You must import App js files from our CDN links (it will automatically load the JMap Core dependency).
Make sure the version of the library matches the version of your JMap backend (JMap Cloud or JMap Server).
You have to provide required and optional parameters to the library and the app:
More information about startup options here
Try it out in Codepen.io
Try it out in Codepen.io
In this example, we will show how to add one or multiple attributions on the map in JMap NG.
Note that attributions are available in both NG Core and NG App.
In the example bellow, we add a single attribution composed of one hyperlink forwarding to k2geospatial website.
Try it out in
You can add multiple attributions in one call.
In this example, we add two attributions, one composed of a hyperlink forwarding to stackoverflow website and the other composed of a random image forwading to an example domain.
The following pages contain source code examples that you can run or modifiy in Codepen.io.
In all examples, you must import the JMap NG core or app library from our CDN with a command like this:
or
The specific version of the library that you import must match the version of your backend. For JMap Cloud, always use version 'jmapcloud'. For JMap Server, use the version that matches your setup (for instance, 7_Jakarta_HF6 or 7_Kathmandu_HF3). New versions of JMap NG libraries are published for each release of JMap Server.
The mouseover is a popup window that is displayed after clicking on features on the map.
If no mouseover content is set in the layer configuration, no popup is displayed when clicking on a feature of that layer.
You can set your own mouseover content programatically in Javascript. For instance, you can add a mouseover on a layer that has no mousoever content in its configuration.
In the following example, the layer "Hydrography", id=3, has no mouseover defined.
We will set a custom mouseover content that:
Always displays a custom header
Displays the mouseover content for a clicked hydrography feature
Avoids displaying a mouseover for the "Event" layer (blue dots on the map)
Always displays a custom footer
JMap NG extensions are plug-in modules taht can exetend the functionalities present in JMap NG App. You can develop and add your own extensions.
For more information about JMap NG extensions, refer to this .
The JMap NG App extension API documentation is available .
The example bellow shows a simple extension that creates a panel and displays some text on it.
Try it out in
There is another way to load your extension, after the JMap NG App has been loaded.
You can register the previous extension like this:
The example bellow shows you a more sophisticated extension named "Favourite locations".
It adds points on the map where you click, and displays a list of your "favourite" locations. You can also toggle the visibility of the point layer.
Try it out in
Try it out in
Try it out in
Option
Description
JavaScript Example
URL Parameter Example
Value
Login as anonymous user
If true, the lib will try to log in as an anonymous user. (api doc)
anonymous: true
ngAnonymous=true
true | false
Default Basemap Id
If set, will use the basemap id as default basemap when loading a project. Using "none" will disable any default basemap.(api doc)
defaultBasemapId: "mapbox-satellite-streets"
ngDefaultBasemapId=mapbox-satellite-streets
string
Disable Basemaps
If true, no basemap will be available/displayed. In JMap NG App, no basemap panel will be displayed in the left panel. (api doc)
disableBasemaps: true
ngDisableBasemaps= true
true | false
Disable project change
If true, changing project (after one has been loaded) will be disabled. (api doc)
disableProjectChange: true
ngDisableProjectChange= true
true | false
Extensions
You can provide your own Core extensions. (api doc)
{ extensions: [ … ] }
-
json / javascript
Extensions overrides
During the development of a project extension, you can use this option to load your local code instead of the project's extension's jsUrl. (api doc)
{ extensionsUrlOverride: [ … ] }
-
json
Enable/Disable Geolocation
By default, the geolocation is activated (if the browser supports it). You can disable the geolocation by using this option. (api doc)
geolocationEnabled: false
ngGeolocationEnabled =false
true | false
Disable UI visibility
If set to true, NG Core will not display a basic UI providing loading progress information, a login form and a project list. By default, this option is disabled in NG App. (api doc)
hideMainLayout: true
-
true | false
Session language
If set to any of the locales supported by JMap NG, it will define the session locale, bypassing browser or user-defined locale. (api doc)
locale: “en“
ngLocale=fr
string
Project thumbnails
If true will load all project thumbnails (base 64 images) asynchronously. (api doc)
loadProjectThumbnails: true
-
boolean
Project id
Id of the JMap project to open. (api doc)
projectId: 12
ngProjectId=12
number
Project name
Name of the JMap project to open. If both a project id and a project name are provided, project id will be used. (api doc)
projectName: “World“
ngProjectName=The world url encoded => ngProjectName=World
string
Projects loaded callback
You can provide some JS code to be executed when all project definitions have been loaded from the backend. (api doc)
onProjectsChange: (params) => console.log( params.projects )
-
javascript function() => void
Rest API URL
The Rest API URL of your JMap Server instance. Not used for JMap Cloud. (api doc)
restBaseUrl: “http://your-server/services/rest/v2.0“
-
string
Session token
A JMap session token (aka sessionId). If valid, will be used to identify the user. Not used for JMap Cloud. (api doc)
token: “123456789“
ngToken=123456789
number
Option
Description
JavaScript Example
URL Parameter Example
Value
Map initial bearing
The initial bearing of the map (counterclockwise rotation). (api doc)
map: { bearing: 90 }
ngBearing=90
number
Center
Will center the map on the specified point. (api doc)
map: { center: { x: 12.4, y: 45.34 } }
-
json
Html container id
You can place the map in the HTML div of your choice by identifying the div in the map parameter. If not set, a div is appended in the body root. (api doc)
map: { containerId: “my-div“ }
-
string
Extent
Will adjust the map to fit the extent. (sw = bbox south-west, ne = bbox north-east) (api doc)
map: { extent: { sw: { x: 12.4, y: 45.34 }, ne: { x: 24.4, y: 55.34} } }
ngExtent=12.48|45.34 |24.4|55.34 url encoded => ngExtent=12.48%7C45.34 %7C24.4%7C55.34
json | string
Rotation control
By default, the map rotation control is visible, but can be hidden with this parameter. (api doc)
map: { mapRotation ControlVisible: true }
ngMapRotationControl Visible=false
true | false
Google Maps Api Key
If no Google Maps API key is set in the JMap Cloud or JMap Server configuration, you can provide the API key as a JS parameter. The Google Maps API key is not mandatory, but if you don't provide one you won't have access to the Google Maps basemaps. (api doc)
map: { googleMapsApiKey: “Bse….32k“ }
-
string
Mapbox token
If no Mapbox access token is set in the JMap Cloud or JMap Server configuration, you can provide the token as a JS parameter. The Mapbox token is not mandatory, but if you don't provide one you won't have access to the Mapbox basemaps. (api doc)
map: { mapboxToken: “xgb….4f5“ }
-
string
Navigation history control visibility
By default, the navigation history control is visible, but can be hidden with this parameter. (api doc)
map: { navigationHistory ControlVisible: true }
ngNavigationHistory ControlVisible=true
true | false
Map ready callback
This function is triggered only once, the first time the map is loaded. (api doc)
map: { onStartupMapReadyFn: map => { console.log(“The map is ready“, map) } }
-
javascript function(map: mapboxgl.Map) => void
Map initial rotation
The initial rotation of the map (clockwise rotation). (api doc)
map: { rotation: 45 }
ngRotation=45
number
Scale-control position
The scale control position on the map. (api doc)
map: { scaleControlPosition: “bottom-right“ }
-
“top-left” | “top-right” | “bottom-right” | “bottom-left”
Scale-control unit
The scale control unit. (api doc)
map: { scaleControlUnit: “imperial“ }
-
imperial | metric | nautical
Scale-control visibility
By default, the scale control is visible, but can be hidden with this parameter. (api doc)
map: { scaleControlVisible: true }
-
true | false
Search
When the map is loaded, will execute a search by attribute(s) on the layer, and zoom to the matching features. You can search using multiple attribute values by passing an array in the javascript form, or by passing trailing values in the URL form (api doc). An optional parameter lets you specify to display a MouseOver popup on the result feature. This popup wil only be displayed if the showMapPopup parameter is true, and if there is only one result to the search. In the URL form, showMapPopup must be passed as a keyword, and at the beginning of the query string
map:{ search: { layerId: 2, attributeName: “PEC“, attributeValue: [“RT 201“, "RT 202"], showMapPopup: true } }
ngSearch=showMapPopup |2|PEC|RT 201|RT 202 url encoded => ngSearch=showMapPopup %7C2%7CPEC %7CRT%20201 %7CRT%20202
json | string
Zoom level
The initial zoom level of the map. (api doc)
map: { zoom: 5.3456 }
-
number
Option
Description
JavaScript Example
URL Parameter Example
Value
Div container id
You can choose the div where the application (and the map) will be rendered in your page. (api doc)
application: { containerId: “my-app“, … }
-
string
Disable panels
Will disable (and hide) the specified panels. (api doc)
application: { disabledPanels: [ “print“, “mapcontext“ ], … }
ngDisabledPanels= print,mapcontext
Array | string
Extensions
You can provide your own application extensions . See the examples section for details. (api doc)
application: { extensions: [ … ] }
-
json / javascript
Login screen background image
You can set a custom background image for the login screen by setting an image url. This image will be displayed to the left of the JMap NG login form. (api doc)
application: { loginBackgroundImageUrl: “http://my-server/my-image“, … }
-
string
Logo image
You can set a custom logo image by setting an image url. The logo will be displayed above the JMap NG login form. (api doc)
application: { logoImageUrl: “http://my-server/my-image“, … }
-
string
App loaded callback
You can provide JS code that will be executed when the app is ready. (api doc)
application: { onAppLoad: () => console.log(“App is loaded“), … }
-
javascript function() => void
App unloaded callback
You can provide JS code that will be executed when the app is unloaded. (api doc)
application: { onAppUnload: () => console.log(“App is not loaded anymore“), … }
-
javascript function() => void
Display a panel
Will show the specified panel at startup. (api doc)
application: { panel: “query“, … }
ngPanel= selection
"layer" | "selection" | "measure" | "mapcontext"| "print" | "user" | "query" | "annotation" | "geometry"
Project list background image
You can set a custom background image for the project list screen by setting an image url. This image will be displayed to the left of the project list. (api doc)
application: { projectBackgroundImageUrl: “http://my-server/my-image“, … }
-
string
Initial side panel visibility
Controls side panel initial visibility. (api doc)
application: { sidePanelInitialVisibility: false, … }
ngSidePanelInitialVisibility= false
true | false
Theme
Will set the theme, dark or light. (api doc)
application: { theme: “light“, … }
ngTheme=light
light | dark
This example shows how to create a custom form. It instantiates a JMap NG App extension that creates a custom form in a panel.
Form UI is only available in JMap NG App, and not in JMap NG Core.
Try it out in Codepen.io
JMap Server NG is a fork of the first generation of JMap NG that was the official JMap Server web client up until JMap Server Kathmandu.
JMap Server NG is the official NG Client for JMap Server Lima and above. JMap Server NG is only compatible with JMap Server. All JMap Cloud capabilities of JMap Server NG have been removed after the fork from JMap NG (first generation).
New method added in user service
new API method: JMap.User.isSystemUser()
Add support for the uuid()
default value fonction in forms
In forms, make the “submit” button always visible and give visual feedback after validation instead of disabling the button
Added projection
property to the map's redux state
let the user choose between EPSG:4326 (Lat-Lon) and the project’s CRS for the mapInfo widget coordinates
Support more projections when doing geographic re-projections. Some breaking changes are related to this, see below.
Added new NG startup option reportsBaseUrl
Add support for Google Maps base maps via the Google Maps Tiles API
new API method: JMap.Map.Basemap.isGoogleMapsId()
new startup option: googleMapsApiKey
In Dynamic layer filters, show a dropdown for properties that have unique values in their statistics
new API method: JMap.Layer.getLayerAttributesWithStatistics(layerId)
(returns attributes with their unique values if available)
Support snapping on layer elements in all draw environments (feature creation, measures, annotations)
New API methods:
JMap.Feature.getByLayerId(layerId, bbox)
(retrieves features from a layer)
JMap.Application.Annotation.setSnapEnabled(enabled)
JMap.Application.Annotation.setSnapLayerId(layerId)
JMap.Application.Geometry.setSnapEnabled(enabled)
JMap.Application.Geometry.setSnapLayerId(layerId)
JMap.Application.Measure.setSnapEnabled(enabled)
JMap.Application.Measure.setSnapLayerId(layerId)
The category for null values doesn’t appear in the dynamic legend
Photos named with accentuated characters cannot be added in a form
Error while updating a dynamic layer filter, passing from “is null” or “is not null” operator to “between” or “not between” operator
Error while updating dynamic layer filter, passing from "equal to/not equal to" to other operators
Unable to save a form if a not required child list component of a parent-child lists configuration is left empty
Lists of individual values in layer dynamic filters should be naturally sorted ASC
ngExtent url startup param is not working anymore
Unable to create an element if we don't have "ADD Data" permission on DB Form
various bugs for subform creation while editing a new element that is not yet created
Removed conditional logic in JMap Server NG for switching between JMap Cloud and JMap Server
Removed API methods:
JMap.Server.getType()
JMap.Server.isSaas()
JMap.Server.isLegacy()
JMap.User.loginIntoOrganization()
Modified API methods:
JMap.Server.getMinimumVersion()
now return a JServerVersion
removed/renamed/modified types/enums/interfaces:
JSERVER_TYPES
JSERVER_SAAS_STATUS
JServerSaasService
JServerSaasServiceById
JJMapCloudPasswordPolicyCompliance
JJMapServerPasswordPolicyCompliance
renamed to JJMapPasswordPolicyCompliance
removed refreshToken
from JTokenInfo
New CRS support refactoring:
Modified API methods:
JMap.Layer.getEPSG4326Extent()
is not asynchronous anymore
JMap.Map.displayLayerExtent()
is not asynchronous anymore
JMap.Projection.reprojectLocation()
is now asynchronous
JMap.Projection.reprojectBoundaryBox()
is now asynchronous
Removed API methods:
JMap.Map.isLayerRendered()
has been removed
JMap.Map.getLayersVisibilityStatus()
has been removed
JMap.Map.getLayersVisibilityStatusAsArray()
has been removed
JMap.Map.getRenderedJMapLayerIds()
has been removed