-
Notifications
You must be signed in to change notification settings - Fork 449
/
Get closest point to position.html
130 lines (107 loc) · 5.63 KB
/
Get closest point to position.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<!DOCTYPE html>
<html lang="en">
<head>
<title>Get closest point to position - Azure Maps Web SDK Samples</title>
<meta charset="utf-8" />
<link rel="shortcut icon" href="/favicon.ico"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="This sample shows how to calculate the closest point to a given coordinate, in this case, where the user clicked on the map. " />
<meta name="keywords" content="Microsoft maps, map, gis, API, SDK, geospatial, spatial math, math, point, coordinate" />
<meta name="author" content="Microsoft Azure Maps" /><meta name="version" content="1.0" />
<meta name="screenshot" content="screenshot.jpg" />
<!-- Add references to the Azure Maps Map control JavaScript and CSS files. -->
<link href="https://atlas.microsoft.com/sdk/javascript/mapcontrol/3/atlas.min.css" rel="stylesheet" />
<script src="https://atlas.microsoft.com/sdk/javascript/mapcontrol/3/atlas.min.js"></script>
<script>
var map, datasource, closestPoint;
function getMap() {
//Initialize a map instance.
map = new atlas.Map('myMap', {
view: 'Auto',
//Add authentication details for connecting to Azure Maps.
authOptions: {
//Use Microsoft Entra ID authentication.
authType: 'anonymous',
clientId: 'e6b6ab59-eb5d-4d25-aa57-581135b927f0', //Your Azure Maps client id for accessing your Azure Maps account.
getToken: function (resolve, reject, map) {
//URL to your authentication service that retrieves an Microsoft Entra ID Token.
var tokenServiceUrl = 'https://samples.azuremaps.com/api/GetAzureMapsToken';
fetch(tokenServiceUrl).then(r => r.text()).then(token => resolve(token));
}
//Alternatively, use an Azure Maps key. Get an Azure Maps key at https://azure.com/maps. NOTE: The primary key should be used as the key.
//authType: 'subscriptionKey',
//subscriptionKey: '[YOUR_AZURE_MAPS_KEY]'
}
});
//Wait until the map resources are ready.
map.events.add('ready', function () {
//Create a data source and add it to the map.
datasource = new atlas.source.DataSource();
map.sources.add(datasource);
//Generate some random data.
generateRandomPoints();
//Add a bubble layer to render the points on the map.
map.layers.add(new atlas.layer.BubbleLayer(datasource, null, {
createIndicators: true, // to enable bubble layer a11y feature
//Get the color of each point from it's color property.
color: ['get', 'color']
}));
//Add a click event to the map.
map.events.add('click', getClosestPoint);
});
}
function getClosestPoint(e) {
//Reset the color of any previously closest point.
if (closestPoint) {
closestPoint.setProperties({ color: 'blue' });
closestPoint = null;
document.getElementById('infoPanel').innerHTML = '';
}
var shapes = datasource.getShapes();
var minDistance = Infinity;
for (var i = 0; i < shapes.length; i++) {
if (shapes[i].getType() === 'Point') {
//Calculate the distance between the point shape and the position.
var d = atlas.math.getDistanceTo(shapes[i].getCoordinates(), e.position, 'miles');
if (d < minDistance) {
closestPoint = shapes[i];
minDistance = d;
}
}
}
if (closestPoint) {
closestPoint.setProperties({ color: 'red' });
//Display details about closest point.
document.getElementById('infoPanel').innerHTML = ` - Point Id: ${closestPoint.getProperties().id}<br/> - Distance: ${Math.round(minDistance)} miles`;
}
}
function generateRandomPoints() {
var points = [];
for (var i = 0; i < 100; i++) {
points.push(new atlas.data.Feature(new atlas.data.Point([
Math.random() * 360 - 180,
Math.random()* 170 - 85
]), {
color: 'blue',
id: i
}));
}
datasource.add(points);
}
</script>
</head>
<body onload="getMap()">
<div id="myMap" style="position:relative;width:100%;min-width:290px;height:600px;"></div>
<div style="position:absolute;top:10px;left:10px;background-color:#fff;padding:10px;border-radius:20px;">
Click on the map to find the closest point. <br/><br />
Closest point:<br /><br />
<span id="infoPanel"></span>
</div>
<fieldset style="width:calc(100% - 30px);min-width:290px;margin-top:10px;">
<legend>Get closest point to position</legend>
This sample shows how to calculate the closest point to a given position, in this case, where the user clicked on the map.
The closest point will have it's color changed to red.
This is achieved by looping over through the data and calculating the distance between the position and each point using the atlas.math.getDistanceTo function.
</fieldset>
</body>
</html>