UNPKG

universal-geocoder

Version:

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

150 lines 8 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 { ProviderHelpers, YandexGeocoded, YandexGeocodeQuery, YandexReverseQuery, defaultProviderOptions, } from "./.."; import AdminLevel from "../../AdminLevel"; import { flattenObject } from "../../utils"; export var defaultYandexProviderOptions = __assign(__assign({}, defaultProviderOptions), { apiKey: "" }); var YandexProvider = /** @class */ (function () { function YandexProvider(_externalLoader, options) { if (options === void 0) { options = defaultYandexProviderOptions; } this.externalLoader = _externalLoader; this.options = __assign(__assign({}, defaultYandexProviderOptions), options); if (!this.options.apiKey) { throw new Error('An API key is required for the Yandex provider. Please add it in the "apiKey" option.'); } } YandexProvider.prototype.geocode = function (query, callback, errorCallback) { var _this = this; var _a, _b, _c, _d, _e, _f, _g, _h; var geocodeQuery = ProviderHelpers.getGeocodeQueryFromParameter(query, YandexGeocodeQuery); if (geocodeQuery.getIp()) { throw new Error("The Yandex provider does not support IP geolocation, only location geocoding."); } this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "geocode-maps.yandex.ru", pathname: "1.x", }); var rspn; if (geocodeQuery.getBounded() === false) { rspn = "0"; } else if (geocodeQuery.getBounded() === true) { rspn = "1"; } var params = this.withCommonParams({ geocode: geocodeQuery.getText() || "", rspn: rspn, ll: geocodeQuery.getProximity() ? ((_a = geocodeQuery.getProximity()) === null || _a === void 0 ? void 0 : _a.longitude) + "," + ((_b = geocodeQuery.getProximity()) === null || _b === void 0 ? void 0 : _b.latitude) : undefined, spn: geocodeQuery.getSpan() ? ((_c = geocodeQuery.getSpan()) === null || _c === void 0 ? void 0 : _c.spanLongitude) + "," + ((_d = geocodeQuery.getSpan()) === null || _d === void 0 ? void 0 : _d.spanLatitude) : undefined, bbox: geocodeQuery.getBounds() ? ((_e = geocodeQuery.getBounds()) === null || _e === void 0 ? void 0 : _e.longitudeSW) + "," + ((_f = geocodeQuery.getBounds()) === null || _f === void 0 ? void 0 : _f.latitudeSW) + "~" + ((_g = geocodeQuery.getBounds()) === null || _g === void 0 ? void 0 : _g.longitudeNE) + "," + ((_h = geocodeQuery.getBounds()) === null || _h === void 0 ? void 0 : _h.latitudeNE) : 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); }; YandexProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) { var _this = this; var _a; var reverseQuery = ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback, YandexReverseQuery); var reverseCallback = ProviderHelpers.getCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback); var reverseErrorCallback = ProviderHelpers.getErrorCallbackFromParameters(longitudeOrCallback, callbackOrErrorCallback, errorCallback); this.externalLoader.setOptions({ protocol: this.options.useSsl ? "https" : "http", host: "geocode-maps.yandex.ru", pathname: "1.x", }); var params = this.withCommonParams({ geocode: reverseQuery.getCoordinates().longitude + "," + reverseQuery.getCoordinates().latitude, kind: reverseQuery.getTypes() ? (_a = reverseQuery.getTypes()) === null || _a === void 0 ? void 0 : _a[0] : undefined, }, 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); }; YandexProvider.prototype.withCommonParams = function (params, query) { var _a; return __assign(__assign({}, params), { apikey: this.options.apiKey, format: "json", lang: query.getLocale(), results: query.getLimit().toString(), skip: (_a = query.getSkip()) === null || _a === void 0 ? void 0 : _a.toString(), jsonpCallback: this.options.useJsonp ? "callback" : undefined }); }; YandexProvider.prototype.executeRequest = function (params, callback, headers, body, errorCallback) { this.externalLoader.executeRequest(params, function (data) { callback(data.response.GeoObjectCollection.featureMember.map(function (result) { return YandexProvider.mapToGeocoded(result.GeoObject); })); }, headers, body, errorCallback); }; YandexProvider.mapToGeocoded = function (result) { var point = result.Point.pos.split(" "); var latitude = parseFloat(point[1]); var longitude = parseFloat(point[0]); var addressDetails = flattenObject(result.metaDataProperty.GeocoderMetaData.AddressDetails); var streetNumber = addressDetails.PremiseNumber; var streetName = addressDetails.ThoroughfareName; var subLocality = addressDetails.DependentLocalityName; var locality = addressDetails.LocalityName; var region = addressDetails.AdministrativeAreaName; var country = addressDetails.CountryName; var countryCode = addressDetails.CountryNameCode; var types = [result.metaDataProperty.GeocoderMetaData.kind]; var precision = result.metaDataProperty.GeocoderMetaData.precision; var geocoded = YandexGeocoded.create({ coordinates: { latitude: latitude, longitude: longitude, }, streetNumber: streetNumber, streetName: streetName, subLocality: subLocality, locality: locality, region: region, country: country, countryCode: countryCode, types: types, precision: precision, }); var adminLevels = ["AdministrativeAreaName", "SubAdministrativeAreaName"]; adminLevels.forEach(function (adminLevel, level) { if (addressDetails[adminLevel]) { geocoded.addAdminLevel(AdminLevel.create({ level: level + 1, name: addressDetails[adminLevel] || "", })); } }); var lowerCorner = result.boundedBy.Envelope.lowerCorner.split(" "); var upperCorner = result.boundedBy.Envelope.upperCorner.split(" "); geocoded = geocoded.withBounds({ latitudeSW: parseFloat(lowerCorner[1]), longitudeSW: parseFloat(lowerCorner[0]), latitudeNE: parseFloat(upperCorner[1]), longitudeNE: parseFloat(upperCorner[0]), }); return geocoded; }; return YandexProvider; }()); export default YandexProvider; //# sourceMappingURL=YandexProvider.js.map