Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
204 lines (165 sloc) 9.17 KB
<!DOCTYPE html>
<html>
<head>
<title>Drag and Drop Shapefiles onto the Map - Azure Maps Web SDK Samples</title>
<meta charset="utf-8" />
<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 load add support for dragging and dropping zipped shapefile (.shp, .dbf, .prj) files from your local computer file system on to the map and having them render on the map." />
<meta name="keywords" content="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() {
//Initialize a map instance.
map = new atlas.Map('myMap', {
view: 'Auto',
//Add your Azure Maps subscription key to the map SDK. Get an Azure Maps key at https://azure.com/maps
authOptions: {
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: '<div style="padding:10px;max-height:200px;overflow-y:auto;">' + object2Table(properties) + '</div>',
position: pos,
pixelOffset: [0, 0]
});
//Open the popup.
popup.open(map);
}
}
function object2Table(obj) {
//Create a HTML table from an objects property names and values.
var html = ['<table><tr><td><b>Property</b></td><td><b>Value</b></td><tr>'];
Object.keys(obj).forEach(function (key, index) {
//Ignore private properties which are commonly denoted using an underscore.
if (key.indexOf('_') !== 0) {
html.push('<tr><td>', key, '</td><td>');
if (typeof obj[key] === 'object') {
//If the value of the property is an object, create a sub-table recursively.
html.push(object2Table(obj[key]));
} else {
html.push(obj[key]);
}
html.push('</td><tr>');
}
});
html.push('</table>');
return html.join('');
}
</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>Drag and Drop Shapefiles onto the Map</legend>
This sample shows how load add support for dragging and dropping zipped shapefile (.shp, .dbf, .prj) files from your local computer file system on to the map and having them render on the map.
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>
You can’t perform that action at this time.