Created
April 20, 2018 09:41
-
-
Save hpfast/da4219d30e66332433f96d8556709048 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
(function (exports) { | |
'use strict'; | |
function unwrapExports (x) { | |
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; | |
} | |
function createCommonjsModule(fn, module) { | |
return module = { exports: {} }, fn(module, module.exports), module.exports; | |
} | |
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { | |
return typeof obj; | |
} : function (obj) { | |
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; | |
}; | |
var nlmapsLeaflet_cjs = createCommonjsModule(function (module, exports) { | |
Object.defineProperty(exports, '__esModule', { value: true }); | |
var config = { | |
"version": 0.1, | |
"basemaps": { | |
"defaults": { | |
"attr": "Kaartgegevens © <a href='https://data.amsterdam.nl'>Datapunt Amsterdam</a>", | |
"minZoom": 11, | |
"maxZoom": 19, | |
"type": "tms", | |
"format": "png", | |
"url": "https://t1.data.amsterdam.nl" | |
}, | |
"layers": [{ | |
"name": "standaard", | |
"urlname": "topo_wm_zw" | |
}, { | |
"name": "licht", | |
"urlname": "topo_wm_light" | |
}] | |
}, | |
"wms": { | |
"defaults": { | |
"url": "https://map.data.amsterdam.nl/maps", | |
"version": "1.1.0", | |
"transparent": true, | |
"format": "image/png", | |
"minZoom": 0, | |
"maxZoom": 24 | |
}, | |
"layers": [{ | |
"name": "tram", | |
"layerName": "trm", | |
"url": "https://map.data.amsterdam.nl/maps/trm?" | |
}] | |
}, | |
"geocoder": { | |
"suggestUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?", | |
"lookupUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/lookup?" | |
}, | |
"featureQuery": { | |
"baseUrl": "https://api.data.amsterdam.nl/bag/nummeraanduiding/?format=json&locatie=" | |
}, | |
"map": { | |
"style": 'standaard', | |
"center": { | |
"latitude": 52.37, | |
"longitude": 4.8952 | |
}, | |
"zoom": 12, | |
"attribution": true, | |
"extent": [4.7283, 52.2771, 5.0799, 52.4324] | |
} | |
}; | |
var CONFIG = {}; | |
CONFIG.BASE_DEFAULTS = { | |
crs: "EPSG:3857", | |
attr: "", | |
minZoom: 0, | |
maxZoom: 19, | |
type: "wmts", | |
format: "png", | |
url: "" | |
}; | |
CONFIG.WMS_DEFAULTS = { | |
url: "", | |
version: "1.1.1", | |
transparent: true, | |
format: "image/png", | |
minZoom: 0, | |
maxZoom: 24 | |
}; | |
CONFIG.BASEMAP_PROVIDERS = {}; | |
CONFIG.WMS_PROVIDERS = {}; | |
CONFIG.GEOCODER = {}; | |
CONFIG.MAP = {}; | |
function err(err) { | |
throw err; | |
} | |
if (config.version !== 0.1) { | |
err('unsupported config version'); | |
} | |
function mergeConfig(defaults$$1, config$$1) { | |
return Object.assign({}, defaults$$1, config$$1); | |
} | |
function parseBase(basemaps) { | |
var defaults$$1 = mergeConfig(CONFIG.BASE_DEFAULTS, basemaps.defaults); | |
if (!basemaps.layers || basemaps.layers.length < 0) { | |
err('no basemap defined, please define a basemap in the configuration'); | |
} | |
basemaps.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.BASEMAP_PROVIDERS[layer.name] !== undefined) { | |
err('basemap names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.BASEMAP_PROVIDERS[layer.name] = formatBasemapUrl(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
function parseWMS(wms) { | |
var defaults$$1 = mergeConfig(CONFIG.WMS_DEFAULTS, wms.defaults); | |
if (wms.layers) { | |
wms.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.WMS_PROVIDERS[layer.name] !== undefined) { | |
err('wms names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.WMS_PROVIDERS[layer.name] = applyTemplate(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
} | |
function parseGeocoder(geocoder) { | |
CONFIG.GEOCODER.lookupUrl = geocoder.lookupUrl; | |
CONFIG.GEOCODER.suggestUrl = geocoder.suggestUrl; | |
} | |
function parseMap(map) { | |
CONFIG.MAP = mergeConfig({}, map); | |
} | |
function formatBasemapUrl(layer) { | |
switch (layer.type) { | |
case 'wmts': | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
break; | |
case 'tms': | |
layer.url = layer.url + "/" + layer.urlname + "/{z}/{x}/{y}." + layer.format; | |
break; | |
default: | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
} | |
return layer; | |
} | |
function applyTemplate(layer) { | |
//Check if the url is templated | |
var start = layer.url.indexOf('{'); | |
if (start > -1) { | |
var end = layer.url.indexOf('}'); | |
var template = layer.url.slice(start + 1, end); | |
if (template.toLowerCase() === "workspacename") { | |
layer.url = layer.url.slice(0, start) + layer.workSpaceName + layer.url.slice(end + 1, -1); | |
} else { | |
err('only workspacename templates are supported for now'); | |
} | |
} | |
return layer; | |
} | |
function parseFeatureQuery(baseUrl) { | |
CONFIG.FEATUREQUERYBASEURL = baseUrl; | |
} | |
if (config.featureQuery !== undefined) parseFeatureQuery(config.featureQuery.baseUrl); | |
parseMap(config.map); | |
parseBase(config.basemaps); | |
if (config.wms !== undefined) parseWMS(config.wms); | |
if (config.geocoder !== undefined) parseGeocoder(config.geocoder); | |
var geocoder = CONFIG.GEOCODER; | |
function httpGetAsync(url) { | |
// eslint-disable-next-line no-unused-vars | |
return new Promise(function (resolve, reject) { | |
var xmlHttp = new XMLHttpRequest(); | |
xmlHttp.onreadystatechange = function () { | |
// eslint-disable-next-line eqeqeq | |
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { | |
resolve(JSON.parse(xmlHttp.responseText)); | |
} | |
}; | |
xmlHttp.open("GET", url, true); // true for asynchronous | |
xmlHttp.send(null); | |
}); | |
} | |
function wktPointToGeoJson(wktPoint) { | |
if (!wktPoint.includes('POINT')) { | |
throw TypeError('Provided WKT geometry is not a point.'); | |
} | |
var coordinateTuple = wktPoint.split('(')[1].split(')')[0]; | |
var x = parseFloat(coordinateTuple.split(' ')[0]); | |
var y = parseFloat(coordinateTuple.split(' ')[1]); | |
return { | |
type: 'Point', | |
coordinates: [x, y] | |
}; | |
} | |
/** | |
* Make a call to PDOK locatieserver v3 suggest service. This service is meant for geocoder autocomplete functionality. For | |
* additional documentation, check https://github.com/PDOK/locatieserver/wiki/API-Locatieserver. | |
* @param {string} searchTerm The term which to search for | |
*/ | |
geocoder.doSuggestRequest = function (searchTerm) { | |
return httpGetAsync(this.suggestUrl + 'q=' + encodeURIComponent(searchTerm)); | |
}; | |
/** | |
* Make a call to PDOK locatieserver v3 lookup service. This service provides information about objects found through the suggest service. For additional | |
* documentation, check: https://github.com/PDOK/locatieserver/wiki/API-Locatieserver | |
* @param {string} id The id of the feature that is to be looked up. | |
*/ | |
geocoder.doLookupRequest = function (id) { | |
return httpGetAsync(this.lookupUrl + 'id=' + encodeURIComponent(id)).then(function (lookupResult) { | |
// A lookup request should always return 1 result | |
var geocodeResult = lookupResult.response.docs[0]; | |
geocodeResult.centroide_ll = wktPointToGeoJson(geocodeResult.centroide_ll); | |
geocodeResult.centroide_rd = wktPointToGeoJson(geocodeResult.centroide_rd); | |
return geocodeResult; | |
}); | |
}; | |
geocoder.createControl = function (zoomFunction, map) { | |
var _this = this; | |
this.zoomTo = zoomFunction; | |
this.map = map; | |
var container = document.createElement('div'); | |
var searchDiv = document.createElement('div'); | |
var input = document.createElement('input'); | |
var results = document.createElement('div'); | |
var controlWidth = '300px'; | |
container.style.width = controlWidth; | |
container.style.zIndex = 1000000; | |
container.style.position = 'absolute'; | |
container.style.top = '15px'; | |
container.style.left = '12px'; | |
input.id = 'nlmaps-geocoder-control-input'; | |
input.placeholder = 'Zoeken op adres...'; | |
input.style.padding = '4px 10px'; | |
input.style.width = '100%'; | |
input.style.border = 'none'; | |
input.style.backgroundColor = '#fff'; | |
input.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
input.style.height = '26px'; | |
input.style.borderRadius = '5px 5px'; | |
input.setAttribute('aria-label', 'Zoek een adres'); | |
input.addEventListener('input', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
input.addEventListener('focus', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
results.id = 'nlmaps-geocoder-control-results'; | |
results.style.width = controlWidth; | |
container.appendChild(searchDiv); | |
searchDiv.appendChild(input); | |
container.appendChild(results); | |
return container; | |
}; | |
geocoder.suggest = function (query) { | |
var _this2 = this; | |
if (query.length < 4) { | |
this.clearSuggestResults(); | |
return; | |
} | |
this.doSuggestRequest(query).then(function (results) { | |
_this2.showSuggestResults(results.response.docs); | |
}); | |
}; | |
geocoder.lookup = function (id) { | |
var _this3 = this; | |
this.doLookupRequest(id).then(function (result) { | |
_this3.zoomTo(result.centroide_ll, _this3.map); | |
_this3.showLookupResult(result.weergavenaam); | |
_this3.clearSuggestResults(); | |
}); | |
}; | |
geocoder.clearSuggestResults = function () { | |
document.getElementById('nlmaps-geocoder-control-results').innerHTML = ''; | |
}; | |
geocoder.showLookupResult = function (name) { | |
document.getElementById('nlmaps-geocoder-control-input').value = name; | |
}; | |
geocoder.showSuggestResults = function (results) { | |
var _this4 = this; | |
var resultList = document.createElement('ul'); | |
resultList.style.padding = '10px 10px 2px 10px'; | |
resultList.style.width = '100%'; | |
resultList.style.background = '#FFFFFF'; | |
resultList.style.borderRadius = '5px 5px'; | |
resultList.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
results.forEach(function (result) { | |
var li = document.createElement('li'); | |
li.innerHTML = result.weergavenaam; | |
li.id = result.id; | |
li.style.cursor = 'pointer'; | |
li.style.padding = '5px'; | |
li.style.listStyleType = 'none'; | |
li.style.marginBottom = '5px'; | |
li.addEventListener('click', function (e) { | |
_this4.lookup(e.target.id); | |
}); | |
li.addEventListener('mouseenter', function () { | |
li.style.background = '#6C62A6'; | |
li.style.color = '#FFFFFF'; | |
}); | |
li.addEventListener('mouseleave', function () { | |
li.style.background = '#FFFFFF'; | |
li.style.color = '#333'; | |
}); | |
resultList.appendChild(li); | |
}); | |
this.clearSuggestResults(); | |
document.getElementById('nlmaps-geocoder-control-results').appendChild(resultList); | |
}; | |
var markerUrl = 'https://rawgit.com/webmapper/nlmaps/master/dist/assets/rijksoverheid-marker.png'; | |
/*parts copied from maps.stamen.com: https://github.com/stamen/maps.stamen.com/blob/master/js/tile.stamen.js | |
* copyright (c) 2012, Stamen Design | |
* under BSD 3-Clause license: https://github.com/stamen/maps.stamen.com/blob/master/LICENSE | |
*/ | |
/* | |
* Get the named provider, or throw an exception if it doesn't exist. | |
**/ | |
function getProvider(name) { | |
if (name in CONFIG.BASEMAP_PROVIDERS) { | |
var provider = CONFIG.BASEMAP_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (provider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated style; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
return provider; | |
} else { | |
// eslint-disable-next-line no-console | |
console.error('NL Maps error: You asked for a style which does not exist! Available styles: ' + Object.keys(PROVIDERS).join(', ')); | |
} | |
} | |
/* | |
* Get the named wmsProvider, or throw an exception if it doesn't exist. | |
**/ | |
function getWmsProvider(name, options) { | |
var wmsProvider = void 0; | |
if (name in CONFIG.WMS_PROVIDERS) { | |
wmsProvider = CONFIG.WMS_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (wmsProvider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated wms; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
} else { | |
wmsProvider = Object.assign({}, CONFIG.WMS_DEFAULTS, options); | |
// eslint-disable-next-line no-console | |
console.log('NL Maps: You asked for a wms which does not exist! Available wmses: ' + Object.keys(CONFIG.WMS_PROVIDERS).join(', ') + '. Provide an options object to make your own WMS.'); | |
} | |
return wmsProvider; | |
} | |
var _typeof$$1 = typeof Symbol === "function" && _typeof(Symbol.iterator) === "symbol" ? function (obj) { | |
return typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
} : function (obj) { | |
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
}; | |
//TODO 'standaard' vervangen door eerste layer van baselayers | |
if (typeof L !== 'undefined' && (typeof L === 'undefined' ? 'undefined' : _typeof$$1(L)) === 'object') { | |
L.NlmapsBgLayer = L.TileLayer.extend({ | |
initialize: function initialize() { | |
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'standaard'; | |
var options = arguments[1]; | |
var provider = getProvider(name); | |
var opts = L.Util.extend({}, options, { | |
'minZoom': provider.minZoom, | |
'maxZoom': provider.maxZoom, | |
'scheme': 'xyz', | |
'attribution': provider.attribution, | |
sa_id: name | |
}); | |
L.TileLayer.prototype.initialize.call(this, provider.url, opts); | |
} | |
}); | |
/* | |
* Factory function for consistency with Leaflet conventions | |
**/ | |
L.nlmapsBgLayer = function (options, source) { | |
return new L.NlmapsBgLayer(options, source); | |
}; | |
L.NlmapsOverlayLayer = L.TileLayer.WMS.extend({ | |
initialize: function initialize() { | |
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; | |
var options = arguments[1]; | |
var wmsProvider = getWmsProvider(name, options); | |
var url = wmsProvider.url; | |
delete wmsProvider.url; | |
var wmsParams = L.Util.extend({}, options, { | |
layers: wmsProvider.layers, | |
maxZoom: 24, | |
minZoom: 1, | |
styles: wmsProvider.styles, | |
version: wmsProvider.version, | |
transparent: wmsProvider.transparent, | |
format: wmsProvider.format | |
}); | |
L.TileLayer.WMS.prototype.initialize.call(this, url, wmsParams); | |
} | |
}); | |
/* | |
* Factory function for consistency with Leaflet conventions | |
**/ | |
L.nlmapsOverlayLayer = function (options, source) { | |
return new L.NlmapsOverlayLayer(options, source); | |
}; | |
L.Control.GeoLocatorControl = L.Control.extend({ | |
options: { | |
position: 'topright' | |
}, | |
initialize: function initialize(options) { | |
// set default options if nothing is set (merge one step deep) | |
for (var i in options) { | |
if (_typeof$$1(this.options[i]) === 'object') { | |
L.extend(this.options[i], options[i]); | |
} else { | |
this.options[i] = options[i]; | |
} | |
} | |
}, | |
onAdd: function onAdd(map) { | |
var div = L.DomUtil.create('div'); | |
div.id = 'nlmaps-geolocator-control'; | |
div.className = 'nlmaps-geolocator-control'; | |
var img = document.createElement('img'); | |
div.append(img); | |
if (this.options.geolocator.isStarted()) { | |
L.DomUtil.addClass(div, 'started'); | |
} | |
function moveMap(position) { | |
map.panTo([position.coords.latitude, position.coords.longitude]); | |
} | |
L.DomEvent.on(div, 'click', function () { | |
this.options.geolocator.start(); | |
L.DomUtil.addClass(div, 'started'); | |
}, this); | |
this.options.geolocator.on('position', function (d) { | |
L.DomUtil.removeClass(div, 'started'); | |
L.DomUtil.addClass(div, 'has-position'); | |
moveMap(d); | |
}); | |
return div; | |
}, | |
onRemove: function onRemove(map) { | |
return map; | |
} | |
}); | |
L.geoLocatorControl = function (geolocator) { | |
return new L.Control.GeoLocatorControl({ geolocator: geolocator }); | |
}; | |
} | |
function markerLayer(latLngObject) { | |
if (typeof L !== 'undefined' && (typeof L === 'undefined' ? 'undefined' : _typeof$$1(L)) === 'object') { | |
var lat = void 0; | |
var lng = void 0; | |
// LatLngObject should always be defined when it is called from the main package. | |
// eslint-disable-next-line eqeqeq | |
if (typeof latLngObject == 'undefined') { | |
var center = getMapCenter(map); | |
lat = center.latitude; | |
lng = center.longitude; | |
} else { | |
lat = latLngObject.latitude; | |
lng = latLngObject.longitude; | |
} | |
return new L.marker([lat, lng], { | |
alt: 'marker', | |
icon: new L.icon({ | |
iconUrl: markerUrl, | |
iconSize: [64, 64], | |
iconAnchor: [32, 63] | |
}) | |
}); | |
} | |
} | |
function bgLayer(name) { | |
if (typeof L !== 'undefined' && (typeof L === 'undefined' ? 'undefined' : _typeof$$1(L)) === 'object') { | |
return L.nlmapsBgLayer(name); | |
} | |
} | |
function overlayLayer(name, options) { | |
if (typeof L !== 'undefined' && (typeof L === 'undefined' ? 'undefined' : _typeof$$1(L)) === 'object') { | |
return L.nlmapsOverlayLayer(name, options); | |
} | |
} | |
function geoLocatorControl(geolocator) { | |
if (typeof L !== 'undefined' && (typeof L === 'undefined' ? 'undefined' : _typeof$$1(L)) === 'object') { | |
return L.geoLocatorControl(geolocator); | |
} | |
} | |
function zoomTo(point, map) { | |
map.fitBounds(L.geoJSON(point).getBounds(), { maxZoom: 18 }); | |
} | |
function geocoderControl(map) { | |
var control = geocoder.createControl(zoomTo, map); | |
control.addEventListener('click', function (e) { | |
return e.stopPropagation(); | |
}); | |
map.getContainer().appendChild(control); | |
} | |
function getMapCenter(map) { | |
var latLngObject = map.getCenter(); | |
return { | |
latitude: latLngObject.lat, | |
longitude: latLngObject.lng | |
}; | |
} | |
exports.bgLayer = bgLayer; | |
exports.overlayLayer = overlayLayer; | |
exports.markerLayer = markerLayer; | |
exports.getMapCenter = getMapCenter; | |
exports.geoLocatorControl = geoLocatorControl; | |
exports.geocoderControl = geocoderControl; | |
}); | |
unwrapExports(nlmapsLeaflet_cjs); | |
var nlmapsLeaflet_cjs_1 = nlmapsLeaflet_cjs.bgLayer; | |
var nlmapsLeaflet_cjs_2 = nlmapsLeaflet_cjs.overlayLayer; | |
var nlmapsLeaflet_cjs_3 = nlmapsLeaflet_cjs.markerLayer; | |
var nlmapsLeaflet_cjs_4 = nlmapsLeaflet_cjs.getMapCenter; | |
var nlmapsLeaflet_cjs_5 = nlmapsLeaflet_cjs.geoLocatorControl; | |
var nlmapsLeaflet_cjs_6 = nlmapsLeaflet_cjs.geocoderControl; | |
var nlmapsOpenlayers_cjs = createCommonjsModule(function (module, exports) { | |
Object.defineProperty(exports, '__esModule', { value: true }); | |
var config = { | |
"version": 0.1, | |
"basemaps": { | |
"defaults": { | |
"attr": "Kaartgegevens © <a href='https://data.amsterdam.nl'>Datapunt Amsterdam</a>", | |
"minZoom": 11, | |
"maxZoom": 19, | |
"type": "tms", | |
"format": "png", | |
"url": "https://t1.data.amsterdam.nl" | |
}, | |
"layers": [{ | |
"name": "standaard", | |
"urlname": "topo_wm_zw" | |
}, { | |
"name": "licht", | |
"urlname": "topo_wm_light" | |
}] | |
}, | |
"wms": { | |
"defaults": { | |
"url": "https://map.data.amsterdam.nl/maps", | |
"version": "1.1.0", | |
"transparent": true, | |
"format": "image/png", | |
"minZoom": 0, | |
"maxZoom": 24 | |
}, | |
"layers": [{ | |
"name": "tram", | |
"layerName": "trm", | |
"url": "https://map.data.amsterdam.nl/maps/trm?" | |
}] | |
}, | |
"geocoder": { | |
"suggestUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?", | |
"lookupUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/lookup?" | |
}, | |
"featureQuery": { | |
"baseUrl": "https://api.data.amsterdam.nl/bag/nummeraanduiding/?format=json&locatie=" | |
}, | |
"map": { | |
"style": 'standaard', | |
"center": { | |
"latitude": 52.37, | |
"longitude": 4.8952 | |
}, | |
"zoom": 12, | |
"attribution": true, | |
"extent": [4.7283, 52.2771, 5.0799, 52.4324] | |
} | |
}; | |
var CONFIG = {}; | |
CONFIG.BASE_DEFAULTS = { | |
crs: "EPSG:3857", | |
attr: "", | |
minZoom: 0, | |
maxZoom: 19, | |
type: "wmts", | |
format: "png", | |
url: "" | |
}; | |
CONFIG.WMS_DEFAULTS = { | |
url: "", | |
version: "1.1.1", | |
transparent: true, | |
format: "image/png", | |
minZoom: 0, | |
maxZoom: 24 | |
}; | |
CONFIG.BASEMAP_PROVIDERS = {}; | |
CONFIG.WMS_PROVIDERS = {}; | |
CONFIG.GEOCODER = {}; | |
CONFIG.MAP = {}; | |
function err(err) { | |
throw err; | |
} | |
if (config.version !== 0.1) { | |
err('unsupported config version'); | |
} | |
function mergeConfig(defaults$$1, config$$1) { | |
return Object.assign({}, defaults$$1, config$$1); | |
} | |
function parseBase(basemaps) { | |
var defaults$$1 = mergeConfig(CONFIG.BASE_DEFAULTS, basemaps.defaults); | |
if (!basemaps.layers || basemaps.layers.length < 0) { | |
err('no basemap defined, please define a basemap in the configuration'); | |
} | |
basemaps.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.BASEMAP_PROVIDERS[layer.name] !== undefined) { | |
err('basemap names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.BASEMAP_PROVIDERS[layer.name] = formatBasemapUrl(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
function parseWMS(wms) { | |
var defaults$$1 = mergeConfig(CONFIG.WMS_DEFAULTS, wms.defaults); | |
if (wms.layers) { | |
wms.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.WMS_PROVIDERS[layer.name] !== undefined) { | |
err('wms names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.WMS_PROVIDERS[layer.name] = applyTemplate(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
} | |
function parseGeocoder(geocoder) { | |
CONFIG.GEOCODER.lookupUrl = geocoder.lookupUrl; | |
CONFIG.GEOCODER.suggestUrl = geocoder.suggestUrl; | |
} | |
function parseMap(map) { | |
CONFIG.MAP = mergeConfig({}, map); | |
} | |
function formatBasemapUrl(layer) { | |
switch (layer.type) { | |
case 'wmts': | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
break; | |
case 'tms': | |
layer.url = layer.url + "/" + layer.urlname + "/{z}/{x}/{y}." + layer.format; | |
break; | |
default: | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
} | |
return layer; | |
} | |
function applyTemplate(layer) { | |
//Check if the url is templated | |
var start = layer.url.indexOf('{'); | |
if (start > -1) { | |
var end = layer.url.indexOf('}'); | |
var template = layer.url.slice(start + 1, end); | |
if (template.toLowerCase() === "workspacename") { | |
layer.url = layer.url.slice(0, start) + layer.workSpaceName + layer.url.slice(end + 1, -1); | |
} else { | |
err('only workspacename templates are supported for now'); | |
} | |
} | |
return layer; | |
} | |
function parseFeatureQuery(baseUrl) { | |
CONFIG.FEATUREQUERYBASEURL = baseUrl; | |
} | |
if (config.featureQuery !== undefined) parseFeatureQuery(config.featureQuery.baseUrl); | |
parseMap(config.map); | |
parseBase(config.basemaps); | |
if (config.wms !== undefined) parseWMS(config.wms); | |
if (config.geocoder !== undefined) parseGeocoder(config.geocoder); | |
var geocoder = CONFIG.GEOCODER; | |
function httpGetAsync(url) { | |
// eslint-disable-next-line no-unused-vars | |
return new Promise(function (resolve, reject) { | |
var xmlHttp = new XMLHttpRequest(); | |
xmlHttp.onreadystatechange = function () { | |
// eslint-disable-next-line eqeqeq | |
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { | |
resolve(JSON.parse(xmlHttp.responseText)); | |
} | |
}; | |
xmlHttp.open("GET", url, true); // true for asynchronous | |
xmlHttp.send(null); | |
}); | |
} | |
function wktPointToGeoJson(wktPoint) { | |
if (!wktPoint.includes('POINT')) { | |
throw TypeError('Provided WKT geometry is not a point.'); | |
} | |
var coordinateTuple = wktPoint.split('(')[1].split(')')[0]; | |
var x = parseFloat(coordinateTuple.split(' ')[0]); | |
var y = parseFloat(coordinateTuple.split(' ')[1]); | |
return { | |
type: 'Point', | |
coordinates: [x, y] | |
}; | |
} | |
/** | |
* Make a call to PDOK locatieserver v3 suggest service. This service is meant for geocoder autocomplete functionality. For | |
* additional documentation, check https://github.com/PDOK/locatieserver/wiki/API-Locatieserver. | |
* @param {string} searchTerm The term which to search for | |
*/ | |
geocoder.doSuggestRequest = function (searchTerm) { | |
return httpGetAsync(this.suggestUrl + 'q=' + encodeURIComponent(searchTerm)); | |
}; | |
/** | |
* Make a call to PDOK locatieserver v3 lookup service. This service provides information about objects found through the suggest service. For additional | |
* documentation, check: https://github.com/PDOK/locatieserver/wiki/API-Locatieserver | |
* @param {string} id The id of the feature that is to be looked up. | |
*/ | |
geocoder.doLookupRequest = function (id) { | |
return httpGetAsync(this.lookupUrl + 'id=' + encodeURIComponent(id)).then(function (lookupResult) { | |
// A lookup request should always return 1 result | |
var geocodeResult = lookupResult.response.docs[0]; | |
geocodeResult.centroide_ll = wktPointToGeoJson(geocodeResult.centroide_ll); | |
geocodeResult.centroide_rd = wktPointToGeoJson(geocodeResult.centroide_rd); | |
return geocodeResult; | |
}); | |
}; | |
geocoder.createControl = function (zoomFunction, map) { | |
var _this = this; | |
this.zoomTo = zoomFunction; | |
this.map = map; | |
var container = document.createElement('div'); | |
var searchDiv = document.createElement('div'); | |
var input = document.createElement('input'); | |
var results = document.createElement('div'); | |
var controlWidth = '300px'; | |
container.style.width = controlWidth; | |
container.style.zIndex = 1000000; | |
container.style.position = 'absolute'; | |
container.style.top = '15px'; | |
container.style.left = '12px'; | |
input.id = 'nlmaps-geocoder-control-input'; | |
input.placeholder = 'Zoeken op adres...'; | |
input.style.padding = '4px 10px'; | |
input.style.width = '100%'; | |
input.style.border = 'none'; | |
input.style.backgroundColor = '#fff'; | |
input.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
input.style.height = '26px'; | |
input.style.borderRadius = '5px 5px'; | |
input.setAttribute('aria-label', 'Zoek een adres'); | |
input.addEventListener('input', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
input.addEventListener('focus', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
results.id = 'nlmaps-geocoder-control-results'; | |
results.style.width = controlWidth; | |
container.appendChild(searchDiv); | |
searchDiv.appendChild(input); | |
container.appendChild(results); | |
return container; | |
}; | |
geocoder.suggest = function (query) { | |
var _this2 = this; | |
if (query.length < 4) { | |
this.clearSuggestResults(); | |
return; | |
} | |
this.doSuggestRequest(query).then(function (results) { | |
_this2.showSuggestResults(results.response.docs); | |
}); | |
}; | |
geocoder.lookup = function (id) { | |
var _this3 = this; | |
this.doLookupRequest(id).then(function (result) { | |
_this3.zoomTo(result.centroide_ll, _this3.map); | |
_this3.showLookupResult(result.weergavenaam); | |
_this3.clearSuggestResults(); | |
}); | |
}; | |
geocoder.clearSuggestResults = function () { | |
document.getElementById('nlmaps-geocoder-control-results').innerHTML = ''; | |
}; | |
geocoder.showLookupResult = function (name) { | |
document.getElementById('nlmaps-geocoder-control-input').value = name; | |
}; | |
geocoder.showSuggestResults = function (results) { | |
var _this4 = this; | |
var resultList = document.createElement('ul'); | |
resultList.style.padding = '10px 10px 2px 10px'; | |
resultList.style.width = '100%'; | |
resultList.style.background = '#FFFFFF'; | |
resultList.style.borderRadius = '5px 5px'; | |
resultList.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
results.forEach(function (result) { | |
var li = document.createElement('li'); | |
li.innerHTML = result.weergavenaam; | |
li.id = result.id; | |
li.style.cursor = 'pointer'; | |
li.style.padding = '5px'; | |
li.style.listStyleType = 'none'; | |
li.style.marginBottom = '5px'; | |
li.addEventListener('click', function (e) { | |
_this4.lookup(e.target.id); | |
}); | |
li.addEventListener('mouseenter', function () { | |
li.style.background = '#6C62A6'; | |
li.style.color = '#FFFFFF'; | |
}); | |
li.addEventListener('mouseleave', function () { | |
li.style.background = '#FFFFFF'; | |
li.style.color = '#333'; | |
}); | |
resultList.appendChild(li); | |
}); | |
this.clearSuggestResults(); | |
document.getElementById('nlmaps-geocoder-control-results').appendChild(resultList); | |
}; | |
var geolocator_icon = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="7.0556mm" width="7.0556mm" version="1.1"\nxmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 24.999999 24.999999">\n<metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>\n<dc:title/> </cc:Work> </rdf:RDF> </metadata> <g transform="translate(-151.39 -117.97)"> <g transform="translate(.39250 .85750)">\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m163.5 123.27c-3.4931 0-6.3379 2.8448-6.3379 6.3379s2.8448 6.3398 6.3379 6.3398 6.3379-2.8467 6.3379-6.3398-2.8448-6.3379-6.3379-6.3379zm0 1.3008c2.7905 0 5.0391 2.2466 5.0391 5.0371s-2.2485 5.0391-5.0391 5.0391c-2.7905 0-5.0391-2.2485-5.0391-5.0391 0-2.7905 2.2485-5.0371 5.0391-5.0371z"/><circle cx="163.5" cy="129.61" r="1.9312" style="fill:#191919"/>\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m162.85 120.57v3.3555h1.3008v-3.3555h-1.3008z"/> <path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m162.85 135.3v3.3555h1.3008v-3.3555h-1.3008z"/> <path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m154.46 128.96v1.2988h3.3535v-1.2988h-3.3535z"/>\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m169.19 128.96v1.2988h3.3535v-1.2988h-3.3535z"/> </g> </g></svg>'; | |
var markerUrl = 'https://rawgit.com/webmapper/nlmaps/master/dist/assets/rijksoverheid-marker.png'; | |
/*parts copied from maps.stamen.com: https://github.com/stamen/maps.stamen.com/blob/master/js/tile.stamen.js | |
* copyright (c) 2012, Stamen Design | |
* under BSD 3-Clause license: https://github.com/stamen/maps.stamen.com/blob/master/LICENSE | |
*/ | |
/* | |
* Get the named provider, or throw an exception if it doesn't exist. | |
**/ | |
function getProvider(name) { | |
if (name in CONFIG.BASEMAP_PROVIDERS) { | |
var provider = CONFIG.BASEMAP_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (provider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated style; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
return provider; | |
} else { | |
// eslint-disable-next-line no-console | |
console.error('NL Maps error: You asked for a style which does not exist! Available styles: ' + Object.keys(PROVIDERS).join(', ')); | |
} | |
} | |
/* | |
* Get the named wmsProvider, or throw an exception if it doesn't exist. | |
**/ | |
function getWmsProvider(name, options) { | |
var wmsProvider = void 0; | |
if (name in CONFIG.WMS_PROVIDERS) { | |
wmsProvider = CONFIG.WMS_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (wmsProvider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated wms; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
} else { | |
wmsProvider = Object.assign({}, CONFIG.WMS_DEFAULTS, options); | |
// eslint-disable-next-line no-console | |
console.log('NL Maps: You asked for a wms which does not exist! Available wmses: ' + Object.keys(CONFIG.WMS_PROVIDERS).join(', ') + '. Provide an options object to make your own WMS.'); | |
} | |
return wmsProvider; | |
} | |
var _typeof$$1 = typeof Symbol === "function" && _typeof(Symbol.iterator) === "symbol" ? function (obj) { | |
return typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
} : function (obj) { | |
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
}; | |
function bgLayer() { | |
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'standaard'; | |
var provider = getProvider(name); | |
if ((typeof ol === 'undefined' ? 'undefined' : _typeof$$1(ol)) === "object") { | |
return new ol.layer.Tile({ | |
source: new ol.source.XYZ({ | |
url: provider.url, | |
attributions: [new ol.Attribution({ | |
html: provider.attribution | |
})] | |
}) | |
}); | |
} else { | |
throw 'openlayers is not defined'; | |
} | |
} | |
function markerLayer(latLngObject) { | |
var markerStyle = new ol.style.Style({ | |
image: new ol.style.Icon({ | |
anchor: [32, 63], | |
anchorXUnits: 'pixels', | |
anchorYUnits: 'pixels', | |
src: markerUrl, | |
scale: 1 | |
}) | |
}); | |
var lat = void 0; | |
var lng = void 0; | |
// eslint-disable-next-line eqeqeq | |
if (typeof latLngObject == 'undefined') { | |
var mapCenter = getMapCenter(map); | |
lat = mapCenter.latitude; | |
lng = mapCenter.longitude; | |
} else { | |
lat = latLngObject.latitude; | |
lng = latLngObject.longitude; | |
} | |
var center = ol.proj.fromLonLat([lng, lat]); | |
var markerFeature = new ol.Feature({ | |
geometry: new ol.geom.Point(center), | |
name: 'marker' | |
}); | |
markerFeature.setStyle(markerStyle); | |
var markerSource = new ol.source.Vector({ | |
features: [markerFeature] | |
}); | |
return new ol.layer.Vector({ | |
source: markerSource | |
}); | |
} | |
function overlayLayer(name, options) { | |
var wmsProvider = getWmsProvider(name, options); | |
if ((typeof ol === 'undefined' ? 'undefined' : _typeof$$1(ol)) === "object") { | |
return new ol.layer.Tile({ | |
source: new ol.source.TileWMS({ | |
url: wmsProvider.url, | |
serverType: 'geoserver', | |
params: { | |
LAYERS: wmsProvider.layers, | |
VERSION: wmsProvider.version, | |
STYLES: wmsProvider.styles | |
} | |
}) | |
}); | |
} else { | |
throw 'openlayers is not defined'; | |
} | |
} | |
function geoLocatorControl(geolocator, map) { | |
var myControlEl = document.createElement('div'); | |
myControlEl.id = 'nlmaps-geolocator-control'; | |
myControlEl.style.backgroundColor = '#fff'; | |
myControlEl.style.cursor = 'pointer'; | |
myControlEl.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
myControlEl.style.height = '26px'; | |
myControlEl.style.width = '26px'; | |
myControlEl.style.borderRadius = '26px 26px'; | |
myControlEl.innerHTML = geolocator_icon; | |
myControlEl.className = 'ol-control'; | |
myControlEl.style.right = '.5em'; | |
myControlEl.style.top = '.5em'; | |
myControlEl.addEventListener('click', function () { | |
geolocator.start(); | |
}); | |
function moveMap(d) { | |
var map = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : map; | |
var oldZoom = map.getView().getZoom(); | |
var view = new ol.View({ | |
center: ol.proj.fromLonLat([d.coords.longitude, d.coords.latitude]), | |
zoom: oldZoom | |
}); | |
map.setView(view); | |
} | |
geolocator.on('position', function (d) { | |
moveMap(d, map); | |
}); | |
var control = new ol.control.Control({ element: myControlEl }); | |
return control; | |
} | |
function zoomTo(point, map) { | |
var newCenter = ol.proj.fromLonLat(point.coordinates); | |
map.getView().setCenter(newCenter); | |
map.getView().setZoom(18); | |
} | |
function getMapCenter(map) { | |
var EPSG3857Coords = map.getView().getCenter(); | |
var lngLatCoords = ol.proj.toLonLat(EPSG3857Coords); | |
return { | |
longitude: lngLatCoords[0], | |
latitude: lngLatCoords[1] | |
}; | |
} | |
function geocoderControl(map) { | |
var control = geocoder.createControl(zoomTo, map); | |
control = new ol.control.Control({ element: control }); | |
map.addControl(control); | |
} | |
exports.bgLayer = bgLayer; | |
exports.overlayLayer = overlayLayer; | |
exports.markerLayer = markerLayer; | |
exports.getMapCenter = getMapCenter; | |
exports.geoLocatorControl = geoLocatorControl; | |
exports.geocoderControl = geocoderControl; | |
}); | |
unwrapExports(nlmapsOpenlayers_cjs); | |
var nlmapsOpenlayers_cjs_1 = nlmapsOpenlayers_cjs.bgLayer; | |
var nlmapsOpenlayers_cjs_2 = nlmapsOpenlayers_cjs.overlayLayer; | |
var nlmapsOpenlayers_cjs_3 = nlmapsOpenlayers_cjs.markerLayer; | |
var nlmapsOpenlayers_cjs_4 = nlmapsOpenlayers_cjs.getMapCenter; | |
var nlmapsOpenlayers_cjs_5 = nlmapsOpenlayers_cjs.geoLocatorControl; | |
var nlmapsOpenlayers_cjs_6 = nlmapsOpenlayers_cjs.geocoderControl; | |
var nlmapsGooglemaps_cjs = createCommonjsModule(function (module, exports) { | |
Object.defineProperty(exports, '__esModule', { value: true }); | |
var config = { | |
"version": 0.1, | |
"basemaps": { | |
"defaults": { | |
"attr": "Kaartgegevens © <a href='https://data.amsterdam.nl'>Datapunt Amsterdam</a>", | |
"minZoom": 11, | |
"maxZoom": 19, | |
"type": "tms", | |
"format": "png", | |
"url": "https://t1.data.amsterdam.nl" | |
}, | |
"layers": [{ | |
"name": "standaard", | |
"urlname": "topo_wm_zw" | |
}, { | |
"name": "licht", | |
"urlname": "topo_wm_light" | |
}] | |
}, | |
"wms": { | |
"defaults": { | |
"url": "https://map.data.amsterdam.nl/maps", | |
"version": "1.1.0", | |
"transparent": true, | |
"format": "image/png", | |
"minZoom": 0, | |
"maxZoom": 24 | |
}, | |
"layers": [{ | |
"name": "tram", | |
"layerName": "trm", | |
"url": "https://map.data.amsterdam.nl/maps/trm?" | |
}] | |
}, | |
"geocoder": { | |
"suggestUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?", | |
"lookupUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/lookup?" | |
}, | |
"featureQuery": { | |
"baseUrl": "https://api.data.amsterdam.nl/bag/nummeraanduiding/?format=json&locatie=" | |
}, | |
"map": { | |
"style": 'standaard', | |
"center": { | |
"latitude": 52.37, | |
"longitude": 4.8952 | |
}, | |
"zoom": 12, | |
"attribution": true, | |
"extent": [4.7283, 52.2771, 5.0799, 52.4324] | |
} | |
}; | |
var CONFIG = {}; | |
CONFIG.BASE_DEFAULTS = { | |
crs: "EPSG:3857", | |
attr: "", | |
minZoom: 0, | |
maxZoom: 19, | |
type: "wmts", | |
format: "png", | |
url: "" | |
}; | |
CONFIG.WMS_DEFAULTS = { | |
url: "", | |
version: "1.1.1", | |
transparent: true, | |
format: "image/png", | |
minZoom: 0, | |
maxZoom: 24 | |
}; | |
CONFIG.BASEMAP_PROVIDERS = {}; | |
CONFIG.WMS_PROVIDERS = {}; | |
CONFIG.GEOCODER = {}; | |
CONFIG.MAP = {}; | |
function err(err) { | |
throw err; | |
} | |
if (config.version !== 0.1) { | |
err('unsupported config version'); | |
} | |
function mergeConfig(defaults$$1, config$$1) { | |
return Object.assign({}, defaults$$1, config$$1); | |
} | |
function parseBase(basemaps) { | |
var defaults$$1 = mergeConfig(CONFIG.BASE_DEFAULTS, basemaps.defaults); | |
if (!basemaps.layers || basemaps.layers.length < 0) { | |
err('no basemap defined, please define a basemap in the configuration'); | |
} | |
basemaps.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.BASEMAP_PROVIDERS[layer.name] !== undefined) { | |
err('basemap names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.BASEMAP_PROVIDERS[layer.name] = formatBasemapUrl(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
function parseWMS(wms) { | |
var defaults$$1 = mergeConfig(CONFIG.WMS_DEFAULTS, wms.defaults); | |
if (wms.layers) { | |
wms.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.WMS_PROVIDERS[layer.name] !== undefined) { | |
err('wms names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.WMS_PROVIDERS[layer.name] = applyTemplate(mergeConfig(defaults$$1, layer)); | |
}); | |
} | |
} | |
function parseGeocoder(geocoder) { | |
CONFIG.GEOCODER.lookupUrl = geocoder.lookupUrl; | |
CONFIG.GEOCODER.suggestUrl = geocoder.suggestUrl; | |
} | |
function parseMap(map) { | |
CONFIG.MAP = mergeConfig({}, map); | |
} | |
function formatBasemapUrl(layer) { | |
switch (layer.type) { | |
case 'wmts': | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
break; | |
case 'tms': | |
layer.url = layer.url + "/" + layer.urlname + "/{z}/{x}/{y}." + layer.format; | |
break; | |
default: | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
} | |
return layer; | |
} | |
function applyTemplate(layer) { | |
//Check if the url is templated | |
var start = layer.url.indexOf('{'); | |
if (start > -1) { | |
var end = layer.url.indexOf('}'); | |
var template = layer.url.slice(start + 1, end); | |
if (template.toLowerCase() === "workspacename") { | |
layer.url = layer.url.slice(0, start) + layer.workSpaceName + layer.url.slice(end + 1, -1); | |
} else { | |
err('only workspacename templates are supported for now'); | |
} | |
} | |
return layer; | |
} | |
function parseFeatureQuery(baseUrl) { | |
CONFIG.FEATUREQUERYBASEURL = baseUrl; | |
} | |
if (config.featureQuery !== undefined) parseFeatureQuery(config.featureQuery.baseUrl); | |
parseMap(config.map); | |
parseBase(config.basemaps); | |
if (config.wms !== undefined) parseWMS(config.wms); | |
if (config.geocoder !== undefined) parseGeocoder(config.geocoder); | |
var geocoder = CONFIG.GEOCODER; | |
function httpGetAsync(url) { | |
// eslint-disable-next-line no-unused-vars | |
return new Promise(function (resolve, reject) { | |
var xmlHttp = new XMLHttpRequest(); | |
xmlHttp.onreadystatechange = function () { | |
// eslint-disable-next-line eqeqeq | |
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { | |
resolve(JSON.parse(xmlHttp.responseText)); | |
} | |
}; | |
xmlHttp.open("GET", url, true); // true for asynchronous | |
xmlHttp.send(null); | |
}); | |
} | |
function wktPointToGeoJson(wktPoint) { | |
if (!wktPoint.includes('POINT')) { | |
throw TypeError('Provided WKT geometry is not a point.'); | |
} | |
var coordinateTuple = wktPoint.split('(')[1].split(')')[0]; | |
var x = parseFloat(coordinateTuple.split(' ')[0]); | |
var y = parseFloat(coordinateTuple.split(' ')[1]); | |
return { | |
type: 'Point', | |
coordinates: [x, y] | |
}; | |
} | |
/** | |
* Make a call to PDOK locatieserver v3 suggest service. This service is meant for geocoder autocomplete functionality. For | |
* additional documentation, check https://github.com/PDOK/locatieserver/wiki/API-Locatieserver. | |
* @param {string} searchTerm The term which to search for | |
*/ | |
geocoder.doSuggestRequest = function (searchTerm) { | |
return httpGetAsync(this.suggestUrl + 'q=' + encodeURIComponent(searchTerm)); | |
}; | |
/** | |
* Make a call to PDOK locatieserver v3 lookup service. This service provides information about objects found through the suggest service. For additional | |
* documentation, check: https://github.com/PDOK/locatieserver/wiki/API-Locatieserver | |
* @param {string} id The id of the feature that is to be looked up. | |
*/ | |
geocoder.doLookupRequest = function (id) { | |
return httpGetAsync(this.lookupUrl + 'id=' + encodeURIComponent(id)).then(function (lookupResult) { | |
// A lookup request should always return 1 result | |
var geocodeResult = lookupResult.response.docs[0]; | |
geocodeResult.centroide_ll = wktPointToGeoJson(geocodeResult.centroide_ll); | |
geocodeResult.centroide_rd = wktPointToGeoJson(geocodeResult.centroide_rd); | |
return geocodeResult; | |
}); | |
}; | |
geocoder.createControl = function (zoomFunction, map) { | |
var _this = this; | |
this.zoomTo = zoomFunction; | |
this.map = map; | |
var container = document.createElement('div'); | |
var searchDiv = document.createElement('div'); | |
var input = document.createElement('input'); | |
var results = document.createElement('div'); | |
var controlWidth = '300px'; | |
container.style.width = controlWidth; | |
container.style.zIndex = 1000000; | |
container.style.position = 'absolute'; | |
container.style.top = '15px'; | |
container.style.left = '12px'; | |
input.id = 'nlmaps-geocoder-control-input'; | |
input.placeholder = 'Zoeken op adres...'; | |
input.style.padding = '4px 10px'; | |
input.style.width = '100%'; | |
input.style.border = 'none'; | |
input.style.backgroundColor = '#fff'; | |
input.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
input.style.height = '26px'; | |
input.style.borderRadius = '5px 5px'; | |
input.setAttribute('aria-label', 'Zoek een adres'); | |
input.addEventListener('input', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
input.addEventListener('focus', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
results.id = 'nlmaps-geocoder-control-results'; | |
results.style.width = controlWidth; | |
container.appendChild(searchDiv); | |
searchDiv.appendChild(input); | |
container.appendChild(results); | |
return container; | |
}; | |
geocoder.suggest = function (query) { | |
var _this2 = this; | |
if (query.length < 4) { | |
this.clearSuggestResults(); | |
return; | |
} | |
this.doSuggestRequest(query).then(function (results) { | |
_this2.showSuggestResults(results.response.docs); | |
}); | |
}; | |
geocoder.lookup = function (id) { | |
var _this3 = this; | |
this.doLookupRequest(id).then(function (result) { | |
_this3.zoomTo(result.centroide_ll, _this3.map); | |
_this3.showLookupResult(result.weergavenaam); | |
_this3.clearSuggestResults(); | |
}); | |
}; | |
geocoder.clearSuggestResults = function () { | |
document.getElementById('nlmaps-geocoder-control-results').innerHTML = ''; | |
}; | |
geocoder.showLookupResult = function (name) { | |
document.getElementById('nlmaps-geocoder-control-input').value = name; | |
}; | |
geocoder.showSuggestResults = function (results) { | |
var _this4 = this; | |
var resultList = document.createElement('ul'); | |
resultList.style.padding = '10px 10px 2px 10px'; | |
resultList.style.width = '100%'; | |
resultList.style.background = '#FFFFFF'; | |
resultList.style.borderRadius = '5px 5px'; | |
resultList.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
results.forEach(function (result) { | |
var li = document.createElement('li'); | |
li.innerHTML = result.weergavenaam; | |
li.id = result.id; | |
li.style.cursor = 'pointer'; | |
li.style.padding = '5px'; | |
li.style.listStyleType = 'none'; | |
li.style.marginBottom = '5px'; | |
li.addEventListener('click', function (e) { | |
_this4.lookup(e.target.id); | |
}); | |
li.addEventListener('mouseenter', function () { | |
li.style.background = '#6C62A6'; | |
li.style.color = '#FFFFFF'; | |
}); | |
li.addEventListener('mouseleave', function () { | |
li.style.background = '#FFFFFF'; | |
li.style.color = '#333'; | |
}); | |
resultList.appendChild(li); | |
}); | |
this.clearSuggestResults(); | |
document.getElementById('nlmaps-geocoder-control-results').appendChild(resultList); | |
}; | |
var geolocator_icon = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="7.0556mm" width="7.0556mm" version="1.1"\nxmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 24.999999 24.999999">\n<metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>\n<dc:title/> </cc:Work> </rdf:RDF> </metadata> <g transform="translate(-151.39 -117.97)"> <g transform="translate(.39250 .85750)">\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m163.5 123.27c-3.4931 0-6.3379 2.8448-6.3379 6.3379s2.8448 6.3398 6.3379 6.3398 6.3379-2.8467 6.3379-6.3398-2.8448-6.3379-6.3379-6.3379zm0 1.3008c2.7905 0 5.0391 2.2466 5.0391 5.0371s-2.2485 5.0391-5.0391 5.0391c-2.7905 0-5.0391-2.2485-5.0391-5.0391 0-2.7905 2.2485-5.0371 5.0391-5.0371z"/><circle cx="163.5" cy="129.61" r="1.9312" style="fill:#191919"/>\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m162.85 120.57v3.3555h1.3008v-3.3555h-1.3008z"/> <path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m162.85 135.3v3.3555h1.3008v-3.3555h-1.3008z"/> <path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m154.46 128.96v1.2988h3.3535v-1.2988h-3.3535z"/>\n<path style="color-rendering:auto;text-decoration-color:#000000;color:#000000;shape-rendering:auto;solid-color:#000000;text-decoration-line:none;fill:#191919;fill-rule:evenodd;mix-blend-mode:normal;block-progression:tb;text-indent:0;image-rendering:auto;white-space:normal;text-decoration-style:solid;isolation:auto;text-transform:none" d="m169.19 128.96v1.2988h3.3535v-1.2988h-3.3535z"/> </g> </g></svg>'; | |
var markerUrl = 'https://rawgit.com/webmapper/nlmaps/master/dist/assets/rijksoverheid-marker.png'; | |
/*parts copied from maps.stamen.com: https://github.com/stamen/maps.stamen.com/blob/master/js/tile.stamen.js | |
* copyright (c) 2012, Stamen Design | |
* under BSD 3-Clause license: https://github.com/stamen/maps.stamen.com/blob/master/LICENSE | |
*/ | |
/* | |
* Get the named provider, or throw an exception if it doesn't exist. | |
**/ | |
function getProvider(name) { | |
if (name in CONFIG.BASEMAP_PROVIDERS) { | |
var provider = CONFIG.BASEMAP_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (provider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated style; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
return provider; | |
} else { | |
// eslint-disable-next-line no-console | |
console.error('NL Maps error: You asked for a style which does not exist! Available styles: ' + Object.keys(PROVIDERS).join(', ')); | |
} | |
} | |
/* | |
* Get the named wmsProvider, or throw an exception if it doesn't exist. | |
**/ | |
function getWmsProvider(name, options) { | |
var wmsProvider = void 0; | |
if (name in CONFIG.WMS_PROVIDERS) { | |
wmsProvider = CONFIG.WMS_PROVIDERS[name]; | |
// eslint-disable-next-line no-console | |
if (wmsProvider.deprecated && console && console.warn) { | |
// eslint-disable-next-line no-console | |
console.warn(name + " is a deprecated wms; it will be redirected to its replacement. For performance improvements, please change your reference."); | |
} | |
} else { | |
wmsProvider = Object.assign({}, CONFIG.WMS_DEFAULTS, options); | |
// eslint-disable-next-line no-console | |
console.log('NL Maps: You asked for a wms which does not exist! Available wmses: ' + Object.keys(CONFIG.WMS_PROVIDERS).join(', ') + '. Provide an options object to make your own WMS.'); | |
} | |
return wmsProvider; | |
} | |
var _typeof$$1 = typeof Symbol === "function" && _typeof(Symbol.iterator) === "symbol" ? function (obj) { | |
return typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
} : function (obj) { | |
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof(obj); | |
}; | |
function AttributionControl(controlDiv, attrControlText) { | |
if ((typeof google === 'undefined' ? 'undefined' : _typeof$$1(google)) === 'object' && _typeof$$1(google.maps) === 'object') { | |
var controlUI = document.createElement('div'); | |
controlUI.style.backgroundColor = '#fff'; | |
controlUI.style.opacity = '0.7'; | |
controlUI.style.border = '2px solid #fff'; | |
controlUI.style.cursor = 'pointer'; | |
controlDiv.appendChild(controlUI); | |
// Set CSS for the control interior. | |
var controlText = document.createElement('div'); | |
controlText.style.color = 'rgb(25,25,25)'; | |
controlText.style.fontFamily = 'Roboto,Arial,sans-serif'; | |
controlText.style.fontSize = '10px'; | |
controlText.innerHTML = attrControlText; | |
controlUI.appendChild(controlText); | |
controlDiv.index = 1; | |
return controlDiv; | |
} else { | |
var error = 'google is not defined'; | |
throw error; | |
} | |
} | |
function geoLocatorControl(geolocator, map) { | |
var controlUI = document.createElement('div'); | |
controlUI.id = 'nlmaps-geolocator-control'; | |
controlUI.innerHTML = geolocator_icon; | |
controlUI.style.backgroundColor = '#fff'; | |
controlUI.style.cursor = 'pointer'; | |
controlUI.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
controlUI.style.height = '26px'; | |
controlUI.style.width = '26px'; | |
controlUI.style.borderRadius = '26px 26px'; | |
controlUI.style.margin = '.5em'; | |
controlUI.addEventListener('click', function () { | |
geolocator.start(); | |
}, this); | |
geolocator.on('position', function (position) { | |
map.setCenter({ lat: position.coords.latitude, lng: position.coords.longitude }); | |
}); | |
return controlUI; | |
} | |
function zoomTo(point, map) { | |
map.setCenter({ lat: point.coordinates[1], lng: point.coordinates[0] }); | |
map.setZoom(18); | |
} | |
function indexOfMapControl(controlArray, control) { | |
return controlArray.getArray().indexOf(control); | |
} | |
function toggleAttrControl(attrControl, map) { | |
var currentMapId = map.getMapTypeId(); | |
var controlArray = map.controls[google.maps.ControlPosition.BOTTOM_RIGHT]; | |
var indexToRemove = indexOfMapControl(controlArray, attrControl); | |
if (currentMapId === 'roadmap' || currentMapId === 'hybrid' || currentMapId === 'sattelite') { | |
if (indexToRemove > -1) { | |
controlArray.removeAt(indexToRemove); | |
} | |
} else { | |
if (indexToRemove === -1) { | |
controlArray.push(attrControl); | |
} | |
} | |
} | |
function makeGoogleAttrControl() { | |
var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : map; | |
var attr = arguments[1]; | |
var attrControlDiv = document.createElement('div'); | |
var attrControlText = attr; | |
var attrControl = new AttributionControl(attrControlDiv, attrControlText); | |
map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(attrControl); | |
map.addListener('maptypeid_changed', function () { | |
return toggleAttrControl(attrControl, map); | |
}); | |
} | |
function makeGoogleLayerOpts(provider) { | |
return { | |
getTileUrl: function getTileUrl(coord, zoom) { | |
var url = provider.bare_url + '/' + zoom + '/' + coord.x + '/' + coord.y + '.png'; | |
return url; | |
}, | |
tileSize: new google.maps.Size(256, 256), | |
isPng: true, | |
name: provider.name, | |
maxZoom: provider.maxZoom, | |
minZoom: provider.minZoom | |
}; | |
} | |
function getWmsTiledOptions(wmsProvider) { | |
return { | |
baseUrl: wmsProvider.url, | |
layers: wmsProvider.layers, | |
styles: wmsProvider.styles, | |
format: wmsProvider.format, | |
transparent: wmsProvider.transparent, | |
// todo maybe: add opacity to wmsProvider params | |
opacity: 0.7 | |
}; | |
} | |
function bgLayer(map) { | |
var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'standaard'; | |
if ((typeof google === 'undefined' ? 'undefined' : _typeof$$1(google)) === 'object' && _typeof$$1(google.maps) === 'object') { | |
var provider = getProvider(name); | |
var GoogleLayerOpts = makeGoogleLayerOpts(provider); | |
var layer = new google.maps.ImageMapType(GoogleLayerOpts); | |
// warning: tight coupling with nlmaps.createMap | |
var ourmap = map || this.map || 'undefined'; | |
if (typeof ourmap !== 'undefined') { | |
makeGoogleAttrControl(ourmap, provider.attribution); | |
} | |
return layer; | |
} else { | |
var error = 'google is not defined'; | |
throw error; | |
} | |
} | |
function toMercator(coord) { | |
var lat = coord.lat(); | |
var lng = coord.lng(); | |
if (Math.abs(lng) > 180 || Math.abs(lat) > 90) return; | |
var num = lng * 0.017453292519943295; | |
var x = 6378137.0 * num; | |
var a = lat * 0.017453292519943295; | |
var merc_lon = x; | |
var merc_lat = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a))); | |
return { x: merc_lon, y: merc_lat }; | |
} | |
function WMSTiled(mapObject, wmsTiledOptions) { | |
var options = { | |
getTileUrl: function getTileUrl(coord, zoom) { | |
var proj = mapObject.getProjection(); | |
var zfactor = Math.pow(2, zoom); | |
var top = proj.fromPointToLatLng(new google.maps.Point(coord.x * 256 / zfactor, coord.y * 256 / zfactor)); | |
var bot = proj.fromPointToLatLng(new google.maps.Point((coord.x + 1) * 256 / zfactor, (coord.y + 1) * 256 / zfactor)); | |
var ne = toMercator(top); | |
var sw = toMercator(bot); | |
var bbox = ne.x + ',' + sw.y + ',' + sw.x + ',' + ne.y; | |
var url = wmsTiledOptions.baseUrl; | |
url += 'SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:3857'; | |
url += '&WIDTH=256'; | |
url += '&HEIGHT=256'; | |
url += '&LAYERS=' + wmsTiledOptions.layers; | |
url += '&STYLES=' + wmsTiledOptions.styles; | |
url += '&BBOX=' + bbox; | |
url += '&FORMAT=' + wmsTiledOptions.format; | |
url += '&TRANSPARENT=' + wmsTiledOptions.transparent; | |
return url; | |
}, | |
tileSize: new google.maps.Size(256, 256), | |
isPng: true | |
}; | |
var layer = new google.maps.ImageMapType(options); | |
layer.setOpacity(wmsTiledOptions.opacity); | |
return mapObject.overlayMapTypes.push(layer); | |
} | |
function overlayLayer() { | |
var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : map; | |
var name = arguments[1]; | |
var options = arguments[2]; | |
var wmsProvider = getWmsProvider(name, options); | |
var wmsTiledOptions = getWmsTiledOptions(wmsProvider); | |
var wmsLayer = new WMSTiled(map, wmsTiledOptions); | |
wmsLayer.name = 'wms'; | |
return wmsLayer; | |
} | |
function markerLayer(latLngObject) { | |
var lat = void 0; | |
var lng = void 0; | |
// eslint-disable-next-line eqeqeq | |
if (typeof latLngObject == 'undefined') { | |
var mapCenter = getMapCenter(map); | |
lat = mapCenter.latitude; | |
lng = mapCenter.longitude; | |
} else { | |
lat = latLngObject.latitude; | |
lng = latLngObject.longitude; | |
} | |
var markerLocationLatLng = new google.maps.LatLng(lat, lng); | |
var marker = new google.maps.Marker({ | |
title: 'marker', | |
position: markerLocationLatLng, | |
icon: markerUrl | |
}); | |
return marker; | |
} | |
function getMapCenter(map) { | |
return { | |
latitude: map.getCenter().lat(), | |
longitude: map.getCenter().lng() | |
}; | |
} | |
function geocoderControl(map) { | |
var control = geocoder.createControl(zoomTo, map); | |
map.getDiv().appendChild(control); | |
} | |
exports.bgLayer = bgLayer; | |
exports.overlayLayer = overlayLayer; | |
exports.markerLayer = markerLayer; | |
exports.getMapCenter = getMapCenter; | |
exports.geoLocatorControl = geoLocatorControl; | |
exports.geocoderControl = geocoderControl; | |
}); | |
unwrapExports(nlmapsGooglemaps_cjs); | |
var nlmapsGooglemaps_cjs_1 = nlmapsGooglemaps_cjs.bgLayer; | |
var nlmapsGooglemaps_cjs_2 = nlmapsGooglemaps_cjs.overlayLayer; | |
var nlmapsGooglemaps_cjs_3 = nlmapsGooglemaps_cjs.markerLayer; | |
var nlmapsGooglemaps_cjs_4 = nlmapsGooglemaps_cjs.getMapCenter; | |
var nlmapsGooglemaps_cjs_5 = nlmapsGooglemaps_cjs.geoLocatorControl; | |
var nlmapsGooglemaps_cjs_6 = nlmapsGooglemaps_cjs.geocoderControl; | |
var config = { | |
"version": 0.1, | |
"basemaps": { | |
"defaults": { | |
"attr": "Kaartgegevens © <a href='https://data.amsterdam.nl'>Datapunt Amsterdam</a>", | |
"minZoom": 11, | |
"maxZoom": 19, | |
"type": "tms", | |
"format": "png", | |
"url": "https://t1.data.amsterdam.nl" | |
}, | |
"layers": [{ | |
"name": "standaard", | |
"urlname": "topo_wm_zw" | |
}, { | |
"name": "licht", | |
"urlname": "topo_wm_light" | |
}] | |
}, | |
"wms": { | |
"defaults": { | |
"url": "https://map.data.amsterdam.nl/maps", | |
"version": "1.1.0", | |
"transparent": true, | |
"format": "image/png", | |
"minZoom": 0, | |
"maxZoom": 24 | |
}, | |
"layers": [{ | |
"name": "tram", | |
"layerName": "trm", | |
"url": "https://map.data.amsterdam.nl/maps/trm?" | |
}] | |
}, | |
"geocoder": { | |
"suggestUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?", | |
"lookupUrl": "https://geodata.nationaalgeoregister.nl/locatieserver/v3/lookup?" | |
}, | |
"featureQuery": { | |
"baseUrl": "https://api.data.amsterdam.nl/bag/nummeraanduiding/?format=json&locatie=" | |
}, | |
"map": { | |
"style": 'standaard', | |
"center": { | |
"latitude": 52.37, | |
"longitude": 4.8952 | |
}, | |
"zoom": 12, | |
"attribution": true, | |
"extent": [4.7283, 52.2771, 5.0799, 52.4324] | |
} | |
}; | |
var CONFIG = {}; | |
CONFIG.BASE_DEFAULTS = { | |
crs: "EPSG:3857", | |
attr: "", | |
minZoom: 0, | |
maxZoom: 19, | |
type: "wmts", | |
format: "png", | |
url: "" | |
}; | |
CONFIG.WMS_DEFAULTS = { | |
url: "", | |
version: "1.1.1", | |
transparent: true, | |
format: "image/png", | |
minZoom: 0, | |
maxZoom: 24 | |
}; | |
CONFIG.BASEMAP_PROVIDERS = {}; | |
CONFIG.WMS_PROVIDERS = {}; | |
CONFIG.GEOCODER = {}; | |
CONFIG.MAP = {}; | |
function err(err) { | |
throw err; | |
} | |
if (config.version !== 0.1) { | |
err('unsupported config version'); | |
} | |
function mergeConfig(defaults, config$$1) { | |
return Object.assign({}, defaults, config$$1); | |
} | |
function parseBase(basemaps) { | |
var defaults = mergeConfig(CONFIG.BASE_DEFAULTS, basemaps.defaults); | |
if (!basemaps.layers || basemaps.layers.length < 0) { | |
err('no basemap defined, please define a basemap in the configuration'); | |
} | |
basemaps.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.BASEMAP_PROVIDERS[layer.name] !== undefined) { | |
err('basemap names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.BASEMAP_PROVIDERS[layer.name] = formatBasemapUrl(mergeConfig(defaults, layer)); | |
}); | |
} | |
function parseWMS(wms) { | |
var defaults = mergeConfig(CONFIG.WMS_DEFAULTS, wms.defaults); | |
if (wms.layers) { | |
wms.layers.forEach(function (layer) { | |
if (!layer.name || CONFIG.WMS_PROVIDERS[layer.name] !== undefined) { | |
err('wms names need to be defined and unique: ' + layer.name); | |
} | |
CONFIG.WMS_PROVIDERS[layer.name] = applyTemplate(mergeConfig(defaults, layer)); | |
}); | |
} | |
} | |
function parseGeocoder(geocoder) { | |
CONFIG.GEOCODER.lookupUrl = geocoder.lookupUrl; | |
CONFIG.GEOCODER.suggestUrl = geocoder.suggestUrl; | |
} | |
function parseMap(map) { | |
CONFIG.MAP = mergeConfig({}, map); | |
} | |
function formatBasemapUrl(layer) { | |
switch (layer.type) { | |
case 'wmts': | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
break; | |
case 'tms': | |
layer.url = layer.url + "/" + layer.urlname + "/{z}/{x}/{y}." + layer.format; | |
break; | |
default: | |
layer.url = layer.url + "/" + layer.type + "/" + layer.urlname + "/" + layer.crs + "/{z}/{x}/{y}." + layer.format; | |
} | |
return layer; | |
} | |
function applyTemplate(layer) { | |
//Check if the url is templated | |
var start = layer.url.indexOf('{'); | |
if (start > -1) { | |
var end = layer.url.indexOf('}'); | |
var template = layer.url.slice(start + 1, end); | |
if (template.toLowerCase() === "workspacename") { | |
layer.url = layer.url.slice(0, start) + layer.workSpaceName + layer.url.slice(end + 1, -1); | |
} else { | |
err('only workspacename templates are supported for now'); | |
} | |
} | |
return layer; | |
} | |
function parseFeatureQuery(baseUrl) { | |
CONFIG.FEATUREQUERYBASEURL = baseUrl; | |
} | |
if (config.featureQuery !== undefined) parseFeatureQuery(config.featureQuery.baseUrl); | |
parseMap(config.map); | |
parseBase(config.basemaps); | |
if (config.wms !== undefined) parseWMS(config.wms); | |
if (config.geocoder !== undefined) parseGeocoder(config.geocoder); | |
var emitonoff = createCommonjsModule(function (module) { | |
var EmitOnOff = module.exports = function (thing) { | |
if (!thing) thing = {}; | |
thing._subs = []; | |
thing._paused = false; | |
thing._pending = []; | |
/** | |
* Sub of pubsub | |
* @param {String} name name of event | |
* @param {Function} cb your callback | |
*/ | |
thing.on = function (name, cb) { | |
thing._subs[name] = thing._subs[name] || []; | |
thing._subs[name].push(cb); | |
}; | |
/** | |
* remove sub of pubsub | |
* @param {String} name name of event | |
* @param {Function} cb your callback | |
*/ | |
thing.off = function (name, cb) { | |
if (!thing._subs[name]) return; | |
for (var i in thing._subs[name]) { | |
if (thing._subs[name][i] === cb) { | |
thing._subs[name].splice(i); | |
break; | |
} | |
} | |
}; | |
/** | |
* Pub of pubsub | |
* @param {String} name name of event | |
* @param {Mixed} data the data to publish | |
*/ | |
thing.emit = function (name) { | |
if (!thing._subs[name]) return; | |
var args = Array.prototype.slice.call(arguments, 1); | |
if (thing._paused) { | |
thing._pending[name] = thing._pending[name] || []; | |
thing._pending[name].push(args); | |
return; | |
} | |
for (var i in thing._subs[name]) { | |
thing._subs[name][i].apply(thing, args); | |
} | |
}; | |
thing.pause = function () { | |
thing._paused = true; | |
}; | |
thing.resume = function () { | |
thing._paused = false; | |
for (var name in thing._pending) { | |
for (var i = 0; i < thing._pending[name].length; i++) { | |
thing.emit(name, thing._pending[name][i]); | |
} | |
} | |
}; | |
return thing; | |
}; | |
}); | |
var geoLocateDefaultOpts = { | |
follow: false | |
}; | |
function positionHandler(position) { | |
this.emit('position', position); | |
} | |
function positionErrorHandler(error) { | |
this.emit('error', error); | |
} | |
var GeoLocator = function GeoLocator(opts) { | |
var state = Object.assign({}, geoLocateDefaultOpts, opts); | |
return { | |
start: function start() { | |
state.started = true; | |
navigator.geolocation.getCurrentPosition(positionHandler.bind(this), positionErrorHandler.bind(this), { maximumAge: 60000 }); | |
return this; | |
}, | |
stop: function stop() { | |
state.started = false; | |
return this; | |
}, | |
isStarted: function isStarted() { | |
return state.started; | |
}, | |
log: function log() { | |
// eslint-disable-next-line no-console | |
console.log(state); | |
return this; | |
} | |
}; | |
}; | |
function geoLocator(opts) { | |
var navigator = typeof window !== 'undefined' ? window.navigator || {} : {}; | |
if (typeof navigator !== 'undefined' && 'geolocation' in navigator) { | |
var geolocator = emitonoff(GeoLocator(opts)); | |
geolocator.on('position', function () { | |
this.stop(); | |
}); | |
return geolocator; | |
} else { | |
var error = 'geolocation is not available in your browser.'; | |
throw error; | |
} | |
} | |
function globals (defs) { | |
defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); | |
defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); | |
defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"); | |
defs.WGS84 = defs['EPSG:4326']; | |
defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 | |
defs.GOOGLE = defs['EPSG:3857']; | |
defs['EPSG:900913'] = defs['EPSG:3857']; | |
defs['EPSG:102113'] = defs['EPSG:3857']; | |
} | |
var PJD_3PARAM = 1; | |
var PJD_7PARAM = 2; | |
var PJD_WGS84 = 4; // WGS84 or equivalent | |
var PJD_NODATUM = 5; // WGS84 or equivalent | |
var SEC_TO_RAD = 4.84813681109535993589914102357e-6; | |
var HALF_PI = Math.PI / 2; | |
// ellipoid pj_set_ell.c | |
var SIXTH = 0.1666666666666666667; | |
/* 1/6 */ | |
var RA4 = 0.04722222222222222222; | |
/* 17/360 */ | |
var RA6 = 0.02215608465608465608; | |
var EPSLN = 1.0e-10; | |
// you'd think you could use Number.EPSILON above but that makes | |
// Mollweide get into an infinate loop. | |
var D2R = 0.01745329251994329577; | |
var R2D = 57.29577951308232088; | |
var FORTPI = Math.PI / 4; | |
var TWO_PI = Math.PI * 2; | |
// SPI is slightly greater than Math.PI, so values that exceed the -180..180 | |
// degree range by a tiny amount don't get wrapped. This prevents points that | |
// have drifted from their original location along the 180th meridian (due to | |
// floating point error) from changing their sign. | |
var SPI = 3.14159265359; | |
var exports$1 = {}; | |
exports$1.greenwich = 0.0; //"0dE", | |
exports$1.lisbon = -9.131906111111; //"9d07'54.862\"W", | |
exports$1.paris = 2.337229166667; //"2d20'14.025\"E", | |
exports$1.bogota = -74.080916666667; //"74d04'51.3\"W", | |
exports$1.madrid = -3.687938888889; //"3d41'16.58\"W", | |
exports$1.rome = 12.452333333333; //"12d27'8.4\"E", | |
exports$1.bern = 7.439583333333; //"7d26'22.5\"E", | |
exports$1.jakarta = 106.807719444444; //"106d48'27.79\"E", | |
exports$1.ferro = -17.666666666667; //"17d40'W", | |
exports$1.brussels = 4.367975; //"4d22'4.71\"E", | |
exports$1.stockholm = 18.058277777778; //"18d3'29.8\"E", | |
exports$1.athens = 23.7163375; //"23d42'58.815\"E", | |
exports$1.oslo = 10.722916666667; //"10d43'22.5\"E" | |
var _units = { | |
ft: { to_meter: 0.3048 }, | |
'us-ft': { to_meter: 1200 / 3937 } | |
}; | |
var ignoredChar = /[\s_\-\/\(\)]/g; | |
function match(obj, key) { | |
if (obj[key]) { | |
return obj[key]; | |
} | |
var keys = Object.keys(obj); | |
var lkey = key.toLowerCase().replace(ignoredChar, ''); | |
var i = -1; | |
var testkey, processedKey; | |
while (++i < keys.length) { | |
testkey = keys[i]; | |
processedKey = testkey.toLowerCase().replace(ignoredChar, ''); | |
if (processedKey === lkey) { | |
return obj[testkey]; | |
} | |
} | |
} | |
function parseProj (defData) { | |
var self = {}; | |
var paramObj = defData.split('+').map(function (v) { | |
return v.trim(); | |
}).filter(function (a) { | |
return a; | |
}).reduce(function (p, a) { | |
var split = a.split('='); | |
split.push(true); | |
p[split[0].toLowerCase()] = split[1]; | |
return p; | |
}, {}); | |
var paramName, paramVal, paramOutname; | |
var params = { | |
proj: 'projName', | |
datum: 'datumCode', | |
rf: function rf(v) { | |
self.rf = parseFloat(v); | |
}, | |
lat_0: function lat_0(v) { | |
self.lat0 = v * D2R; | |
}, | |
lat_1: function lat_1(v) { | |
self.lat1 = v * D2R; | |
}, | |
lat_2: function lat_2(v) { | |
self.lat2 = v * D2R; | |
}, | |
lat_ts: function lat_ts(v) { | |
self.lat_ts = v * D2R; | |
}, | |
lon_0: function lon_0(v) { | |
self.long0 = v * D2R; | |
}, | |
lon_1: function lon_1(v) { | |
self.long1 = v * D2R; | |
}, | |
lon_2: function lon_2(v) { | |
self.long2 = v * D2R; | |
}, | |
alpha: function alpha(v) { | |
self.alpha = parseFloat(v) * D2R; | |
}, | |
lonc: function lonc(v) { | |
self.longc = v * D2R; | |
}, | |
x_0: function x_0(v) { | |
self.x0 = parseFloat(v); | |
}, | |
y_0: function y_0(v) { | |
self.y0 = parseFloat(v); | |
}, | |
k_0: function k_0(v) { | |
self.k0 = parseFloat(v); | |
}, | |
k: function k(v) { | |
self.k0 = parseFloat(v); | |
}, | |
a: function a(v) { | |
self.a = parseFloat(v); | |
}, | |
b: function b(v) { | |
self.b = parseFloat(v); | |
}, | |
r_a: function r_a() { | |
self.R_A = true; | |
}, | |
zone: function zone(v) { | |
self.zone = parseInt(v, 10); | |
}, | |
south: function south() { | |
self.utmSouth = true; | |
}, | |
towgs84: function towgs84(v) { | |
self.datum_params = v.split(",").map(function (a) { | |
return parseFloat(a); | |
}); | |
}, | |
to_meter: function to_meter(v) { | |
self.to_meter = parseFloat(v); | |
}, | |
units: function units(v) { | |
self.units = v; | |
var unit = match(_units, v); | |
if (unit) { | |
self.to_meter = unit.to_meter; | |
} | |
}, | |
from_greenwich: function from_greenwich(v) { | |
self.from_greenwich = v * D2R; | |
}, | |
pm: function pm(v) { | |
var pm = match(exports$1, v); | |
self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R; | |
}, | |
nadgrids: function nadgrids(v) { | |
if (v === '@null') { | |
self.datumCode = 'none'; | |
} else { | |
self.nadgrids = v; | |
} | |
}, | |
axis: function axis(v) { | |
var legalAxis = "ewnsud"; | |
if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { | |
self.axis = v; | |
} | |
} | |
}; | |
for (paramName in paramObj) { | |
paramVal = paramObj[paramName]; | |
if (paramName in params) { | |
paramOutname = params[paramName]; | |
if (typeof paramOutname === 'function') { | |
paramOutname(paramVal); | |
} else { | |
self[paramOutname] = paramVal; | |
} | |
} else { | |
self[paramName] = paramVal; | |
} | |
} | |
if (typeof self.datumCode === 'string' && self.datumCode !== "WGS84") { | |
self.datumCode = self.datumCode.toLowerCase(); | |
} | |
return self; | |
} | |
var NEUTRAL = 1; | |
var KEYWORD = 2; | |
var NUMBER = 3; | |
var QUOTED = 4; | |
var AFTERQUOTE = 5; | |
var ENDED = -1; | |
var whitespace = /\s/; | |
var latin = /[A-Za-z]/; | |
var keyword = /[A-Za-z84]/; | |
var endThings = /[,\]]/; | |
var digets = /[\d\.E\-\+]/; | |
// const ignoredChar = /[\s_\-\/\(\)]/g; | |
function Parser(text) { | |
if (typeof text !== 'string') { | |
throw new Error('not a string'); | |
} | |
this.text = text.trim(); | |
this.level = 0; | |
this.place = 0; | |
this.root = null; | |
this.stack = []; | |
this.currentObject = null; | |
this.state = NEUTRAL; | |
} | |
Parser.prototype.readCharicter = function () { | |
var char = this.text[this.place++]; | |
if (this.state !== QUOTED) { | |
while (whitespace.test(char)) { | |
if (this.place >= this.text.length) { | |
return; | |
} | |
char = this.text[this.place++]; | |
} | |
} | |
switch (this.state) { | |
case NEUTRAL: | |
return this.neutral(char); | |
case KEYWORD: | |
return this.keyword(char); | |
case QUOTED: | |
return this.quoted(char); | |
case AFTERQUOTE: | |
return this.afterquote(char); | |
case NUMBER: | |
return this.number(char); | |
case ENDED: | |
return; | |
} | |
}; | |
Parser.prototype.afterquote = function (char) { | |
if (char === '"') { | |
this.word += '"'; | |
this.state = QUOTED; | |
return; | |
} | |
if (endThings.test(char)) { | |
this.word = this.word.trim(); | |
this.afterItem(char); | |
return; | |
} | |
throw new Error('havn\'t handled "' + char + '" in afterquote yet, index ' + this.place); | |
}; | |
Parser.prototype.afterItem = function (char) { | |
if (char === ',') { | |
if (this.word !== null) { | |
this.currentObject.push(this.word); | |
} | |
this.word = null; | |
this.state = NEUTRAL; | |
return; | |
} | |
if (char === ']') { | |
this.level--; | |
if (this.word !== null) { | |
this.currentObject.push(this.word); | |
this.word = null; | |
} | |
this.state = NEUTRAL; | |
this.currentObject = this.stack.pop(); | |
if (!this.currentObject) { | |
this.state = ENDED; | |
} | |
return; | |
} | |
}; | |
Parser.prototype.number = function (char) { | |
if (digets.test(char)) { | |
this.word += char; | |
return; | |
} | |
if (endThings.test(char)) { | |
this.word = parseFloat(this.word); | |
this.afterItem(char); | |
return; | |
} | |
throw new Error('havn\'t handled "' + char + '" in number yet, index ' + this.place); | |
}; | |
Parser.prototype.quoted = function (char) { | |
if (char === '"') { | |
this.state = AFTERQUOTE; | |
return; | |
} | |
this.word += char; | |
return; | |
}; | |
Parser.prototype.keyword = function (char) { | |
if (keyword.test(char)) { | |
this.word += char; | |
return; | |
} | |
if (char === '[') { | |
var newObjects = []; | |
newObjects.push(this.word); | |
this.level++; | |
if (this.root === null) { | |
this.root = newObjects; | |
} else { | |
this.currentObject.push(newObjects); | |
} | |
this.stack.push(this.currentObject); | |
this.currentObject = newObjects; | |
this.state = NEUTRAL; | |
return; | |
} | |
if (endThings.test(char)) { | |
this.afterItem(char); | |
return; | |
} | |
throw new Error('havn\'t handled "' + char + '" in keyword yet, index ' + this.place); | |
}; | |
Parser.prototype.neutral = function (char) { | |
if (latin.test(char)) { | |
this.word = char; | |
this.state = KEYWORD; | |
return; | |
} | |
if (char === '"') { | |
this.word = ''; | |
this.state = QUOTED; | |
return; | |
} | |
if (digets.test(char)) { | |
this.word = char; | |
this.state = NUMBER; | |
return; | |
} | |
if (endThings.test(char)) { | |
this.afterItem(char); | |
return; | |
} | |
throw new Error('havn\'t handled "' + char + '" in neutral yet, index ' + this.place); | |
}; | |
Parser.prototype.output = function () { | |
while (this.place < this.text.length) { | |
this.readCharicter(); | |
} | |
if (this.state === ENDED) { | |
return this.root; | |
} | |
throw new Error('unable to parse string "' + this.text + '". State is ' + this.state); | |
}; | |
function parseString(txt) { | |
var parser = new Parser(txt); | |
return parser.output(); | |
} | |
function mapit(obj, key, value) { | |
if (Array.isArray(key)) { | |
value.unshift(key); | |
key = null; | |
} | |
var thing = key ? {} : obj; | |
var out = value.reduce(function (newObj, item) { | |
sExpr(item, newObj); | |
return newObj; | |
}, thing); | |
if (key) { | |
obj[key] = out; | |
} | |
} | |
function sExpr(v, obj) { | |
if (!Array.isArray(v)) { | |
obj[v] = true; | |
return; | |
} | |
var key = v.shift(); | |
if (key === 'PARAMETER') { | |
key = v.shift(); | |
} | |
if (v.length === 1) { | |
if (Array.isArray(v[0])) { | |
obj[key] = {}; | |
sExpr(v[0], obj[key]); | |
return; | |
} | |
obj[key] = v[0]; | |
return; | |
} | |
if (!v.length) { | |
obj[key] = true; | |
return; | |
} | |
if (key === 'TOWGS84') { | |
obj[key] = v; | |
return; | |
} | |
if (!Array.isArray(key)) { | |
obj[key] = {}; | |
} | |
var i; | |
switch (key) { | |
case 'UNIT': | |
case 'PRIMEM': | |
case 'VERT_DATUM': | |
obj[key] = { | |
name: v[0].toLowerCase(), | |
convert: v[1] | |
}; | |
if (v.length === 3) { | |
sExpr(v[2], obj[key]); | |
} | |
return; | |
case 'SPHEROID': | |
case 'ELLIPSOID': | |
obj[key] = { | |
name: v[0], | |
a: v[1], | |
rf: v[2] | |
}; | |
if (v.length === 4) { | |
sExpr(v[3], obj[key]); | |
} | |
return; | |
case 'PROJECTEDCRS': | |
case 'PROJCRS': | |
case 'GEOGCS': | |
case 'GEOCCS': | |
case 'PROJCS': | |
case 'LOCAL_CS': | |
case 'GEODCRS': | |
case 'GEODETICCRS': | |
case 'GEODETICDATUM': | |
case 'EDATUM': | |
case 'ENGINEERINGDATUM': | |
case 'VERT_CS': | |
case 'VERTCRS': | |
case 'VERTICALCRS': | |
case 'COMPD_CS': | |
case 'COMPOUNDCRS': | |
case 'ENGINEERINGCRS': | |
case 'ENGCRS': | |
case 'FITTED_CS': | |
case 'LOCAL_DATUM': | |
case 'DATUM': | |
v[0] = ['name', v[0]]; | |
mapit(obj, key, v); | |
return; | |
default: | |
i = -1; | |
while (++i < v.length) { | |
if (!Array.isArray(v[i])) { | |
return sExpr(v, obj[key]); | |
} | |
} | |
return mapit(obj, key, v); | |
} | |
} | |
var D2R$1 = 0.01745329251994329577; | |
function rename(obj, params) { | |
var outName = params[0]; | |
var inName = params[1]; | |
if (!(outName in obj) && inName in obj) { | |
obj[outName] = obj[inName]; | |
if (params.length === 3) { | |
obj[outName] = params[2](obj[outName]); | |
} | |
} | |
} | |
function d2r(input) { | |
return input * D2R$1; | |
} | |
function cleanWKT(wkt) { | |
if (wkt.type === 'GEOGCS') { | |
wkt.projName = 'longlat'; | |
} else if (wkt.type === 'LOCAL_CS') { | |
wkt.projName = 'identity'; | |
wkt.local = true; | |
} else { | |
if (_typeof(wkt.PROJECTION) === 'object') { | |
wkt.projName = Object.keys(wkt.PROJECTION)[0]; | |
} else { | |
wkt.projName = wkt.PROJECTION; | |
} | |
} | |
if (wkt.UNIT) { | |
wkt.units = wkt.UNIT.name.toLowerCase(); | |
if (wkt.units === 'metre') { | |
wkt.units = 'meter'; | |
} | |
if (wkt.UNIT.convert) { | |
if (wkt.type === 'GEOGCS') { | |
if (wkt.DATUM && wkt.DATUM.SPHEROID) { | |
wkt.to_meter = wkt.UNIT.convert * wkt.DATUM.SPHEROID.a; | |
} | |
} else { | |
wkt.to_meter = wkt.UNIT.convert, 10; | |
} | |
} | |
} | |
var geogcs = wkt.GEOGCS; | |
if (wkt.type === 'GEOGCS') { | |
geogcs = wkt; | |
} | |
if (geogcs) { | |
//if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ | |
// wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; | |
//} | |
if (geogcs.DATUM) { | |
wkt.datumCode = geogcs.DATUM.name.toLowerCase(); | |
} else { | |
wkt.datumCode = geogcs.name.toLowerCase(); | |
} | |
if (wkt.datumCode.slice(0, 2) === 'd_') { | |
wkt.datumCode = wkt.datumCode.slice(2); | |
} | |
if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { | |
wkt.datumCode = 'nzgd49'; | |
} | |
if (wkt.datumCode === 'wgs_1984') { | |
if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { | |
wkt.sphere = true; | |
} | |
wkt.datumCode = 'wgs84'; | |
} | |
if (wkt.datumCode.slice(-6) === '_ferro') { | |
wkt.datumCode = wkt.datumCode.slice(0, -6); | |
} | |
if (wkt.datumCode.slice(-8) === '_jakarta') { | |
wkt.datumCode = wkt.datumCode.slice(0, -8); | |
} | |
if (~wkt.datumCode.indexOf('belge')) { | |
wkt.datumCode = 'rnb72'; | |
} | |
if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { | |
wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); | |
if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { | |
wkt.ellps = 'intl'; | |
} | |
wkt.a = geogcs.DATUM.SPHEROID.a; | |
wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); | |
} | |
if (~wkt.datumCode.indexOf('osgb_1936')) { | |
wkt.datumCode = 'osgb36'; | |
} | |
if (~wkt.datumCode.indexOf('osni_1952')) { | |
wkt.datumCode = 'osni52'; | |
} | |
if (~wkt.datumCode.indexOf('tm65') || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) { | |
wkt.datumCode = 'ire65'; | |
} | |
if (wkt.datumCode === 'ch1903+') { | |
wkt.datumCode = 'ch1903'; | |
} | |
} | |
if (wkt.b && !isFinite(wkt.b)) { | |
wkt.b = wkt.a; | |
} | |
function toMeter(input) { | |
var ratio = wkt.to_meter || 1; | |
return input * ratio; | |
} | |
var renamer = function renamer(a) { | |
return rename(wkt, a); | |
}; | |
var list = [['standard_parallel_1', 'Standard_Parallel_1'], ['standard_parallel_2', 'Standard_Parallel_2'], ['false_easting', 'False_Easting'], ['false_northing', 'False_Northing'], ['central_meridian', 'Central_Meridian'], ['latitude_of_origin', 'Latitude_Of_Origin'], ['latitude_of_origin', 'Central_Parallel'], ['scale_factor', 'Scale_Factor'], ['k0', 'scale_factor'], ['latitude_of_center', 'Latitude_Of_Center'], ['latitude_of_center', 'Latitude_of_center'], ['lat0', 'latitude_of_center', d2r], ['longitude_of_center', 'Longitude_Of_Center'], ['longitude_of_center', 'Longitude_of_center'], ['longc', 'longitude_of_center', d2r], ['x0', 'false_easting', toMeter], ['y0', 'false_northing', toMeter], ['long0', 'central_meridian', d2r], ['lat0', 'latitude_of_origin', d2r], ['lat0', 'standard_parallel_1', d2r], ['lat1', 'standard_parallel_1', d2r], ['lat2', 'standard_parallel_2', d2r], ['azimuth', 'Azimuth'], ['alpha', 'azimuth', d2r], ['srsCode', 'name']]; | |
list.forEach(renamer); | |
if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) { | |
wkt.long0 = wkt.longc; | |
} | |
if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) { | |
wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); | |
wkt.lat_ts = wkt.lat1; | |
} | |
} | |
function wkt (wkt) { | |
var lisp = parseString(wkt); | |
var type = lisp.shift(); | |
var name = lisp.shift(); | |
lisp.unshift(['name', name]); | |
lisp.unshift(['type', type]); | |
var obj = {}; | |
sExpr(lisp, obj); | |
cleanWKT(obj); | |
return obj; | |
} | |
function defs(name) { | |
/*global console*/ | |
var that = this; | |
if (arguments.length === 2) { | |
var def = arguments[1]; | |
if (typeof def === 'string') { | |
if (def.charAt(0) === '+') { | |
defs[name] = parseProj(arguments[1]); | |
} else { | |
defs[name] = wkt(arguments[1]); | |
} | |
} else { | |
defs[name] = def; | |
} | |
} else if (arguments.length === 1) { | |
if (Array.isArray(name)) { | |
return name.map(function (v) { | |
if (Array.isArray(v)) { | |
defs.apply(that, v); | |
} else { | |
defs(v); | |
} | |
}); | |
} else if (typeof name === 'string') { | |
if (name in defs) { | |
return defs[name]; | |
} | |
} else if ('EPSG' in name) { | |
defs['EPSG:' + name.EPSG] = name; | |
} else if ('ESRI' in name) { | |
defs['ESRI:' + name.ESRI] = name; | |
} else if ('IAU2000' in name) { | |
defs['IAU2000:' + name.IAU2000] = name; | |
} else { | |
console.log(name); | |
} | |
return; | |
} | |
} | |
globals(defs); | |
function testObj(code) { | |
return typeof code === 'string'; | |
} | |
function testDef(code) { | |
return code in defs; | |
} | |
var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS', 'GEOCCS', 'PROJCS', 'LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; | |
function testWKT(code) { | |
return codeWords.some(function (word) { | |
return code.indexOf(word) > -1; | |
}); | |
} | |
function testProj(code) { | |
return code[0] === '+'; | |
} | |
function parse(code) { | |
if (testObj(code)) { | |
//check to see if this is a WKT string | |
if (testDef(code)) { | |
return defs[code]; | |
} | |
if (testWKT(code)) { | |
return wkt(code); | |
} | |
if (testProj(code)) { | |
return parseProj(code); | |
} | |
} else { | |
return code; | |
} | |
} | |
function extend (destination, source) { | |
destination = destination || {}; | |
var value, property; | |
if (!source) { | |
return destination; | |
} | |
for (property in source) { | |
value = source[property]; | |
if (value !== undefined) { | |
destination[property] = value; | |
} | |
} | |
return destination; | |
} | |
function msfnz (eccent, sinphi, cosphi) { | |
var con = eccent * sinphi; | |
return cosphi / Math.sqrt(1 - con * con); | |
} | |
function sign (x) { | |
return x < 0 ? -1 : 1; | |
} | |
function adjust_lon (x) { | |
return Math.abs(x) <= SPI ? x : x - sign(x) * TWO_PI; | |
} | |
function tsfnz (eccent, phi, sinphi) { | |
var con = eccent * sinphi; | |
var com = 0.5 * eccent; | |
con = Math.pow((1 - con) / (1 + con), com); | |
return Math.tan(0.5 * (HALF_PI - phi)) / con; | |
} | |
function phi2z (eccent, ts) { | |
var eccnth = 0.5 * eccent; | |
var con, dphi; | |
var phi = HALF_PI - 2 * Math.atan(ts); | |
for (var i = 0; i <= 15; i++) { | |
con = eccent * Math.sin(phi); | |
dphi = HALF_PI - 2 * Math.atan(ts * Math.pow((1 - con) / (1 + con), eccnth)) - phi; | |
phi += dphi; | |
if (Math.abs(dphi) <= 0.0000000001) { | |
return phi; | |
} | |
} | |
//console.log("phi2z has NoConvergence"); | |
return -9999; | |
} | |
function init() { | |
var con = this.b / this.a; | |
this.es = 1 - con * con; | |
if (!('x0' in this)) { | |
this.x0 = 0; | |
} | |
if (!('y0' in this)) { | |
this.y0 = 0; | |
} | |
this.e = Math.sqrt(this.es); | |
if (this.lat_ts) { | |
if (this.sphere) { | |
this.k0 = Math.cos(this.lat_ts); | |
} else { | |
this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); | |
} | |
} else { | |
if (!this.k0) { | |
if (this.k) { | |
this.k0 = this.k; | |
} else { | |
this.k0 = 1; | |
} | |
} | |
} | |
} | |
/* Mercator forward equations--mapping lat,long to x,y | |
--------------------------------------------------*/ | |
function forward(p) { | |
var lon = p.x; | |
var lat = p.y; | |
// convert to radians | |
if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { | |
return null; | |
} | |
var x, y; | |
if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { | |
return null; | |
} else { | |
if (this.sphere) { | |
x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); | |
y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); | |
} else { | |
var sinphi = Math.sin(lat); | |
var ts = tsfnz(this.e, lat, sinphi); | |
x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); | |
y = this.y0 - this.a * this.k0 * Math.log(ts); | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
} | |
/* Mercator inverse equations--mapping x,y to lat/long | |
--------------------------------------------------*/ | |
function inverse(p) { | |
var x = p.x - this.x0; | |
var y = p.y - this.y0; | |
var lon, lat; | |
if (this.sphere) { | |
lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); | |
} else { | |
var ts = Math.exp(-y / (this.a * this.k0)); | |
lat = phi2z(this.e, ts); | |
if (lat === -9999) { | |
return null; | |
} | |
} | |
lon = adjust_lon(this.long0 + x / (this.a * this.k0)); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; | |
var merc = { | |
init: init, | |
forward: forward, | |
inverse: inverse, | |
names: names | |
}; | |
function init$1() { | |
//no-op for longlat | |
} | |
function identity(pt) { | |
return pt; | |
} | |
var names$1 = ["longlat", "identity"]; | |
var longlat = { | |
init: init$1, | |
forward: identity, | |
inverse: identity, | |
names: names$1 | |
}; | |
var projs = [merc, longlat]; | |
var names$2 = {}; | |
var projStore = []; | |
function add(proj, i) { | |
var len = projStore.length; | |
if (!proj.names) { | |
console.log(i); | |
return true; | |
} | |
projStore[len] = proj; | |
proj.names.forEach(function (n) { | |
names$2[n.toLowerCase()] = len; | |
}); | |
return this; | |
} | |
function get$1(name) { | |
if (!name) { | |
return false; | |
} | |
var n = name.toLowerCase(); | |
if (typeof names$2[n] !== 'undefined' && projStore[names$2[n]]) { | |
return projStore[names$2[n]]; | |
} | |
} | |
function start() { | |
projs.forEach(add); | |
} | |
var projections = { | |
start: start, | |
add: add, | |
get: get$1 | |
}; | |
var exports$2 = {}; | |
exports$2.MERIT = { | |
a: 6378137.0, | |
rf: 298.257, | |
ellipseName: "MERIT 1983" | |
}; | |
exports$2.SGS85 = { | |
a: 6378136.0, | |
rf: 298.257, | |
ellipseName: "Soviet Geodetic System 85" | |
}; | |
exports$2.GRS80 = { | |
a: 6378137.0, | |
rf: 298.257222101, | |
ellipseName: "GRS 1980(IUGG, 1980)" | |
}; | |
exports$2.IAU76 = { | |
a: 6378140.0, | |
rf: 298.257, | |
ellipseName: "IAU 1976" | |
}; | |
exports$2.airy = { | |
a: 6377563.396, | |
b: 6356256.910, | |
ellipseName: "Airy 1830" | |
}; | |
exports$2.APL4 = { | |
a: 6378137, | |
rf: 298.25, | |
ellipseName: "Appl. Physics. 1965" | |
}; | |
exports$2.NWL9D = { | |
a: 6378145.0, | |
rf: 298.25, | |
ellipseName: "Naval Weapons Lab., 1965" | |
}; | |
exports$2.mod_airy = { | |
a: 6377340.189, | |
b: 6356034.446, | |
ellipseName: "Modified Airy" | |
}; | |
exports$2.andrae = { | |
a: 6377104.43, | |
rf: 300.0, | |
ellipseName: "Andrae 1876 (Den., Iclnd.)" | |
}; | |
exports$2.aust_SA = { | |
a: 6378160.0, | |
rf: 298.25, | |
ellipseName: "Australian Natl & S. Amer. 1969" | |
}; | |
exports$2.GRS67 = { | |
a: 6378160.0, | |
rf: 298.2471674270, | |
ellipseName: "GRS 67(IUGG 1967)" | |
}; | |
exports$2.bessel = { | |
a: 6377397.155, | |
rf: 299.1528128, | |
ellipseName: "Bessel 1841" | |
}; | |
exports$2.bess_nam = { | |
a: 6377483.865, | |
rf: 299.1528128, | |
ellipseName: "Bessel 1841 (Namibia)" | |
}; | |
exports$2.clrk66 = { | |
a: 6378206.4, | |
b: 6356583.8, | |
ellipseName: "Clarke 1866" | |
}; | |
exports$2.clrk80 = { | |
a: 6378249.145, | |
rf: 293.4663, | |
ellipseName: "Clarke 1880 mod." | |
}; | |
exports$2.clrk58 = { | |
a: 6378293.645208759, | |
rf: 294.2606763692654, | |
ellipseName: "Clarke 1858" | |
}; | |
exports$2.CPM = { | |
a: 6375738.7, | |
rf: 334.29, | |
ellipseName: "Comm. des Poids et Mesures 1799" | |
}; | |
exports$2.delmbr = { | |
a: 6376428.0, | |
rf: 311.5, | |
ellipseName: "Delambre 1810 (Belgium)" | |
}; | |
exports$2.engelis = { | |
a: 6378136.05, | |
rf: 298.2566, | |
ellipseName: "Engelis 1985" | |
}; | |
exports$2.evrst30 = { | |
a: 6377276.345, | |
rf: 300.8017, | |
ellipseName: "Everest 1830" | |
}; | |
exports$2.evrst48 = { | |
a: 6377304.063, | |
rf: 300.8017, | |
ellipseName: "Everest 1948" | |
}; | |
exports$2.evrst56 = { | |
a: 6377301.243, | |
rf: 300.8017, | |
ellipseName: "Everest 1956" | |
}; | |
exports$2.evrst69 = { | |
a: 6377295.664, | |
rf: 300.8017, | |
ellipseName: "Everest 1969" | |
}; | |
exports$2.evrstSS = { | |
a: 6377298.556, | |
rf: 300.8017, | |
ellipseName: "Everest (Sabah & Sarawak)" | |
}; | |
exports$2.fschr60 = { | |
a: 6378166.0, | |
rf: 298.3, | |
ellipseName: "Fischer (Mercury Datum) 1960" | |
}; | |
exports$2.fschr60m = { | |
a: 6378155.0, | |
rf: 298.3, | |
ellipseName: "Fischer 1960" | |
}; | |
exports$2.fschr68 = { | |
a: 6378150.0, | |
rf: 298.3, | |
ellipseName: "Fischer 1968" | |
}; | |
exports$2.helmert = { | |
a: 6378200.0, | |
rf: 298.3, | |
ellipseName: "Helmert 1906" | |
}; | |
exports$2.hough = { | |
a: 6378270.0, | |
rf: 297.0, | |
ellipseName: "Hough" | |
}; | |
exports$2.intl = { | |
a: 6378388.0, | |
rf: 297.0, | |
ellipseName: "International 1909 (Hayford)" | |
}; | |
exports$2.kaula = { | |
a: 6378163.0, | |
rf: 298.24, | |
ellipseName: "Kaula 1961" | |
}; | |
exports$2.lerch = { | |
a: 6378139.0, | |
rf: 298.257, | |
ellipseName: "Lerch 1979" | |
}; | |
exports$2.mprts = { | |
a: 6397300.0, | |
rf: 191.0, | |
ellipseName: "Maupertius 1738" | |
}; | |
exports$2.new_intl = { | |
a: 6378157.5, | |
b: 6356772.2, | |
ellipseName: "New International 1967" | |
}; | |
exports$2.plessis = { | |
a: 6376523.0, | |
rf: 6355863.0, | |
ellipseName: "Plessis 1817 (France)" | |
}; | |
exports$2.krass = { | |
a: 6378245.0, | |
rf: 298.3, | |
ellipseName: "Krassovsky, 1942" | |
}; | |
exports$2.SEasia = { | |
a: 6378155.0, | |
b: 6356773.3205, | |
ellipseName: "Southeast Asia" | |
}; | |
exports$2.walbeck = { | |
a: 6376896.0, | |
b: 6355834.8467, | |
ellipseName: "Walbeck" | |
}; | |
exports$2.WGS60 = { | |
a: 6378165.0, | |
rf: 298.3, | |
ellipseName: "WGS 60" | |
}; | |
exports$2.WGS66 = { | |
a: 6378145.0, | |
rf: 298.25, | |
ellipseName: "WGS 66" | |
}; | |
exports$2.WGS7 = { | |
a: 6378135.0, | |
rf: 298.26, | |
ellipseName: "WGS 72" | |
}; | |
var WGS84 = exports$2.WGS84 = { | |
a: 6378137.0, | |
rf: 298.257223563, | |
ellipseName: "WGS 84" | |
}; | |
exports$2.sphere = { | |
a: 6370997.0, | |
b: 6370997.0, | |
ellipseName: "Normal Sphere (r=6370997)" | |
}; | |
function eccentricity(a, b, rf, R_A) { | |
var a2 = a * a; // used in geocentric | |
var b2 = b * b; // used in geocentric | |
var es = (a2 - b2) / a2; // e ^ 2 | |
var e = 0; | |
if (R_A) { | |
a *= 1 - es * (SIXTH + es * (RA4 + es * RA6)); | |
a2 = a * a; | |
es = 0; | |
} else { | |
e = Math.sqrt(es); // eccentricity | |
} | |
var ep2 = (a2 - b2) / b2; // used in geocentric | |
return { | |
es: es, | |
e: e, | |
ep2: ep2 | |
}; | |
} | |
function sphere(a, b, rf, ellps, sphere) { | |
if (!a) { | |
// do we have an ellipsoid? | |
var ellipse = match(exports$2, ellps); | |
if (!ellipse) { | |
ellipse = WGS84; | |
} | |
a = ellipse.a; | |
b = ellipse.b; | |
rf = ellipse.rf; | |
} | |
if (rf && !b) { | |
b = (1.0 - 1.0 / rf) * a; | |
} | |
if (rf === 0 || Math.abs(a - b) < EPSLN) { | |
sphere = true; | |
b = a; | |
} | |
return { | |
a: a, | |
b: b, | |
rf: rf, | |
sphere: sphere | |
}; | |
} | |
var exports$3 = {}; | |
exports$3.wgs84 = { | |
towgs84: "0,0,0", | |
ellipse: "WGS84", | |
datumName: "WGS84" | |
}; | |
exports$3.ch1903 = { | |
towgs84: "674.374,15.056,405.346", | |
ellipse: "bessel", | |
datumName: "swiss" | |
}; | |
exports$3.ggrs87 = { | |
towgs84: "-199.87,74.79,246.62", | |
ellipse: "GRS80", | |
datumName: "Greek_Geodetic_Reference_System_1987" | |
}; | |
exports$3.nad83 = { | |
towgs84: "0,0,0", | |
ellipse: "GRS80", | |
datumName: "North_American_Datum_1983" | |
}; | |
exports$3.nad27 = { | |
nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", | |
ellipse: "clrk66", | |
datumName: "North_American_Datum_1927" | |
}; | |
exports$3.potsdam = { | |
towgs84: "606.0,23.0,413.0", | |
ellipse: "bessel", | |
datumName: "Potsdam Rauenberg 1950 DHDN" | |
}; | |
exports$3.carthage = { | |
towgs84: "-263.0,6.0,431.0", | |
ellipse: "clark80", | |
datumName: "Carthage 1934 Tunisia" | |
}; | |
exports$3.hermannskogel = { | |
towgs84: "653.0,-212.0,449.0", | |
ellipse: "bessel", | |
datumName: "Hermannskogel" | |
}; | |
exports$3.osni52 = { | |
towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", | |
ellipse: "airy", | |
datumName: "Irish National" | |
}; | |
exports$3.ire65 = { | |
towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", | |
ellipse: "mod_airy", | |
datumName: "Ireland 1965" | |
}; | |
exports$3.rassadiran = { | |
towgs84: "-133.63,-157.5,-158.62", | |
ellipse: "intl", | |
datumName: "Rassadiran" | |
}; | |
exports$3.nzgd49 = { | |
towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", | |
ellipse: "intl", | |
datumName: "New Zealand Geodetic Datum 1949" | |
}; | |
exports$3.osgb36 = { | |
towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", | |
ellipse: "airy", | |
datumName: "Airy 1830" | |
}; | |
exports$3.s_jtsk = { | |
towgs84: "589,76,480", | |
ellipse: 'bessel', | |
datumName: 'S-JTSK (Ferro)' | |
}; | |
exports$3.beduaram = { | |
towgs84: '-106,-87,188', | |
ellipse: 'clrk80', | |
datumName: 'Beduaram' | |
}; | |
exports$3.gunung_segara = { | |
towgs84: '-403,684,41', | |
ellipse: 'bessel', | |
datumName: 'Gunung Segara Jakarta' | |
}; | |
exports$3.rnb72 = { | |
towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", | |
ellipse: "intl", | |
datumName: "Reseau National Belge 1972" | |
}; | |
function datum(datumCode, datum_params, a, b, es, ep2) { | |
var out = {}; | |
if (datumCode === undefined || datumCode === 'none') { | |
out.datum_type = PJD_NODATUM; | |
} else { | |
out.datum_type = PJD_WGS84; | |
} | |
if (datum_params) { | |
out.datum_params = datum_params.map(parseFloat); | |
if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) { | |
out.datum_type = PJD_3PARAM; | |
} | |
if (out.datum_params.length > 3) { | |
if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) { | |
out.datum_type = PJD_7PARAM; | |
out.datum_params[3] *= SEC_TO_RAD; | |
out.datum_params[4] *= SEC_TO_RAD; | |
out.datum_params[5] *= SEC_TO_RAD; | |
out.datum_params[6] = out.datum_params[6] / 1000000.0 + 1.0; | |
} | |
} | |
} | |
out.a = a; //datum object also uses these values | |
out.b = b; | |
out.es = es; | |
out.ep2 = ep2; | |
return out; | |
} | |
function Projection(srsCode, callback) { | |
if (!(this instanceof Projection)) { | |
return new Projection(srsCode); | |
} | |
callback = callback || function (error) { | |
if (error) { | |
throw error; | |
} | |
}; | |
var json = parse(srsCode); | |
if ((typeof json === 'undefined' ? 'undefined' : _typeof(json)) !== 'object') { | |
callback(srsCode); | |
return; | |
} | |
var ourProj = Projection.projections.get(json.projName); | |
if (!ourProj) { | |
callback(srsCode); | |
return; | |
} | |
if (json.datumCode && json.datumCode !== 'none') { | |
var datumDef = match(exports$3, json.datumCode); | |
if (datumDef) { | |
json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null; | |
json.ellps = datumDef.ellipse; | |
json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; | |
} | |
} | |
json.k0 = json.k0 || 1.0; | |
json.axis = json.axis || 'enu'; | |
json.ellps = json.ellps || 'wgs84'; | |
var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere); | |
var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A); | |
var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2); | |
extend(this, json); // transfer everything over from the projection because we don't know what we'll need | |
extend(this, ourProj); // transfer all the methods from the projection | |
// copy the 4 things over we calulated in deriveConstants.sphere | |
this.a = sphere_.a; | |
this.b = sphere_.b; | |
this.rf = sphere_.rf; | |
this.sphere = sphere_.sphere; | |
// copy the 3 things we calculated in deriveConstants.eccentricity | |
this.es = ecc.es; | |
this.e = ecc.e; | |
this.ep2 = ecc.ep2; | |
// add in the datum object | |
this.datum = datumObj; | |
// init the projection | |
this.init(); | |
// legecy callback from back in the day when it went to spatialreference.org | |
callback(null, this); | |
} | |
Projection.projections = projections; | |
Projection.projections.start(); | |
function compareDatums(source, dest) { | |
if (source.datum_type !== dest.datum_type) { | |
return false; // false, datums are not equal | |
} else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) { | |
// the tolerance for es is to ensure that GRS80 and WGS84 | |
// are considered identical | |
return false; | |
} else if (source.datum_type === PJD_3PARAM) { | |
return source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]; | |
} else if (source.datum_type === PJD_7PARAM) { | |
return source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]; | |
} else { | |
return true; // datums are equal | |
} | |
} // cs_compare_datums() | |
/* | |
* The function Convert_Geodetic_To_Geocentric converts geodetic coordinates | |
* (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), | |
* according to the current ellipsoid parameters. | |
* | |
* Latitude : Geodetic latitude in radians (input) | |
* Longitude : Geodetic longitude in radians (input) | |
* Height : Geodetic height, in meters (input) | |
* X : Calculated Geocentric X coordinate, in meters (output) | |
* Y : Calculated Geocentric Y coordinate, in meters (output) | |
* Z : Calculated Geocentric Z coordinate, in meters (output) | |
* | |
*/ | |
function geodeticToGeocentric(p, es, a) { | |
var Longitude = p.x; | |
var Latitude = p.y; | |
var Height = p.z ? p.z : 0; //Z value not always supplied | |
var Rn; /* Earth radius at location */ | |
var Sin_Lat; /* Math.sin(Latitude) */ | |
var Sin2_Lat; /* Square of Math.sin(Latitude) */ | |
var Cos_Lat; /* Math.cos(Latitude) */ | |
/* | |
** Don't blow up if Latitude is just a little out of the value | |
** range as it may just be a rounding issue. Also removed longitude | |
** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. | |
*/ | |
if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { | |
Latitude = -HALF_PI; | |
} else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { | |
Latitude = HALF_PI; | |
} else if (Latitude < -HALF_PI || Latitude > HALF_PI) { | |
/* Latitude out of range */ | |
//..reportError('geocent:lat out of range:' + Latitude); | |
return null; | |
} | |
if (Longitude > Math.PI) { | |
Longitude -= 2 * Math.PI; | |
} | |
Sin_Lat = Math.sin(Latitude); | |
Cos_Lat = Math.cos(Latitude); | |
Sin2_Lat = Sin_Lat * Sin_Lat; | |
Rn = a / Math.sqrt(1.0e0 - es * Sin2_Lat); | |
return { | |
x: (Rn + Height) * Cos_Lat * Math.cos(Longitude), | |
y: (Rn + Height) * Cos_Lat * Math.sin(Longitude), | |
z: (Rn * (1 - es) + Height) * Sin_Lat | |
}; | |
} // cs_geodetic_to_geocentric() | |
function geocentricToGeodetic(p, es, a, b) { | |
/* local defintions and variables */ | |
/* end-criterium of loop, accuracy of sin(Latitude) */ | |
var genau = 1e-12; | |
var genau2 = genau * genau; | |
var maxiter = 30; | |
var P; /* distance between semi-minor axis and location */ | |
var RR; /* distance between center and location */ | |
var CT; /* sin of geocentric latitude */ | |
var ST; /* cos of geocentric latitude */ | |
var RX; | |
var RK; | |
var RN; /* Earth radius at location */ | |
var CPHI0; /* cos of start or old geodetic latitude in iterations */ | |
var SPHI0; /* sin of start or old geodetic latitude in iterations */ | |
var CPHI; /* cos of searched geodetic latitude */ | |
var SPHI; /* sin of searched geodetic latitude */ | |
var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ | |
var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ | |
var X = p.x; | |
var Y = p.y; | |
var Z = p.z ? p.z : 0.0; //Z value not always supplied | |
var Longitude; | |
var Latitude; | |
var Height; | |
P = Math.sqrt(X * X + Y * Y); | |
RR = Math.sqrt(X * X + Y * Y + Z * Z); | |
/* special cases for latitude and longitude */ | |
if (P / a < genau) { | |
/* special case, if P=0. (X=0., Y=0.) */ | |
Longitude = 0.0; | |
/* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis | |
* of ellipsoid (=center of mass), Latitude becomes PI/2 */ | |
if (RR / a < genau) { | |
Latitude = HALF_PI; | |
Height = -b; | |
return { | |
x: p.x, | |
y: p.y, | |
z: p.z | |
}; | |
} | |
} else { | |
/* ellipsoidal (geodetic) longitude | |
* interval: -PI < Longitude <= +PI */ | |
Longitude = Math.atan2(Y, X); | |
} | |
/* -------------------------------------------------------------- | |
* Following iterative algorithm was developped by | |
* "Institut for Erdmessung", University of Hannover, July 1988. | |
* Internet: www.ife.uni-hannover.de | |
* Iterative computation of CPHI,SPHI and Height. | |
* Iteration of CPHI and SPHI to 10**-12 radian resp. | |
* 2*10**-7 arcsec. | |
* -------------------------------------------------------------- | |
*/ | |
CT = Z / RR; | |
ST = P / RR; | |
RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST); | |
CPHI0 = ST * (1.0 - es) * RX; | |
SPHI0 = CT * RX; | |
iter = 0; | |
/* loop to find sin(Latitude) resp. Latitude | |
* until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ | |
do { | |
iter++; | |
RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0); | |
/* ellipsoidal (geodetic) height */ | |
Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0); | |
RK = es * RN / (RN + Height); | |
RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST); | |
CPHI = ST * (1.0 - RK) * RX; | |
SPHI = CT * RX; | |
SDPHI = SPHI * CPHI0 - CPHI * SPHI0; | |
CPHI0 = CPHI; | |
SPHI0 = SPHI; | |
} while (SDPHI * SDPHI > genau2 && iter < maxiter); | |
/* ellipsoidal (geodetic) latitude */ | |
Latitude = Math.atan(SPHI / Math.abs(CPHI)); | |
return { | |
x: Longitude, | |
y: Latitude, | |
z: Height | |
}; | |
} // cs_geocentric_to_geodetic() | |
/****************************************************************/ | |
// pj_geocentic_to_wgs84( p ) | |
// p = point to transform in geocentric coordinates (x,y,z) | |
/** point object, nothing fancy, just allows values to be | |
passed back and forth by reference rather than by value. | |
Other point classes may be used as long as they have | |
x and y properties, which will get modified in the transform method. | |
*/ | |
function geocentricToWgs84(p, datum_type, datum_params) { | |
if (datum_type === PJD_3PARAM) { | |
// if( x[io] === HUGE_VAL ) | |
// continue; | |
return { | |
x: p.x + datum_params[0], | |
y: p.y + datum_params[1], | |
z: p.z + datum_params[2] | |
}; | |
} else if (datum_type === PJD_7PARAM) { | |
var Dx_BF = datum_params[0]; | |
var Dy_BF = datum_params[1]; | |
var Dz_BF = datum_params[2]; | |
var Rx_BF = datum_params[3]; | |
var Ry_BF = datum_params[4]; | |
var Rz_BF = datum_params[5]; | |
var M_BF = datum_params[6]; | |
// if( x[io] === HUGE_VAL ) | |
// continue; | |
return { | |
x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF, | |
y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF, | |
z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF | |
}; | |
} | |
} // cs_geocentric_to_wgs84 | |
/****************************************************************/ | |
// pj_geocentic_from_wgs84() | |
// coordinate system definition, | |
// point to transform in geocentric coordinates (x,y,z) | |
function geocentricFromWgs84(p, datum_type, datum_params) { | |
if (datum_type === PJD_3PARAM) { | |
//if( x[io] === HUGE_VAL ) | |
// continue; | |
return { | |
x: p.x - datum_params[0], | |
y: p.y - datum_params[1], | |
z: p.z - datum_params[2] | |
}; | |
} else if (datum_type === PJD_7PARAM) { | |
var Dx_BF = datum_params[0]; | |
var Dy_BF = datum_params[1]; | |
var Dz_BF = datum_params[2]; | |
var Rx_BF = datum_params[3]; | |
var Ry_BF = datum_params[4]; | |
var Rz_BF = datum_params[5]; | |
var M_BF = datum_params[6]; | |
var x_tmp = (p.x - Dx_BF) / M_BF; | |
var y_tmp = (p.y - Dy_BF) / M_BF; | |
var z_tmp = (p.z - Dz_BF) / M_BF; | |
//if( x[io] === HUGE_VAL ) | |
// continue; | |
return { | |
x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp, | |
y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp, | |
z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp | |
}; | |
} //cs_geocentric_from_wgs84() | |
} | |
function checkParams(type) { | |
return type === PJD_3PARAM || type === PJD_7PARAM; | |
} | |
function datum_transform (source, dest, point) { | |
// Short cut if the datums are identical. | |
if (compareDatums(source, dest)) { | |
return point; // in this case, zero is sucess, | |
// whereas cs_compare_datums returns 1 to indicate TRUE | |
// confusing, should fix this | |
} | |
// Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest | |
if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { | |
return point; | |
} | |
// If this datum requires grid shifts, then apply it to geodetic coordinates. | |
// Do we need to go through geocentric coordinates? | |
if (source.es === dest.es && source.a === dest.a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) { | |
return point; | |
} | |
// Convert to geocentric coordinates. | |
point = geodeticToGeocentric(point, source.es, source.a); | |
// Convert between datums | |
if (checkParams(source.datum_type)) { | |
point = geocentricToWgs84(point, source.datum_type, source.datum_params); | |
} | |
if (checkParams(dest.datum_type)) { | |
point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params); | |
} | |
return geocentricToGeodetic(point, dest.es, dest.a, dest.b); | |
} | |
function adjust_axis (crs, denorm, point) { | |
var xin = point.x, | |
yin = point.y, | |
zin = point.z || 0.0; | |
var v, t, i; | |
var out = {}; | |
for (i = 0; i < 3; i++) { | |
if (denorm && i === 2 && point.z === undefined) { | |
continue; | |
} | |
if (i === 0) { | |
v = xin; | |
t = 'x'; | |
} else if (i === 1) { | |
v = yin; | |
t = 'y'; | |
} else { | |
v = zin; | |
t = 'z'; | |
} | |
switch (crs.axis[i]) { | |
case 'e': | |
out[t] = v; | |
break; | |
case 'w': | |
out[t] = -v; | |
break; | |
case 'n': | |
out[t] = v; | |
break; | |
case 's': | |
out[t] = -v; | |
break; | |
case 'u': | |
if (point[t] !== undefined) { | |
out.z = v; | |
} | |
break; | |
case 'd': | |
if (point[t] !== undefined) { | |
out.z = -v; | |
} | |
break; | |
default: | |
//console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); | |
return null; | |
} | |
} | |
return out; | |
} | |
function toPoint (array) { | |
var out = { | |
x: array[0], | |
y: array[1] | |
}; | |
if (array.length > 2) { | |
out.z = array[2]; | |
} | |
if (array.length > 3) { | |
out.m = array[3]; | |
} | |
return out; | |
} | |
function checkSanity (point) { | |
checkCoord(point.x); | |
checkCoord(point.y); | |
} | |
function checkCoord(num) { | |
if (typeof Number.isFinite === 'function') { | |
if (Number.isFinite(num)) { | |
return; | |
} | |
throw new TypeError('coordinates must be finite numbers'); | |
} | |
if (typeof num !== 'number' || num !== num || !isFinite(num)) { | |
throw new TypeError('coordinates must be finite numbers'); | |
} | |
} | |
function checkNotWGS(source, dest) { | |
return (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84' || (dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84'; | |
} | |
function transform(source, dest, point) { | |
var wgs84; | |
if (Array.isArray(point)) { | |
point = toPoint(point); | |
} | |
checkSanity(point); | |
// Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 | |
if (source.datum && dest.datum && checkNotWGS(source, dest)) { | |
wgs84 = new Projection('WGS84'); | |
point = transform(source, wgs84, point); | |
source = wgs84; | |
} | |
// DGR, 2010/11/12 | |
if (source.axis !== 'enu') { | |
point = adjust_axis(source, false, point); | |
} | |
// Transform source points to long/lat, if they aren't already. | |
if (source.projName === 'longlat') { | |
point = { | |
x: point.x * D2R, | |
y: point.y * D2R | |
}; | |
} else { | |
if (source.to_meter) { | |
point = { | |
x: point.x * source.to_meter, | |
y: point.y * source.to_meter | |
}; | |
} | |
point = source.inverse(point); // Convert Cartesian to longlat | |
} | |
// Adjust for the prime meridian if necessary | |
if (source.from_greenwich) { | |
point.x += source.from_greenwich; | |
} | |
// Convert datums if needed, and if possible. | |
point = datum_transform(source.datum, dest.datum, point); | |
// Adjust for the prime meridian if necessary | |
if (dest.from_greenwich) { | |
point = { | |
x: point.x - dest.from_greenwich, | |
y: point.y | |
}; | |
} | |
if (dest.projName === 'longlat') { | |
// convert radians to decimal degrees | |
point = { | |
x: point.x * R2D, | |
y: point.y * R2D | |
}; | |
} else { | |
// else project | |
point = dest.forward(point); | |
if (dest.to_meter) { | |
point = { | |
x: point.x / dest.to_meter, | |
y: point.y / dest.to_meter | |
}; | |
} | |
} | |
// DGR, 2010/11/12 | |
if (dest.axis !== 'enu') { | |
return adjust_axis(dest, true, point); | |
} | |
return point; | |
} | |
var wgs84 = Projection('WGS84'); | |
function transformer(from, to, coords) { | |
var transformedArray, out, keys; | |
if (Array.isArray(coords)) { | |
transformedArray = transform(from, to, coords); | |
if (coords.length === 3) { | |
return [transformedArray.x, transformedArray.y, transformedArray.z]; | |
} else { | |
return [transformedArray.x, transformedArray.y]; | |
} | |
} else { | |
out = transform(from, to, coords); | |
keys = Object.keys(coords); | |
if (keys.length === 2) { | |
return out; | |
} | |
keys.forEach(function (key) { | |
if (key === 'x' || key === 'y') { | |
return; | |
} | |
out[key] = coords[key]; | |
}); | |
return out; | |
} | |
} | |
function checkProj(item) { | |
if (item instanceof Projection) { | |
return item; | |
} | |
if (item.oProj) { | |
return item.oProj; | |
} | |
return Projection(item); | |
} | |
function proj4(fromProj, toProj, coord) { | |
fromProj = checkProj(fromProj); | |
var single = false; | |
var obj; | |
if (typeof toProj === 'undefined') { | |
toProj = fromProj; | |
fromProj = wgs84; | |
single = true; | |
} else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { | |
coord = toProj; | |
toProj = fromProj; | |
fromProj = wgs84; | |
single = true; | |
} | |
toProj = checkProj(toProj); | |
if (coord) { | |
return transformer(fromProj, toProj, coord); | |
} else { | |
obj = { | |
forward: function forward(coords) { | |
return transformer(fromProj, toProj, coords); | |
}, | |
inverse: function inverse(coords) { | |
return transformer(toProj, fromProj, coords); | |
} | |
}; | |
if (single) { | |
obj.oProj = toProj; | |
} | |
return obj; | |
} | |
} | |
/** | |
* UTM zones are grouped, and assigned to one of a group of 6 | |
* sets. | |
* | |
* {int} @private | |
*/ | |
var NUM_100K_SETS = 6; | |
/** | |
* The column letters (for easting) of the lower left value, per | |
* set. | |
* | |
* {string} @private | |
*/ | |
var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; | |
/** | |
* The row letters (for northing) of the lower left value, per | |
* set. | |
* | |
* {string} @private | |
*/ | |
var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; | |
var A = 65; // A | |
var I = 73; // I | |
var O = 79; // O | |
var V = 86; // V | |
var Z = 90; // Z | |
var mgrs = { | |
forward: forward$1, | |
inverse: inverse$1, | |
toPoint: toPoint$1 | |
}; | |
/** | |
* Conversion of lat/lon to MGRS. | |
* | |
* @param {object} ll Object literal with lat and lon properties on a | |
* WGS84 ellipsoid. | |
* @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for | |
* 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5. | |
* @return {string} the MGRS string for the given location and accuracy. | |
*/ | |
function forward$1(ll, accuracy) { | |
accuracy = accuracy || 5; // default accuracy 1m | |
return encode(LLtoUTM({ | |
lat: ll[1], | |
lon: ll[0] | |
}), accuracy); | |
} | |
/** | |
* Conversion of MGRS to lat/lon. | |
* | |
* @param {string} mgrs MGRS string. | |
* @return {array} An array with left (longitude), bottom (latitude), right | |
* (longitude) and top (latitude) values in WGS84, representing the | |
* bounding box for the provided MGRS reference. | |
*/ | |
function inverse$1(mgrs) { | |
var bbox = UTMtoLL(decode(mgrs.toUpperCase())); | |
if (bbox.lat && bbox.lon) { | |
return [bbox.lon, bbox.lat, bbox.lon, bbox.lat]; | |
} | |
return [bbox.left, bbox.bottom, bbox.right, bbox.top]; | |
} | |
function toPoint$1(mgrs) { | |
var bbox = UTMtoLL(decode(mgrs.toUpperCase())); | |
if (bbox.lat && bbox.lon) { | |
return [bbox.lon, bbox.lat]; | |
} | |
return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2]; | |
}/** | |
* Conversion from degrees to radians. | |
* | |
* @private | |
* @param {number} deg the angle in degrees. | |
* @return {number} the angle in radians. | |
*/ | |
function degToRad(deg) { | |
return deg * (Math.PI / 180.0); | |
} | |
/** | |
* Conversion from radians to degrees. | |
* | |
* @private | |
* @param {number} rad the angle in radians. | |
* @return {number} the angle in degrees. | |
*/ | |
function radToDeg(rad) { | |
return 180.0 * (rad / Math.PI); | |
} | |
/** | |
* Converts a set of Longitude and Latitude co-ordinates to UTM | |
* using the WGS84 ellipsoid. | |
* | |
* @private | |
* @param {object} ll Object literal with lat and lon properties | |
* representing the WGS84 coordinate to be converted. | |
* @return {object} Object literal containing the UTM value with easting, | |
* northing, zoneNumber and zoneLetter properties, and an optional | |
* accuracy property in digits. Returns null if the conversion failed. | |
*/ | |
function LLtoUTM(ll) { | |
var Lat = ll.lat; | |
var Long = ll.lon; | |
var a = 6378137.0; //ellip.radius; | |
var eccSquared = 0.00669438; //ellip.eccsq; | |
var k0 = 0.9996; | |
var LongOrigin; | |
var eccPrimeSquared; | |
var N, T, C, A, M; | |
var LatRad = degToRad(Lat); | |
var LongRad = degToRad(Long); | |
var LongOriginRad; | |
var ZoneNumber; | |
// (int) | |
ZoneNumber = Math.floor((Long + 180) / 6) + 1; | |
//Make sure the longitude 180.00 is in Zone 60 | |
if (Long === 180) { | |
ZoneNumber = 60; | |
} | |
// Special zone for Norway | |
if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { | |
ZoneNumber = 32; | |
} | |
// Special zones for Svalbard | |
if (Lat >= 72.0 && Lat < 84.0) { | |
if (Long >= 0.0 && Long < 9.0) { | |
ZoneNumber = 31; | |
} else if (Long >= 9.0 && Long < 21.0) { | |
ZoneNumber = 33; | |
} else if (Long >= 21.0 && Long < 33.0) { | |
ZoneNumber = 35; | |
} else if (Long >= 33.0 && Long < 42.0) { | |
ZoneNumber = 37; | |
} | |
} | |
LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin | |
// in middle of | |
// zone | |
LongOriginRad = degToRad(LongOrigin); | |
eccPrimeSquared = eccSquared / (1 - eccSquared); | |
N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); | |
T = Math.tan(LatRad) * Math.tan(LatRad); | |
C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); | |
A = Math.cos(LatRad) * (LongRad - LongOriginRad); | |
M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - 35 * eccSquared * eccSquared * eccSquared / 3072 * Math.sin(6 * LatRad)); | |
var UTMEasting = k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0; | |
var UTMNorthing = k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)); | |
if (Lat < 0.0) { | |
UTMNorthing += 10000000.0; //10000000 meter offset for | |
// southern hemisphere | |
} | |
return { | |
northing: Math.round(UTMNorthing), | |
easting: Math.round(UTMEasting), | |
zoneNumber: ZoneNumber, | |
zoneLetter: getLetterDesignator(Lat) | |
}; | |
} | |
/** | |
* Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience | |
* class where the Zone can be specified as a single string eg."60N" which | |
* is then broken down into the ZoneNumber and ZoneLetter. | |
* | |
* @private | |
* @param {object} utm An object literal with northing, easting, zoneNumber | |
* and zoneLetter properties. If an optional accuracy property is | |
* provided (in meters), a bounding box will be returned instead of | |
* latitude and longitude. | |
* @return {object} An object literal containing either lat and lon values | |
* (if no accuracy was provided), or top, right, bottom and left values | |
* for the bounding box calculated according to the provided accuracy. | |
* Returns null if the conversion failed. | |
*/ | |
function UTMtoLL(utm) { | |
var UTMNorthing = utm.northing; | |
var UTMEasting = utm.easting; | |
var zoneLetter = utm.zoneLetter; | |
var zoneNumber = utm.zoneNumber; | |
// check the ZoneNummber is valid | |
if (zoneNumber < 0 || zoneNumber > 60) { | |
return null; | |
} | |
var k0 = 0.9996; | |
var a = 6378137.0; //ellip.radius; | |
var eccSquared = 0.00669438; //ellip.eccsq; | |
var eccPrimeSquared; | |
var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); | |
var N1, T1, C1, R1, D, M; | |
var LongOrigin; | |
var mu, phi1Rad; | |
// remove 500,000 meter offset for longitude | |
var x = UTMEasting - 500000.0; | |
var y = UTMNorthing; | |
// We must know somehow if we are in the Northern or Southern | |
// hemisphere, this is the only time we use the letter So even | |
// if the Zone letter isn't exactly correct it should indicate | |
// the hemisphere correctly | |
if (zoneLetter < 'N') { | |
y -= 10000000.0; // remove 10,000,000 meter offset used | |
// for southern hemisphere | |
} | |
// There are 60 zones with zone 1 being at West -180 to -174 | |
LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin | |
// in middle of | |
// zone | |
eccPrimeSquared = eccSquared / (1 - eccSquared); | |
M = y / k0; | |
mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); | |
phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + 151 * e1 * e1 * e1 / 96 * Math.sin(6 * mu); | |
// double phi1 = ProjMath.radToDeg(phi1Rad); | |
N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); | |
T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); | |
C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); | |
R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); | |
D = x / (N1 * k0); | |
var lat = phi1Rad - N1 * Math.tan(phi1Rad) / R1 * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); | |
lat = radToDeg(lat); | |
var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); | |
lon = LongOrigin + radToDeg(lon); | |
var result; | |
if (utm.accuracy) { | |
var topRight = UTMtoLL({ | |
northing: utm.northing + utm.accuracy, | |
easting: utm.easting + utm.accuracy, | |
zoneLetter: utm.zoneLetter, | |
zoneNumber: utm.zoneNumber | |
}); | |
result = { | |
top: topRight.lat, | |
right: topRight.lon, | |
bottom: lat, | |
left: lon | |
}; | |
} else { | |
result = { | |
lat: lat, | |
lon: lon | |
}; | |
} | |
return result; | |
} | |
/** | |
* Calculates the MGRS letter designator for the given latitude. | |
* | |
* @private | |
* @param {number} lat The latitude in WGS84 to get the letter designator | |
* for. | |
* @return {char} The letter designator. | |
*/ | |
function getLetterDesignator(lat) { | |
//This is here as an error flag to show that the Latitude is | |
//outside MGRS limits | |
var LetterDesignator = 'Z'; | |
if (84 >= lat && lat >= 72) { | |
LetterDesignator = 'X'; | |
} else if (72 > lat && lat >= 64) { | |
LetterDesignator = 'W'; | |
} else if (64 > lat && lat >= 56) { | |
LetterDesignator = 'V'; | |
} else if (56 > lat && lat >= 48) { | |
LetterDesignator = 'U'; | |
} else if (48 > lat && lat >= 40) { | |
LetterDesignator = 'T'; | |
} else if (40 > lat && lat >= 32) { | |
LetterDesignator = 'S'; | |
} else if (32 > lat && lat >= 24) { | |
LetterDesignator = 'R'; | |
} else if (24 > lat && lat >= 16) { | |
LetterDesignator = 'Q'; | |
} else if (16 > lat && lat >= 8) { | |
LetterDesignator = 'P'; | |
} else if (8 > lat && lat >= 0) { | |
LetterDesignator = 'N'; | |
} else if (0 > lat && lat >= -8) { | |
LetterDesignator = 'M'; | |
} else if (-8 > lat && lat >= -16) { | |
LetterDesignator = 'L'; | |
} else if (-16 > lat && lat >= -24) { | |
LetterDesignator = 'K'; | |
} else if (-24 > lat && lat >= -32) { | |
LetterDesignator = 'J'; | |
} else if (-32 > lat && lat >= -40) { | |
LetterDesignator = 'H'; | |
} else if (-40 > lat && lat >= -48) { | |
LetterDesignator = 'G'; | |
} else if (-48 > lat && lat >= -56) { | |
LetterDesignator = 'F'; | |
} else if (-56 > lat && lat >= -64) { | |
LetterDesignator = 'E'; | |
} else if (-64 > lat && lat >= -72) { | |
LetterDesignator = 'D'; | |
} else if (-72 > lat && lat >= -80) { | |
LetterDesignator = 'C'; | |
} | |
return LetterDesignator; | |
} | |
/** | |
* Encodes a UTM location as MGRS string. | |
* | |
* @private | |
* @param {object} utm An object literal with easting, northing, | |
* zoneLetter, zoneNumber | |
* @param {number} accuracy Accuracy in digits (1-5). | |
* @return {string} MGRS string for the given UTM location. | |
*/ | |
function encode(utm, accuracy) { | |
// prepend with leading zeroes | |
var seasting = "00000" + utm.easting, | |
snorthing = "00000" + utm.northing; | |
return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); | |
} | |
/** | |
* Get the two letter 100k designator for a given UTM easting, | |
* northing and zone number value. | |
* | |
* @private | |
* @param {number} easting | |
* @param {number} northing | |
* @param {number} zoneNumber | |
* @return the two letter 100k designator for the given UTM location. | |
*/ | |
function get100kID(easting, northing, zoneNumber) { | |
var setParm = get100kSetForZone(zoneNumber); | |
var setColumn = Math.floor(easting / 100000); | |
var setRow = Math.floor(northing / 100000) % 20; | |
return getLetter100kID(setColumn, setRow, setParm); | |
} | |
/** | |
* Given a UTM zone number, figure out the MGRS 100K set it is in. | |
* | |
* @private | |
* @param {number} i An UTM zone number. | |
* @return {number} the 100k set the UTM zone is in. | |
*/ | |
function get100kSetForZone(i) { | |
var setParm = i % NUM_100K_SETS; | |
if (setParm === 0) { | |
setParm = NUM_100K_SETS; | |
} | |
return setParm; | |
} | |
/** | |
* Get the two-letter MGRS 100k designator given information | |
* translated from the UTM northing, easting and zone number. | |
* | |
* @private | |
* @param {number} column the column index as it relates to the MGRS | |
* 100k set spreadsheet, created from the UTM easting. | |
* Values are 1-8. | |
* @param {number} row the row index as it relates to the MGRS 100k set | |
* spreadsheet, created from the UTM northing value. Values | |
* are from 0-19. | |
* @param {number} parm the set block, as it relates to the MGRS 100k set | |
* spreadsheet, created from the UTM zone. Values are from | |
* 1-60. | |
* @return two letter MGRS 100k code. | |
*/ | |
function getLetter100kID(column, row, parm) { | |
// colOrigin and rowOrigin are the letters at the origin of the set | |
var index = parm - 1; | |
var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); | |
var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); | |
// colInt and rowInt are the letters to build to return | |
var colInt = colOrigin + column - 1; | |
var rowInt = rowOrigin + row; | |
var rollover = false; | |
if (colInt > Z) { | |
colInt = colInt - Z + A - 1; | |
rollover = true; | |
} | |
if (colInt === I || colOrigin < I && colInt > I || (colInt > I || colOrigin < I) && rollover) { | |
colInt++; | |
} | |
if (colInt === O || colOrigin < O && colInt > O || (colInt > O || colOrigin < O) && rollover) { | |
colInt++; | |
if (colInt === I) { | |
colInt++; | |
} | |
} | |
if (colInt > Z) { | |
colInt = colInt - Z + A - 1; | |
} | |
if (rowInt > V) { | |
rowInt = rowInt - V + A - 1; | |
rollover = true; | |
} else { | |
rollover = false; | |
} | |
if (rowInt === I || rowOrigin < I && rowInt > I || (rowInt > I || rowOrigin < I) && rollover) { | |
rowInt++; | |
} | |
if (rowInt === O || rowOrigin < O && rowInt > O || (rowInt > O || rowOrigin < O) && rollover) { | |
rowInt++; | |
if (rowInt === I) { | |
rowInt++; | |
} | |
} | |
if (rowInt > V) { | |
rowInt = rowInt - V + A - 1; | |
} | |
var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); | |
return twoLetter; | |
} | |
/** | |
* Decode the UTM parameters from a MGRS string. | |
* | |
* @private | |
* @param {string} mgrsString an UPPERCASE coordinate string is expected. | |
* @return {object} An object literal with easting, northing, zoneLetter, | |
* zoneNumber and accuracy (in meters) properties. | |
*/ | |
function decode(mgrsString) { | |
if (mgrsString && mgrsString.length === 0) { | |
throw "MGRSPoint coverting from nothing"; | |
} | |
var length = mgrsString.length; | |
var hunK = null; | |
var sb = ""; | |
var testChar; | |
var i = 0; | |
// get Zone number | |
while (!/[A-Z]/.test(testChar = mgrsString.charAt(i))) { | |
if (i >= 2) { | |
throw "MGRSPoint bad conversion from: " + mgrsString; | |
} | |
sb += testChar; | |
i++; | |
} | |
var zoneNumber = parseInt(sb, 10); | |
if (i === 0 || i + 3 > length) { | |
// A good MGRS string has to be 4-5 digits long, | |
// ##AAA/#AAA at least. | |
throw "MGRSPoint bad conversion from: " + mgrsString; | |
} | |
var zoneLetter = mgrsString.charAt(i++); | |
// Should we check the zone letter here? Why not. | |
if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { | |
throw "MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString; | |
} | |
hunK = mgrsString.substring(i, i += 2); | |
var set = get100kSetForZone(zoneNumber); | |
var east100k = getEastingFromChar(hunK.charAt(0), set); | |
var north100k = getNorthingFromChar(hunK.charAt(1), set); | |
// We have a bug where the northing may be 2000000 too low. | |
// How | |
// do we know when to roll over? | |
while (north100k < getMinNorthing(zoneLetter)) { | |
north100k += 2000000; | |
} | |
// calculate the char index for easting/northing separator | |
var remainder = length - i; | |
if (remainder % 2 !== 0) { | |
throw "MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString; | |
} | |
var sep = remainder / 2; | |
var sepEasting = 0.0; | |
var sepNorthing = 0.0; | |
var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; | |
if (sep > 0) { | |
accuracyBonus = 100000.0 / Math.pow(10, sep); | |
sepEastingString = mgrsString.substring(i, i + sep); | |
sepEasting = parseFloat(sepEastingString) * accuracyBonus; | |
sepNorthingString = mgrsString.substring(i + sep); | |
sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; | |
} | |
easting = sepEasting + east100k; | |
northing = sepNorthing + north100k; | |
return { | |
easting: easting, | |
northing: northing, | |
zoneLetter: zoneLetter, | |
zoneNumber: zoneNumber, | |
accuracy: accuracyBonus | |
}; | |
} | |
/** | |
* Given the first letter from a two-letter MGRS 100k zone, and given the | |
* MGRS table set for the zone number, figure out the easting value that | |
* should be added to the other, secondary easting value. | |
* | |
* @private | |
* @param {char} e The first letter from a two-letter MGRS 100´k zone. | |
* @param {number} set The MGRS table set for the zone number. | |
* @return {number} The easting value for the given letter and set. | |
*/ | |
function getEastingFromChar(e, set) { | |
// colOrigin is the letter at the origin of the set for the | |
// column | |
var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); | |
var eastingValue = 100000.0; | |
var rewindMarker = false; | |
while (curCol !== e.charCodeAt(0)) { | |
curCol++; | |
if (curCol === I) { | |
curCol++; | |
} | |
if (curCol === O) { | |
curCol++; | |
} | |
if (curCol > Z) { | |
if (rewindMarker) { | |
throw "Bad character: " + e; | |
} | |
curCol = A; | |
rewindMarker = true; | |
} | |
eastingValue += 100000.0; | |
} | |
return eastingValue; | |
} | |
/** | |
* Given the second letter from a two-letter MGRS 100k zone, and given the | |
* MGRS table set for the zone number, figure out the northing value that | |
* should be added to the other, secondary northing value. You have to | |
* remember that Northings are determined from the equator, and the vertical | |
* cycle of letters mean a 2000000 additional northing meters. This happens | |
* approx. every 18 degrees of latitude. This method does *NOT* count any | |
* additional northings. You have to figure out how many 2000000 meters need | |
* to be added for the zone letter of the MGRS coordinate. | |
* | |
* @private | |
* @param {char} n Second letter of the MGRS 100k zone | |
* @param {number} set The MGRS table set number, which is dependent on the | |
* UTM zone number. | |
* @return {number} The northing value for the given letter and set. | |
*/ | |
function getNorthingFromChar(n, set) { | |
if (n > 'V') { | |
throw "MGRSPoint given invalid Northing " + n; | |
} | |
// rowOrigin is the letter at the origin of the set for the | |
// column | |
var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); | |
var northingValue = 0.0; | |
var rewindMarker = false; | |
while (curRow !== n.charCodeAt(0)) { | |
curRow++; | |
if (curRow === I) { | |
curRow++; | |
} | |
if (curRow === O) { | |
curRow++; | |
} | |
// fixing a bug making whole application hang in this loop | |
// when 'n' is a wrong character | |
if (curRow > V) { | |
if (rewindMarker) { | |
// making sure that this loop ends | |
throw "Bad character: " + n; | |
} | |
curRow = A; | |
rewindMarker = true; | |
} | |
northingValue += 100000.0; | |
} | |
return northingValue; | |
} | |
/** | |
* The function getMinNorthing returns the minimum northing value of a MGRS | |
* zone. | |
* | |
* Ported from Geotrans' c Lattitude_Band_Value structure table. | |
* | |
* @private | |
* @param {char} zoneLetter The MGRS zone to get the min northing for. | |
* @return {number} | |
*/ | |
function getMinNorthing(zoneLetter) { | |
var northing; | |
switch (zoneLetter) { | |
case 'C': | |
northing = 1100000.0; | |
break; | |
case 'D': | |
northing = 2000000.0; | |
break; | |
case 'E': | |
northing = 2800000.0; | |
break; | |
case 'F': | |
northing = 3700000.0; | |
break; | |
case 'G': | |
northing = 4600000.0; | |
break; | |
case 'H': | |
northing = 5500000.0; | |
break; | |
case 'J': | |
northing = 6400000.0; | |
break; | |
case 'K': | |
northing = 7300000.0; | |
break; | |
case 'L': | |
northing = 8200000.0; | |
break; | |
case 'M': | |
northing = 9100000.0; | |
break; | |
case 'N': | |
northing = 0.0; | |
break; | |
case 'P': | |
northing = 800000.0; | |
break; | |
case 'Q': | |
northing = 1700000.0; | |
break; | |
case 'R': | |
northing = 2600000.0; | |
break; | |
case 'S': | |
northing = 3500000.0; | |
break; | |
case 'T': | |
northing = 4400000.0; | |
break; | |
case 'U': | |
northing = 5300000.0; | |
break; | |
case 'V': | |
northing = 6200000.0; | |
break; | |
case 'W': | |
northing = 7000000.0; | |
break; | |
case 'X': | |
northing = 7900000.0; | |
break; | |
default: | |
northing = -1.0; | |
} | |
if (northing >= 0.0) { | |
return northing; | |
} else { | |
throw "Invalid zone letter: " + zoneLetter; | |
} | |
} | |
function Point(x, y, z) { | |
if (!(this instanceof Point)) { | |
return new Point(x, y, z); | |
} | |
if (Array.isArray(x)) { | |
this.x = x[0]; | |
this.y = x[1]; | |
this.z = x[2] || 0.0; | |
} else if ((typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object') { | |
this.x = x.x; | |
this.y = x.y; | |
this.z = x.z || 0.0; | |
} else if (typeof x === 'string' && typeof y === 'undefined') { | |
var coords = x.split(','); | |
this.x = parseFloat(coords[0], 10); | |
this.y = parseFloat(coords[1], 10); | |
this.z = parseFloat(coords[2], 10) || 0.0; | |
} else { | |
this.x = x; | |
this.y = y; | |
this.z = z || 0.0; | |
} | |
console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); | |
} | |
Point.fromMGRS = function (mgrsStr) { | |
return new Point(toPoint$1(mgrsStr)); | |
}; | |
Point.prototype.toMGRS = function (accuracy) { | |
return forward$1([this.x, this.y], accuracy); | |
}; | |
var version = "2.4.4"; | |
var C00 = 1; | |
var C02 = 0.25; | |
var C04 = 0.046875; | |
var C06 = 0.01953125; | |
var C08 = 0.01068115234375; | |
var C22 = 0.75; | |
var C44 = 0.46875; | |
var C46 = 0.01302083333333333333; | |
var C48 = 0.00712076822916666666; | |
var C66 = 0.36458333333333333333; | |
var C68 = 0.00569661458333333333; | |
var C88 = 0.3076171875; | |
function pj_enfn (es) { | |
var en = []; | |
en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); | |
en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); | |
var t = es * es; | |
en[2] = t * (C44 - es * (C46 + es * C48)); | |
t *= es; | |
en[3] = t * (C66 - es * C68); | |
en[4] = t * es * C88; | |
return en; | |
} | |
function pj_mlfn (phi, sphi, cphi, en) { | |
cphi *= sphi; | |
sphi *= sphi; | |
return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))); | |
} | |
var MAX_ITER = 20; | |
function pj_inv_mlfn (arg, es, en) { | |
var k = 1 / (1 - es); | |
var phi = arg; | |
for (var i = MAX_ITER; i; --i) { | |
/* rarely goes over 2 iterations */ | |
var s = Math.sin(phi); | |
var t = 1 - es * s * s; | |
//t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; | |
//phi -= t * (t * Math.sqrt(t)) * k; | |
t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; | |
phi -= t; | |
if (Math.abs(t) < EPSLN) { | |
return phi; | |
} | |
} | |
//..reportError("cass:pj_inv_mlfn: Convergence error"); | |
return phi; | |
} | |
// Heavily based on this tmerc projection implementation | |
function init$2() { | |
this.x0 = this.x0 !== undefined ? this.x0 : 0; | |
this.y0 = this.y0 !== undefined ? this.y0 : 0; | |
this.long0 = this.long0 !== undefined ? this.long0 : 0; | |
this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; | |
if (this.es) { | |
this.en = pj_enfn(this.es); | |
this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); | |
} | |
} | |
/** | |
Transverse Mercator Forward - long/lat to x/y | |
long/lat in radians | |
*/ | |
function forward$2(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var delta_lon = adjust_lon(lon - this.long0); | |
var con; | |
var x, y; | |
var sin_phi = Math.sin(lat); | |
var cos_phi = Math.cos(lat); | |
if (!this.es) { | |
var b = cos_phi * Math.sin(delta_lon); | |
if (Math.abs(Math.abs(b) - 1) < EPSLN) { | |
return 93; | |
} else { | |
x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0; | |
y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2)); | |
b = Math.abs(y); | |
if (b >= 1) { | |
if (b - 1 > EPSLN) { | |
return 93; | |
} else { | |
y = 0; | |
} | |
} else { | |
y = Math.acos(y); | |
} | |
if (lat < 0) { | |
y = -y; | |
} | |
y = this.a * this.k0 * (y - this.lat0) + this.y0; | |
} | |
} else { | |
var al = cos_phi * delta_lon; | |
var als = Math.pow(al, 2); | |
var c = this.ep2 * Math.pow(cos_phi, 2); | |
var cs = Math.pow(c, 2); | |
var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0; | |
var t = Math.pow(tq, 2); | |
var ts = Math.pow(t, 2); | |
con = 1 - this.es * Math.pow(sin_phi, 2); | |
al = al / Math.sqrt(con); | |
var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en); | |
x = this.a * (this.k0 * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c + als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) + this.x0; | |
y = this.a * (this.k0 * (ml - this.ml0 + sin_phi * delta_lon * al / 2 * (1 + als / 12 * (5 - t + 9 * c + 4 * cs + als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c + als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) + this.y0; | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
/** | |
Transverse Mercator Inverse - x/y to long/lat | |
*/ | |
function inverse$2(p) { | |
var con, phi; | |
var lat, lon; | |
var x = (p.x - this.x0) * (1 / this.a); | |
var y = (p.y - this.y0) * (1 / this.a); | |
if (!this.es) { | |
var f = Math.exp(x / this.k0); | |
var g = 0.5 * (f - 1 / f); | |
var temp = this.lat0 + y / this.k0; | |
var h = Math.cos(temp); | |
con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2))); | |
lat = Math.asin(con); | |
if (y < 0) { | |
lat = -lat; | |
} | |
if (g === 0 && h === 0) { | |
lon = 0; | |
} else { | |
lon = adjust_lon(Math.atan2(g, h) + this.long0); | |
} | |
} else { | |
// ellipsoidal form | |
con = this.ml0 + y / this.k0; | |
phi = pj_inv_mlfn(con, this.es, this.en); | |
if (Math.abs(phi) < HALF_PI) { | |
var sin_phi = Math.sin(phi); | |
var cos_phi = Math.cos(phi); | |
var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0; | |
var c = this.ep2 * Math.pow(cos_phi, 2); | |
var cs = Math.pow(c, 2); | |
var t = Math.pow(tan_phi, 2); | |
var ts = Math.pow(t, 2); | |
con = 1 - this.es * Math.pow(sin_phi, 2); | |
var d = x * Math.sqrt(con) / this.k0; | |
var ds = Math.pow(d, 2); | |
con = con * tan_phi; | |
lat = phi - con * ds / (1 - this.es) * 0.5 * (1 - ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs - ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c - ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t)))); | |
lon = adjust_lon(this.long0 + d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c - ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi); | |
} else { | |
lat = HALF_PI * sign(y); | |
lon = 0; | |
} | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$3 = ["Transverse_Mercator", "Transverse Mercator", "tmerc"]; | |
var tmerc = { | |
init: init$2, | |
forward: forward$2, | |
inverse: inverse$2, | |
names: names$3 | |
}; | |
function sinh (x) { | |
var r = Math.exp(x); | |
r = (r - 1 / r) / 2; | |
return r; | |
} | |
function hypot (x, y) { | |
x = Math.abs(x); | |
y = Math.abs(y); | |
var a = Math.max(x, y); | |
var b = Math.min(x, y) / (a ? a : 1); | |
return a * Math.sqrt(1 + Math.pow(b, 2)); | |
} | |
function log1py (x) { | |
var y = 1 + x; | |
var z = y - 1; | |
return z === 0 ? x : x * Math.log(y) / z; | |
} | |
function asinhy (x) { | |
var y = Math.abs(x); | |
y = log1py(y * (1 + y / (hypot(1, y) + 1))); | |
return x < 0 ? -y : y; | |
} | |
function gatg (pp, B) { | |
var cos_2B = 2 * Math.cos(2 * B); | |
var i = pp.length - 1; | |
var h1 = pp[i]; | |
var h2 = 0; | |
var h; | |
while (--i >= 0) { | |
h = -h2 + cos_2B * h1 + pp[i]; | |
h2 = h1; | |
h1 = h; | |
} | |
return B + h * Math.sin(2 * B); | |
} | |
function clens (pp, arg_r) { | |
var r = 2 * Math.cos(arg_r); | |
var i = pp.length - 1; | |
var hr1 = pp[i]; | |
var hr2 = 0; | |
var hr; | |
while (--i >= 0) { | |
hr = -hr2 + r * hr1 + pp[i]; | |
hr2 = hr1; | |
hr1 = hr; | |
} | |
return Math.sin(arg_r) * hr; | |
} | |
function cosh (x) { | |
var r = Math.exp(x); | |
r = (r + 1 / r) / 2; | |
return r; | |
} | |
function clens_cmplx (pp, arg_r, arg_i) { | |
var sin_arg_r = Math.sin(arg_r); | |
var cos_arg_r = Math.cos(arg_r); | |
var sinh_arg_i = sinh(arg_i); | |
var cosh_arg_i = cosh(arg_i); | |
var r = 2 * cos_arg_r * cosh_arg_i; | |
var i = -2 * sin_arg_r * sinh_arg_i; | |
var j = pp.length - 1; | |
var hr = pp[j]; | |
var hi1 = 0; | |
var hr1 = 0; | |
var hi = 0; | |
var hr2; | |
var hi2; | |
while (--j >= 0) { | |
hr2 = hr1; | |
hi2 = hi1; | |
hr1 = hr; | |
hi1 = hi; | |
hr = -hr2 + r * hr1 - i * hi1 + pp[j]; | |
hi = -hi2 + i * hr1 + r * hi1; | |
} | |
r = sin_arg_r * cosh_arg_i; | |
i = cos_arg_r * sinh_arg_i; | |
return [r * hr - i * hi, r * hi + i * hr]; | |
} | |
// Heavily based on this etmerc projection implementation | |
function init$3() { | |
if (this.es === undefined || this.es <= 0) { | |
throw new Error('incorrect elliptical usage'); | |
} | |
this.x0 = this.x0 !== undefined ? this.x0 : 0; | |
this.y0 = this.y0 !== undefined ? this.y0 : 0; | |
this.long0 = this.long0 !== undefined ? this.long0 : 0; | |
this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; | |
this.cgb = []; | |
this.cbg = []; | |
this.utg = []; | |
this.gtu = []; | |
var f = this.es / (1 + Math.sqrt(1 - this.es)); | |
var n = f / (2 - f); | |
var np = n; | |
this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675)))))); | |
this.cbg[0] = n * (-2 + n * (2 / 3 + n * (4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725)))))); | |
np = np * n; | |
this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945))))); | |
this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * (-13 / 9 + n * (904 / 315 + n * (-1522 / 945))))); | |
np = np * n; | |
this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835)))); | |
this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835)))); | |
np = np * n; | |
this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175))); | |
this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * (-24832 / 14175))); | |
np = np * n; | |
this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237)); | |
this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185)); | |
np = np * n; | |
this.cgb[5] = np * (601676 / 22275); | |
this.cbg[5] = np * (444337 / 155925); | |
np = Math.pow(n, 2); | |
this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256))); | |
this.utg[0] = n * (-0.5 + n * (2 / 3 + n * (-37 / 96 + n * (1 / 360 + n * (81 / 512 + n * (-96199 / 604800)))))); | |
this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800)))))); | |
this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720))))); | |
this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360))))); | |
np = np * n; | |
this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720)))); | |
this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440)))); | |
np = np * n; | |
this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600))); | |
this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600))); | |
np = np * n; | |
this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680)); | |
this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840)); | |
np = np * n; | |
this.utg[5] = np * (-20648693 / 638668800); | |
this.gtu[5] = np * (212378941 / 319334400); | |
var Z = gatg(this.cbg, this.lat0); | |
this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z)); | |
} | |
function forward$3(p) { | |
var Ce = adjust_lon(p.x - this.long0); | |
var Cn = p.y; | |
Cn = gatg(this.cbg, Cn); | |
var sin_Cn = Math.sin(Cn); | |
var cos_Cn = Math.cos(Cn); | |
var sin_Ce = Math.sin(Ce); | |
var cos_Ce = Math.cos(Ce); | |
Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); | |
Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce)); | |
Ce = asinhy(Math.tan(Ce)); | |
var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce); | |
Cn = Cn + tmp[0]; | |
Ce = Ce + tmp[1]; | |
var x; | |
var y; | |
if (Math.abs(Ce) <= 2.623395162778) { | |
x = this.a * (this.Qn * Ce) + this.x0; | |
y = this.a * (this.Qn * Cn + this.Zb) + this.y0; | |
} else { | |
x = Infinity; | |
y = Infinity; | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$3(p) { | |
var Ce = (p.x - this.x0) * (1 / this.a); | |
var Cn = (p.y - this.y0) * (1 / this.a); | |
Cn = (Cn - this.Zb) / this.Qn; | |
Ce = Ce / this.Qn; | |
var lon; | |
var lat; | |
if (Math.abs(Ce) <= 2.623395162778) { | |
var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce); | |
Cn = Cn + tmp[0]; | |
Ce = Ce + tmp[1]; | |
Ce = Math.atan(sinh(Ce)); | |
var sin_Cn = Math.sin(Cn); | |
var cos_Cn = Math.cos(Cn); | |
var sin_Ce = Math.sin(Ce); | |
var cos_Ce = Math.cos(Ce); | |
Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn)); | |
Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); | |
lon = adjust_lon(Ce + this.long0); | |
lat = gatg(this.cgb, Cn); | |
} else { | |
lon = Infinity; | |
lat = Infinity; | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$4 = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc"]; | |
var etmerc = { | |
init: init$3, | |
forward: forward$3, | |
inverse: inverse$3, | |
names: names$4 | |
}; | |
function adjust_zone (zone, lon) { | |
if (zone === undefined) { | |
zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1; | |
if (zone < 0) { | |
return 0; | |
} else if (zone > 60) { | |
return 60; | |
} | |
} | |
return zone; | |
} | |
var dependsOn = 'etmerc'; | |
function init$4() { | |
var zone = adjust_zone(this.zone, this.long0); | |
if (zone === undefined) { | |
throw new Error('unknown utm zone'); | |
} | |
this.lat0 = 0; | |
this.long0 = (6 * Math.abs(zone) - 183) * D2R; | |
this.x0 = 500000; | |
this.y0 = this.utmSouth ? 10000000 : 0; | |
this.k0 = 0.9996; | |
etmerc.init.apply(this); | |
this.forward = etmerc.forward; | |
this.inverse = etmerc.inverse; | |
} | |
var names$5 = ["Universal Transverse Mercator System", "utm"]; | |
var utm = { | |
init: init$4, | |
names: names$5, | |
dependsOn: dependsOn | |
}; | |
function srat (esinp, exp) { | |
return Math.pow((1 - esinp) / (1 + esinp), exp); | |
} | |
var MAX_ITER$1 = 20; | |
function init$5() { | |
var sphi = Math.sin(this.lat0); | |
var cphi = Math.cos(this.lat0); | |
cphi *= cphi; | |
this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); | |
this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); | |
this.phic0 = Math.asin(sphi / this.C); | |
this.ratexp = 0.5 * this.C * this.e; | |
this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); | |
} | |
function forward$4(p) { | |
var lon = p.x; | |
var lat = p.y; | |
p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; | |
p.x = this.C * lon; | |
return p; | |
} | |
function inverse$4(p) { | |
var DEL_TOL = 1e-14; | |
var lon = p.x / this.C; | |
var lat = p.y; | |
var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); | |
for (var i = MAX_ITER$1; i > 0; --i) { | |
lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI; | |
if (Math.abs(lat - p.y) < DEL_TOL) { | |
break; | |
} | |
p.y = lat; | |
} | |
/* convergence failed */ | |
if (!i) { | |
return null; | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$6 = ["gauss"]; | |
var gauss = { | |
init: init$5, | |
forward: forward$4, | |
inverse: inverse$4, | |
names: names$6 | |
}; | |
function init$6() { | |
gauss.init.apply(this); | |
if (!this.rc) { | |
return; | |
} | |
this.sinc0 = Math.sin(this.phic0); | |
this.cosc0 = Math.cos(this.phic0); | |
this.R2 = 2 * this.rc; | |
if (!this.title) { | |
this.title = "Oblique Stereographic Alternative"; | |
} | |
} | |
function forward$5(p) { | |
var sinc, cosc, cosl, k; | |
p.x = adjust_lon(p.x - this.long0); | |
gauss.forward.apply(this, [p]); | |
sinc = Math.sin(p.y); | |
cosc = Math.cos(p.y); | |
cosl = Math.cos(p.x); | |
k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); | |
p.x = k * cosc * Math.sin(p.x); | |
p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); | |
p.x = this.a * p.x + this.x0; | |
p.y = this.a * p.y + this.y0; | |
return p; | |
} | |
function inverse$5(p) { | |
var sinc, cosc, lon, lat, rho; | |
p.x = (p.x - this.x0) / this.a; | |
p.y = (p.y - this.y0) / this.a; | |
p.x /= this.k0; | |
p.y /= this.k0; | |
if (rho = Math.sqrt(p.x * p.x + p.y * p.y)) { | |
var c = 2 * Math.atan2(rho, this.R2); | |
sinc = Math.sin(c); | |
cosc = Math.cos(c); | |
lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); | |
lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); | |
} else { | |
lat = this.phic0; | |
lon = 0; | |
} | |
p.x = lon; | |
p.y = lat; | |
gauss.inverse.apply(this, [p]); | |
p.x = adjust_lon(p.x + this.long0); | |
return p; | |
} | |
var names$7 = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea", "Oblique Stereographic Alternative"]; | |
var sterea = { | |
init: init$6, | |
forward: forward$5, | |
inverse: inverse$5, | |
names: names$7 | |
}; | |
function ssfn_(phit, sinphi, eccen) { | |
sinphi *= eccen; | |
return Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen); | |
} | |
function init$7() { | |
this.coslat0 = Math.cos(this.lat0); | |
this.sinlat0 = Math.sin(this.lat0); | |
if (this.sphere) { | |
if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { | |
this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); | |
} | |
} else { | |
if (Math.abs(this.coslat0) <= EPSLN) { | |
if (this.lat0 > 0) { | |
//North pole | |
//trace('stere:north pole'); | |
this.con = 1; | |
} else { | |
//South pole | |
//trace('stere:south pole'); | |
this.con = -1; | |
} | |
} | |
this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); | |
if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { | |
this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); | |
} | |
this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); | |
this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; | |
this.cosX0 = Math.cos(this.X0); | |
this.sinX0 = Math.sin(this.X0); | |
} | |
} | |
// Stereographic forward equations--mapping lat,long to x,y | |
function forward$6(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var sinlat = Math.sin(lat); | |
var coslat = Math.cos(lat); | |
var A, X, sinX, cosX, ts, rh; | |
var dlon = adjust_lon(lon - this.long0); | |
if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { | |
//case of the origine point | |
//trace('stere:this is the origin point'); | |
p.x = NaN; | |
p.y = NaN; | |
return p; | |
} | |
if (this.sphere) { | |
//trace('stere:sphere case'); | |
A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); | |
p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; | |
p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; | |
return p; | |
} else { | |
X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; | |
cosX = Math.cos(X); | |
sinX = Math.sin(X); | |
if (Math.abs(this.coslat0) <= EPSLN) { | |
ts = tsfnz(this.e, lat * this.con, this.con * sinlat); | |
rh = 2 * this.a * this.k0 * ts / this.cons; | |
p.x = this.x0 + rh * Math.sin(lon - this.long0); | |
p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); | |
//trace(p.toString()); | |
return p; | |
} else if (Math.abs(this.sinlat0) < EPSLN) { | |
//Eq | |
//trace('stere:equateur'); | |
A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); | |
p.y = A * sinX; | |
} else { | |
//other case | |
//trace('stere:normal case'); | |
A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); | |
p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; | |
} | |
p.x = A * cosX * Math.sin(dlon) + this.x0; | |
} | |
//trace(p.toString()); | |
return p; | |
} | |
//* Stereographic inverse equations--mapping x,y to lat/long | |
function inverse$6(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var lon, lat, ts, ce, Chi; | |
var rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
if (this.sphere) { | |
var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0)); | |
lon = this.long0; | |
lat = this.lat0; | |
if (rh <= EPSLN) { | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); | |
if (Math.abs(this.coslat0) < EPSLN) { | |
if (this.lat0 > 0) { | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); | |
} else { | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); | |
} | |
} else { | |
lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} else { | |
if (Math.abs(this.coslat0) <= EPSLN) { | |
if (rh <= EPSLN) { | |
lat = this.lat0; | |
lon = this.long0; | |
p.x = lon; | |
p.y = lat; | |
//trace(p.toString()); | |
return p; | |
} | |
p.x *= this.con; | |
p.y *= this.con; | |
ts = rh * this.cons / (2 * this.a * this.k0); | |
lat = this.con * phi2z(this.e, ts); | |
lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y)); | |
} else { | |
ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); | |
lon = this.long0; | |
if (rh <= EPSLN) { | |
Chi = this.X0; | |
} else { | |
Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); | |
lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); | |
} | |
lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); | |
} | |
} | |
p.x = lon; | |
p.y = lat; | |
//trace(p.toString()); | |
return p; | |
} | |
var names$8 = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"]; | |
var stere = { | |
init: init$7, | |
forward: forward$6, | |
inverse: inverse$6, | |
names: names$8, | |
ssfn_: ssfn_ | |
}; | |
/* | |
references: | |
Formules et constantes pour le Calcul pour la | |
projection cylindrique conforme à axe oblique et pour la transformation entre | |
des systèmes de référence. | |
http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf | |
*/ | |
function init$8() { | |
var phy0 = this.lat0; | |
this.lambda0 = this.long0; | |
var sinPhy0 = Math.sin(phy0); | |
var semiMajorAxis = this.a; | |
var invF = this.rf; | |
var flattening = 1 / invF; | |
var e2 = 2 * flattening - Math.pow(flattening, 2); | |
var e = this.e = Math.sqrt(e2); | |
this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); | |
this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); | |
this.b0 = Math.asin(sinPhy0 / this.alpha); | |
var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); | |
var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); | |
var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); | |
this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; | |
} | |
function forward$7(p) { | |
var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); | |
var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); | |
var S = -this.alpha * (Sa1 + Sa2) + this.K; | |
// spheric latitude | |
var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); | |
// spheric longitude | |
var I = this.alpha * (p.x - this.lambda0); | |
// psoeudo equatorial rotation | |
var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); | |
var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); | |
p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; | |
p.x = this.R * rotI + this.x0; | |
return p; | |
} | |
function inverse$7(p) { | |
var Y = p.x - this.x0; | |
var X = p.y - this.y0; | |
var rotI = Y / this.R; | |
var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); | |
var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); | |
var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); | |
var lambda = this.lambda0 + I / this.alpha; | |
var S = 0; | |
var phy = b; | |
var prevPhy = -1000; | |
var iteration = 0; | |
while (Math.abs(phy - prevPhy) > 0.0000001) { | |
if (++iteration > 20) { | |
//...reportError("omercFwdInfinity"); | |
return; | |
} | |
//S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); | |
S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); | |
prevPhy = phy; | |
phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; | |
} | |
p.x = lambda; | |
p.y = phy; | |
return p; | |
} | |
var names$9 = ["somerc"]; | |
var somerc = { | |
init: init$8, | |
forward: forward$7, | |
inverse: inverse$7, | |
names: names$9 | |
}; | |
/* Initialize the Oblique Mercator projection | |
------------------------------------------*/ | |
function init$9() { | |
this.no_off = this.no_off || false; | |
this.no_rot = this.no_rot || false; | |
if (isNaN(this.k0)) { | |
this.k0 = 1; | |
} | |
var sinlat = Math.sin(this.lat0); | |
var coslat = Math.cos(this.lat0); | |
var con = this.e * sinlat; | |
this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4)); | |
this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con); | |
var t0 = tsfnz(this.e, this.lat0, sinlat); | |
var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con)); | |
if (dl * dl < 1) { | |
dl = 1; | |
} | |
var fl; | |
var gl; | |
if (!isNaN(this.longc)) { | |
//Central point and azimuth method | |
if (this.lat0 >= 0) { | |
fl = dl + Math.sqrt(dl * dl - 1); | |
} else { | |
fl = dl - Math.sqrt(dl * dl - 1); | |
} | |
this.el = fl * Math.pow(t0, this.bl); | |
gl = 0.5 * (fl - 1 / fl); | |
this.gamma0 = Math.asin(Math.sin(this.alpha) / dl); | |
this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl; | |
} else { | |
//2 points method | |
var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1)); | |
var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2)); | |
if (this.lat0 >= 0) { | |
this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); | |
} else { | |
this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); | |
} | |
var hl = Math.pow(t1, this.bl); | |
var ll = Math.pow(t2, this.bl); | |
fl = this.el / hl; | |
gl = 0.5 * (fl - 1 / fl); | |
var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl); | |
var pl = (ll - hl) / (ll + hl); | |
var dlon12 = adjust_lon(this.long1 - this.long2); | |
this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * dlon12) / pl) / this.bl; | |
this.long0 = adjust_lon(this.long0); | |
var dlon10 = adjust_lon(this.long1 - this.long0); | |
this.gamma0 = Math.atan(Math.sin(this.bl * dlon10) / gl); | |
this.alpha = Math.asin(dl * Math.sin(this.gamma0)); | |
} | |
if (this.no_off) { | |
this.uc = 0; | |
} else { | |
if (this.lat0 >= 0) { | |
this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); | |
} else { | |
this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); | |
} | |
} | |
} | |
/* Oblique Mercator forward equations--mapping lat,long to x,y | |
----------------------------------------------------------*/ | |
function forward$8(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var dlon = adjust_lon(lon - this.long0); | |
var us, vs; | |
var con; | |
if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { | |
if (lat > 0) { | |
con = -1; | |
} else { | |
con = 1; | |
} | |
vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5)); | |
us = -1 * con * HALF_PI * this.al / this.bl; | |
} else { | |
var t = tsfnz(this.e, lat, Math.sin(lat)); | |
var ql = this.el / Math.pow(t, this.bl); | |
var sl = 0.5 * (ql - 1 / ql); | |
var tl = 0.5 * (ql + 1 / ql); | |
var vl = Math.sin(this.bl * dlon); | |
var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl; | |
if (Math.abs(Math.abs(ul) - 1) <= EPSLN) { | |
vs = Number.POSITIVE_INFINITY; | |
} else { | |
vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl; | |
} | |
if (Math.abs(Math.cos(this.bl * dlon)) <= EPSLN) { | |
us = this.al * this.bl * dlon; | |
} else { | |
us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl; | |
} | |
} | |
if (this.no_rot) { | |
p.x = this.x0 + us; | |
p.y = this.y0 + vs; | |
} else { | |
us -= this.uc; | |
p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha); | |
p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha); | |
} | |
return p; | |
} | |
function inverse$8(p) { | |
var us, vs; | |
if (this.no_rot) { | |
vs = p.y - this.y0; | |
us = p.x - this.x0; | |
} else { | |
vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha); | |
us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha); | |
us += this.uc; | |
} | |
var qp = Math.exp(-1 * this.bl * vs / this.al); | |
var sp = 0.5 * (qp - 1 / qp); | |
var tp = 0.5 * (qp + 1 / qp); | |
var vp = Math.sin(this.bl * us / this.al); | |
var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp; | |
var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl); | |
if (Math.abs(up - 1) < EPSLN) { | |
p.x = this.long0; | |
p.y = HALF_PI; | |
} else if (Math.abs(up + 1) < EPSLN) { | |
p.x = this.long0; | |
p.y = -1 * HALF_PI; | |
} else { | |
p.y = phi2z(this.e, ts); | |
p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl); | |
} | |
return p; | |
} | |
var names$10 = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "omerc"]; | |
var omerc = { | |
init: init$9, | |
forward: forward$8, | |
inverse: inverse$8, | |
names: names$10 | |
}; | |
function init$10() { | |
// array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north | |
//double c_lat; /* center latitude */ | |
//double c_lon; /* center longitude */ | |
//double lat1; /* first standard parallel */ | |
//double lat2; /* second standard parallel */ | |
//double r_maj; /* major axis */ | |
//double r_min; /* minor axis */ | |
//double false_east; /* x offset in meters */ | |
//double false_north; /* y offset in meters */ | |
if (!this.lat2) { | |
this.lat2 = this.lat1; | |
} //if lat2 is not defined | |
if (!this.k0) { | |
this.k0 = 1; | |
} | |
this.x0 = this.x0 || 0; | |
this.y0 = this.y0 || 0; | |
// Standard Parallels cannot be equal and on opposite sides of the equator | |
if (Math.abs(this.lat1 + this.lat2) < EPSLN) { | |
return; | |
} | |
var temp = this.b / this.a; | |
this.e = Math.sqrt(1 - temp * temp); | |
var sin1 = Math.sin(this.lat1); | |
var cos1 = Math.cos(this.lat1); | |
var ms1 = msfnz(this.e, sin1, cos1); | |
var ts1 = tsfnz(this.e, this.lat1, sin1); | |
var sin2 = Math.sin(this.lat2); | |
var cos2 = Math.cos(this.lat2); | |
var ms2 = msfnz(this.e, sin2, cos2); | |
var ts2 = tsfnz(this.e, this.lat2, sin2); | |
var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); | |
if (Math.abs(this.lat1 - this.lat2) > EPSLN) { | |
this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); | |
} else { | |
this.ns = sin1; | |
} | |
if (isNaN(this.ns)) { | |
this.ns = sin1; | |
} | |
this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); | |
this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); | |
if (!this.title) { | |
this.title = "Lambert Conformal Conic"; | |
} | |
} | |
// Lambert Conformal conic forward equations--mapping lat,long to x,y | |
// ----------------------------------------------------------------- | |
function forward$9(p) { | |
var lon = p.x; | |
var lat = p.y; | |
// singular cases : | |
if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { | |
lat = sign(lat) * (HALF_PI - 2 * EPSLN); | |
} | |
var con = Math.abs(Math.abs(lat) - HALF_PI); | |
var ts, rh1; | |
if (con > EPSLN) { | |
ts = tsfnz(this.e, lat, Math.sin(lat)); | |
rh1 = this.a * this.f0 * Math.pow(ts, this.ns); | |
} else { | |
con = lat * this.ns; | |
if (con <= 0) { | |
return null; | |
} | |
rh1 = 0; | |
} | |
var theta = this.ns * adjust_lon(lon - this.long0); | |
p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; | |
p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; | |
return p; | |
} | |
// Lambert Conformal Conic inverse equations--mapping x,y to lat/long | |
// ----------------------------------------------------------------- | |
function inverse$9(p) { | |
var rh1, con, ts; | |
var lat, lon; | |
var x = (p.x - this.x0) / this.k0; | |
var y = this.rh - (p.y - this.y0) / this.k0; | |
if (this.ns > 0) { | |
rh1 = Math.sqrt(x * x + y * y); | |
con = 1; | |
} else { | |
rh1 = -Math.sqrt(x * x + y * y); | |
con = -1; | |
} | |
var theta = 0; | |
if (rh1 !== 0) { | |
theta = Math.atan2(con * x, con * y); | |
} | |
if (rh1 !== 0 || this.ns > 0) { | |
con = 1 / this.ns; | |
ts = Math.pow(rh1 / (this.a * this.f0), con); | |
lat = phi2z(this.e, ts); | |
if (lat === -9999) { | |
return null; | |
} | |
} else { | |
lat = -HALF_PI; | |
} | |
lon = adjust_lon(theta / this.ns + this.long0); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$11 = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_2SP", "lcc"]; | |
var lcc = { | |
init: init$10, | |
forward: forward$9, | |
inverse: inverse$9, | |
names: names$11 | |
}; | |
function init$11() { | |
this.a = 6377397.155; | |
this.es = 0.006674372230614; | |
this.e = Math.sqrt(this.es); | |
if (!this.lat0) { | |
this.lat0 = 0.863937979737193; | |
} | |
if (!this.long0) { | |
this.long0 = 0.7417649320975901 - 0.308341501185665; | |
} | |
/* if scale not set default to 0.9999 */ | |
if (!this.k0) { | |
this.k0 = 0.9999; | |
} | |
this.s45 = 0.785398163397448; /* 45 */ | |
this.s90 = 2 * this.s45; | |
this.fi0 = this.lat0; | |
this.e2 = this.es; | |
this.e = Math.sqrt(this.e2); | |
this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2)); | |
this.uq = 1.04216856380474; | |
this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa); | |
this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2); | |
this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g; | |
this.k1 = this.k0; | |
this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)); | |
this.s0 = 1.37008346281555; | |
this.n = Math.sin(this.s0); | |
this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); | |
this.ad = this.s90 - this.uq; | |
} | |
/* ellipsoid */ | |
/* calculate xy from lat/lon */ | |
/* Constants, identical to inverse transform function */ | |
function forward$10(p) { | |
var gfi, u, deltav, s, d, eps, ro; | |
var lon = p.x; | |
var lat = p.y; | |
var delta_lon = adjust_lon(lon - this.long0); | |
/* Transformation */ | |
gfi = Math.pow((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat)), this.alfa * this.e / 2); | |
u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); | |
deltav = -delta_lon * this.alfa; | |
s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); | |
d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); | |
eps = this.n * d; | |
ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); | |
p.y = ro * Math.cos(eps) / 1; | |
p.x = ro * Math.sin(eps) / 1; | |
if (!this.czech) { | |
p.y *= -1; | |
p.x *= -1; | |
} | |
return p; | |
} | |
/* calculate lat/lon from xy */ | |
function inverse$10(p) { | |
var u, deltav, s, d, eps, ro, fi1; | |
var ok; | |
/* Transformation */ | |
/* revert y, x*/ | |
var tmp = p.x; | |
p.x = p.y; | |
p.y = tmp; | |
if (!this.czech) { | |
p.y *= -1; | |
p.x *= -1; | |
} | |
ro = Math.sqrt(p.x * p.x + p.y * p.y); | |
eps = Math.atan2(p.y, p.x); | |
d = eps / Math.sin(this.s0); | |
s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); | |
u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); | |
deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); | |
p.x = this.long0 - deltav / this.alfa; | |
fi1 = u; | |
ok = 0; | |
var iter = 0; | |
do { | |
p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); | |
if (Math.abs(fi1 - p.y) < 0.0000000001) { | |
ok = 1; | |
} | |
fi1 = p.y; | |
iter += 1; | |
} while (ok === 0 && iter < 15); | |
if (iter >= 15) { | |
return null; | |
} | |
return p; | |
} | |
var names$12 = ["Krovak", "krovak"]; | |
var krovak = { | |
init: init$11, | |
forward: forward$10, | |
inverse: inverse$10, | |
names: names$12 | |
}; | |
function mlfn (e0, e1, e2, e3, phi) { | |
return e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi); | |
} | |
function e0fn (x) { | |
return 1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)); | |
} | |
function e1fn (x) { | |
return 0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)); | |
} | |
function e2fn (x) { | |
return 0.05859375 * x * x * (1 + 0.75 * x); | |
} | |
function e3fn (x) { | |
return x * x * x * (35 / 3072); | |
} | |
function gN (a, e, sinphi) { | |
var temp = e * sinphi; | |
return a / Math.sqrt(1 - temp * temp); | |
} | |
function adjust_lat (x) { | |
return Math.abs(x) < HALF_PI ? x : x - sign(x) * Math.PI; | |
} | |
function imlfn (ml, e0, e1, e2, e3) { | |
var phi; | |
var dphi; | |
phi = ml / e0; | |
for (var i = 0; i < 15; i++) { | |
dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); | |
phi += dphi; | |
if (Math.abs(dphi) <= 0.0000000001) { | |
return phi; | |
} | |
} | |
//..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); | |
return NaN; | |
} | |
function init$12() { | |
if (!this.sphere) { | |
this.e0 = e0fn(this.es); | |
this.e1 = e1fn(this.es); | |
this.e2 = e2fn(this.es); | |
this.e3 = e3fn(this.es); | |
this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); | |
} | |
} | |
/* Cassini forward equations--mapping lat,long to x,y | |
-----------------------------------------------------------------------*/ | |
function forward$11(p) { | |
/* Forward equations | |
-----------------*/ | |
var x, y; | |
var lam = p.x; | |
var phi = p.y; | |
lam = adjust_lon(lam - this.long0); | |
if (this.sphere) { | |
x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); | |
y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); | |
} else { | |
//ellipsoid | |
var sinphi = Math.sin(phi); | |
var cosphi = Math.cos(phi); | |
var nl = gN(this.a, this.e, sinphi); | |
var tl = Math.tan(phi) * Math.tan(phi); | |
var al = lam * Math.cos(phi); | |
var asq = al * al; | |
var cl = this.es * cosphi * cosphi / (1 - this.es); | |
var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); | |
x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); | |
y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); | |
} | |
p.x = x + this.x0; | |
p.y = y + this.y0; | |
return p; | |
} | |
/* Inverse equations | |
-----------------*/ | |
function inverse$11(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var x = p.x / this.a; | |
var y = p.y / this.a; | |
var phi, lam; | |
if (this.sphere) { | |
var dd = y + this.lat0; | |
phi = Math.asin(Math.sin(dd) * Math.cos(x)); | |
lam = Math.atan2(Math.tan(x), Math.cos(dd)); | |
} else { | |
/* ellipsoid */ | |
var ml1 = this.ml0 / this.a + y; | |
var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); | |
if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { | |
p.x = this.long0; | |
p.y = HALF_PI; | |
if (y < 0) { | |
p.y *= -1; | |
} | |
return p; | |
} | |
var nl1 = gN(this.a, this.e, Math.sin(phi1)); | |
var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); | |
var tl1 = Math.pow(Math.tan(phi1), 2); | |
var dl = x * this.a / nl1; | |
var dsq = dl * dl; | |
phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); | |
lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); | |
} | |
p.x = adjust_lon(lam + this.long0); | |
p.y = adjust_lat(phi); | |
return p; | |
} | |
var names$13 = ["Cassini", "Cassini_Soldner", "cass"]; | |
var cass = { | |
init: init$12, | |
forward: forward$11, | |
inverse: inverse$11, | |
names: names$13 | |
}; | |
function qsfnz (eccent, sinphi) { | |
var con; | |
if (eccent > 1.0e-7) { | |
con = eccent * sinphi; | |
return (1 - eccent * eccent) * (sinphi / (1 - con * con) - 0.5 / eccent * Math.log((1 - con) / (1 + con))); | |
} else { | |
return 2 * sinphi; | |
} | |
} | |
/* | |
reference | |
"New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, | |
The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. | |
*/ | |
var S_POLE = 1; | |
var N_POLE = 2; | |
var EQUIT = 3; | |
var OBLIQ = 4; | |
/* Initialize the Lambert Azimuthal Equal Area projection | |
------------------------------------------------------*/ | |
function init$13() { | |
var t = Math.abs(this.lat0); | |
if (Math.abs(t - HALF_PI) < EPSLN) { | |
this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; | |
} else if (Math.abs(t) < EPSLN) { | |
this.mode = this.EQUIT; | |
} else { | |
this.mode = this.OBLIQ; | |
} | |
if (this.es > 0) { | |
var sinphi; | |
this.qp = qsfnz(this.e, 1); | |
this.mmf = 0.5 / (1 - this.es); | |
this.apa = authset(this.es); | |
switch (this.mode) { | |
case this.N_POLE: | |
this.dd = 1; | |
break; | |
case this.S_POLE: | |
this.dd = 1; | |
break; | |
case this.EQUIT: | |
this.rq = Math.sqrt(0.5 * this.qp); | |
this.dd = 1 / this.rq; | |
this.xmf = 1; | |
this.ymf = 0.5 * this.qp; | |
break; | |
case this.OBLIQ: | |
this.rq = Math.sqrt(0.5 * this.qp); | |
sinphi = Math.sin(this.lat0); | |
this.sinb1 = qsfnz(this.e, sinphi) / this.qp; | |
this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); | |
this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); | |
this.ymf = (this.xmf = this.rq) / this.dd; | |
this.xmf *= this.dd; | |
break; | |
} | |
} else { | |
if (this.mode === this.OBLIQ) { | |
this.sinph0 = Math.sin(this.lat0); | |
this.cosph0 = Math.cos(this.lat0); | |
} | |
} | |
} | |
/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y | |
-----------------------------------------------------------------------*/ | |
function forward$12(p) { | |
/* Forward equations | |
-----------------*/ | |
var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; | |
var lam = p.x; | |
var phi = p.y; | |
lam = adjust_lon(lam - this.long0); | |
if (this.sphere) { | |
sinphi = Math.sin(phi); | |
cosphi = Math.cos(phi); | |
coslam = Math.cos(lam); | |
if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { | |
y = this.mode === this.EQUIT ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; | |
if (y <= EPSLN) { | |
return null; | |
} | |
y = Math.sqrt(2 / y); | |
x = y * cosphi * Math.sin(lam); | |
y *= this.mode === this.EQUIT ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; | |
} else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { | |
if (this.mode === this.N_POLE) { | |
coslam = -coslam; | |
} | |
if (Math.abs(phi + this.phi0) < EPSLN) { | |
return null; | |
} | |
y = FORTPI - phi * 0.5; | |
y = 2 * (this.mode === this.S_POLE ? Math.cos(y) : Math.sin(y)); | |
x = y * Math.sin(lam); | |
y *= coslam; | |
} | |
} else { | |
sinb = 0; | |
cosb = 0; | |
b = 0; | |
coslam = Math.cos(lam); | |
sinlam = Math.sin(lam); | |
sinphi = Math.sin(phi); | |
q = qsfnz(this.e, sinphi); | |
if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { | |
sinb = q / this.qp; | |
cosb = Math.sqrt(1 - sinb * sinb); | |
} | |
switch (this.mode) { | |
case this.OBLIQ: | |
b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; | |
break; | |
case this.EQUIT: | |
b = 1 + cosb * coslam; | |
break; | |
case this.N_POLE: | |
b = HALF_PI + phi; | |
q = this.qp - q; | |
break; | |
case this.S_POLE: | |
b = phi - HALF_PI; | |
q = this.qp + q; | |
break; | |
} | |
if (Math.abs(b) < EPSLN) { | |
return null; | |
} | |
switch (this.mode) { | |
case this.OBLIQ: | |
case this.EQUIT: | |
b = Math.sqrt(2 / b); | |
if (this.mode === this.OBLIQ) { | |
y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); | |
} else { | |
y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; | |
} | |
x = this.xmf * b * cosb * sinlam; | |
break; | |
case this.N_POLE: | |
case this.S_POLE: | |
if (q >= 0) { | |
x = (b = Math.sqrt(q)) * sinlam; | |
y = coslam * (this.mode === this.S_POLE ? b : -b); | |
} else { | |
x = y = 0; | |
} | |
break; | |
} | |
} | |
p.x = this.a * x + this.x0; | |
p.y = this.a * y + this.y0; | |
return p; | |
} | |
/* Inverse equations | |
-----------------*/ | |
function inverse$12(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var x = p.x / this.a; | |
var y = p.y / this.a; | |
var lam, phi, cCe, sCe, q, rho, ab; | |
if (this.sphere) { | |
var cosz = 0, | |
rh, | |
sinz = 0; | |
rh = Math.sqrt(x * x + y * y); | |
phi = rh * 0.5; | |
if (phi > 1) { | |
return null; | |
} | |
phi = 2 * Math.asin(phi); | |
if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { | |
sinz = Math.sin(phi); | |
cosz = Math.cos(phi); | |
} | |
switch (this.mode) { | |
case this.EQUIT: | |
phi = Math.abs(rh) <= EPSLN ? 0 : Math.asin(y * sinz / rh); | |
x *= sinz; | |
y = cosz * rh; | |
break; | |
case this.OBLIQ: | |
phi = Math.abs(rh) <= EPSLN ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); | |
x *= sinz * this.cosph0; | |
y = (cosz - Math.sin(phi) * this.sinph0) * rh; | |
break; | |
case this.N_POLE: | |
y = -y; | |
phi = HALF_PI - phi; | |
break; | |
case this.S_POLE: | |
phi -= HALF_PI; | |
break; | |
} | |
lam = y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(x, y); | |
} else { | |
ab = 0; | |
if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { | |
x /= this.dd; | |
y *= this.dd; | |
rho = Math.sqrt(x * x + y * y); | |
if (rho < EPSLN) { | |
p.x = 0; | |
p.y = this.phi0; | |
return p; | |
} | |
sCe = 2 * Math.asin(0.5 * rho / this.rq); | |
cCe = Math.cos(sCe); | |
x *= sCe = Math.sin(sCe); | |
if (this.mode === this.OBLIQ) { | |
ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; | |
q = this.qp * ab; | |
y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; | |
} else { | |
ab = y * sCe / rho; | |
q = this.qp * ab; | |
y = rho * cCe; | |
} | |
} else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { | |
if (this.mode === this.N_POLE) { | |
y = -y; | |
} | |
q = x * x + y * y; | |
if (!q) { | |
p.x = 0; | |
p.y = this.phi0; | |
return p; | |
} | |
ab = 1 - q / this.qp; | |
if (this.mode === this.S_POLE) { | |
ab = -ab; | |
} | |
} | |
lam = Math.atan2(x, y); | |
phi = authlat(Math.asin(ab), this.apa); | |
} | |
p.x = adjust_lon(this.long0 + lam); | |
p.y = phi; | |
return p; | |
} | |
/* determine latitude from authalic latitude */ | |
var P00 = 0.33333333333333333333; | |
var P01 = 0.17222222222222222222; | |
var P02 = 0.10257936507936507936; | |
var P10 = 0.06388888888888888888; | |
var P11 = 0.06640211640211640211; | |
var P20 = 0.01641501294219154443; | |
function authset(es) { | |
var t; | |
var APA = []; | |
APA[0] = es * P00; | |
t = es * es; | |
APA[0] += t * P01; | |
APA[1] = t * P10; | |
t *= es; | |
APA[0] += t * P02; | |
APA[1] += t * P11; | |
APA[2] = t * P20; | |
return APA; | |
} | |
function authlat(beta, APA) { | |
var t = beta + beta; | |
return beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t); | |
} | |
var names$14 = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; | |
var laea = { | |
init: init$13, | |
forward: forward$12, | |
inverse: inverse$12, | |
names: names$14, | |
S_POLE: S_POLE, | |
N_POLE: N_POLE, | |
EQUIT: EQUIT, | |
OBLIQ: OBLIQ | |
}; | |
function asinz (x) { | |
if (Math.abs(x) > 1) { | |
x = x > 1 ? 1 : -1; | |
} | |
return Math.asin(x); | |
} | |
function init$14() { | |
if (Math.abs(this.lat1 + this.lat2) < EPSLN) { | |
return; | |
} | |
this.temp = this.b / this.a; | |
this.es = 1 - Math.pow(this.temp, 2); | |
this.e3 = Math.sqrt(this.es); | |
this.sin_po = Math.sin(this.lat1); | |
this.cos_po = Math.cos(this.lat1); | |
this.t1 = this.sin_po; | |
this.con = this.sin_po; | |
this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po); | |
this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po); | |
this.sin_po = Math.sin(this.lat2); | |
this.cos_po = Math.cos(this.lat2); | |
this.t2 = this.sin_po; | |
this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po); | |
this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po); | |
this.sin_po = Math.sin(this.lat0); | |
this.cos_po = Math.cos(this.lat0); | |
this.t3 = this.sin_po; | |
this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po); | |
if (Math.abs(this.lat1 - this.lat2) > EPSLN) { | |
this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); | |
} else { | |
this.ns0 = this.con; | |
} | |
this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; | |
this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0; | |
} | |
/* Albers Conical Equal Area forward equations--mapping lat,long to x,y | |
-------------------------------------------------------------------*/ | |
function forward$13(p) { | |
var lon = p.x; | |
var lat = p.y; | |
this.sin_phi = Math.sin(lat); | |
this.cos_phi = Math.cos(lat); | |
var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi); | |
var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; | |
var theta = this.ns0 * adjust_lon(lon - this.long0); | |
var x = rh1 * Math.sin(theta) + this.x0; | |
var y = this.rh - rh1 * Math.cos(theta) + this.y0; | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$13(p) { | |
var rh1, qs, con, theta, lon, lat; | |
p.x -= this.x0; | |
p.y = this.rh - p.y + this.y0; | |
if (this.ns0 >= 0) { | |
rh1 = Math.sqrt(p.x * p.x + p.y * p.y); | |
con = 1; | |
} else { | |
rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); | |
con = -1; | |
} | |
theta = 0; | |
if (rh1 !== 0) { | |
theta = Math.atan2(con * p.x, con * p.y); | |
} | |
con = rh1 * this.ns0 / this.a; | |
if (this.sphere) { | |
lat = Math.asin((this.c - con * con) / (2 * this.ns0)); | |
} else { | |
qs = (this.c - con * con) / this.ns0; | |
lat = this.phi1z(this.e3, qs); | |
} | |
lon = adjust_lon(theta / this.ns0 + this.long0); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
/* Function to compute phi1, the latitude for the inverse of the | |
Albers Conical Equal-Area projection. | |
-------------------------------------------*/ | |
function phi1z(eccent, qs) { | |
var sinphi, cosphi, con, com, dphi; | |
var phi = asinz(0.5 * qs); | |
if (eccent < EPSLN) { | |
return phi; | |
} | |
var eccnts = eccent * eccent; | |
for (var i = 1; i <= 25; i++) { | |
sinphi = Math.sin(phi); | |
cosphi = Math.cos(phi); | |
con = eccent * sinphi; | |
com = 1 - con * con; | |
dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); | |
phi = phi + dphi; | |
if (Math.abs(dphi) <= 1e-7) { | |
return phi; | |
} | |
} | |
return null; | |
} | |
var names$15 = ["Albers_Conic_Equal_Area", "Albers", "aea"]; | |
var aea = { | |
init: init$14, | |
forward: forward$13, | |
inverse: inverse$13, | |
names: names$15, | |
phi1z: phi1z | |
}; | |
/* | |
reference: | |
Wolfram Mathworld "Gnomonic Projection" | |
http://mathworld.wolfram.com/GnomonicProjection.html | |
Accessed: 12th November 2009 | |
*/ | |
function init$15() { | |
/* Place parameters in static storage for common use | |
-------------------------------------------------*/ | |
this.sin_p14 = Math.sin(this.lat0); | |
this.cos_p14 = Math.cos(this.lat0); | |
// Approximation for projecting points to the horizon (infinity) | |
this.infinity_dist = 1000 * this.a; | |
this.rc = 1; | |
} | |
/* Gnomonic forward equations--mapping lat,long to x,y | |
---------------------------------------------------*/ | |
function forward$14(p) { | |
var sinphi, cosphi; /* sin and cos value */ | |
var dlon; /* delta longitude value */ | |
var coslon; /* cos of longitude */ | |
var ksp; /* scale factor */ | |
var g; | |
var x, y; | |
var lon = p.x; | |
var lat = p.y; | |
/* Forward equations | |
-----------------*/ | |
dlon = adjust_lon(lon - this.long0); | |
sinphi = Math.sin(lat); | |
cosphi = Math.cos(lat); | |
coslon = Math.cos(dlon); | |
g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; | |
ksp = 1; | |
if (g > 0 || Math.abs(g) <= EPSLN) { | |
x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; | |
y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; | |
} else { | |
// Point is in the opposing hemisphere and is unprojectable | |
// We still need to return a reasonable point, so we project | |
// to infinity, on a bearing | |
// equivalent to the northern hemisphere equivalent | |
// This is a reasonable approximation for short shapes and lines that | |
// straddle the horizon. | |
x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); | |
y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$14(p) { | |
var rh; /* Rho */ | |
var sinc, cosc; | |
var c; | |
var lon, lat; | |
/* Inverse equations | |
-----------------*/ | |
p.x = (p.x - this.x0) / this.a; | |
p.y = (p.y - this.y0) / this.a; | |
p.x /= this.k0; | |
p.y /= this.k0; | |
if (rh = Math.sqrt(p.x * p.x + p.y * p.y)) { | |
c = Math.atan2(rh, this.rc); | |
sinc = Math.sin(c); | |
cosc = Math.cos(c); | |
lat = asinz(cosc * this.sin_p14 + p.y * sinc * this.cos_p14 / rh); | |
lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); | |
lon = adjust_lon(this.long0 + lon); | |
} else { | |
lat = this.phic0; | |
lon = 0; | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$16 = ["gnom"]; | |
var gnom = { | |
init: init$15, | |
forward: forward$14, | |
inverse: inverse$14, | |
names: names$16 | |
}; | |
function iqsfnz (eccent, q) { | |
var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); | |
if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { | |
if (q < 0) { | |
return -1 * HALF_PI; | |
} else { | |
return HALF_PI; | |
} | |
} | |
//var phi = 0.5* q/(1-eccent*eccent); | |
var phi = Math.asin(0.5 * q); | |
var dphi; | |
var sin_phi; | |
var cos_phi; | |
var con; | |
for (var i = 0; i < 30; i++) { | |
sin_phi = Math.sin(phi); | |
cos_phi = Math.cos(phi); | |
con = eccent * sin_phi; | |
dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); | |
phi += dphi; | |
if (Math.abs(dphi) <= 0.0000000001) { | |
return phi; | |
} | |
} | |
//console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); | |
return NaN; | |
} | |
/* | |
reference: | |
"Cartographic Projection Procedures for the UNIX Environment- | |
A User's Manual" by Gerald I. Evenden, | |
USGS Open File Report 90-284and Release 4 Interim Reports (2003) | |
*/ | |
function init$16() { | |
//no-op | |
if (!this.sphere) { | |
this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); | |
} | |
} | |
/* Cylindrical Equal Area forward equations--mapping lat,long to x,y | |
------------------------------------------------------------*/ | |
function forward$15(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var x, y; | |
/* Forward equations | |
-----------------*/ | |
var dlon = adjust_lon(lon - this.long0); | |
if (this.sphere) { | |
x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); | |
y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); | |
} else { | |
var qs = qsfnz(this.e, Math.sin(lat)); | |
x = this.x0 + this.a * this.k0 * dlon; | |
y = this.y0 + this.a * qs * 0.5 / this.k0; | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long | |
------------------------------------------------------------*/ | |
function inverse$15(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var lon, lat; | |
if (this.sphere) { | |
lon = adjust_lon(this.long0 + p.x / this.a / Math.cos(this.lat_ts)); | |
lat = Math.asin(p.y / this.a * Math.cos(this.lat_ts)); | |
} else { | |
lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); | |
lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$17 = ["cea"]; | |
var cea = { | |
init: init$16, | |
forward: forward$15, | |
inverse: inverse$15, | |
names: names$17 | |
}; | |
function init$17() { | |
this.x0 = this.x0 || 0; | |
this.y0 = this.y0 || 0; | |
this.lat0 = this.lat0 || 0; | |
this.long0 = this.long0 || 0; | |
this.lat_ts = this.lat_ts || 0; | |
this.title = this.title || "Equidistant Cylindrical (Plate Carre)"; | |
this.rc = Math.cos(this.lat_ts); | |
} | |
// forward equations--mapping lat,long to x,y | |
// ----------------------------------------------------------------- | |
function forward$16(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var dlon = adjust_lon(lon - this.long0); | |
var dlat = adjust_lat(lat - this.lat0); | |
p.x = this.x0 + this.a * dlon * this.rc; | |
p.y = this.y0 + this.a * dlat; | |
return p; | |
} | |
// inverse equations--mapping x,y to lat/long | |
// ----------------------------------------------------------------- | |
function inverse$16(p) { | |
var x = p.x; | |
var y = p.y; | |
p.x = adjust_lon(this.long0 + (x - this.x0) / (this.a * this.rc)); | |
p.y = adjust_lat(this.lat0 + (y - this.y0) / this.a); | |
return p; | |
} | |
var names$18 = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; | |
var eqc = { | |
init: init$17, | |
forward: forward$16, | |
inverse: inverse$16, | |
names: names$18 | |
}; | |
var MAX_ITER$2 = 20; | |
function init$18() { | |
/* Place parameters in static storage for common use | |
-------------------------------------------------*/ | |
this.temp = this.b / this.a; | |
this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles | |
this.e = Math.sqrt(this.es); | |
this.e0 = e0fn(this.es); | |
this.e1 = e1fn(this.es); | |
this.e2 = e2fn(this.es); | |
this.e3 = e3fn(this.es); | |
this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas | |
} | |
/* Polyconic forward equations--mapping lat,long to x,y | |
---------------------------------------------------*/ | |
function forward$17(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var x, y, el; | |
var dlon = adjust_lon(lon - this.long0); | |
el = dlon * Math.sin(lat); | |
if (this.sphere) { | |
if (Math.abs(lat) <= EPSLN) { | |
x = this.a * dlon; | |
y = -1 * this.a * this.lat0; | |
} else { | |
x = this.a * Math.sin(el) / Math.tan(lat); | |
y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); | |
} | |
} else { | |
if (Math.abs(lat) <= EPSLN) { | |
x = this.a * dlon; | |
y = -1 * this.ml0; | |
} else { | |
var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); | |
x = nl * Math.sin(el); | |
y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); | |
} | |
} | |
p.x = x + this.x0; | |
p.y = y + this.y0; | |
return p; | |
} | |
/* Inverse equations | |
-----------------*/ | |
function inverse$17(p) { | |
var lon, lat, x, y, i; | |
var al, bl; | |
var phi, dphi; | |
x = p.x - this.x0; | |
y = p.y - this.y0; | |
if (this.sphere) { | |
if (Math.abs(y + this.a * this.lat0) <= EPSLN) { | |
lon = adjust_lon(x / this.a + this.long0); | |
lat = 0; | |
} else { | |
al = this.lat0 + y / this.a; | |
bl = x * x / this.a / this.a + al * al; | |
phi = al; | |
var tanphi; | |
for (i = MAX_ITER$2; i; --i) { | |
tanphi = Math.tan(phi); | |
dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); | |
phi += dphi; | |
if (Math.abs(dphi) <= EPSLN) { | |
lat = phi; | |
break; | |
} | |
} | |
lon = adjust_lon(this.long0 + Math.asin(x * Math.tan(phi) / this.a) / Math.sin(lat)); | |
} | |
} else { | |
if (Math.abs(y + this.ml0) <= EPSLN) { | |
lat = 0; | |
lon = adjust_lon(this.long0 + x / this.a); | |
} else { | |
al = (this.ml0 + y) / this.a; | |
bl = x * x / this.a / this.a + al * al; | |
phi = al; | |
var cl, mln, mlnp, ma; | |
var con; | |
for (i = MAX_ITER$2; i; --i) { | |
con = this.e * Math.sin(phi); | |
cl = Math.sqrt(1 - con * con) * Math.tan(phi); | |
mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); | |
mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); | |
ma = mln / this.a; | |
dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); | |
phi -= dphi; | |
if (Math.abs(dphi) <= EPSLN) { | |
lat = phi; | |
break; | |
} | |
} | |
//lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); | |
cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); | |
lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); | |
} | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$19 = ["Polyconic", "poly"]; | |
var poly = { | |
init: init$18, | |
forward: forward$17, | |
inverse: inverse$17, | |
names: names$19 | |
}; | |
function init$19() { | |
this.A = []; | |
this.A[1] = 0.6399175073; | |
this.A[2] = -0.1358797613; | |
this.A[3] = 0.063294409; | |
this.A[4] = -0.02526853; | |
this.A[5] = 0.0117879; | |
this.A[6] = -0.0055161; | |
this.A[7] = 0.0026906; | |
this.A[8] = -0.001333; | |
this.A[9] = 0.00067; | |
this.A[10] = -0.00034; | |
this.B_re = []; | |
this.B_im = []; | |
this.B_re[1] = 0.7557853228; | |
this.B_im[1] = 0; | |
this.B_re[2] = 0.249204646; | |
this.B_im[2] = 0.003371507; | |
this.B_re[3] = -0.001541739; | |
this.B_im[3] = 0.041058560; | |
this.B_re[4] = -0.10162907; | |
this.B_im[4] = 0.01727609; | |
this.B_re[5] = -0.26623489; | |
this.B_im[5] = -0.36249218; | |
this.B_re[6] = -0.6870983; | |
this.B_im[6] = -1.1651967; | |
this.C_re = []; | |
this.C_im = []; | |
this.C_re[1] = 1.3231270439; | |
this.C_im[1] = 0; | |
this.C_re[2] = -0.577245789; | |
this.C_im[2] = -0.007809598; | |
this.C_re[3] = 0.508307513; | |
this.C_im[3] = -0.112208952; | |
this.C_re[4] = -0.15094762; | |
this.C_im[4] = 0.18200602; | |
this.C_re[5] = 1.01418179; | |
this.C_im[5] = 1.64497696; | |
this.C_re[6] = 1.9660549; | |
this.C_im[6] = 2.5127645; | |
this.D = []; | |
this.D[1] = 1.5627014243; | |
this.D[2] = 0.5185406398; | |
this.D[3] = -0.03333098; | |
this.D[4] = -0.1052906; | |
this.D[5] = -0.0368594; | |
this.D[6] = 0.007317; | |
this.D[7] = 0.01220; | |
this.D[8] = 0.00394; | |
this.D[9] = -0.0013; | |
} | |
/** | |
New Zealand Map Grid Forward - long/lat to x/y | |
long/lat in radians | |
*/ | |
function forward$18(p) { | |
var n; | |
var lon = p.x; | |
var lat = p.y; | |
var delta_lat = lat - this.lat0; | |
var delta_lon = lon - this.long0; | |
// 1. Calculate d_phi and d_psi ... // and d_lambda | |
// For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. | |
var d_phi = delta_lat / SEC_TO_RAD * 1E-5; | |
var d_lambda = delta_lon; | |
var d_phi_n = 1; // d_phi^0 | |
var d_psi = 0; | |
for (n = 1; n <= 10; n++) { | |
d_phi_n = d_phi_n * d_phi; | |
d_psi = d_psi + this.A[n] * d_phi_n; | |
} | |
// 2. Calculate theta | |
var th_re = d_psi; | |
var th_im = d_lambda; | |
// 3. Calculate z | |
var th_n_re = 1; | |
var th_n_im = 0; // theta^0 | |
var th_n_re1; | |
var th_n_im1; | |
var z_re = 0; | |
var z_im = 0; | |
for (n = 1; n <= 6; n++) { | |
th_n_re1 = th_n_re * th_re - th_n_im * th_im; | |
th_n_im1 = th_n_im * th_re + th_n_re * th_im; | |
th_n_re = th_n_re1; | |
th_n_im = th_n_im1; | |
z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; | |
z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; | |
} | |
// 4. Calculate easting and northing | |
p.x = z_im * this.a + this.x0; | |
p.y = z_re * this.a + this.y0; | |
return p; | |
} | |
/** | |
New Zealand Map Grid Inverse - x/y to long/lat | |
*/ | |
function inverse$18(p) { | |
var n; | |
var x = p.x; | |
var y = p.y; | |
var delta_x = x - this.x0; | |
var delta_y = y - this.y0; | |
// 1. Calculate z | |
var z_re = delta_y / this.a; | |
var z_im = delta_x / this.a; | |
// 2a. Calculate theta - first approximation gives km accuracy | |
var z_n_re = 1; | |
var z_n_im = 0; // z^0 | |
var z_n_re1; | |
var z_n_im1; | |
var th_re = 0; | |
var th_im = 0; | |
for (n = 1; n <= 6; n++) { | |
z_n_re1 = z_n_re * z_re - z_n_im * z_im; | |
z_n_im1 = z_n_im * z_re + z_n_re * z_im; | |
z_n_re = z_n_re1; | |
z_n_im = z_n_im1; | |
th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; | |
th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; | |
} | |
// 2b. Iterate to refine the accuracy of the calculation | |
// 0 iterations gives km accuracy | |
// 1 iteration gives m accuracy -- good enough for most mapping applications | |
// 2 iterations bives mm accuracy | |
for (var i = 0; i < this.iterations; i++) { | |
var th_n_re = th_re; | |
var th_n_im = th_im; | |
var th_n_re1; | |
var th_n_im1; | |
var num_re = z_re; | |
var num_im = z_im; | |
for (n = 2; n <= 6; n++) { | |
th_n_re1 = th_n_re * th_re - th_n_im * th_im; | |
th_n_im1 = th_n_im * th_re + th_n_re * th_im; | |
th_n_re = th_n_re1; | |
th_n_im = th_n_im1; | |
num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); | |
num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); | |
} | |
th_n_re = 1; | |
th_n_im = 0; | |
var den_re = this.B_re[1]; | |
var den_im = this.B_im[1]; | |
for (n = 2; n <= 6; n++) { | |
th_n_re1 = th_n_re * th_re - th_n_im * th_im; | |
th_n_im1 = th_n_im * th_re + th_n_re * th_im; | |
th_n_re = th_n_re1; | |
th_n_im = th_n_im1; | |
den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); | |
den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); | |
} | |
// Complex division | |
var den2 = den_re * den_re + den_im * den_im; | |
th_re = (num_re * den_re + num_im * den_im) / den2; | |
th_im = (num_im * den_re - num_re * den_im) / den2; | |
} | |
// 3. Calculate d_phi ... // and d_lambda | |
var d_psi = th_re; | |
var d_lambda = th_im; | |
var d_psi_n = 1; // d_psi^0 | |
var d_phi = 0; | |
for (n = 1; n <= 9; n++) { | |
d_psi_n = d_psi_n * d_psi; | |
d_phi = d_phi + this.D[n] * d_psi_n; | |
} | |
// 4. Calculate latitude and longitude | |
// d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. | |
var lat = this.lat0 + d_phi * SEC_TO_RAD * 1E5; | |
var lon = this.long0 + d_lambda; | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$20 = ["New_Zealand_Map_Grid", "nzmg"]; | |
var nzmg = { | |
init: init$19, | |
forward: forward$18, | |
inverse: inverse$18, | |
names: names$20 | |
}; | |
/* | |
reference | |
"New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, | |
The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. | |
*/ | |
/* Initialize the Miller Cylindrical projection | |
-------------------------------------------*/ | |
function init$20() {} | |
//no-op | |
/* Miller Cylindrical forward equations--mapping lat,long to x,y | |
------------------------------------------------------------*/ | |
function forward$19(p) { | |
var lon = p.x; | |
var lat = p.y; | |
/* Forward equations | |
-----------------*/ | |
var dlon = adjust_lon(lon - this.long0); | |
var x = this.x0 + this.a * dlon; | |
var y = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + lat / 2.5)) * 1.25; | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
/* Miller Cylindrical inverse equations--mapping x,y to lat/long | |
------------------------------------------------------------*/ | |
function inverse$19(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var lon = adjust_lon(this.long0 + p.x / this.a); | |
var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$21 = ["Miller_Cylindrical", "mill"]; | |
var mill = { | |
init: init$20, | |
forward: forward$19, | |
inverse: inverse$19, | |
names: names$21 | |
}; | |
var MAX_ITER$3 = 20; | |
function init$21() { | |
/* Place parameters in static storage for common use | |
-------------------------------------------------*/ | |
if (!this.sphere) { | |
this.en = pj_enfn(this.es); | |
} else { | |
this.n = 1; | |
this.m = 0; | |
this.es = 0; | |
this.C_y = Math.sqrt((this.m + 1) / this.n); | |
this.C_x = this.C_y / (this.m + 1); | |
} | |
} | |
/* Sinusoidal forward equations--mapping lat,long to x,y | |
-----------------------------------------------------*/ | |
function forward$20(p) { | |
var x, y; | |
var lon = p.x; | |
var lat = p.y; | |
/* Forward equations | |
-----------------*/ | |
lon = adjust_lon(lon - this.long0); | |
if (this.sphere) { | |
if (!this.m) { | |
lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; | |
} else { | |
var k = this.n * Math.sin(lat); | |
for (var i = MAX_ITER$3; i; --i) { | |
var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); | |
lat -= V; | |
if (Math.abs(V) < EPSLN) { | |
break; | |
} | |
} | |
} | |
x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); | |
y = this.a * this.C_y * lat; | |
} else { | |
var s = Math.sin(lat); | |
var c = Math.cos(lat); | |
y = this.a * pj_mlfn(lat, s, c, this.en); | |
x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$20(p) { | |
var lat, temp, lon, s; | |
p.x -= this.x0; | |
lon = p.x / this.a; | |
p.y -= this.y0; | |
lat = p.y / this.a; | |
if (this.sphere) { | |
lat /= this.C_y; | |
lon = lon / (this.C_x * (this.m + Math.cos(lat))); | |
if (this.m) { | |
lat = asinz((this.m * lat + Math.sin(lat)) / this.n); | |
} else if (this.n !== 1) { | |
lat = asinz(Math.sin(lat) / this.n); | |
} | |
lon = adjust_lon(lon + this.long0); | |
lat = adjust_lat(lat); | |
} else { | |
lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); | |
s = Math.abs(lat); | |
if (s < HALF_PI) { | |
s = Math.sin(lat); | |
temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); | |
//temp = this.long0 + p.x / (this.a * Math.cos(lat)); | |
lon = adjust_lon(temp); | |
} else if (s - EPSLN < HALF_PI) { | |
lon = this.long0; | |
} | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$22 = ["Sinusoidal", "sinu"]; | |
var sinu = { | |
init: init$21, | |
forward: forward$20, | |
inverse: inverse$20, | |
names: names$22 | |
}; | |
function init$22() {} | |
/* Mollweide forward equations--mapping lat,long to x,y | |
----------------------------------------------------*/ | |
function forward$21(p) { | |
/* Forward equations | |
-----------------*/ | |
var lon = p.x; | |
var lat = p.y; | |
var delta_lon = adjust_lon(lon - this.long0); | |
var theta = lat; | |
var con = Math.PI * Math.sin(lat); | |
/* Iterate using the Newton-Raphson method to find theta | |
-----------------------------------------------------*/ | |
while (true) { | |
var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); | |
theta += delta_theta; | |
if (Math.abs(delta_theta) < EPSLN) { | |
break; | |
} | |
} | |
theta /= 2; | |
/* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" | |
this is done here because of precision problems with "cos(theta)" | |
--------------------------------------------------------------------------*/ | |
if (Math.PI / 2 - Math.abs(lat) < EPSLN) { | |
delta_lon = 0; | |
} | |
var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; | |
var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$21(p) { | |
var theta; | |
var arg; | |
/* Inverse equations | |
-----------------*/ | |
p.x -= this.x0; | |
p.y -= this.y0; | |
arg = p.y / (1.4142135623731 * this.a); | |
/* Because of division by zero problems, 'arg' can not be 1. Therefore | |
a number very close to one is used instead. | |
-------------------------------------------------------------------*/ | |
if (Math.abs(arg) > 0.999999999999) { | |
arg = 0.999999999999; | |
} | |
theta = Math.asin(arg); | |
var lon = adjust_lon(this.long0 + p.x / (0.900316316158 * this.a * Math.cos(theta))); | |
if (lon < -Math.PI) { | |
lon = -Math.PI; | |
} | |
if (lon > Math.PI) { | |
lon = Math.PI; | |
} | |
arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; | |
if (Math.abs(arg) > 1) { | |
arg = 1; | |
} | |
var lat = Math.asin(arg); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$23 = ["Mollweide", "moll"]; | |
var moll = { | |
init: init$22, | |
forward: forward$21, | |
inverse: inverse$21, | |
names: names$23 | |
}; | |
function init$23() { | |
/* Place parameters in static storage for common use | |
-------------------------------------------------*/ | |
// Standard Parallels cannot be equal and on opposite sides of the equator | |
if (Math.abs(this.lat1 + this.lat2) < EPSLN) { | |
return; | |
} | |
this.lat2 = this.lat2 || this.lat1; | |
this.temp = this.b / this.a; | |
this.es = 1 - Math.pow(this.temp, 2); | |
this.e = Math.sqrt(this.es); | |
this.e0 = e0fn(this.es); | |
this.e1 = e1fn(this.es); | |
this.e2 = e2fn(this.es); | |
this.e3 = e3fn(this.es); | |
this.sinphi = Math.sin(this.lat1); | |
this.cosphi = Math.cos(this.lat1); | |
this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); | |
this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); | |
if (Math.abs(this.lat1 - this.lat2) < EPSLN) { | |
this.ns = this.sinphi; | |
} else { | |
this.sinphi = Math.sin(this.lat2); | |
this.cosphi = Math.cos(this.lat2); | |
this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); | |
this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); | |
this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); | |
} | |
this.g = this.ml1 + this.ms1 / this.ns; | |
this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); | |
this.rh = this.a * (this.g - this.ml0); | |
} | |
/* Equidistant Conic forward equations--mapping lat,long to x,y | |
-----------------------------------------------------------*/ | |
function forward$22(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var rh1; | |
/* Forward equations | |
-----------------*/ | |
if (this.sphere) { | |
rh1 = this.a * (this.g - lat); | |
} else { | |
var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); | |
rh1 = this.a * (this.g - ml); | |
} | |
var theta = this.ns * adjust_lon(lon - this.long0); | |
var x = this.x0 + rh1 * Math.sin(theta); | |
var y = this.y0 + this.rh - rh1 * Math.cos(theta); | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
/* Inverse equations | |
-----------------*/ | |
function inverse$22(p) { | |
p.x -= this.x0; | |
p.y = this.rh - p.y + this.y0; | |
var con, rh1, lat, lon; | |
if (this.ns >= 0) { | |
rh1 = Math.sqrt(p.x * p.x + p.y * p.y); | |
con = 1; | |
} else { | |
rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); | |
con = -1; | |
} | |
var theta = 0; | |
if (rh1 !== 0) { | |
theta = Math.atan2(con * p.x, con * p.y); | |
} | |
if (this.sphere) { | |
lon = adjust_lon(this.long0 + theta / this.ns); | |
lat = adjust_lat(this.g - rh1 / this.a); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} else { | |
var ml = this.g - rh1 / this.a; | |
lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); | |
lon = adjust_lon(this.long0 + theta / this.ns); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
} | |
var names$24 = ["Equidistant_Conic", "eqdc"]; | |
var eqdc = { | |
init: init$23, | |
forward: forward$22, | |
inverse: inverse$22, | |
names: names$24 | |
}; | |
/* Initialize the Van Der Grinten projection | |
----------------------------------------*/ | |
function init$24() { | |
//this.R = 6370997; //Radius of earth | |
this.R = this.a; | |
} | |
function forward$23(p) { | |
var lon = p.x; | |
var lat = p.y; | |
/* Forward equations | |
-----------------*/ | |
var dlon = adjust_lon(lon - this.long0); | |
var x, y; | |
if (Math.abs(lat) <= EPSLN) { | |
x = this.x0 + this.R * dlon; | |
y = this.y0; | |
} | |
var theta = asinz(2 * Math.abs(lat / Math.PI)); | |
if (Math.abs(dlon) <= EPSLN || Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { | |
x = this.x0; | |
if (lat >= 0) { | |
y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); | |
} else { | |
y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); | |
} | |
// return(OK); | |
} | |
var al = 0.5 * Math.abs(Math.PI / dlon - dlon / Math.PI); | |
var asq = al * al; | |
var sinth = Math.sin(theta); | |
var costh = Math.cos(theta); | |
var g = costh / (sinth + costh - 1); | |
var gsq = g * g; | |
var m = g * (2 / sinth - 1); | |
var msq = m * m; | |
var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); | |
if (dlon < 0) { | |
con = -con; | |
} | |
x = this.x0 + con; | |
//con = Math.abs(con / (Math.PI * this.R)); | |
var q = asq + g; | |
con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); | |
if (lat >= 0) { | |
//y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); | |
y = this.y0 + con; | |
} else { | |
//y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); | |
y = this.y0 - con; | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
/* Van Der Grinten inverse equations--mapping x,y to lat/long | |
---------------------------------------------------------*/ | |
function inverse$23(p) { | |
var lon, lat; | |
var xx, yy, xys, c1, c2, c3; | |
var a1; | |
var m1; | |
var con; | |
var th1; | |
var d; | |
/* inverse equations | |
-----------------*/ | |
p.x -= this.x0; | |
p.y -= this.y0; | |
con = Math.PI * this.R; | |
xx = p.x / con; | |
yy = p.y / con; | |
xys = xx * xx + yy * yy; | |
c1 = -Math.abs(yy) * (1 + xys); | |
c2 = c1 - 2 * yy * yy + xx * xx; | |
c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; | |
d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; | |
a1 = (c1 - c2 * c2 / 3 / c3) / c3; | |
m1 = 2 * Math.sqrt(-a1 / 3); | |
con = 3 * d / a1 / m1; | |
if (Math.abs(con) > 1) { | |
if (con >= 0) { | |
con = 1; | |
} else { | |
con = -1; | |
} | |
} | |
th1 = Math.acos(con) / 3; | |
if (p.y >= 0) { | |
lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; | |
} else { | |
lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; | |
} | |
if (Math.abs(xx) < EPSLN) { | |
lon = this.long0; | |
} else { | |
lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$25 = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; | |
var vandg = { | |
init: init$24, | |
forward: forward$23, | |
inverse: inverse$23, | |
names: names$25 | |
}; | |
function init$25() { | |
this.sin_p12 = Math.sin(this.lat0); | |
this.cos_p12 = Math.cos(this.lat0); | |
} | |
function forward$24(p) { | |
var lon = p.x; | |
var lat = p.y; | |
var sinphi = Math.sin(p.y); | |
var cosphi = Math.cos(p.y); | |
var dlon = adjust_lon(lon - this.long0); | |
var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; | |
if (this.sphere) { | |
if (Math.abs(this.sin_p12 - 1) <= EPSLN) { | |
//North Pole case | |
p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); | |
p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); | |
return p; | |
} else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { | |
//South Pole case | |
p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); | |
p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); | |
return p; | |
} else { | |
//default case | |
cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); | |
c = Math.acos(cos_c); | |
kp = c / Math.sin(c); | |
p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); | |
p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); | |
return p; | |
} | |
} else { | |
e0 = e0fn(this.es); | |
e1 = e1fn(this.es); | |
e2 = e2fn(this.es); | |
e3 = e3fn(this.es); | |
if (Math.abs(this.sin_p12 - 1) <= EPSLN) { | |
//North Pole case | |
Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); | |
Ml = this.a * mlfn(e0, e1, e2, e3, lat); | |
p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); | |
p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); | |
return p; | |
} else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { | |
//South Pole case | |
Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); | |
Ml = this.a * mlfn(e0, e1, e2, e3, lat); | |
p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); | |
p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); | |
return p; | |
} else { | |
//Default case | |
tanphi = sinphi / cosphi; | |
Nl1 = gN(this.a, this.e, this.sin_p12); | |
Nl = gN(this.a, this.e, sinphi); | |
psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); | |
Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); | |
if (Az === 0) { | |
s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); | |
} else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { | |
s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); | |
} else { | |
s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); | |
} | |
G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); | |
H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); | |
GH = G * H; | |
Hs = H * H; | |
s2 = s * s; | |
s3 = s2 * s; | |
s4 = s3 * s; | |
s5 = s4 * s; | |
c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); | |
p.x = this.x0 + c * Math.sin(Az); | |
p.y = this.y0 + c * Math.cos(Az); | |
return p; | |
} | |
} | |
} | |
function inverse$24(p) { | |
p.x -= this.x0; | |
p.y -= this.y0; | |
var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F; | |
if (this.sphere) { | |
rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
if (rh > 2 * HALF_PI * this.a) { | |
return; | |
} | |
z = rh / this.a; | |
sinz = Math.sin(z); | |
cosz = Math.cos(z); | |
lon = this.long0; | |
if (Math.abs(rh) <= EPSLN) { | |
lat = this.lat0; | |
} else { | |
lat = asinz(cosz * this.sin_p12 + p.y * sinz * this.cos_p12 / rh); | |
con = Math.abs(this.lat0) - HALF_PI; | |
if (Math.abs(con) <= EPSLN) { | |
if (this.lat0 >= 0) { | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); | |
} else { | |
lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); | |
} | |
} else { | |
/*con = cosz - this.sin_p12 * Math.sin(lat); | |
if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { | |
//no-op, just keep the lon value as is | |
} else { | |
var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); | |
lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); | |
}*/ | |
lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); | |
} | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} else { | |
e0 = e0fn(this.es); | |
e1 = e1fn(this.es); | |
e2 = e2fn(this.es); | |
e3 = e3fn(this.es); | |
if (Math.abs(this.sin_p12 - 1) <= EPSLN) { | |
//North pole case | |
Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); | |
rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
M = Mlp - rh; | |
lat = imlfn(M / this.a, e0, e1, e2, e3); | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { | |
//South pole case | |
Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); | |
rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
M = rh - Mlp; | |
lat = imlfn(M / this.a, e0, e1, e2, e3); | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} else { | |
//default case | |
rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
Az = Math.atan2(p.x, p.y); | |
N1 = gN(this.a, this.e, this.sin_p12); | |
cosAz = Math.cos(Az); | |
tmp = this.e * this.cos_p12 * cosAz; | |
A = -tmp * tmp / (1 - this.es); | |
B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); | |
D = rh / N1; | |
Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; | |
F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; | |
psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); | |
lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); | |
lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es)); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
} | |
} | |
var names$26 = ["Azimuthal_Equidistant", "aeqd"]; | |
var aeqd = { | |
init: init$25, | |
forward: forward$24, | |
inverse: inverse$24, | |
names: names$26 | |
}; | |
function init$26() { | |
//double temp; /* temporary variable */ | |
/* Place parameters in static storage for common use | |
-------------------------------------------------*/ | |
this.sin_p14 = Math.sin(this.lat0); | |
this.cos_p14 = Math.cos(this.lat0); | |
} | |
/* Orthographic forward equations--mapping lat,long to x,y | |
---------------------------------------------------*/ | |
function forward$25(p) { | |
var sinphi, cosphi; /* sin and cos value */ | |
var dlon; /* delta longitude value */ | |
var coslon; /* cos of longitude */ | |
var ksp; /* scale factor */ | |
var g, x, y; | |
var lon = p.x; | |
var lat = p.y; | |
/* Forward equations | |
-----------------*/ | |
dlon = adjust_lon(lon - this.long0); | |
sinphi = Math.sin(lat); | |
cosphi = Math.cos(lat); | |
coslon = Math.cos(dlon); | |
g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; | |
ksp = 1; | |
if (g > 0 || Math.abs(g) <= EPSLN) { | |
x = this.a * ksp * cosphi * Math.sin(dlon); | |
y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); | |
} | |
p.x = x; | |
p.y = y; | |
return p; | |
} | |
function inverse$25(p) { | |
var rh; /* height above ellipsoid */ | |
var z; /* angle */ | |
var sinz, cosz; /* sin of z and cos of z */ | |
var con; | |
var lon, lat; | |
/* Inverse equations | |
-----------------*/ | |
p.x -= this.x0; | |
p.y -= this.y0; | |
rh = Math.sqrt(p.x * p.x + p.y * p.y); | |
z = asinz(rh / this.a); | |
sinz = Math.sin(z); | |
cosz = Math.cos(z); | |
lon = this.long0; | |
if (Math.abs(rh) <= EPSLN) { | |
lat = this.lat0; | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
lat = asinz(cosz * this.sin_p14 + p.y * sinz * this.cos_p14 / rh); | |
con = Math.abs(this.lat0) - HALF_PI; | |
if (Math.abs(con) <= EPSLN) { | |
if (this.lat0 >= 0) { | |
lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); | |
} else { | |
lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); | |
} | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz)); | |
p.x = lon; | |
p.y = lat; | |
return p; | |
} | |
var names$27 = ["ortho"]; | |
var ortho = { | |
init: init$26, | |
forward: forward$25, | |
inverse: inverse$25, | |
names: names$27 | |
}; | |
// QSC projection rewritten from the original PROJ4 | |
/* constants */ | |
var FACE_ENUM = { | |
FRONT: 1, | |
RIGHT: 2, | |
BACK: 3, | |
LEFT: 4, | |
TOP: 5, | |
BOTTOM: 6 | |
}; | |
var AREA_ENUM = { | |
AREA_0: 1, | |
AREA_1: 2, | |
AREA_2: 3, | |
AREA_3: 4 | |
}; | |
function init$27() { | |
this.x0 = this.x0 || 0; | |
this.y0 = this.y0 || 0; | |
this.lat0 = this.lat0 || 0; | |
this.long0 = this.long0 || 0; | |
this.lat_ts = this.lat_ts || 0; | |
this.title = this.title || "Quadrilateralized Spherical Cube"; | |
/* Determine the cube face from the center of projection. */ | |
if (this.lat0 >= HALF_PI - FORTPI / 2.0) { | |
this.face = FACE_ENUM.TOP; | |
} else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) { | |
this.face = FACE_ENUM.BOTTOM; | |
} else if (Math.abs(this.long0) <= FORTPI) { | |
this.face = FACE_ENUM.FRONT; | |
} else if (Math.abs(this.long0) <= HALF_PI + FORTPI) { | |
this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT; | |
} else { | |
this.face = FACE_ENUM.BACK; | |
} | |
/* Fill in useful values for the ellipsoid <-> sphere shift | |
* described in [LK12]. */ | |
if (this.es !== 0) { | |
this.one_minus_f = 1 - (this.a - this.b) / this.a; | |
this.one_minus_f_squared = this.one_minus_f * this.one_minus_f; | |
} | |
} | |
// QSC forward equations--mapping lat,long to x,y | |
// ----------------------------------------------------------------- | |
function forward$26(p) { | |
var xy = { x: 0, y: 0 }; | |
var lat, lon; | |
var theta, phi; | |
var t, mu; | |
/* nu; */ | |
var area = { value: 0 }; | |
// move lon according to projection's lon | |
p.x -= this.long0; | |
/* Convert the geodetic latitude to a geocentric latitude. | |
* This corresponds to the shift from the ellipsoid to the sphere | |
* described in [LK12]. */ | |
if (this.es !== 0) { | |
//if (P->es != 0) { | |
lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y)); | |
} else { | |
lat = p.y; | |
} | |
/* Convert the input lat, lon into theta, phi as used by QSC. | |
* This depends on the cube face and the area on it. | |
* For the top and bottom face, we can compute theta and phi | |
* directly from phi, lam. For the other faces, we must use | |
* unit sphere cartesian coordinates as an intermediate step. */ | |
lon = p.x; //lon = lp.lam; | |
if (this.face === FACE_ENUM.TOP) { | |
phi = HALF_PI - lat; | |
if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { | |
area.value = AREA_ENUM.AREA_0; | |
theta = lon - HALF_PI; | |
} else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) { | |
area.value = AREA_ENUM.AREA_1; | |
theta = lon > 0.0 ? lon - SPI : lon + SPI; | |
} else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) { | |
area.value = AREA_ENUM.AREA_2; | |
theta = lon + HALF_PI; | |
} else { | |
area.value = AREA_ENUM.AREA_3; | |
theta = lon; | |
} | |
} else if (this.face === FACE_ENUM.BOTTOM) { | |
phi = HALF_PI + lat; | |
if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { | |
area.value = AREA_ENUM.AREA_0; | |
theta = -lon + HALF_PI; | |
} else if (lon < FORTPI && lon >= -FORTPI) { | |
area.value = AREA_ENUM.AREA_1; | |
theta = -lon; | |
} else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) { | |
area.value = AREA_ENUM.AREA_2; | |
theta = -lon - HALF_PI; | |
} else { | |
area.value = AREA_ENUM.AREA_3; | |
theta = lon > 0.0 ? -lon + SPI : -lon - SPI; | |
} | |
} else { | |
var q, r, s; | |
var sinlat, coslat; | |
var sinlon, coslon; | |
if (this.face === FACE_ENUM.RIGHT) { | |
lon = qsc_shift_lon_origin(lon, +HALF_PI); | |
} else if (this.face === FACE_ENUM.BACK) { | |
lon = qsc_shift_lon_origin(lon, +SPI); | |
} else if (this.face === FACE_ENUM.LEFT) { | |
lon = qsc_shift_lon_origin(lon, -HALF_PI); | |
} | |
sinlat = Math.sin(lat); | |
coslat = Math.cos(lat); | |
sinlon = Math.sin(lon); | |
coslon = Math.cos(lon); | |
q = coslat * coslon; | |
r = coslat * sinlon; | |
s = sinlat; | |
if (this.face === FACE_ENUM.FRONT) { | |
phi = Math.acos(q); | |
theta = qsc_fwd_equat_face_theta(phi, s, r, area); | |
} else if (this.face === FACE_ENUM.RIGHT) { | |
phi = Math.acos(r); | |
theta = qsc_fwd_equat_face_theta(phi, s, -q, area); | |
} else if (this.face === FACE_ENUM.BACK) { | |
phi = Math.acos(-q); | |
theta = qsc_fwd_equat_face_theta(phi, s, -r, area); | |
} else if (this.face === FACE_ENUM.LEFT) { | |
phi = Math.acos(-r); | |
theta = qsc_fwd_equat_face_theta(phi, s, q, area); | |
} else { | |
/* Impossible */ | |
phi = theta = 0; | |
area.value = AREA_ENUM.AREA_0; | |
} | |
} | |
/* Compute mu and nu for the area of definition. | |
* For mu, see Eq. (3-21) in [OL76], but note the typos: | |
* compare with Eq. (3-14). For nu, see Eq. (3-38). */ | |
mu = Math.atan(12 / SPI * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI)); | |
t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta))))); | |
/* Apply the result to the real area. */ | |
if (area.value === AREA_ENUM.AREA_1) { | |
mu += HALF_PI; | |
} else if (area.value === AREA_ENUM.AREA_2) { | |
mu += SPI; | |
} else if (area.value === AREA_ENUM.AREA_3) { | |
mu += 1.5 * SPI; | |
} | |
/* Now compute x, y from mu and nu */ | |
xy.x = t * Math.cos(mu); | |
xy.y = t * Math.sin(mu); | |
xy.x = xy.x * this.a + this.x0; | |
xy.y = xy.y * this.a + this.y0; | |
p.x = xy.x; | |
p.y = xy.y; | |
return p; | |
} | |
// QSC inverse equations--mapping x,y to lat/long | |
// ----------------------------------------------------------------- | |
function inverse$26(p) { | |
var lp = { lam: 0, phi: 0 }; | |
var mu, nu, cosmu, tannu; | |
var tantheta, theta, cosphi, phi; | |
var t; | |
var area = { value: 0 }; | |
/* de-offset */ | |
p.x = (p.x - this.x0) / this.a; | |
p.y = (p.y - this.y0) / this.a; | |
/* Convert the input x, y to the mu and nu angles as used by QSC. | |
* This depends on the area of the cube face. */ | |
nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y)); | |
mu = Math.atan2(p.y, p.x); | |
if (p.x >= 0.0 && p.x >= Math.abs(p.y)) { | |
area.value = AREA_ENUM.AREA_0; | |
} else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) { | |
area.value = AREA_ENUM.AREA_1; | |
mu -= HALF_PI; | |
} else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) { | |
area.value = AREA_ENUM.AREA_2; | |
mu = mu < 0.0 ? mu + SPI : mu - SPI; | |
} else { | |
area.value = AREA_ENUM.AREA_3; | |
mu += HALF_PI; | |
} | |
/* Compute phi and theta for the area of definition. | |
* The inverse projection is not described in the original paper, but some | |
* good hints can be found here (as of 2011-12-14): | |
* http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302 | |
* (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */ | |
t = SPI / 12 * Math.tan(mu); | |
tantheta = Math.sin(t) / (Math.cos(t) - 1 / Math.sqrt(2)); | |
theta = Math.atan(tantheta); | |
cosmu = Math.cos(mu); | |
tannu = Math.tan(nu); | |
cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta)))); | |
if (cosphi < -1) { | |
cosphi = -1; | |
} else if (cosphi > +1) { | |
cosphi = +1; | |
} | |
/* Apply the result to the real area on the cube face. | |
* For the top and bottom face, we can compute phi and lam directly. | |
* For the other faces, we must use unit sphere cartesian coordinates | |
* as an intermediate step. */ | |
if (this.face === FACE_ENUM.TOP) { | |
phi = Math.acos(cosphi); | |
lp.phi = HALF_PI - phi; | |
if (area.value === AREA_ENUM.AREA_0) { | |
lp.lam = theta + HALF_PI; | |
} else if (area.value === AREA_ENUM.AREA_1) { | |
lp.lam = theta < 0.0 ? theta + SPI : theta - SPI; | |
} else if (area.value === AREA_ENUM.AREA_2) { | |
lp.lam = theta - HALF_PI; | |
} else /* area.value == AREA_ENUM.AREA_3 */{ | |
lp.lam = theta; | |
} | |
} else if (this.face === FACE_ENUM.BOTTOM) { | |
phi = Math.acos(cosphi); | |
lp.phi = phi - HALF_PI; | |
if (area.value === AREA_ENUM.AREA_0) { | |
lp.lam = -theta + HALF_PI; | |
} else if (area.value === AREA_ENUM.AREA_1) { | |
lp.lam = -theta; | |
} else if (area.value === AREA_ENUM.AREA_2) { | |
lp.lam = -theta - HALF_PI; | |
} else /* area.value == AREA_ENUM.AREA_3 */{ | |
lp.lam = theta < 0.0 ? -theta - SPI : -theta + SPI; | |
} | |
} else { | |
/* Compute phi and lam via cartesian unit sphere coordinates. */ | |
var q, r, s; | |
q = cosphi; | |
t = q * q; | |
if (t >= 1) { | |
s = 0; | |
} else { | |
s = Math.sqrt(1 - t) * Math.sin(theta); | |
} | |
t += s * s; | |
if (t >= 1) { | |
r = 0; | |
} else { | |
r = Math.sqrt(1 - t); | |
} | |
/* Rotate q,r,s into the correct area. */ | |
if (area.value === AREA_ENUM.AREA_1) { | |
t = r; | |
r = -s; | |
s = t; | |
} else if (area.value === AREA_ENUM.AREA_2) { | |
r = -r; | |
s = -s; | |
} else if (area.value === AREA_ENUM.AREA_3) { | |
t = r; | |
r = s; | |
s = -t; | |
} | |
/* Rotate q,r,s into the correct cube face. */ | |
if (this.face === FACE_ENUM.RIGHT) { | |
t = q; | |
q = -r; | |
r = t; | |
} else if (this.face === FACE_ENUM.BACK) { | |
q = -q; | |
r = -r; | |
} else if (this.face === FACE_ENUM.LEFT) { | |
t = q; | |
q = r; | |
r = -t; | |
} | |
/* Now compute phi and lam from the unit sphere coordinates. */ | |
lp.phi = Math.acos(-s) - HALF_PI; | |
lp.lam = Math.atan2(r, q); | |
if (this.face === FACE_ENUM.RIGHT) { | |
lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI); | |
} else if (this.face === FACE_ENUM.BACK) { | |
lp.lam = qsc_shift_lon_origin(lp.lam, -SPI); | |
} else if (this.face === FACE_ENUM.LEFT) { | |
lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI); | |
} | |
} | |
/* Apply the shift from the sphere to the ellipsoid as described | |
* in [LK12]. */ | |
if (this.es !== 0) { | |
var invert_sign; | |
var tanphi, xa; | |
invert_sign = lp.phi < 0 ? 1 : 0; | |
tanphi = Math.tan(lp.phi); | |
xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared); | |
lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa)); | |
if (invert_sign) { | |
lp.phi = -lp.phi; | |
} | |
} | |
lp.lam += this.long0; | |
p.x = lp.lam; | |
p.y = lp.phi; | |
return p; | |
} | |
/* Helper function for forward projection: compute the theta angle | |
* and determine the area number. */ | |
function qsc_fwd_equat_face_theta(phi, y, x, area) { | |
var theta; | |
if (phi < EPSLN) { | |
area.value = AREA_ENUM.AREA_0; | |
theta = 0.0; | |
} else { | |
theta = Math.atan2(y, x); | |
if (Math.abs(theta) <= FORTPI) { | |
area.value = AREA_ENUM.AREA_0; | |
} else if (theta > FORTPI && theta <= HALF_PI + FORTPI) { | |
area.value = AREA_ENUM.AREA_1; | |
theta -= HALF_PI; | |
} else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) { | |
area.value = AREA_ENUM.AREA_2; | |
theta = theta >= 0.0 ? theta - SPI : theta + SPI; | |
} else { | |
area.value = AREA_ENUM.AREA_3; | |
theta += HALF_PI; | |
} | |
} | |
return theta; | |
} | |
/* Helper function: shift the longitude. */ | |
function qsc_shift_lon_origin(lon, offset) { | |
var slon = lon + offset; | |
if (slon < -SPI) { | |
slon += TWO_PI; | |
} else if (slon > +SPI) { | |
slon -= TWO_PI; | |
} | |
return slon; | |
} | |
var names$28 = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"]; | |
var qsc = { | |
init: init$27, | |
forward: forward$26, | |
inverse: inverse$26, | |
names: names$28 | |
}; | |
function includedProjections (proj4) { | |
proj4.Proj.projections.add(tmerc); | |
proj4.Proj.projections.add(etmerc); | |
proj4.Proj.projections.add(utm); | |
proj4.Proj.projections.add(sterea); | |
proj4.Proj.projections.add(stere); | |
proj4.Proj.projections.add(somerc); | |
proj4.Proj.projections.add(omerc); | |
proj4.Proj.projections.add(lcc); | |
proj4.Proj.projections.add(krovak); | |
proj4.Proj.projections.add(cass); | |
proj4.Proj.projections.add(laea); | |
proj4.Proj.projections.add(aea); | |
proj4.Proj.projections.add(gnom); | |
proj4.Proj.projections.add(cea); | |
proj4.Proj.projections.add(eqc); | |
proj4.Proj.projections.add(poly); | |
proj4.Proj.projections.add(nzmg); | |
proj4.Proj.projections.add(mill); | |
proj4.Proj.projections.add(sinu); | |
proj4.Proj.projections.add(moll); | |
proj4.Proj.projections.add(eqdc); | |
proj4.Proj.projections.add(vandg); | |
proj4.Proj.projections.add(aeqd); | |
proj4.Proj.projections.add(ortho); | |
proj4.Proj.projections.add(qsc); | |
} | |
proj4.defaultDatum = 'WGS84'; //default datum | |
proj4.Proj = Projection; | |
proj4.WGS84 = new proj4.Proj('WGS84'); | |
proj4.Point = Point; | |
proj4.toPoint = toPoint; | |
proj4.defs = defs; | |
proj4.transform = transform; | |
proj4.mgrs = mgrs; | |
proj4.version = version; | |
includedProjections(proj4); | |
function query(url) { | |
var promise = new Promise(function (resolve, reject) { | |
fetch(url).then(function (res) { | |
return resolve(res.json()); | |
}).catch(function (err) { | |
return reject(err); | |
}); | |
}); | |
return promise; | |
} | |
proj4.defs("EPSG:28992", "+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs"); | |
var transformCoords = proj4(proj4.defs('EPSG:4326'), proj4.defs('EPSG:28992')); | |
function formatQueryURL(baseUrl, xy) { | |
return '' + baseUrl + xy.x + ',' + xy.y + ',10'; | |
} | |
function handleQueryResponse(res, d) { | |
var filtered = res.results.filter(function (x) { | |
return x.hoofdadres === true; | |
}); | |
if (filtered.length > 0) { | |
return { queryResult: filtered[0], latlng: d.latlng }; | |
} else { | |
return { queryResult: null, latlng: d.latlng }; | |
} | |
} | |
//transforming operator | |
var pointToQuery = function pointToQuery(url) { | |
return function (inputSource) { | |
return function outputSource(start, outputSink) { | |
if (start !== 0) return; | |
inputSource(0, function (t, d) { | |
if (t === 1) { | |
var xyRD = transformCoords.forward({ x: d.latlng.lng, y: d.latlng.lat }); | |
query(formatQueryURL(url, xyRD)).then(function (res) { | |
var output = handleQueryResponse(res, d); | |
outputSink(1, output); | |
}); | |
} else { | |
outputSink(t, d); | |
} | |
}); | |
}; | |
}; | |
}; | |
//constructor to create a 'clickpricker' in one go. | |
var queryFeatures = function queryFeatures() { | |
return pointToQuery(CONFIG.FEATUREQUERYBASEURL); | |
}; | |
var geocoder = CONFIG.GEOCODER; | |
function httpGetAsync(url) { | |
// eslint-disable-next-line no-unused-vars | |
return new Promise(function (resolve, reject) { | |
var xmlHttp = new XMLHttpRequest(); | |
xmlHttp.onreadystatechange = function () { | |
// eslint-disable-next-line eqeqeq | |
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { | |
resolve(JSON.parse(xmlHttp.responseText)); | |
} | |
}; | |
xmlHttp.open("GET", url, true); // true for asynchronous | |
xmlHttp.send(null); | |
}); | |
} | |
function wktPointToGeoJson(wktPoint) { | |
if (!wktPoint.includes('POINT')) { | |
throw TypeError('Provided WKT geometry is not a point.'); | |
} | |
var coordinateTuple = wktPoint.split('(')[1].split(')')[0]; | |
var x = parseFloat(coordinateTuple.split(' ')[0]); | |
var y = parseFloat(coordinateTuple.split(' ')[1]); | |
return { | |
type: 'Point', | |
coordinates: [x, y] | |
}; | |
} | |
/** | |
* Make a call to PDOK locatieserver v3 suggest service. This service is meant for geocoder autocomplete functionality. For | |
* additional documentation, check https://github.com/PDOK/locatieserver/wiki/API-Locatieserver. | |
* @param {string} searchTerm The term which to search for | |
*/ | |
geocoder.doSuggestRequest = function (searchTerm) { | |
return httpGetAsync(this.suggestUrl + 'q=' + encodeURIComponent(searchTerm)); | |
}; | |
/** | |
* Make a call to PDOK locatieserver v3 lookup service. This service provides information about objects found through the suggest service. For additional | |
* documentation, check: https://github.com/PDOK/locatieserver/wiki/API-Locatieserver | |
* @param {string} id The id of the feature that is to be looked up. | |
*/ | |
geocoder.doLookupRequest = function (id) { | |
return httpGetAsync(this.lookupUrl + 'id=' + encodeURIComponent(id)).then(function (lookupResult) { | |
// A lookup request should always return 1 result | |
var geocodeResult = lookupResult.response.docs[0]; | |
geocodeResult.centroide_ll = wktPointToGeoJson(geocodeResult.centroide_ll); | |
geocodeResult.centroide_rd = wktPointToGeoJson(geocodeResult.centroide_rd); | |
return geocodeResult; | |
}); | |
}; | |
geocoder.createControl = function (zoomFunction, map) { | |
var _this = this; | |
this.zoomTo = zoomFunction; | |
this.map = map; | |
var container = document.createElement('div'); | |
var searchDiv = document.createElement('div'); | |
var input = document.createElement('input'); | |
var results = document.createElement('div'); | |
var controlWidth = '300px'; | |
container.style.width = controlWidth; | |
container.style.zIndex = 1000000; | |
container.style.position = 'absolute'; | |
container.style.top = '15px'; | |
container.style.left = '12px'; | |
input.id = 'nlmaps-geocoder-control-input'; | |
input.placeholder = 'Zoeken op adres...'; | |
input.style.padding = '4px 10px'; | |
input.style.width = '100%'; | |
input.style.border = 'none'; | |
input.style.backgroundColor = '#fff'; | |
input.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
input.style.height = '26px'; | |
input.style.borderRadius = '5px 5px'; | |
input.setAttribute('aria-label', 'Zoek een adres'); | |
input.addEventListener('input', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
input.addEventListener('focus', function (e) { | |
_this.suggest(e.target.value); | |
}); | |
results.id = 'nlmaps-geocoder-control-results'; | |
results.style.width = controlWidth; | |
container.appendChild(searchDiv); | |
searchDiv.appendChild(input); | |
container.appendChild(results); | |
return container; | |
}; | |
geocoder.suggest = function (query) { | |
var _this2 = this; | |
if (query.length < 4) { | |
this.clearSuggestResults(); | |
return; | |
} | |
this.doSuggestRequest(query).then(function (results) { | |
_this2.showSuggestResults(results.response.docs); | |
}); | |
}; | |
geocoder.lookup = function (id) { | |
var _this3 = this; | |
this.doLookupRequest(id).then(function (result) { | |
_this3.zoomTo(result.centroide_ll, _this3.map); | |
_this3.showLookupResult(result.weergavenaam); | |
_this3.clearSuggestResults(); | |
}); | |
}; | |
geocoder.clearSuggestResults = function () { | |
document.getElementById('nlmaps-geocoder-control-results').innerHTML = ''; | |
}; | |
geocoder.showLookupResult = function (name) { | |
document.getElementById('nlmaps-geocoder-control-input').value = name; | |
}; | |
geocoder.showSuggestResults = function (results) { | |
var _this4 = this; | |
var resultList = document.createElement('ul'); | |
resultList.style.padding = '10px 10px 2px 10px'; | |
resultList.style.width = '100%'; | |
resultList.style.background = '#FFFFFF'; | |
resultList.style.borderRadius = '5px 5px'; | |
resultList.style.boxShadow = '0 1px 5px rgba(0, 0, 0, 0.65)'; | |
results.forEach(function (result) { | |
var li = document.createElement('li'); | |
li.innerHTML = result.weergavenaam; | |
li.id = result.id; | |
li.style.cursor = 'pointer'; | |
li.style.padding = '5px'; | |
li.style.listStyleType = 'none'; | |
li.style.marginBottom = '5px'; | |
li.addEventListener('click', function (e) { | |
_this4.lookup(e.target.id); | |
}); | |
li.addEventListener('mouseenter', function () { | |
li.style.background = '#6C62A6'; | |
li.style.color = '#FFFFFF'; | |
}); | |
li.addEventListener('mouseleave', function () { | |
li.style.background = '#FFFFFF'; | |
li.style.color = '#333'; | |
}); | |
resultList.appendChild(li); | |
}); | |
this.clearSuggestResults(); | |
document.getElementById('nlmaps-geocoder-control-results').appendChild(resultList); | |
}; | |
var markerUrl = 'https://rawgit.com/webmapper/nlmaps/master/dist/assets/rijksoverheid-marker.png'; | |
/*parts copied from maps.stamen.com: https://github.com/stamen/maps.stamen.com/blob/master/js/tile.stamen.js | |
* copyright (c) 2012, Stamen Design | |
* under BSD 3-Clause license: https://github.com/stamen/maps.stamen.com/blob/master/LICENSE | |
*/ | |
var markerStore = {}; | |
function singleClick(map) { | |
return function singleMarker(t, d) { | |
if (t === 1) { | |
if (markerStore.marker) { | |
markerStore.marker.remove(); | |
// if (spatialEq(marker.marker._latlng, d.latlng )) { | |
// return; | |
// } | |
} | |
var newmarker = L.marker([d.latlng.lat, d.latlng.lng], { | |
alt: 'marker', | |
icon: new L.icon({ | |
iconUrl: markerUrl, | |
iconSize: [64, 64], | |
iconAnchor: [32, 63] | |
}) | |
}); | |
markerStore.marker = newmarker; | |
markerStore.marker.addTo(map); | |
var div = document.createElement('div'); | |
var button = document.createElement('button'); | |
var p = document.createElement('p'); | |
if (d.queryResult !== null) { | |
p.innerText = d.queryResult._display; | |
} else { | |
p.innerText = 'geen zoekresultaten'; | |
} | |
div.append(p); | |
button.innerHTML = 'verwijder'; | |
button.addEventListener('click', function (e) { | |
markerStore.marker.remove(); | |
delete markerStore.marker; | |
}); | |
div.append(button); | |
var popup = L.popup({ offset: [0, -50] }).setContent(div); | |
markerStore.marker.bindPopup(popup).openPopup(); | |
} | |
}; | |
} | |
//import markersWithQueryResults from '../../lib/index.js'; | |
var nlmaps = { | |
leaflet: { | |
bgLayer: nlmapsLeaflet_cjs_1, | |
overlayLayer: nlmapsLeaflet_cjs_2, | |
markerLayer: nlmapsLeaflet_cjs_3, | |
geocoderControl: nlmapsLeaflet_cjs_6, | |
geoLocatorControl: nlmapsLeaflet_cjs_5 | |
}, | |
openlayers: { | |
bgLayer: nlmapsOpenlayers_cjs_1, | |
overlayLayer: nlmapsOpenlayers_cjs_2, | |
markerLayer: nlmapsOpenlayers_cjs_3, | |
geocoderControl: nlmapsOpenlayers_cjs_6, | |
geoLocatorControl: nlmapsOpenlayers_cjs_5 | |
}, | |
googlemaps: { | |
bgLayer: nlmapsGooglemaps_cjs_1, | |
overlayLayer: nlmapsGooglemaps_cjs_2, | |
markerLayer: nlmapsGooglemaps_cjs_3, | |
geoLocatorControl: nlmapsGooglemaps_cjs_5, | |
geocoderControl: nlmapsGooglemaps_cjs_6 | |
} | |
}; | |
//for future use | |
var geoLocateDefaultOpts$1 = {}; | |
function testWhichLib() { | |
var defined = []; | |
if ((typeof L === 'undefined' ? 'undefined' : _typeof(L)) === 'object') { | |
defined.push('leaflet'); | |
} | |
if ((typeof google === 'undefined' ? 'undefined' : _typeof(google)) === 'object' && _typeof(google.maps) === 'object') { | |
defined.push('googlemaps'); | |
} | |
if ((typeof ol === 'undefined' ? 'undefined' : _typeof(ol)) === 'object') { | |
defined.push('openlayers'); | |
} | |
if (defined.length > 1) { | |
return 'too many libs'; | |
} else if (defined.length === 0) { | |
return 'too few libs'; | |
} else { | |
return defined[0]; | |
} | |
} | |
function initMap(lib, opts) { | |
var map = void 0; | |
switch (lib) { | |
case 'leaflet': | |
map = L.map(opts.target).setView([opts.center.latitude, opts.center.longitude], opts.zoom); | |
map.zoomControl.setPosition('bottomleft'); | |
break; | |
case 'googlemaps': | |
map = new google.maps.Map(document.getElementById(opts.target), { | |
center: { lat: opts.center.latitude, lng: opts.center.longitude }, | |
zoom: opts.zoom, | |
zoomControl: true, | |
zoomControlOptions: { | |
position: google.maps.ControlPosition.LEFT_BOTTOM | |
}, | |
fullscreenControl: false | |
}); | |
break; | |
case 'openlayers': | |
map = new ol.Map({ | |
view: new ol.View({ | |
center: ol.proj.fromLonLat([opts.center.longitude, opts.center.latitude]), | |
zoom: opts.zoom | |
}), | |
target: opts.target | |
}); | |
map.getTargetElement().getElementsByClassName('ol-zoom')[0].style.cssText = "left: 5px !important; bottom: 5px !important"; | |
map.getTargetElement().getElementsByClassName('ol-zoom')[0].classList.remove('ol-zoom'); | |
break; | |
} | |
return map; | |
} | |
function addGoogleLayer(layer, map) { | |
// Markers are not considered to be a layer in google maps. Therefore, they must be added differently. | |
// It is important that a layer has the title 'marker' in order to be recognized as a layer. | |
if (layer.title === 'marker') { | |
layer.setMap(map); | |
return; | |
} | |
var mapTypeIds = [layer.name, 'roadmap']; | |
if (layer.name === 'wms') { | |
map.setOptions({ | |
mapTypeControl: true, | |
mapTypeControlOptions: { | |
mapTypeIds: mapTypeIds, | |
position: google.maps.ControlPosition.BOTTOM_LEFT | |
} | |
}); | |
return; | |
} | |
map.setOptions({ | |
mapTypeControl: true, | |
mapTypeControlOptions: { | |
mapTypeIds: mapTypeIds, | |
position: google.maps.ControlPosition.BOTTOM_LEFT | |
} | |
}); | |
map.mapTypes.set(layer.name, layer); | |
map.setMapTypeId(layer.name); | |
} | |
function addLayerToMap(lib, layer, map) { | |
switch (lib) { | |
case 'leaflet': | |
map.addLayer(layer); | |
break; | |
case 'googlemaps': | |
addGoogleLayer(layer, map); | |
break; | |
case 'openlayers': | |
map.addLayer(layer); | |
break; | |
} | |
} | |
function createBackgroundLayer(lib, map, name) { | |
var bgLayer$$1 = void 0; | |
switch (lib) { | |
case 'leaflet': | |
bgLayer$$1 = nlmaps.leaflet.bgLayer(name); | |
break; | |
case 'googlemaps': | |
bgLayer$$1 = nlmaps.googlemaps.bgLayer(map, name); | |
break; | |
case 'openlayers': | |
bgLayer$$1 = nlmaps.openlayers.bgLayer(name); | |
break; | |
} | |
return bgLayer$$1; | |
} | |
function createOverlayLayer(lib, map, name) { | |
var overlayLayer$$1 = void 0; | |
switch (lib) { | |
case 'leaflet': | |
overlayLayer$$1 = nlmaps.leaflet.overlayLayer(name); | |
break; | |
case 'googlemaps': | |
overlayLayer$$1 = nlmaps.googlemaps.overlayLayer(map, name); | |
break; | |
case 'openlayers': | |
overlayLayer$$1 = nlmaps.openlayers.overlayLayer(name); | |
break; | |
} | |
return overlayLayer$$1; | |
} | |
function createMarkerLayer(lib, map, latLngObject) { | |
var markerLayer$$1 = void 0; | |
switch (lib) { | |
case 'leaflet': | |
markerLayer$$1 = nlmaps.leaflet.markerLayer(latLngObject); | |
break; | |
case 'googlemaps': | |
markerLayer$$1 = nlmaps.googlemaps.markerLayer(latLngObject); | |
break; | |
case 'openlayers': | |
markerLayer$$1 = nlmaps.openlayers.markerLayer(latLngObject); | |
break; | |
} | |
return markerLayer$$1; | |
} | |
function getMapCenter$$1(lib, map) { | |
var mapCenter = void 0; | |
switch (lib) { | |
case 'leaflet': | |
mapCenter = nlmapsLeaflet_cjs_4(map); | |
break; | |
case 'googlemaps': | |
mapCenter = nlmapsGooglemaps_cjs_4(map); | |
break; | |
case 'openlayers': | |
mapCenter = nlmapsOpenlayers_cjs_4(map); | |
break; | |
} | |
return mapCenter; | |
} | |
function mergeOpts(defaultopts, useropts) { | |
return Object.assign({}, defaultopts, useropts); | |
} | |
nlmaps.lib = testWhichLib(); | |
nlmaps.createMap = function () { | |
var useropts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | |
var opts = mergeOpts(CONFIG.MAP, useropts); | |
try { | |
if (nlmaps.lib == 'too many libs' || nlmaps.lib === 'too few libs') { | |
throw { message: 'one and only one map library can be defined. Please Refer to the documentation to see which map libraries are supported.' }; | |
} | |
} catch (e) { | |
// eslint-disable-next-line no-console | |
console.error(e.message); | |
} | |
var map = initMap(nlmaps.lib, opts); | |
// Background layer | |
var backgroundLayer = createBackgroundLayer(nlmaps.lib, map, opts.style); | |
addLayerToMap(nlmaps.lib, backgroundLayer, map, opts.style); | |
// Geocoder | |
if (opts.search) { | |
addGeocoderControlToMap(nlmaps.lib, map); | |
} | |
// Marker layer | |
if (opts.marker) { | |
var markerLocation = opts.marker; | |
if (typeof opts.marker === "boolean") { | |
markerLocation = getMapCenter$$1(nlmaps.lib, map); | |
} | |
markerStore.marker = createMarkerLayer(nlmaps.lib, map, markerLocation); | |
addLayerToMap(nlmaps.lib, markerStore.marker, map); | |
} | |
// Overlay layer | |
if (opts.overlay && opts.overlay !== 'false') { | |
var overlayLayer$$1 = createOverlayLayer(nlmaps.lib, map, opts.overlay); | |
addLayerToMap(nlmaps.lib, overlayLayer$$1, map); | |
} | |
return map; | |
}; | |
function addGeoLocControlToMap(lib, geolocator, map) { | |
var control = void 0; | |
switch (lib) { | |
case 'leaflet': | |
nlmaps[lib].geoLocatorControl(geolocator).addTo(map); | |
break; | |
case 'googlemaps': | |
control = nlmaps[lib].geoLocatorControl(geolocator, map); | |
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(control); | |
break; | |
case 'openlayers': | |
control = nlmaps[lib].geoLocatorControl(geolocator, map); | |
map.addControl(control); | |
break; | |
} | |
} | |
function addGeocoderControlToMap(lib, map) { | |
nlmaps[lib].geocoderControl(map); | |
} | |
nlmaps.geoLocate = function (map) { | |
var useropts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | |
var opts = mergeOpts(geoLocateDefaultOpts$1, useropts); | |
var geolocator = geoLocator(opts); | |
addGeoLocControlToMap(nlmaps.lib, geolocator, map); | |
}; | |
nlmaps.clickprovider = function (map) { | |
return function (start, sink) { | |
if (start !== 0) return; | |
map.on('click', function (e) { | |
sink(1, e); | |
}); | |
var talkback = function talkback(t, d) { | |
console.log('bye bye'); | |
}; | |
sink(0, talkback); | |
}; | |
}; | |
nlmaps.queryFeatures = queryFeatures; | |
nlmaps.singleClick = singleClick; | |
exports.nlmaps = nlmaps; | |
}((this.window = this.window || {}))); | |
//# sourceMappingURL=nlmaps.iife.js.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment