Permalink
Cannot retrieve contributors at this time
AzureMapsGovCloudCodeSamples/AzureMapsCodeSamples/Geospatial Files/Drag and Drop Shapefiles onto the Map.html
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
194 lines (158 sloc)
9.07 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<title>Drag and Drop Shapefiles onto the Map - Azure Maps Web SDK Samples</title> | |
<meta charset="utf-8" /> | |
<link rel="shortcut icon" href="/favicon.ico"/> | |
<meta http-equiv="x-ua-compatible" content="IE=Edge" /> | |
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> | |
<meta name="description" content="This sample shows how to load zipped shapefile (.shp, .dbf, .prj) files onto the map by dragging and dropping from a local file." /> | |
<meta name="keywords" content="Microsoft maps, map, gis, API, SDK, ESRI Shapefiles, shapefiles, shp, dbf, OGC, web worker, drag, drop, dropover, FileReader" /> | |
<meta name="author" content="Microsoft Azure Maps" /> | |
<!-- Add references to the Azure Maps Map control JavaScript and CSS files. --> | |
<link rel="stylesheet" href="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.css" type="text/css" /> | |
<script src="https://atlas.microsoft.com/sdk/javascript/mapcontrol/2/atlas.min.js"></script> | |
<!-- Load in Catiline.js library which makes it easier to work with web workers. --> | |
<script src="../Common/scripts/catiline.min.js"></script> | |
<script type='text/javascript'> | |
var map, datasource, popup, shpWorker; | |
function GetMap() { | |
//Point the Azure Maps domain to the US Azure Gov Cloud domain. | |
atlas.setDomain('atlas.azure.us'); | |
//Initialize a map instance. | |
map = new atlas.Map('myMap', { | |
view: 'Auto', | |
//Add authentication details for connecting to Azure Maps. | |
authOptions: { | |
//Use Azure Active Directory authentication. | |
authType: 'anonymous', | |
clientId: 'c9f2f391-13f1-407b-a4a5-f0a241bacfbf', //Your Azure Active Directory client id for accessing your Azure Maps account. | |
getToken: function (resolve, reject, map) { | |
//URL to your authentication service that retrieves an Azure Active Directory Token. | |
var tokenServiceUrl = 'https://azuremapscodesamples.azurewebsites.us/Common/TokenService.ashx'; | |
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 style control and add it to the map. | |
map.controls.add(new atlas.control.StyleControl(), { | |
position: 'top-right' | |
}); | |
//Setup the drag & drop listeners on the map. | |
var dropZone = document.getElementById('myMap'); | |
dropZone.addEventListener('dragover', handleDragOver, false); | |
dropZone.addEventListener('drop', handleFileSelect, false); | |
//Create a data source to add your data to. | |
datasource = new atlas.source.DataSource(); | |
map.sources.add(datasource); | |
//Create a popup. | |
popup = new atlas.Popup(); | |
//Add a layers for rendering the data. | |
var layers = [ | |
new atlas.layer.PolygonLayer(datasource, null, { | |
filter: ['any', ['==', ['geometry-type'], 'Polygon'], ['==', ['geometry-type'], 'MultiPolygon']] //Only render Polygon or MultiPolygon in this layer. | |
}), | |
new atlas.layer.LineLayer(datasource, null, { | |
strokeColor: 'white', | |
strokeWidth: 2, | |
filter: ['any', ['==', ['geometry-type'], 'Polygon'], ['==', ['geometry-type'], 'MultiPolygon']] //Only render Polygon or MultiPolygon in this layer. | |
}), | |
new atlas.layer.LineLayer(datasource, null, { | |
strokeColor: 'red', | |
filter: ['any', ['==', ['geometry-type'], 'LineString'], ['==', ['geometry-type'], 'MultiLineString']] //Only render LineString or MultiLineString in this layer. | |
}), | |
new atlas.layer.BubbleLayer(datasource, null, { | |
filter: ['any', ['==', ['geometry-type'], 'Point'], ['==', ['geometry-type'], 'MultiPoint']] //Only render Point or MultiPoints in this layer. | |
}) | |
]; | |
map.layers.add(layers, 'labels'); | |
//Add a click event to the layers to show a popup of what the user clicked on. | |
map.events.add('click', layers, featureClicked); | |
//Create a web worker that uses the shapefile-js library. | |
var wfunc = function (base, cb) { | |
importScripts('../Common/scripts/shp.min.js'); | |
shp(base).then(cb); | |
}; | |
shpWorker = cw({ data: wfunc }, 2); | |
}); | |
} | |
function handleDragOver(evt) { | |
//Stop the browser from performing its default behavior when a file is dragged and dropped. | |
evt.stopPropagation(); | |
evt.preventDefault(); | |
evt.dataTransfer.dropEffect = 'copy'; | |
} | |
function handleFileSelect(evt) { | |
//Stop the browser from performing its default behavior when a file is dragged and dropped. | |
evt.stopPropagation(); | |
evt.preventDefault(); | |
//Remove any existing data from the map. | |
datasource.clear(); | |
//The list of files that have been dragged and dropped onto the map. | |
var files = evt.dataTransfer.files; | |
//Keep track of the bounding box of all the data from all files dropped into the map. | |
var dataBounds = null; | |
//Loop through and attempt to read each file. | |
for (var i = 0; i < files.length; i++) { | |
var reader = new FileReader(); | |
reader.onload = function (e) { | |
shpWorker.data(e.target.result).then(function (data) { | |
//Add the GeoJSON data to the data source. | |
datasource.add(data); | |
//Calculate the bounding box of the GeoJSON data. | |
var bounds = atlas.data.BoundingBox.fromData(data); | |
//If data is already loaded from another GeoJSON file, merge the bounding boxes together. | |
if (dataBounds) { | |
dataBounds = atlas.data.BoundingBox.merge(dataBounds, bounds); | |
} else { | |
dataBounds = bounds; | |
} | |
//Update the map view to show the data. | |
map.setCamera({ | |
bounds: dataBounds, | |
padding: 50 | |
}); | |
}); | |
}; | |
//Read the file as text. | |
reader.readAsArrayBuffer(files[i]); | |
} | |
} | |
function featureClicked(e) { | |
//Make sure the event occurred on a shape feature. | |
if (e.shapes && e.shapes.length > 0) { | |
var properties = e.shapes[0].getProperties(); | |
//By default, show the popup where the mouse event occurred. | |
var pos = e.position; | |
//If the shape is a point feature, show the popup at the points coordinate. | |
if (e.shapes[0].getType() === 'Point') { | |
pos = e.shapes[0].getCoordinates(); | |
} | |
//Update the content and position of the popup. | |
popup.setOptions({ | |
//Create a table from the properties in the feature. | |
content: atlas.PopupTemplate.applyTemplate(properties), | |
position: pos, | |
pixelOffset: [0, 0] | |
}); | |
//Open the popup. | |
popup.open(map); | |
} | |
} | |
</script> | |
</head> | |
<body onload="GetMap()"> | |
<div id="myMap" style="position:relative;width:100%;min-width:290px;height:600px;"></div> | |
<fieldset style="width:calc(100% - 30px);min-width:290px;margin-top:10px;"> | |
<legend><h1 style="font-size:16px">Drag and Drop Shapefiles onto the Map</h1></legend> | |
This sample shows how to load zipped shapefile (.shp, .dbf, .prj) files onto the map by dragging and dropping from a local file. | |
This sample uses the open source <a href="https://github.com/calvinmetcalf/shapefile-js" target="_blank">Shapefile.js</a> library which converts Shapefiles into GeoJSON which can easily be consumed by the map control. | |
It also makes use of the open source <a href="http://catilinejs.com/">Catiline.js</a> library which makes working with web workers easier. | |
</fieldset> | |
</body> | |
</html> |