UNPKG

universal-geocoder

Version:

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

226 lines 11.3 kB
"use strict"; 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); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultNominatimProviderOptions = void 0; var provider_1 = require("./.."); var AdminLevel_1 = __importDefault(require("../../AdminLevel")); var error_1 = require("../../error"); exports.defaultNominatimProviderOptions = __assign(__assign({}, provider_1.defaultProviderOptions), { host: "nominatim.openstreetmap.org", userAgent: "" }); var NominatimProvider = /** @class */ (function () { function NominatimProvider(_externalLoader, options) { if (options === void 0) { options = exports.defaultNominatimProviderOptions; } this.externalLoader = _externalLoader; this.options = __assign(__assign({}, exports.defaultNominatimProviderOptions), options); if (this.options.host === exports.defaultNominatimProviderOptions.host && !this.options.userAgent) { throw new Error('An User-Agent identifying your application is required for the OpenStreetMap / Nominatim provider when using the default host. Please add it in the "userAgent" option.'); } } NominatimProvider.prototype.geocode = function (query, callback, errorCallback) { var _this = this; var _a, _b, _c, _d, _e, _f, _g, _h, _j; var geocodeQuery = provider_1.ProviderHelpers.getGeocodeQueryFromParameter(query, provider_1.NominatimGeocodeQuery); if (geocodeQuery.getIp()) { throw new Error("The OpenStreetMap / Nominatim provider does not support IP geolocation, only location geocoding."); } this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: this.options.host, pathname: "search", }); 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, }, geocodeQuery); if (!callback) { return new Promise(function (resolve, reject) { return _this.executeRequest(params, function (results) { return resolve(results); }, _this.getHeaders(), {}, function (error) { return reject(error); }); }); } return this.executeRequest(params, callback, this.getHeaders(), {}, errorCallback); }; NominatimProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) { var _this = this; var _a; var reverseQuery = provider_1.ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback, provider_1.NominatimReverseQuery); var reverseCallback = provider_1.ProviderHelpers.getCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback); var reverseErrorCallback = provider_1.ProviderHelpers.getErrorCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback, errorCallback); this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: this.options.host, pathname: "reverse", }); 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", }, reverseQuery); if (!reverseCallback) { return new Promise(function (resolve, reject) { return _this.executeRequest(params, function (results) { return resolve(results); }, _this.getHeaders(), {}, function (error) { return reject(error); }); }); } return this.executeRequest(params, reverseCallback, this.getHeaders(), {}, reverseErrorCallback); }; NominatimProvider.prototype.withCommonParams = function (params, query) { var _a; return __assign(__assign({}, params), { format: "jsonv2", addressdetails: "1", polygon_geojson: query.getShape() && query.getShape() === "geojson" ? "1" : undefined, polygon_kml: query.getShape() && query.getShape() === "kml" ? "1" : undefined, polygon_svg: query.getShape() && query.getShape() === "svg" ? "1" : undefined, polygon_text: query.getShape() && query.getShape() === "text" ? "1" : undefined, polygon_threshold: query.getShapeThreshold() ? (_a = query.getShapeThreshold()) === null || _a === void 0 ? void 0 : _a.toString() : undefined, jsonpCallback: this.options.useJsonp ? "json_callback" : undefined, "accept-language": query.getLocale() }); }; NominatimProvider.prototype.getHeaders = function () { return { "User-Agent": this.options.userAgent || "", Referer: this.options.referer, }; }; NominatimProvider.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 error_1.ResponseError(errorMessage_1, data)); return; } setTimeout(function () { throw new Error(errorMessage_1); }); return; } results = [data]; } callback(results.map(function (result) { return NominatimProvider.mapToGeocoded(result); })); }, headers, body, errorCallback); }; NominatimProvider.mapToGeocoded = function (result) { var latitude = parseFloat(result.lat); var longitude = parseFloat(result.lon); var displayName = result.display_name; var streetNumber = result.address.house_number; var streetName = result.address.road || result.address.pedestrian; var subLocality = result.address.suburb; var locality; 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 osmId = result.osm_id; var osmType = result.osm_type; var categories = [result.category]; var types = [result.type]; var attribution = result.licence; var shape = result.geojson || result.geokml || result.svg || result.geotext; var localityTypes = [ "city", "town", "village", "hamlet", ]; localityTypes.forEach(function (localityType) { if (result.address[localityType] && !locality) { locality = result.address[localityType]; } }); var geocoded = provider_1.NominatimGeocoded.create({ coordinates: { latitude: latitude, longitude: longitude, }, displayName: displayName, streetNumber: streetNumber, streetName: streetName, subLocality: subLocality, locality: locality, postalCode: postalCode, region: region, country: country, countryCode: countryCode, osmId: osmId, osmType: osmType, categories: categories, types: types, attribution: attribution, shape: shape, }); 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_1.default.create({ level: level + 1, name: result.address[adminLevel] || "", })); } }); var subLocalityLevels = [ ["city_district", "district", "borough", "suburb", "subdivision"], ["hamlet", "croft", "isolated_dwelling"], ["neighbourhood", "allotments", "quarter"], [ "city_block", "residental", "farm", "farmyard", "industrial", "commercial", "retail", ], ["road"], ["house_name"], ]; subLocalityLevels.forEach(function (subLocalities, level) { subLocalities.forEach(function (subLocalityLevel) { if (result.address[subLocalityLevel]) { geocoded.addSubLocalityLevel(AdminLevel_1.default.create({ level: level + 1, name: result.address[subLocalityLevel] || "", })); } }); }); return geocoded; }; return NominatimProvider; }()); exports.default = NominatimProvider; //# sourceMappingURL=NominatimProvider.js.map