Store Locator using GeoJSON Data Source with Custom Icons ¶
This guide shows you how to add different icons for your store data based on a GeoJSON property.The finished example will look like this:
See the example fullscreen
When to use ¶
-
The entire store location data set is relatively small and can be easily downloaded.
-
The data set is not changing frequently.
-
The data set contains different categories of items.
What is needed ¶
-
Magic Lane API key token
-
Web server (an example is provided)
-
SVG files of the different store categories (or use our sample SVGs)
-
GeoJSON file containing the store locations (or use our sample GeoJSON)
Setup ¶
Get your Magic Lane API key token: if you do not have a token, see the Getting Started guide.
Adding controls ¶
To see how to add GeoJSON data control, store list control and free text search control check out the guides Store Locator using a GeoJSON File as Data Source or Store Locator using GeoJSON Text String as Data Source .
Adding custom icons ¶
1// Start by setting your token from https://www.magiclane.com/api/projects
2if (gem.core.App.token === undefined) gem.core.App.token = "";
3let svgLogo = "./store.svg";
4
5defaultAppScreen = gem.core.App.initAppScreen({
6 container: "map-canvas"
7});
8
9let iconFilter = [{ key: 'kinds', value: 'supermarkets', iconClass: 'supermarket-icon' },
10 { key: 'kinds', value: 'conveniences', iconClass: 'supermarket-icon' },
11 { key: 'kinds', value: 'bakeries', iconClass: 'bakery-icon' }];
12let geojsonDataControl = new gem.control.GeoJsonAddedDataControl("Paris_shops.geojson", svgLogo, iconFilter,
13 {
14 markerBubble: {
15 title: ['name'],
16 image: ['preview']
17 }
18 });
19defaultAppScreen.addControl(geojsonDataControl);
1<html>
2<meta charset="utf-8">
3<link rel="stylesheet" type="text/css" href="https://www.magiclane.com/sdk/js/gem.css">
4<title>Store Locator GeoJSON Data Custom Icons</title>
5
6<head>
7 <style>
8 .supermarket-icon {
9 background-image: url(./supermarket.svg);
10 background-position: center;
11 background-repeat: no-repeat;
12 background-size: contain;
13 width: 25px !important;
14 height: 25px !important;
15 position: absolute;
16 margin: 0px auto;
17 cursor: pointer;
18 }
19
20 .supermarket-icon:hover {
21 width: 30px !important;
22 height: 30px !important;
23 }
24
25 .bakery-icon {
26 background-image: url(./bakery.svg);
27 background-position: center;
28 background-repeat: no-repeat;
29 background-size: contain;
30 width: 25px !important;
31 height: 25px !important;
32 position: absolute;
33 margin: 0px auto;
34 cursor: pointer;
35 }
36
37 .bakery-icon:hover {
38 width: 30px !important;
39 height: 30px !important;
40 }
41 </style>
42</head>
43
44<body>
45 <div id="store-locator" style="width: 100%; height: 100%">
46 <div id="map-canvas" style="width: 100%; height: 100%; position: absolute;">
47 </div>
48 </div>
49
50 <script type="text/javascript" src="https://www.magiclane.com/sdk/js/gemapi.js"></script>
51 <script type="text/javascript" src="token.js"></script>
52 <script type="text/javascript" src="jsStoreGeojsonCustomIcons01.js"></script>
53</body>
54
55</html>
Complete example code ¶
1 // Start by setting your token from https://www.magiclane.com/api/projects
2 if (gem.core.App.token === undefined) gem.core.App.token = "";
3 let svgLogo = "./store.svg";
4
5 defaultAppScreen = gem.core.App.initAppScreen({
6 container: "map-canvas"
7 });
8
9 let iconFilter = [{ key: 'kinds', value: 'supermarkets', iconClass: 'supermarket-icon' },
10 { key: 'kinds', value: 'conveniences', iconClass: 'supermarket-icon' },
11 { key: 'kinds', value: 'bakeries', iconClass: 'bakery-icon' }];
12 let geojsonDataControl = new gem.control.GeoJsonAddedDataControl("Paris_shops.geojson", svgLogo, iconFilter,
13 {
14 markerBubble: {
15 title: ['name'],
16 image: ['preview']
17 }
18 });
19 let listUIControl = new gem.control.ListControl(
20 {
21 sourceControl: geojsonDataControl,
22 container: "menu-list-container",
23 menuName: "Store locations example",
24 titleProperties: ['name'],
25 detailsProperties: ['kinds'],
26 imageProperty: ['preview']
27 });
28 defaultAppScreen.addControl(geojsonDataControl);
29 defaultAppScreen.addControl(listUIControl);
30
31 let searchControl = new gem.control.SearchControl({
32 highlightOptions: {
33 contourColor: { r: 0, g: 255, b: 0, a: 0 }
34 },
35 searchPreferences: {
36 exactMatch: true,
37 maximumMatches: 3,
38 addressSearch: true,
39 mapPoisSearch: true,
40 setCursorReferencePoint: true
41 }
42 });
43 defaultAppScreen.addControl(searchControl);
1<html>
2<meta charset="utf-8">
3<link rel="stylesheet" type="text/css" href="https://www.magiclane.com/sdk/js/gem.css">
4<title>Store Locator GeoJSON Data Custom Icons</title>
5
6<head>
7 <style>
8 .supermarket-icon {
9 background-image: url(./supermarket.svg);
10 background-position: center;
11 background-repeat: no-repeat;
12 background-size: contain;
13 width: 25px !important;
14 height: 25px !important;
15 position: absolute;
16 margin: 0px auto;
17 cursor: pointer;
18 }
19
20 .supermarket-icon:hover {
21 width: 30px !important;
22 height: 30px !important;
23 }
24
25 .bakery-icon {
26 background-image: url(./bakery.svg);
27 background-position: center;
28 background-repeat: no-repeat;
29 background-size: contain;
30 width: 25px !important;
31 height: 25px !important;
32 position: absolute;
33 margin: 0px auto;
34 cursor: pointer;
35 }
36
37 .bakery-icon:hover {
38 width: 30px !important;
39 height: 30px !important;
40 }
41 </style>
42</head>
43
44<body>
45 <div id="store-locator" style="width: 100%; height: 100%">
46 <div id="menu-list-container" style="width: 30%; height: 100%; position: absolute;"></div>
47 <div id="map-canvas" style="width: 70%; height: 100%; position:absolute; left: 30%;">
48 </div>
49 </div>
50
51 <script type="text/javascript" src="https://www.magiclane.com/sdk/js/gemapi.js"></script>
52 <script type="text/javascript" src="token.js"></script>
53 <script type="text/javascript" src="jsStoreGeojsonCustomIcons.js"></script>
54</body>
55
56</html>
Files ¶
The finished example consists of the project directory containing these files:
-
JavaScript code (
.js
file extension) -
HTML code (
.html
file extension) -
SVG icons (
.svg
file extension) -
Store locations in GeoJSON format (
.geojson
file extension)
To run the example, the HTML file is loaded in a browser.
Source code for this example:
JavaScriptHTML
SVG store icon
SVG supermarket icon
SVG bakery icon
Store locations in GeoJSON format
right-click on the links and select Save As.