Store Locator using SQL Server as Data Source
This guide shows you how to build a store locator from scratch using store locations previously uploaded to the online Map Studio in GeoJSON format.
The finished example will look like this:
SQL store locations, are loaded dynamically from the server only for the region of the map which is visible.
When to use
- The store location database is large, deployed on a server, and only a small part is downloaded to the client on demand basis.
- The data set is changing frequently.
What is needed
- Magic Lane API key token
- Web server (an example is provided)
- SVG file of the store logo (or use our sample SVG)
- SQL database containing the store locations in GeoJSON format
Setup
Get your Magic Lane API key token: if you do not have a token, see the Getting Started guide.
This project needs a web server. If you do not have access to a web server, you can easily install a local web server, see the Installing a Local Web Server guide. In this project we use a local web server.
Adding stores data
- JavaScript
- HTML
// Start by setting your token from https://developer.magiclane.com/api/projects
if (gem.core.App.token === undefined)
gem.core.App.token = "";
var defaultAppScreen = gem.core.App.initAppScreen({
container: "map-canvas",
center: [48.8546, 2.349, 100000] // latitude, longitude, altitude
});
let queryAddedDataControl = new gem.control.QueryAddedDataControl(
{
languages: ["en"],
storeId: 1
},
"icon.svg",
{
markerBubble: {
title: ['name'],
image: ['preview']
},
markerGrouping: {
maxLevel: 15
}
}
);
defaultAppScreen.addControl(queryAddedDataControl);
The map is rendered in the div
container with the id map-canvas
in the HTML page.
gem.control.QueryAddedDataControl()
is used to add data loaded dynamically from an SQL server by querying for store locations in the currently displayed map region using the specified language filter.
The filename of a SVG logo to use for rendering the store locations on the map is also provided.
The store locations are added to the map dynamically, by zooming on a given location: defaultAppScreen.addControl(queryAddedDataControl);
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, minimum-scale=1, user-scalable=no, shrink-to-fit=no" />
<title>Store Locator using SQL Server - MagicLane Maps SDK for JavaScript</title>
<link rel="stylesheet" type="text/css" href="https://www.magiclane.com/sdk/js/gem.css">
</head>
<body>
<div id="map-canvas" style="width: 100%; height: 100%; position: absolute; overflow: hidden">
</div>
<script src="https://www.magiclane.com/sdk/js/gemapi.js"></script>
<script type="text/javascript" src="token.js"></script>
<script type="text/javascript" src="jsStoreLocatorSql01.js"></script>
</body>
</html>
Themap-canvas
is the drawing area where the map is rendered. The canvas is configured to fill the browser window.
At the bottom, gemapi.js, the Maps SDK for JavaScript is loaded.
Next, the JavaScript source of this example is loaded.
Adding stores list
To display a list of the store locations add a menu list container to your HTML file and the following JavaScript code:
- JavaScript
- HTML
let listUIControl = new gem.control.ListControl({
sourceControl: queryAddedDataControl,
flyToItemAltitude: 300,
container: "menu-list-container",
menuName: 'Store locations example',
titleProperties: ['name'],
imageProperty: ['preview']
});
defaultAppScreen.addControl(listUIControl);
<div id="store-locator" style="width: 100%; height: 100%">
<div id="menu-list-container" class="menu-list-container" style="width: 30%; height: 100%; position: absolute;">
</div>
<div id="map-canvas" style="width: 70%; left: 30%; height: 100%; position:absolute; overflow:hidden"></div>
</div>
Adding free text search
To add free-form text search functionality simply add the following JavaScript code:
- JavaScript
let searchControl = new gem.control.SearchControl({
searchPreferences: {
exactMatch: true,
maximumMatches: 3,
addressSearch: true,
mapPoisSearch: true,
setCursorReferencePoint: true
},
highlightOptions: {
contourColor: { r: 0, g: 255, b: 0, a: 0 }
}
});
defaultAppScreen.addControl(searchControl);
Complete example code
- JavaScript
- HTML
// Start by setting your token from https://developer.magiclane.com/api/projects
if (gem.core.App.token === undefined)
gem.core.App.token = "";
let defaultAppScreen = gem.core.App.initAppScreen({
container: "map-canvas",
center: [48.8546, 2.349, 100000] // latitude, longitude, altitude
});
let queryAddedDataControl = new gem.control.QueryAddedDataControl(
{
languages: ["en"],
storeId: 1
},
"icon.svg",
{
markerBubble: {
title: ['name'],
image: ['preview']
},
markerGrouping: {
maxLevel: 15
}
}
);
let listUIControl = new gem.control.ListControl({
sourceControl: queryAddedDataControl,
flyToItemAltitude: 300,
container: "menu-list-container",
menuName: 'Store locations example',
titleProperties: ['name'],
imageProperty: ['preview']
});
defaultAppScreen.addControl(queryAddedDataControl);
defaultAppScreen.addControl(listUIControl);
let searchControl = new gem.control.SearchControl({
searchPreferences: {
exactMatch: true,
maximumMatches: 3,
addressSearch: true,
mapPoisSearch: true,
setCursorReferencePoint: true
},
highlightOptions: {
contourColor: { r: 0, g: 255, b: 0, a: 0 }
}
});
defaultAppScreen.addControl(searchControl);
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, minimum-scale=1, user-scalable=no, shrink-to-fit=no" />
<title>Store Locator using SQL Server - MagicLane Maps SDK for JavaScript</title>
<link rel="stylesheet" type="text/css" href="https://www.magiclane.com/sdk/js/gem.css">
</head>
<body>
<div id="store-locator" style="width: 100%; height: 100%">
<div id="menu-list-container" class="menu-list-container" style="width: 30%; height: 100%; position: absolute;">
</div>
<div id="map-canvas" style="width: 70%; height: 100%; left: 30%; position: absolute; overflow: hidden">
</div>
</div>
<script src="https://www.magiclane.com/sdk/js/gemapi.js"></script>
<script type="text/javascript" src="token.js"></script>
<script type="text/javascript" src="jsStoreLocatorSql03.js"></script>
</body>
</html>
Files
The finished example consists of the project directory containing these files:
- JavaScript code (
.js
file extension) - HTML code (
.html
file extension) - SVG icon (
.svg
file extension)
To run the example, the HTML file is loaded in a browser.
Source code for this example:
Right-click on the links and select Save As.
Related
See Store Locator using GeoJSON File as Data Source with Custom Controls for an example with GeoJSON data loaded from a file, with Map+List.
See Store Locator using GeoJSON Text String as Data Source for an example with GeoJSON data defined in a variable in javascript, and rendered on the map.
See Store Locator using a GeoJSON File as Data Source for an example with GeoJSON data loaded from a file, and rendered on the map.
See Store Locator using Studio Defined Data Source for an example with GeoJSON data uploaded to the map studio, and rendered on the map.
JavaScript Examples
Maps SDK for JavaScript Examples can be downloaded or cloned with Git.