mirror of
https://github.com/netzmacht/contao-leaflet-libraries.git
synced 2025-11-28 19:13:54 +01:00
256 lines
6.9 KiB
JavaScript
256 lines
6.9 KiB
JavaScript
var xhr = require('corslite'),
|
|
csv2geojson = require('csv2geojson'),
|
|
wellknown = require('wellknown'),
|
|
polyline = require('polyline'),
|
|
topojson = require('topojson/topojson.js'),
|
|
toGeoJSON = require('togeojson');
|
|
|
|
module.exports.polyline = polylineLoad;
|
|
module.exports.polyline.parse = polylineParse;
|
|
|
|
module.exports.geojson = geojsonLoad;
|
|
|
|
module.exports.topojson = topojsonLoad;
|
|
module.exports.topojson.parse = topojsonParse;
|
|
|
|
module.exports.csv = csvLoad;
|
|
module.exports.csv.parse = csvParse;
|
|
|
|
module.exports.gpx = gpxLoad;
|
|
module.exports.gpx.parse = gpxParse;
|
|
|
|
module.exports.kml = kmlLoad;
|
|
module.exports.kml.parse = kmlParse;
|
|
|
|
module.exports.wkt = wktLoad;
|
|
module.exports.wkt.parse = wktParse;
|
|
|
|
function addData(l, d) {
|
|
if ('addData' in l) l.addData(d);
|
|
if ('setGeoJSON' in l) l.setGeoJSON(d);
|
|
}
|
|
|
|
/**
|
|
* Load a [GeoJSON](http://geojson.org/) document into a layer and return the layer.
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function geojsonLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, function(err, response) {
|
|
if (err) return layer.fire('error', { error: err });
|
|
addData(layer, JSON.parse(response.responseText));
|
|
layer.fire('ready');
|
|
});
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a [TopoJSON](https://github.com/mbostock/topojson) document into a layer and return the layer.
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function topojsonLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
if (err) return layer.fire('error', { error: err });
|
|
topojsonParse(response.responseText, options, layer);
|
|
layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a CSV document into a layer and return the layer.
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function csvLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
var error;
|
|
if (err) return layer.fire('error', { error: err });
|
|
function avoidReady() {
|
|
error = true;
|
|
}
|
|
layer.on('error', avoidReady);
|
|
csvParse(response.responseText, options, layer);
|
|
layer.off('error', avoidReady);
|
|
if (!error) layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a GPX document into a layer and return the layer.
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function gpxLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
var error;
|
|
if (err) return layer.fire('error', { error: err });
|
|
function avoidReady() {
|
|
error = true;
|
|
}
|
|
layer.on('error', avoidReady);
|
|
gpxParse(response.responseXML || response.responseText, options, layer);
|
|
layer.off('error', avoidReady);
|
|
if (!error) layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a [KML](https://developers.google.com/kml/documentation/) document into a layer and return the layer.
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function kmlLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
var error;
|
|
if (err) return layer.fire('error', { error: err });
|
|
function avoidReady() {
|
|
error = true;
|
|
}
|
|
layer.on('error', avoidReady);
|
|
kmlParse(response.responseXML || response.responseText, options, layer);
|
|
layer.off('error', avoidReady);
|
|
if (!error) layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a WKT (Well Known Text) string into a layer and return the layer
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function wktLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
if (err) return layer.fire('error', { error: err });
|
|
wktParse(response.responseText, options, layer);
|
|
layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
/**
|
|
* Load a polyline string into a layer and return the layer
|
|
*
|
|
* @param {string} url
|
|
* @param {object} options
|
|
* @param {object} customLayer
|
|
* @returns {object}
|
|
*/
|
|
function polylineLoad(url, options, customLayer) {
|
|
var layer = customLayer || L.geoJson();
|
|
xhr(url, onload);
|
|
function onload(err, response) {
|
|
if (err) return layer.fire('error', { error: err });
|
|
polylineParse(response.responseText, options, layer);
|
|
layer.fire('ready');
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
function topojsonParse(data, options, layer) {
|
|
var o = typeof data === 'string' ?
|
|
JSON.parse(data) : data;
|
|
layer = layer || L.geoJson();
|
|
for (var i in o.objects) {
|
|
var ft = topojson.feature(o, o.objects[i]);
|
|
if (ft.features) addData(layer, ft.features);
|
|
else addData(layer, ft);
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
function csvParse(csv, options, layer) {
|
|
layer = layer || L.geoJson();
|
|
options = options || {};
|
|
csv2geojson.csv2geojson(csv, options, onparse);
|
|
function onparse(err, geojson) {
|
|
if (err) return layer.fire('error', { error: err });
|
|
addData(layer, geojson);
|
|
}
|
|
return layer;
|
|
}
|
|
|
|
function gpxParse(gpx, options, layer) {
|
|
var xml = parseXML(gpx);
|
|
if (!xml) return layer.fire('error', {
|
|
error: 'Could not parse GPX'
|
|
});
|
|
layer = layer || L.geoJson();
|
|
var geojson = toGeoJSON.gpx(xml);
|
|
addData(layer, geojson);
|
|
return layer;
|
|
}
|
|
|
|
|
|
function kmlParse(gpx, options, layer) {
|
|
var xml = parseXML(gpx);
|
|
if (!xml) return layer.fire('error', {
|
|
error: 'Could not parse KML'
|
|
});
|
|
layer = layer || L.geoJson();
|
|
var geojson = toGeoJSON.kml(xml);
|
|
addData(layer, geojson);
|
|
return layer;
|
|
}
|
|
|
|
function polylineParse(txt, options, layer) {
|
|
layer = layer || L.geoJson();
|
|
options = options || {};
|
|
var coords = polyline.decode(txt, options.precision);
|
|
var geojson = { type: 'LineString', coordinates: [] };
|
|
for (var i = 0; i < coords.length; i++) {
|
|
// polyline returns coords in lat, lng order, so flip for geojson
|
|
geojson.coordinates[i] = [coords[i][1], coords[i][0]];
|
|
}
|
|
addData(layer, geojson);
|
|
return layer;
|
|
}
|
|
|
|
function wktParse(wkt, options, layer) {
|
|
layer = layer || L.geoJson();
|
|
var geojson = wellknown(wkt);
|
|
addData(layer, geojson);
|
|
return layer;
|
|
}
|
|
|
|
function parseXML(str) {
|
|
if (typeof str === 'string') {
|
|
return (new DOMParser()).parseFromString(str, 'text/xml');
|
|
} else {
|
|
return str;
|
|
}
|
|
}
|