UNPKG

universal-geocoder

Version:

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

199 lines 10.3 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 { LocationIQGeocoded, LocationIQGeocodeQuery, LocationIQReverseQuery, ProviderHelpers, defaultProviderOptions, } from "./.."; import AdminLevel from "../../AdminLevel"; import { ResponseError } from "../../error"; export var defaultLocationIQProviderOptions = __assign(__assign({}, defaultProviderOptions), { apiKey: "", source: "locationiq" }); var LocationIQProvider = /** @class */ (function () { function LocationIQProvider(_externalLoader, options) { if (options === void 0) { options = defaultLocationIQProviderOptions; } this.externalLoader = _externalLoader; this.options = __assign(__assign({}, defaultLocationIQProviderOptions), options); if (!this.options.apiKey) { throw new Error('An API key is required for the LocationIQ provider. Please add it in the "apiKey" option.'); } if (!["locationiq", "nominatim"].includes(this.options.source || "")) { throw new Error('The "source" option must either be "locationiq" or "nominatim".'); } } LocationIQProvider.prototype.geocode = function (query, callback, errorCallback) { var _this = this; var _a, _b, _c, _d, _e, _f, _g, _h, _j; var geocodeQuery = ProviderHelpers.getGeocodeQueryFromParameter(query, LocationIQGeocodeQuery); if (geocodeQuery.getIp()) { throw new Error("The LocationIQ provider does not support IP geolocation, only location geocoding."); } this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "locationiq.com", pathname: "v1/search.php", }); var params = this.withCommonParams({ q: geocodeQuery.getText(), limit: geocodeQuery.getLimit().toString(), countrycodes: geocodeQuery.getCountryCodes() ? (_a = geocodeQuery.getCountryCodes()) === null || _a === void 0 ? void 0 : _a.join(",") : (_b = this.options.countryCodes) === null || _b === void 0 ? void 0 : _b.join(","), exclude_place_ids: (geocodeQuery).getExcludePlaceIds() ? (_c = geocodeQuery .getExcludePlaceIds()) === null || _c === void 0 ? void 0 : _c.join(",") : undefined, viewbox: geocodeQuery.getBounds() ? ((_d = geocodeQuery.getBounds()) === null || _d === void 0 ? void 0 : _d.longitudeSW) + "," + ((_e = geocodeQuery.getBounds()) === null || _e === void 0 ? void 0 : _e.latitudeSW) + "," + ((_f = geocodeQuery.getBounds()) === null || _f === void 0 ? void 0 : _f.longitudeNE) + "," + ((_g = geocodeQuery.getBounds()) === null || _g === void 0 ? void 0 : _g.latitudeNE) : undefined, bounded: geocodeQuery.getBounded() ? (_h = geocodeQuery.getBounded()) === null || _h === void 0 ? void 0 : _h.toString() : undefined, dedupe: geocodeQuery.getDedupe() ? (_j = geocodeQuery.getDedupe()) === null || _j === void 0 ? void 0 : _j.toString() : undefined, matchquality: "1", }, 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); }; LocationIQProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) { var _this = this; var _a; var reverseQuery = ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback, LocationIQReverseQuery); var reverseCallback = ProviderHelpers.getCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback); var reverseErrorCallback = ProviderHelpers.getErrorCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback, errorCallback); this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "locationiq.com", pathname: "v1/reverse.php", }); var params = this.withCommonParams({ lat: reverseQuery.getCoordinates().latitude.toString(), lon: reverseQuery.getCoordinates().longitude.toString(), zoom: ((_a = reverseQuery.getZoom()) === null || _a === void 0 ? void 0 : _a.toString()) || "18", showdistance: "1", }, 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); }; LocationIQProvider.prototype.withCommonParams = function (params, query) { return __assign(__assign({}, params), { key: this.options.apiKey || "", format: "json", addressdetails: "1", "accept-language": query.getLocale(), jsonpCallback: this.options.useJsonp ? "json_callback" : undefined, normalizeaddress: "1", normalizecity: "1", statecode: "1", postaladdress: "1", source: this.options.source === "nominatim" ? "nom" : undefined }); }; LocationIQProvider.prototype.executeRequest = function (params, callback, headers, body, errorCallback) { this.externalLoader.executeRequest(params, function (data) { var results = data; if (!Array.isArray(data)) { if (data.error) { var errorMessage_1 = "An error has occurred: " + data.error; if (errorCallback) { errorCallback(new ResponseError(errorMessage_1, data)); return; } setTimeout(function () { throw new Error(errorMessage_1); }); return; } results = [data]; } callback(results.map(function (result) { return LocationIQProvider.mapToGeocoded(result); })); }, headers, body, errorCallback); }; LocationIQProvider.mapToGeocoded = function (result) { var _a, _b, _c; var latitude = parseFloat(result.lat); var longitude = parseFloat(result.lon); var formattedAddress = result.postal_address; var displayName = result.display_name; var streetNumber = result.address.house_number; var streetName = result.address.road; var subLocality = result.address.suburb; var locality = result.address.city; var postalCode = result.address.postcode ? result.address.postcode.split(";")[0] : undefined; var region = result.address.state; var country = result.address.country; var countryCode = result.address.country_code; var placeId = result.place_id; var osmId = result.osm_id; var osmType = result.osm_type; var categories = result.class ? [result.class] : []; var distance = result.distance; var types = result.type ? [result.type] : []; var precision = (_a = result.matchquality) === null || _a === void 0 ? void 0 : _a.matchlevel; var precisionCode = (_b = result.matchquality) === null || _b === void 0 ? void 0 : _b.matchcode; var precisionType = (_c = result.matchquality) === null || _c === void 0 ? void 0 : _c.matchtype; var attribution = result.licence; var geocoded = LocationIQGeocoded.create({ coordinates: { latitude: latitude, longitude: longitude, }, formattedAddress: formattedAddress, displayName: displayName, streetNumber: streetNumber, streetName: streetName, subLocality: subLocality, locality: locality, postalCode: postalCode, region: region, country: country, countryCode: countryCode, placeId: placeId, osmId: osmId, osmType: osmType, categories: categories, types: types, distance: distance, precision: precision, precisionCode: precisionCode, precisionType: precisionType, attribution: attribution, }); geocoded = geocoded.withBounds({ latitudeSW: parseFloat(result.boundingbox[0]), longitudeSW: parseFloat(result.boundingbox[2]), latitudeNE: parseFloat(result.boundingbox[1]), longitudeNE: parseFloat(result.boundingbox[3]), }); var adminLevels = ["state", "county"]; adminLevels.forEach(function (adminLevel, level) { if (result.address[adminLevel]) { geocoded.addAdminLevel(AdminLevel.create({ level: level + 1, name: result.address[adminLevel] || "", code: adminLevel === "state" ? result.address.state_code : undefined, })); } }); var subLocalityLevels = ["suburb", "neighbourhood", "road", "name"]; subLocalityLevels.forEach(function (subLocalityLevel, level) { if (result.address[subLocalityLevel]) { geocoded.addSubLocalityLevel(AdminLevel.create({ level: level + 1, name: result.address[subLocalityLevel] || "", })); } }); return geocoded; }; return LocationIQProvider; }()); export default LocationIQProvider; //# sourceMappingURL=LocationIQProvider.js.map