leaflet-routing-machine
Version:
1,469 lines (1,383 loc) • 839 kB
JavaScript
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){
function corslite(url, callback, cors) {
var sent = false;
if (typeof window.XMLHttpRequest === 'undefined') {
return callback(Error('Browser not supported'));
}
if (typeof cors === 'undefined') {
var m = url.match(/^\s*https?:\/\/[^\/]*/);
cors = m && (m[0] !== location.protocol + '//' + location.hostname +
(location.port ? ':' + location.port : ''));
}
var x = new window.XMLHttpRequest();
function isSuccessful(status) {
return status >= 200 && status < 300 || status === 304;
}
if (cors && !('withCredentials' in x)) {
// IE8-9
x = new window.XDomainRequest();
// Ensure callback is never called synchronously, i.e., before
// x.send() returns (this has been observed in the wild).
// See https://github.com/mapbox/mapbox.js/issues/472
var original = callback;
callback = function() {
if (sent) {
original.apply(this, arguments);
} else {
var that = this, args = arguments;
setTimeout(function() {
original.apply(that, args);
}, 0);
}
}
}
function loaded() {
if (
// XDomainRequest
x.status === undefined ||
// modern browsers
isSuccessful(x.status)) callback.call(x, null, x);
else callback.call(x, x, null);
}
// Both `onreadystatechange` and `onload` can fire. `onreadystatechange`
// has [been supported for longer](http://stackoverflow.com/a/9181508/229001).
if ('onload' in x) {
x.onload = loaded;
} else {
x.onreadystatechange = function readystate() {
if (x.readyState === 4) {
loaded();
}
};
}
// Call the callback with the XMLHttpRequest object as an error and prevent
// it from ever being called again by reassigning it to `noop`
x.onerror = function error(evt) {
// XDomainRequest provides no evt parameter
callback.call(this, evt || true, null);
callback = function() { };
};
// IE9 must have onprogress be set to a unique function.
x.onprogress = function() { };
x.ontimeout = function(evt) {
callback.call(this, evt, null);
callback = function() { };
};
x.onabort = function(evt) {
callback.call(this, evt, null);
callback = function() { };
};
// GET is the only supported HTTP Verb by XDomainRequest and is the
// only one supported here.
x.open('GET', url, true);
// Send the request. Sending data is not supported.
x.send(null);
sent = true;
return x;
}
if (typeof module !== 'undefined') module.exports = corslite;
},{}],2:[function(_dereq_,module,exports){
'use strict';
/**
* Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm)
*
* Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js)
* by [Mark McClure](http://facstaff.unca.edu/mcmcclur/)
*
* @module polyline
*/
var polyline = {};
function py2_round(value) {
// Google's polyline algorithm uses the same rounding strategy as Python 2, which is different from JS for negative values
return Math.floor(Math.abs(value) + 0.5) * Math.sign(value);
}
function encode(current, previous, factor) {
current = py2_round(current * factor);
previous = py2_round(previous * factor);
var coordinate = current - previous;
coordinate <<= 1;
if (current - previous < 0) {
coordinate = ~coordinate;
}
var output = '';
while (coordinate >= 0x20) {
output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63);
coordinate >>= 5;
}
output += String.fromCharCode(coordinate + 63);
return output;
}
/**
* Decodes to a [latitude, longitude] coordinates array.
*
* This is adapted from the implementation in Project-OSRM.
*
* @param {String} str
* @param {Number} precision
* @returns {Array}
*
* @see https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js
*/
polyline.decode = function(str, precision) {
var index = 0,
lat = 0,
lng = 0,
coordinates = [],
shift = 0,
result = 0,
byte = null,
latitude_change,
longitude_change,
factor = Math.pow(10, precision || 5);
// Coordinates have variable length when encoded, so just keep
// track of whether we've hit the end of the string. In each
// loop iteration, a single coordinate is decoded.
while (index < str.length) {
// Reset shift, result, and byte
byte = null;
shift = 0;
result = 0;
do {
byte = str.charCodeAt(index++) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
} while (byte >= 0x20);
latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
shift = result = 0;
do {
byte = str.charCodeAt(index++) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
} while (byte >= 0x20);
longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
lat += latitude_change;
lng += longitude_change;
coordinates.push([lat / factor, lng / factor]);
}
return coordinates;
};
/**
* Encodes the given [latitude, longitude] coordinates array.
*
* @param {Array.<Array.<Number>>} coordinates
* @param {Number} precision
* @returns {String}
*/
polyline.encode = function(coordinates, precision) {
if (!coordinates.length) { return ''; }
var factor = Math.pow(10, precision || 5),
output = encode(coordinates[0][0], 0, factor) + encode(coordinates[0][1], 0, factor);
for (var i = 1; i < coordinates.length; i++) {
var a = coordinates[i], b = coordinates[i - 1];
output += encode(a[0], b[0], factor);
output += encode(a[1], b[1], factor);
}
return output;
};
function flipped(coords) {
var flipped = [];
for (var i = 0; i < coords.length; i++) {
flipped.push(coords[i].slice().reverse());
}
return flipped;
}
/**
* Encodes a GeoJSON LineString feature/geometry.
*
* @param {Object} geojson
* @param {Number} precision
* @returns {String}
*/
polyline.fromGeoJSON = function(geojson, precision) {
if (geojson && geojson.type === 'Feature') {
geojson = geojson.geometry;
}
if (!geojson || geojson.type !== 'LineString') {
throw new Error('Input must be a GeoJSON LineString');
}
return polyline.encode(flipped(geojson.coordinates), precision);
};
/**
* Decodes to a GeoJSON LineString geometry.
*
* @param {String} str
* @param {Number} precision
* @returns {Object}
*/
polyline.toGeoJSON = function(str, precision) {
var coords = polyline.decode(str, precision);
return {
type: 'LineString',
coordinates: flipped(coords)
};
};
if (typeof module === 'object' && module.exports) {
module.exports = polyline;
}
},{}],3:[function(_dereq_,module,exports){
var languages = _dereq_('./languages');
var instructions = languages.instructions;
var grammars = languages.grammars;
var abbreviations = languages.abbreviations;
module.exports = function(version) {
Object.keys(instructions).forEach(function(code) {
if (!instructions[code][version]) { throw 'invalid version ' + version + ': ' + code + ' not supported'; }
});
return {
capitalizeFirstLetter: function(language, string) {
return string.charAt(0).toLocaleUpperCase(language) + string.slice(1);
},
ordinalize: function(language, number) {
// Transform numbers to their translated ordinalized value
if (!language) throw new Error('No language code provided');
return instructions[language][version].constants.ordinalize[number.toString()] || '';
},
directionFromDegree: function(language, degree) {
// Transform degrees to their translated compass direction
if (!language) throw new Error('No language code provided');
if (!degree && degree !== 0) {
// step had no bearing_after degree, ignoring
return '';
} else if (degree >= 0 && degree <= 20) {
return instructions[language][version].constants.direction.north;
} else if (degree > 20 && degree < 70) {
return instructions[language][version].constants.direction.northeast;
} else if (degree >= 70 && degree <= 110) {
return instructions[language][version].constants.direction.east;
} else if (degree > 110 && degree < 160) {
return instructions[language][version].constants.direction.southeast;
} else if (degree >= 160 && degree <= 200) {
return instructions[language][version].constants.direction.south;
} else if (degree > 200 && degree < 250) {
return instructions[language][version].constants.direction.southwest;
} else if (degree >= 250 && degree <= 290) {
return instructions[language][version].constants.direction.west;
} else if (degree > 290 && degree < 340) {
return instructions[language][version].constants.direction.northwest;
} else if (degree >= 340 && degree <= 360) {
return instructions[language][version].constants.direction.north;
} else {
throw new Error('Degree ' + degree + ' invalid');
}
},
laneConfig: function(step) {
// Reduce any lane combination down to a contracted lane diagram
if (!step.intersections || !step.intersections[0].lanes) throw new Error('No lanes object');
var config = [];
var currentLaneValidity = null;
step.intersections[0].lanes.forEach(function (lane) {
if (currentLaneValidity === null || currentLaneValidity !== lane.valid) {
if (lane.valid) {
config.push('o');
} else {
config.push('x');
}
currentLaneValidity = lane.valid;
}
});
return config.join('');
},
getWayName: function(language, step, options) {
var classes = options ? options.classes || [] : [];
if (typeof step !== 'object') throw new Error('step must be an Object');
if (!language) throw new Error('No language code provided');
if (!Array.isArray(classes)) throw new Error('classes must be an Array or undefined');
var wayName;
var name = step.name || '';
var ref = (step.ref || '').split(';')[0];
// Remove hacks from Mapbox Directions mixing ref into name
if (name === step.ref) {
// if both are the same we assume that there used to be an empty name, with the ref being filled in for it
// we only need to retain the ref then
name = '';
}
name = name.replace(' (' + step.ref + ')', '');
// In attempt to avoid using the highway name of a way,
// check and see if the step has a class which should signal
// the ref should be used instead of the name.
var wayMotorway = classes.indexOf('motorway') !== -1;
if (name && ref && name !== ref && !wayMotorway) {
var phrase = instructions[language][version].phrase['name and ref'] ||
instructions.en[version].phrase['name and ref'];
wayName = this.tokenize(language, phrase, {
name: name,
ref: ref
}, options);
} else if (name && ref && wayMotorway && (/\d/).test(ref)) {
wayName = options && options.formatToken ? options.formatToken('ref', ref) : ref;
} else if (!name && ref) {
wayName = options && options.formatToken ? options.formatToken('ref', ref) : ref;
} else {
wayName = options && options.formatToken ? options.formatToken('name', name) : name;
}
return wayName;
},
/**
* Formulate a localized text instruction from a step.
*
* @param {string} language Language code.
* @param {object} step Step including maneuver property.
* @param {object} opts Additional options.
* @param {string} opts.legIndex Index of leg in the route.
* @param {string} opts.legCount Total number of legs in the route.
* @param {array} opts.classes List of road classes.
* @param {string} opts.waypointName Name of waypoint for arrival instruction.
*
* @return {string} Localized text instruction.
*/
compile: function(language, step, opts) {
if (!language) throw new Error('No language code provided');
if (languages.supportedCodes.indexOf(language) === -1) throw new Error('language code ' + language + ' not loaded');
if (!step.maneuver) throw new Error('No step maneuver provided');
var options = opts || {};
var type = step.maneuver.type;
var modifier = step.maneuver.modifier;
var mode = step.mode;
// driving_side will only be defined in OSRM 5.14+
var side = step.driving_side;
if (!type) { throw new Error('Missing step maneuver type'); }
if (type !== 'depart' && type !== 'arrive' && !modifier) { throw new Error('Missing step maneuver modifier'); }
if (!instructions[language][version][type]) {
// Log for debugging
console.log('Encountered unknown instruction type: ' + type); // eslint-disable-line no-console
// OSRM specification assumes turn types can be added without
// major version changes. Unknown types are to be treated as
// type `turn` by clients
type = 'turn';
}
// Use special instructions if available, otherwise `defaultinstruction`
var instructionObject;
if (instructions[language][version].modes[mode]) {
instructionObject = instructions[language][version].modes[mode];
} else {
// omit side from off ramp if same as driving_side
// note: side will be undefined if the input is from OSRM <5.14
// but the condition should still evaluate properly regardless
var omitSide = type === 'off ramp' && modifier.indexOf(side) >= 0;
if (instructions[language][version][type][modifier] && !omitSide) {
instructionObject = instructions[language][version][type][modifier];
} else {
instructionObject = instructions[language][version][type].default;
}
}
// Special case handling
var laneInstruction;
switch (type) {
case 'use lane':
laneInstruction = instructions[language][version].constants.lanes[this.laneConfig(step)];
if (!laneInstruction) {
// If the lane combination is not found, default to continue straight
instructionObject = instructions[language][version]['use lane'].no_lanes;
}
break;
case 'rotary':
case 'roundabout':
if (step.rotary_name && step.maneuver.exit && instructionObject.name_exit) {
instructionObject = instructionObject.name_exit;
} else if (step.rotary_name && instructionObject.name) {
instructionObject = instructionObject.name;
} else if (step.maneuver.exit && instructionObject.exit) {
instructionObject = instructionObject.exit;
} else {
instructionObject = instructionObject.default;
}
break;
default:
// NOOP, since no special logic for that type
}
// Decide way_name with special handling for name and ref
var wayName = this.getWayName(language, step, options);
// Decide which instruction string to use
// Destination takes precedence over name
var instruction;
if (step.destinations && step.exits && instructionObject.exit_destination) {
instruction = instructionObject.exit_destination;
} else if (step.destinations && instructionObject.destination) {
instruction = instructionObject.destination;
} else if (step.exits && instructionObject.exit) {
instruction = instructionObject.exit;
} else if (wayName && instructionObject.name) {
instruction = instructionObject.name;
} else if (options.waypointName && instructionObject.named) {
instruction = instructionObject.named;
} else {
instruction = instructionObject.default;
}
var destinations = step.destinations && step.destinations.split(': ');
var destinationRef = destinations && destinations[0].split(',')[0];
var destination = destinations && destinations[1] && destinations[1].split(',')[0];
var firstDestination;
if (destination && destinationRef) {
firstDestination = destinationRef + ': ' + destination;
} else {
firstDestination = destinationRef || destination || '';
}
var nthWaypoint = options.legIndex >= 0 && options.legIndex !== options.legCount - 1 ? this.ordinalize(language, options.legIndex + 1) : '';
// Replace tokens
// NOOP if they don't exist
var replaceTokens = {
'way_name': wayName,
'destination': firstDestination,
'exit': (step.exits || '').split(';')[0],
'exit_number': this.ordinalize(language, step.maneuver.exit || 1),
'rotary_name': step.rotary_name,
'lane_instruction': laneInstruction,
'modifier': instructions[language][version].constants.modifier[modifier],
'direction': this.directionFromDegree(language, step.maneuver.bearing_after),
'nth': nthWaypoint,
'waypoint_name': options.waypointName
};
return this.tokenize(language, instruction, replaceTokens, options);
},
grammarize: function(language, name, grammar) {
if (!language) throw new Error('No language code provided');
// Process way/rotary name with applying grammar rules if any
if (name && grammar && grammars && grammars[language] && grammars[language][version]) {
var rules = grammars[language][version][grammar];
if (rules) {
// Pass original name to rules' regular expressions enclosed with spaces for simplier parsing
var n = ' ' + name + ' ';
var flags = grammars[language].meta.regExpFlags || '';
rules.forEach(function(rule) {
var re = new RegExp(rule[0], flags);
n = n.replace(re, rule[1]);
});
return n.trim();
}
}
return name;
},
abbreviations: abbreviations,
tokenize: function(language, instruction, tokens, options) {
if (!language) throw new Error('No language code provided');
// Keep this function context to use in inline function below (no arrow functions in ES4)
var that = this;
var startedWithToken = false;
var output = instruction.replace(/\{(\w+)(?::(\w+))?\}/g, function(token, tag, grammar, offset) {
var value = tokens[tag];
// Return unknown token unchanged
if (typeof value === 'undefined') {
return token;
}
value = that.grammarize(language, value, grammar);
// If this token appears at the beginning of the instruction, capitalize it.
if (offset === 0 && instructions[language].meta.capitalizeFirstLetter) {
startedWithToken = true;
value = that.capitalizeFirstLetter(language, value);
}
if (options && options.formatToken) {
value = options.formatToken(tag, value);
}
return value;
})
.replace(/ {2}/g, ' '); // remove excess spaces
if (!startedWithToken && instructions[language].meta.capitalizeFirstLetter) {
return this.capitalizeFirstLetter(language, output);
}
return output;
}
};
};
},{"./languages":4}],4:[function(_dereq_,module,exports){
// Load all language files explicitly to allow integration
// with bundling tools like webpack and browserify
var instructionsDa = _dereq_('./languages/translations/da.json');
var instructionsDe = _dereq_('./languages/translations/de.json');
var instructionsEn = _dereq_('./languages/translations/en.json');
var instructionsEo = _dereq_('./languages/translations/eo.json');
var instructionsEs = _dereq_('./languages/translations/es.json');
var instructionsEsEs = _dereq_('./languages/translations/es-ES.json');
var instructionsFi = _dereq_('./languages/translations/fi.json');
var instructionsFr = _dereq_('./languages/translations/fr.json');
var instructionsHe = _dereq_('./languages/translations/he.json');
var instructionsId = _dereq_('./languages/translations/id.json');
var instructionsIt = _dereq_('./languages/translations/it.json');
var instructionsKo = _dereq_('./languages/translations/ko.json');
var instructionsMy = _dereq_('./languages/translations/my.json');
var instructionsNl = _dereq_('./languages/translations/nl.json');
var instructionsNo = _dereq_('./languages/translations/no.json');
var instructionsPl = _dereq_('./languages/translations/pl.json');
var instructionsPtBr = _dereq_('./languages/translations/pt-BR.json');
var instructionsPtPt = _dereq_('./languages/translations/pt-PT.json');
var instructionsRo = _dereq_('./languages/translations/ro.json');
var instructionsRu = _dereq_('./languages/translations/ru.json');
var instructionsSv = _dereq_('./languages/translations/sv.json');
var instructionsTr = _dereq_('./languages/translations/tr.json');
var instructionsUk = _dereq_('./languages/translations/uk.json');
var instructionsVi = _dereq_('./languages/translations/vi.json');
var instructionsZhHans = _dereq_('./languages/translations/zh-Hans.json');
// Load all grammar files
var grammarFr = _dereq_('./languages/grammar/fr.json');
var grammarRu = _dereq_('./languages/grammar/ru.json');
// Load all abbreviations files
var abbreviationsBg = _dereq_('./languages/abbreviations/bg.json');
var abbreviationsCa = _dereq_('./languages/abbreviations/ca.json');
var abbreviationsDa = _dereq_('./languages/abbreviations/da.json');
var ebbreviationsDe = _dereq_('./languages/abbreviations/de.json');
var abbreviationsEn = _dereq_('./languages/abbreviations/en.json');
var abbreviationsEs = _dereq_('./languages/abbreviations/es.json');
var abbreviationsFr = _dereq_('./languages/abbreviations/fr.json');
var abbreviationsHe = _dereq_('./languages/abbreviations/he.json');
var abbreviationsHu = _dereq_('./languages/abbreviations/hu.json');
var abbreviationsLt = _dereq_('./languages/abbreviations/lt.json');
var abbreviationsNl = _dereq_('./languages/abbreviations/nl.json');
var abbreviationsRu = _dereq_('./languages/abbreviations/ru.json');
var abbreviationsSl = _dereq_('./languages/abbreviations/sl.json');
var abbreviationsSv = _dereq_('./languages/abbreviations/sv.json');
var abbreviationsUk = _dereq_('./languages/abbreviations/uk.json');
var abbreviationsVi = _dereq_('./languages/abbreviations/vi.json');
// Create a list of supported codes
var instructions = {
'da': instructionsDa,
'de': instructionsDe,
'en': instructionsEn,
'eo': instructionsEo,
'es': instructionsEs,
'es-ES': instructionsEsEs,
'fi': instructionsFi,
'fr': instructionsFr,
'he': instructionsHe,
'id': instructionsId,
'it': instructionsIt,
'ko': instructionsKo,
'my': instructionsMy,
'nl': instructionsNl,
'no': instructionsNo,
'pl': instructionsPl,
'pt-BR': instructionsPtBr,
'pt-PT': instructionsPtPt,
'ro': instructionsRo,
'ru': instructionsRu,
'sv': instructionsSv,
'tr': instructionsTr,
'uk': instructionsUk,
'vi': instructionsVi,
'zh-Hans': instructionsZhHans
};
// Create list of supported grammar
var grammars = {
'fr': grammarFr,
'ru': grammarRu
};
// Create list of supported abbrevations
var abbreviations = {
'bg': abbreviationsBg,
'ca': abbreviationsCa,
'da': abbreviationsDa,
'de': ebbreviationsDe,
'en': abbreviationsEn,
'es': abbreviationsEs,
'fr': abbreviationsFr,
'he': abbreviationsHe,
'hu': abbreviationsHu,
'lt': abbreviationsLt,
'nl': abbreviationsNl,
'ru': abbreviationsRu,
'sl': abbreviationsSl,
'sv': abbreviationsSv,
'uk': abbreviationsUk,
'vi': abbreviationsVi
};
module.exports = {
supportedCodes: Object.keys(instructions),
instructions: instructions,
grammars: grammars,
abbreviations: abbreviations
};
},{"./languages/abbreviations/bg.json":5,"./languages/abbreviations/ca.json":6,"./languages/abbreviations/da.json":7,"./languages/abbreviations/de.json":8,"./languages/abbreviations/en.json":9,"./languages/abbreviations/es.json":10,"./languages/abbreviations/fr.json":11,"./languages/abbreviations/he.json":12,"./languages/abbreviations/hu.json":13,"./languages/abbreviations/lt.json":14,"./languages/abbreviations/nl.json":15,"./languages/abbreviations/ru.json":16,"./languages/abbreviations/sl.json":17,"./languages/abbreviations/sv.json":18,"./languages/abbreviations/uk.json":19,"./languages/abbreviations/vi.json":20,"./languages/grammar/fr.json":21,"./languages/grammar/ru.json":22,"./languages/translations/da.json":23,"./languages/translations/de.json":24,"./languages/translations/en.json":25,"./languages/translations/eo.json":26,"./languages/translations/es-ES.json":27,"./languages/translations/es.json":28,"./languages/translations/fi.json":29,"./languages/translations/fr.json":30,"./languages/translations/he.json":31,"./languages/translations/id.json":32,"./languages/translations/it.json":33,"./languages/translations/ko.json":34,"./languages/translations/my.json":35,"./languages/translations/nl.json":36,"./languages/translations/no.json":37,"./languages/translations/pl.json":38,"./languages/translations/pt-BR.json":39,"./languages/translations/pt-PT.json":40,"./languages/translations/ro.json":41,"./languages/translations/ru.json":42,"./languages/translations/sv.json":43,"./languages/translations/tr.json":44,"./languages/translations/uk.json":45,"./languages/translations/vi.json":46,"./languages/translations/zh-Hans.json":47}],5:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"международен": "Межд",
"старши": "Стрш",
"възел": "Въз",
"пазар": "Mkt",
"светисвети": "СвСв",
"сестра": "сес",
"уилям": "Ум",
"апартаменти": "ап",
"езеро": "Ез",
"свети": "Св",
"център": "Ц-р",
"парк": "Пк",
"маршрут": "М-т",
"площад": "Пл",
"национален": "Нац",
"училище": "Уч",
"река": "Рек",
"поток": "П-к",
"район": "Р-н",
"крепост": "К-т",
"паметник": "Пам",
"университет": "Уни",
"Връх": "Вр",
"точка": "Точ",
"планина": "Пл",
"село": "с.",
"височини": "вис",
"младши": "Мл",
"станция": "С-я",
"проход": "Прох",
"баща": "Бщ"
},
"classifications": {
"шофиране": "Шоф",
"плавен": "Пл",
"място": "Мя",
"тераса": "Тер",
"магистрала": "М-ла",
"площад": "Пл",
"пеш": "Пеш",
"залив": "З-в",
"пътека": "П-ка",
"платно": "Пл",
"улица": "Ул",
"алея": "Ал",
"пешеходна": "Пеш",
"точка": "Тч",
"задминаване": "Задм",
"кръгово": "Кр",
"връх": "Вр",
"съд": "Сд",
"булевард": "Бул",
"път": "Път",
"скоростна": "Скор",
"мост": "Мо"
},
"directions": {
"северозапад": "СЗ",
"североизток": "СИ",
"югозапад": "ЮЗ",
"югоизток": "ЮИ",
"север": "С",
"изток": "И",
"юг": "Ю"
}
}
},{}],6:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"comunicacions": "Com.",
"entitat de població": "Nucli",
"disseminat": "Diss.",
"cap de municipi": "Cap",
"indret": "Indr.",
"comarca": "Cca.",
"relleu del litoral": "Lit.",
"municipi": "Mun.",
"xarxa hidrogràfica": "Curs Fluv.",
"equipament": "Equip.",
"orografia": "Orogr.",
"barri": "Barri",
"edificació": "Edif.",
"edificació històrica": "Edif. Hist.",
"entitat descentralitzada": "E.M.D.",
"element hidrogràfic": "Hidr."
},
"classifications": {
"rotonda": "Rot.",
"carrerada": "Ca.",
"jardí": "J.",
"paratge": "Pge.",
"pont": "Pont",
"lloc": "Lloc",
"rambla": "Rbla.",
"cases": "Cses.",
"barranc": "Bnc.",
"plana": "Plana",
"polígon": "Pol.",
"muralla": "Mur.",
"enllaç": "Ellaç",
"antiga carretera": "Actra",
"glorieta": "Glor.",
"autovia": "Autv.",
"prolongació": "Prol.",
"calçada": "Cda.",
"carretera": "Ctra.",
"pujada": "Pda.",
"torrent": "T.",
"disseminat": "Disse",
"barri": "B.",
"cinturó": "Cinto",
"passera": "Psera",
"sender": "Send.",
"carrer": "C.",
"sèquia": "Sèq.",
"blocs": "Bloc",
"rambleta": "Rblt.",
"partida": "Par.",
"costa": "Cos.",
"sector": "Sec.",
"corraló": "Crral",
"urbanització": "Urb.",
"autopista": "Autp.",
"grup": "Gr.",
"platja": "Pja.",
"jardins": "J.",
"complex": "Comp.",
"portals": "Ptals",
"finca": "Fin.",
"travessera": "Trav.",
"plaça": "Pl.",
"travessia": "Trv.",
"polígon industrial": "PI.",
"passatge": "Ptge.",
"apartaments": "Apmt.",
"mirador": "Mira.",
"antic": "Antic",
"accés": "Acc.",
"colònia": "Col.",
"corriol": "Crol.",
"portal": "Ptal.",
"porta": "Pta.",
"port": "Port",
"carreró": "Cró.",
"riera": "Ra.",
"circumval·lació": "Cval.",
"baixada": "Bda.",
"placeta": "Plta.",
"escala": "Esc.",
"gran via": "GV",
"rial": "Rial",
"conjunt": "Conj.",
"avinguda": "Av.",
"esplanada": "Esp.",
"cantonada": "Cant.",
"ronda": "Rda.",
"corredor": "Cdor.",
"drecera": "Drec.",
"passadís": "Pdís.",
"viaducte": "Vdct.",
"passeig": "Pg.",
"veïnat": "Veï."
},
"directions": {
"sudest": "SE",
"sudoest": "SO",
"nordest": "NE",
"nordoest": "NO",
"est": "E",
"nord": "N",
"oest": "O",
"sud": "S"
}
}
},{}],7:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"skole": "Sk.",
"ved": "v.",
"centrum": "C.",
"sankt": "Skt.",
"vestre": "v.",
"hospital": "Hosp.",
"stræde": "Str.",
"nordre": "Nr.",
"plads": "Pl.",
"universitet": "Uni.",
"vænge": "vg.",
"station": "St."
},
"classifications": {
"avenue": "Ave",
"gammel": "Gl.",
"dronning": "Dronn.",
"sønder": "Sdr.",
"nørre": "Nr.",
"vester": "V.",
"vestre": "V.",
"øster": "Ø.",
"østre": "Ø.",
"boulevard": "Boul."
},
"directions": {
"sydøst": "SØ",
"nordvest": "NV",
"syd": "S",
"nordøst": "NØ",
"sydvest": "SV",
"vest": "V",
"nord": "N",
"øst": "Ø"
}
}
},{}],8:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {},
"classifications": {},
"directions": {
"osten": "O",
"nordosten": "NO",
"süden": "S",
"nordwest": "NW",
"norden": "N",
"südost": "SO",
"südwest": "SW",
"westen": "W"
}
}
},{}],9:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"square": "Sq",
"centre": "Ctr",
"sister": "Sr",
"lake": "Lk",
"fort": "Ft",
"route": "Rte",
"william": "Wm",
"national": "Nat’l",
"junction": "Jct",
"center": "Ctr",
"saint": "St",
"saints": "SS",
"station": "Sta",
"mount": "Mt",
"junior": "Jr",
"mountain": "Mtn",
"heights": "Hts",
"university": "Univ",
"school": "Sch",
"international": "Int’l",
"apartments": "Apts",
"crossing": "Xing",
"creek": "Crk",
"township": "Twp",
"downtown": "Dtwn",
"father": "Fr",
"senior": "Sr",
"point": "Pt",
"river": "Riv",
"market": "Mkt",
"village": "Vil",
"park": "Pk",
"memorial": "Mem"
},
"classifications": {
"place": "Pl",
"circle": "Cir",
"bypass": "Byp",
"motorway": "Mwy",
"crescent": "Cres",
"road": "Rd",
"cove": "Cv",
"lane": "Ln",
"square": "Sq",
"street": "St",
"freeway": "Fwy",
"walk": "Wk",
"plaza": "Plz",
"parkway": "Pky",
"avenue": "Ave",
"pike": "Pk",
"drive": "Dr",
"highway": "Hwy",
"footway": "Ftwy",
"point": "Pt",
"court": "Ct",
"terrace": "Ter",
"walkway": "Wky",
"alley": "Aly",
"expressway": "Expy",
"bridge": "Br",
"boulevard": "Blvd",
"turnpike": "Tpk"
},
"directions": {
"southeast": "SE",
"northwest": "NW",
"south": "S",
"west": "W",
"southwest": "SW",
"north": "N",
"east": "E",
"northeast": "NE"
}
}
},{}],10:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"segunda": "2ª",
"octubre": "8bre",
"doctores": "Drs",
"doctora": "Dra",
"internacional": "Intl",
"doctor": "Dr",
"segundo": "2º",
"señorita": "Srta",
"doctoras": "Drs",
"primera": "1ª",
"primero": "1º",
"san": "S",
"colonia": "Col",
"doña": "Dña",
"septiembre": "7bre",
"diciembre": "10bre",
"señor": "Sr",
"ayuntamiento": "Ayto",
"señora": "Sra",
"tercera": "3ª",
"tercero": "3º",
"don": "D",
"santa": "Sta",
"ciudad": "Cdad",
"noviembre": "9bre",
"departamento": "Dep"
},
"classifications": {
"camino": "Cmno",
"avenida": "Av",
"paseo": "Pº",
"autopista": "Auto",
"calle": "C",
"plaza": "Pza",
"carretera": "Crta"
},
"directions": {
"este": "E",
"noreste": "NE",
"sur": "S",
"suroeste": "SO",
"noroeste": "NO",
"oeste": "O",
"sureste": "SE",
"norte": "N"
}
}
},{}],11:[function(_dereq_,module,exports){
module.exports={
"abbreviations": {
"allée": "All",
"aérodrome": "Aérod",
"aéroport": "Aérop"
},
"classifications": {
"centrale": "Ctrale",
"campings": "Camp.",
"urbains": "Urb.",
"mineure": "Min.",
"publique": "Publ.",
"supérieur": "Sup.",
"fédération": "Féd.",
"notre-dame": "ND",
"saint": "St",
"centre hospitalier régional": "CHR",
"exploitation": "Exploit.",
"général": "Gal",
"civiles": "Civ.",
"maritimes": "Marit.",
"aviation": "Aviat.",
"iii": "3",
"archéologique": "Archéo.",
"musical": "Music.",
"musicale": "Music.",
"immeuble": "Imm.",
"xv": "15",
"hôtel": "Hôt.",
"alpine": "Alp.",
"communale": "Commun.",
"v": "5",
"global": "Glob.",
"université": "Univ.",
"confédéral": "Conféd.",
"xx": "20",
"x": "10",
"piscine": "Pisc.",
"dimanche": "di.",
"fleuve": "Flv",
"postaux": "Post.",
"musicienne": "Music.",
"département": "Dépt",
"février": "Févr.",
"municipales": "Munic.",
"province": "Prov.",
"communautés": "Commtés",
"barrage": "Barr.",
"mercredi": "me.",
"présidentes": "Pdtes",
"cafétérias": "Cafét.",
"théâtral": "Thé.",
"viticulteur": "Vitic.",
"poste": "Post.",
"spécialisée": "Spéc.",
"agriculture": "Agric.",
"infirmier": "Infirm.",
"animation": "Anim.",
"mondiale": "Mond.",
"arrêt": "Arr.",
"zone": "zon.",
"municipaux": "Munic.",
"grand": "Gd",
"janvier": "Janv.",
"fondateur": "Fond.",
"première": "1re",
"municipale": "Munic.",
"direction": "Dir.",
"anonyme": "Anon.",
"départementale": "Dépt",
"moyens": "Moy.",
"novembre": "Nov.",
"jardin": "Jard.",
"petites": "Pet.",
"privé": "Priv.",
"centres": "Ctres",
"forestier": "Forest.",
"xiv": "14",
"africaines": "Afric.",
"sergent": "Sgt",
"européenne": "Eur.",
"privée": "Priv.",
"café": "Cfé",
"xix": "19",
"hautes": "Htes",
"major": "Mjr",
"vendredi": "ve.",
"municipalité": "Munic.",
"sous-préfecture": "Ss-préf.",
"spéciales": "Spéc.",
"secondaires": "Second.",
"viie": "7e",
"moyenne": "Moy.",
"commerciale": "Commerc.",
"région": "Rég.",
"américaines": "Amér.",
"américains": "Amér.",
"service": "Sce",
"professeur": "Prof.",
"départemental": "Dépt",
"hôtels": "Hôt.",
"mondiales": "Mond.",
"ire": "1re",
"caporal": "Capo.",
"militaire": "Milit.",
"lycée d'enseignement professionnel": "LEP",
"adjudant": "Adj.",
"médicale": "Méd.",
"conférences": "Confér.",
"universelle": "Univ.",
"xiie": "12e",
"supérieures": "Sup.",
"naturel": "Natur.",
"société nationale": "SN",
"hospitalier": "Hosp.",
"culturelle": "Cult.",
"américain": "Amér.",
"son altesse royale": "S.A.R.",
"infirmière": "Infirm.",
"viii": "8",
"fondatrice": "Fond.",
"madame": "Mme",
"métropolitain": "Métrop.",
"ophtalmologues": "Ophtalmos",
"xviie": "18e",
"viiie": "8e",
"commerçante": "Commerç.",
"centre d'enseignement du second degré": "CES",
"septembre": "Sept.",
"agriculteur": "Agric.",
"xiii": "13",
"pontifical": "Pontif.",
"cafétéria": "Cafét.",
"prince": "Pce",
"vie": "6e",
"archiduchesse": "Archid.",
"occidental": "Occ.",
"spectacles": "Spect.",
"camping": "Camp.",
"métro": "Mº",
"arrondissement": "Arrond.",
"viticole": "Vitic.",
"ii": "2",
"siècle": "Si.",
"chapelles": "Chap.",
"centre": "Ctre",
"sapeur-pompiers": "Sap.-pomp.",
"établissements": "Étabts",
"société anonyme": "SA",
"directeurs": "Dir.",
"vii": "7",
"culturel": "Cult.",
"central": "Ctral",
"métropolitaine": "Métrop.",
"administrations": "Admin.",
"amiraux": "Amir.",
"sur": "s/",
"premiers": "1ers",
"provence-alpes-côte d'azur": "PACA",
"cathédrale": "Cathéd.",
"iv": "4",
"postale": "Post.",
"social": "Soc.",
"spécialisé": "Spéc.",
"district": "Distr.",
"technologique": "Techno.",
"viticoles": "Vitic.",
"ix": "9",
"protégés": "Prot.",
"historiques": "Hist.",
"sous": "s/s",
"national": "Nal",
"ambassade": "Amb.",
"cafés": "Cfés",
"agronomie": "Agro.",
"sapeurs": "Sap.",
"petits": "Pet.",
"monsieur": "M.",
"boucher": "Bouch.",
"restaurant": "Restau.",
"lycée": "Lyc.",
"urbaine": "Urb.",
"préfecture": "Préf.",
"districts": "Distr.",
"civil": "Civ.",
"protégées": "Prot.",
"sapeur": "Sap.",
"théâtre": "Thé.",
"collège": "Coll.",
"mardi": "ma.",
"mémorial": "Mémor.",
"africain": "Afric.",
"républicaine": "Républ.",
"sociale": "Soc.",
"spécial": "Spéc.",
"technologie": "Techno.",
"charcuterie": "Charc.",
"commerces": "Commerc.",
"fluviale": "Flv",
"parachutistes": "Para.",
"primaires": "Prim.",
"directions": "Dir.",
"présidentiel": "Pdtl",
"nationales": "Nales",
"après": "apr.",
"samedi": "sa.",
"unité": "U.",
"xxiii": "23",
"associé": "Assoc.",
"électrique": "Électr.",
"populaire": "Pop.",
"asiatique": "Asiat.",
"navigable": "Navig.",
"présidente": "Pdte",
"xive": "14e",
"associés": "Assoc.",
"pompiers": "Pomp.",
"agricoles": "Agric.",
"élém": "Élém.",
"décembre": "Déc.",
"son altesse": "S.Alt.",
"après-midi": "a.-m.",
"mineures": "Min.",
"juillet": "Juil.",
"aviatrices": "Aviat.",
"fondation": "Fond.",
"pontificaux": "Pontif.",
"temple": "Tple",
"européennes": "Eur.",
"régionale": "Rég.",
"informations": "Infos",
"mondiaux": "Mond.",
"infanterie": "Infant.",
"archéologie": "Archéo.",
"dans": "d/",
"hospice": "Hosp.",
"spectacle": "Spect.",
"hôtels-restaurants": "Hôt.-Rest.",
"hôtel-restaurant": "Hôt.-Rest.",
"hélicoptère": "hélico",
"xixe": "19e",
"cliniques": "Clin.",
"docteur": "Dr",
"secondaire": "Second.",
"municipal": "Munic.",
"générale": "Gale",
"château": "Chât.",
"commerçant": "Commerç.",
"avril": "Avr.",
"clinique": "Clin.",
"urbaines": "Urb.",
"navale": "Nav.",
"navigation": "Navig.",
"asiatiques": "Asiat.",
"pontificales": "Pontif.",
"administrative": "Admin.",
"syndicat": "Synd.",
"lundi": "lu.",
"petite": "Pet.",
"maritime": "Marit.",
"métros": "Mº",
"enseignement": "Enseign.",
"fluviales": "Flv",
"historique": "Hist.",
"comtés": "Ctés",
"résidentiel": "Résid.",
"international": "Int.",
"supérieure": "Sup.",
"centre hospitalier universitaire": "CHU",
"confédération": "Conféd.",
"boucherie": "Bouch.",
"fondatrices": "Fond.",
"médicaux": "Méd.",
"européens": "Eur.",
"orientaux": "Ori.",
"naval": "Nav.",
"étang": "Étg",
"provincial": "Prov.",
"junior": "Jr",
"départementales": "Dépt",
"musique": "Musiq.",
"directrices": "Dir.",
"maréchal": "Mal",
"civils": "Civ.",
"protégé": "Prot.",
"établissement": "Étabt",
"trafic": "Traf.",
"aviateur": "Aviat.",
"archives": "Arch.",
"africains": "Afric.",
"maternelle": "Matern.",
"industrielle": "Ind.",
"administratif": "Admin.",
"oriental": "Ori.",
"universitaire": "Univ.",
"majeur": "Maj.",
"haute": "Hte",
"communal": "Commun.",
"petit": "Pet.",
"commune": "Commun.",
"exploitant": "Exploit.",
"conférence": "Confér.",
"monseigneur": "Mgr",
"pharmacien": "Pharm.",
"jeudi": "je.",
"primaire": "Prim.",
"hélicoptères": "hélicos",
"agronomique": "Agro.",
"médecin": "Méd.",
"ve": "5e",
"pontificale": "Pontif.",
"ier": "1er",
"cinéma": "Ciné",
"fluvial": "Flv",
"occidentaux": "Occ.",
"commerçants": "Commerç.",
"banque": "Bq",
"moyennes": "Moy.",
"pharmacienne": "Pharm.",
"démocratique": "Dém.",
"cinémas": "Cinés",
"spéciale": "Spéc.",
"présidents": "Pdts",
"directrice": "Dir.",
"vi": "6",
"basse": "Bas.",
"xve": "15e",
"état": "É.",
"aviateurs": "Aviat.",
"majeurs": "Maj.",
"infirmiers": "Infirm.",
"église": "Égl.",
"confédérale": "Conféd.",
"xxie": "21e",
"comte": "Cte",
"européen": "Eur.",
"union": "U.",
"pharmacie": "Pharm.",
"infirmières": "Infirm.",
"comté": "Cté",
"sportive": "Sport.",
"deuxième": "2e",
"xvi": "17",
"haut": "Ht",
"médicales": "Méd.",
"développé": "Dévelop.",
"bâtiment": "Bât.",
"commerce": "Commerc.",
"ive": "4e",
"associatif": "Assoc.",
"rural": "Rur.",
"cimetière": "Cim.",
"régional": "Rég.",
"ferroviaire": "Ferr.",
"vers": "v/",
"mosquée": "Mosq.",
"mineurs": "Min.",
"nautique": "Naut.",
"châteaux": "Chât.",
"sportif": "Sport.",
"mademoiselle": "Mle",
"école": "Éc.",
"doyen": "Doy.",
"industriel": "Ind.",
"chapelle": "Chap.",
"sociétés": "Stés",
"internationale": "Int.",
"coopératif": "Coop.",
"hospices": "Hosp.",
"xxii": "22",
"parachutiste": "Para.",
"alpines": "Alp.",
"civile": "Civ.",
"xvie": "17e",
"états": "É.",
"musée": "Msée",
"centrales": "Ctrales",
"globaux": "Glob.",
"supérieurs": "Sup.",
"syndicats": "Synd.",
"archevêque": "Archev.",
"docteurs": "Drs",
"bibliothèque": "Biblio.",
"lieutenant": "Lieut.",
"république": "Rép.",
"vétérinaire": "Vét.",
"départementaux": "Dépt",
"premier": "1er",
"fluviaux": "Flv",
"animé": "Anim.",
"orientales": "Ori.",
"technologiques": "Techno.",
"princesse": "Pse",
"routière": "Rout.",
"coopérative": "Coop.",
"scolaire": "Scol.",
"écoles": "Éc.",
"football": "Foot",
"territoriale": "Territ.",
"commercial": "Commerc.",
"mineur": "Min.",
"millénaires": "Mill.",
"association": "Assoc.",
"catholique": "Cathol.",
"administration": "Admin.",
"mairie": "Mair.",
"portuaire": "Port.",
"tertiaires": "Terti.",
"théâtrale": "Thé.",
"palais": "Pal.",
"troisième": "3e",
"directeur": "Dir.",
"vétérinaires": "Vét.",
"faculté": "Fac.",
"occidentales": "Occ.",
"viticulteurs": "Vitic.",
"xvii": "18",
"occidentale": "Occ.",
"amiral": "Amir.",
"professionnel": "Profess.",
"administratives": "Admin.",
"commerciales": "Commerc.",
"saints": "Sts",
"agronomes": "Agro.",
"stade": "Std",
"sous-préfet": "Ss-préf.",
"senior": "Sr",
"agronome": "Agro.",
"terrain": "Terr.",
"catholiques": "Cathol.",
"résidentielle": "Résid.",
"grands": "Gds",
"exploitants": "Exploit.",
"xiiie": "13e",
"croix": "Cx",
"généraux": "Gaux",
"c