UNPKG

universal-geocoder

Version:

Universal geocoding abstraction server-side and client-side with multiple built-in providers

138 lines 6.54 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { BingGeocoded, ProviderHelpers, defaultProviderOptions, } from "./.."; import AdminLevel from "../../AdminLevel"; import { ResponseError } from "../../error"; export var defaultBingProviderOptions = __assign(__assign({}, defaultProviderOptions), { apiKey: "" }); var BingProvider = /** @class */ (function () { function BingProvider(_externalLoader, options) { if (options === void 0) { options = defaultBingProviderOptions; } this.externalLoader = _externalLoader; this.options = __assign(__assign({}, defaultBingProviderOptions), options); if (!this.options.apiKey) { throw new Error('An API key is required for the Bing provider. Please add it in the "apiKey" option.'); } } BingProvider.prototype.geocode = function (query, callback, errorCallback) { var _this = this; var geocodeQuery = ProviderHelpers.getGeocodeQueryFromParameter(query); if (geocodeQuery.getIp()) { throw new Error("The Bing provider does not support IP geolocation, only location geocoding."); } this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "dev.virtualearth.net", pathname: "REST/v1/Locations/" + geocodeQuery.getText(), }); var params = this.withCommonParams({ maxRes: geocodeQuery.getLimit() ? geocodeQuery.getLimit().toString() : undefined, }, geocodeQuery); if (!callback) { return new Promise(function (resolve, reject) { return _this.executeRequest(params, function (results) { return resolve(results); }, {}, {}, function (error) { return reject(error); }); }); } return this.executeRequest(params, callback, {}, {}, errorCallback); }; BingProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) { var _this = this; var reverseQuery = ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback); var reverseCallback = ProviderHelpers.getCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback); var reverseErrorCallback = ProviderHelpers.getErrorCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback, errorCallback); this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "dev.virtualearth.net", pathname: "REST/v1/Locations/" + reverseQuery.getCoordinates().latitude + "," + reverseQuery.getCoordinates().longitude, }); var params = this.withCommonParams({}, reverseQuery); if (!reverseCallback) { return new Promise(function (resolve, reject) { return _this.executeRequest(params, function (results) { return resolve(results); }, {}, {}, function (error) { return reject(error); }); }); } return this.executeRequest(params, reverseCallback, {}, {}, reverseErrorCallback); }; BingProvider.prototype.withCommonParams = function (params, query) { return __assign(__assign({}, params), { key: this.options.apiKey, incl: "ciso2", c: query.getLocale(), jsonpCallback: this.options.useJsonp ? "jsonp" : undefined }); }; BingProvider.prototype.executeRequest = function (params, callback, headers, body, errorCallback) { this.externalLoader.executeRequest(params, function (data) { callback(data.resourceSets[0].resources.map(function (result) { return BingProvider.mapToGeocoded(result, data.copyright); })); }, headers, body, function (error) { var response = error.getResponse(); response.json().then(function (data) { var errorMessage = data.errorDetails && data.errorDetails.length > 0 ? data.errorDetails[0] : data.statusDescription || ""; if (errorCallback) { errorCallback(new ResponseError(errorMessage, data)); return; } setTimeout(function () { throw new Error(errorMessage); }); }); }); }; BingProvider.mapToGeocoded = function (result, attribution) { var latitude = result.point.coordinates[0]; var longitude = result.point.coordinates[1]; var formattedAddress = result.address.formattedAddress; var streetName = result.address.addressLine; var _a = result.address, locality = _a.locality, postalCode = _a.postalCode; var region = result.address.adminDistrict; var country = result.address.countryRegion; var countryCode = result.address.countryRegionIso2; var precision = result.confidence; var geocoded = BingGeocoded.create({ coordinates: { latitude: latitude, longitude: longitude, }, formattedAddress: formattedAddress, streetName: streetName, locality: locality, postalCode: postalCode, region: region, country: country, countryCode: countryCode, attribution: attribution, precision: precision, }); geocoded = geocoded.withBounds({ latitudeSW: result.bbox[0], longitudeSW: result.bbox[1], latitudeNE: result.bbox[2], longitudeNE: result.bbox[3], }); var adminLevels = [ "adminDistrict", "adminDistrict2", ]; adminLevels.forEach(function (adminLevel, level) { if (result.address[adminLevel]) { geocoded.addAdminLevel(AdminLevel.create({ level: level + 1, name: result.address[adminLevel] || "", })); } }); return geocoded; }; return BingProvider; }()); export default BingProvider; //# sourceMappingURL=BingProvider.js.map