UNPKG

universal-geocoder

Version:

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

225 lines 11.5 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 { OpenCageGeocoded, OpenCageGeocodeQuery, OpenCageReverseQuery, ProviderHelpers, defaultProviderOptions, } from "./.."; import AdminLevel from "../../AdminLevel"; import { ResponseError } from "../../error"; export var defaultOpenCageProviderOptions = __assign(__assign({}, defaultProviderOptions), { apiKey: "" }); var OpenCageProvider = /** @class */ (function () { function OpenCageProvider(_externalLoader, options) { if (options === void 0) { options = defaultOpenCageProviderOptions; } this.externalLoader = _externalLoader; this.options = __assign(__assign({}, defaultOpenCageProviderOptions), options); if (!this.options.apiKey) { throw new Error('An API key is required for the OpenCage provider. Please add it in the "apiKey" option.'); } } OpenCageProvider.prototype.geocode = function (query, callback, errorCallback) { var _this = this; var _a, _b, _c, _d, _e, _f; var geocodeQuery = ProviderHelpers.getGeocodeQueryFromParameter(query, OpenCageGeocodeQuery); if (geocodeQuery.getIp()) { throw new Error("The OpenCage provider does not support IP geolocation, only location geocoding."); } this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "api.opencagedata.com", pathname: "geocode/v1/json", }); var params = this.withCommonParams({ q: geocodeQuery.getText() || "", bounds: geocodeQuery.getBounds() ? ((_a = geocodeQuery.getBounds()) === null || _a === void 0 ? void 0 : _a.longitudeSW) + "," + ((_b = geocodeQuery.getBounds()) === null || _b === void 0 ? void 0 : _b.latitudeSW) + "," + ((_c = geocodeQuery.getBounds()) === null || _c === void 0 ? void 0 : _c.longitudeNE) + "," + ((_d = geocodeQuery.getBounds()) === null || _d === void 0 ? void 0 : _d.latitudeNE) : undefined, proximity: geocodeQuery.getProximity() ? ((_e = geocodeQuery.getProximity()) === null || _e === void 0 ? void 0 : _e.latitude) + "," + ((_f = geocodeQuery.getProximity()) === null || _f === void 0 ? void 0 : _f.longitude) : 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); }; OpenCageProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) { var _this = this; var reverseQuery = ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback, OpenCageReverseQuery); var reverseCallback = ProviderHelpers.getCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback); var reverseErrorCallback = ProviderHelpers.getErrorCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback, errorCallback); this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "api.opencagedata.com", pathname: "geocode/v1/json", }); var params = this.withCommonParams({ q: reverseQuery.getCoordinates().latitude + "," + reverseQuery.getCoordinates().longitude, }, 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); }; OpenCageProvider.prototype.withCommonParams = function (params, query) { var _a, _b, _c, _d; return __assign(__assign({}, params), { key: this.options.apiKey || "", countrycode: query.getCountryCodes() ? (_a = query.getCountryCodes()) === null || _a === void 0 ? void 0 : _a.join(",") : (_b = this.options.countryCodes) === null || _b === void 0 ? void 0 : _b.join(","), language: query.getLocale(), limit: query.getLimit().toString(), min_confidence: (_c = query.getMinPrecision()) === null || _c === void 0 ? void 0 : _c.toString(), no_record: (_d = query.getNoRecord()) === null || _d === void 0 ? void 0 : _d.toString(), jsonpCallback: this.options.useJsonp ? "jsonp" : undefined }); }; OpenCageProvider.prototype.executeRequest = function (params, callback, headers, body, errorCallback) { this.externalLoader.executeRequest(params, function (data) { callback(data.results.map(function (result) { return OpenCageProvider.mapToGeocoded(result); })); }, headers, body, function (error) { var response = error.getResponse(); response.json().then(function (data) { if (data.status) { var errorMessage_1; switch (data.status.code) { case 400: errorMessage_1 = "Invalid request (400): " + data.status.message; break; case 401: errorMessage_1 = "Unable to authenticate (401): " + data.status.message; break; case 402: errorMessage_1 = "Quota exceeded (402): " + data.status.message; break; case 403: errorMessage_1 = "Forbidden (403): " + data.status.message; break; case 404: errorMessage_1 = "Invalid API endpoint (404): " + data.status.message; break; case 405: errorMessage_1 = "Method not allowed (405): " + data.status.message; break; case 408: errorMessage_1 = "Timeout (408): " + data.status.message; break; case 410: errorMessage_1 = "Request too long (410): " + data.status.message; break; case 429: errorMessage_1 = "Too many requests (429): " + data.status.message; break; case 503: errorMessage_1 = "Internal server error (503): " + data.status.message; break; default: errorMessage_1 = "Error (" + data.status.code + "): " + data.status.message; } if (errorCallback) { errorCallback(new ResponseError(errorMessage_1, data)); return; } setTimeout(function () { throw new Error(errorMessage_1); }); } }); }); }; OpenCageProvider.mapToGeocoded = function (result) { var _a; var latitude = result.geometry.lat; var longitude = result.geometry.lng; var formattedAddress = result.formatted; var streetNumber = result.components.house_number; var postalCode = result.components.postcode; var region = result.components.state; var country = result.components.country; var countryCode = result.components.country_code; var timezone = result.annotations.timezone.name; var callingCode = result.annotations.callingcode; var flag = result.annotations.flag; var precision = result.confidence; var mgrs = result.annotations.MGRS; var maidenhead = result.annotations.Maidenhead; var geohash = result.annotations.geohash; var what3words = (_a = result.annotations.what3words) === null || _a === void 0 ? void 0 : _a.words; var streetName = result.components.road || result.components.footway || result.components.street || result.components.street_name || result.components.residential || result.components.path || result.components.pedestrian || result.components.road_reference || result.components.road_reference_intl; var subLocality = result.components.neighbourhood || result.components.suburb || result.components.city_district || result.components.district || result.components.quarter || result.components.houses || result.components.subdivision; var locality = result.components.city || result.components.town || result.components.municipality || result.components.village || result.components.hamlet || result.components.locality || result.components.croft; var geocoded = OpenCageGeocoded.create({ coordinates: { latitude: latitude, longitude: longitude, }, formattedAddress: formattedAddress, streetNumber: streetNumber, streetName: streetName, subLocality: subLocality, locality: locality, postalCode: postalCode, region: region, country: country, countryCode: countryCode, timezone: timezone, callingCode: callingCode, flag: flag, precision: precision, mgrs: mgrs, maidenhead: maidenhead, geohash: geohash, what3words: what3words, }); if (result.bounds) { geocoded = geocoded.withBounds({ latitudeSW: result.bounds.southwest.lat, longitudeSW: result.bounds.southwest.lng, latitudeNE: result.bounds.northeast.lat, longitudeNE: result.bounds.northeast.lng, }); } var adminLevels = [ { nameKey: "state", codeKey: "state_code" }, { nameKey: "county", codeKey: "county_code" }, ]; adminLevels.forEach(function (_a, level) { var nameKey = _a.nameKey, codeKey = _a.codeKey; if (result.components[nameKey]) { geocoded.addAdminLevel(AdminLevel.create({ level: level + 1, name: result.components[nameKey] || "", code: result.components[codeKey] || undefined, })); } }); return geocoded; }; return OpenCageProvider; }()); export default OpenCageProvider; //# sourceMappingURL=OpenCageProvider.js.map