universal-geocoder
Version:
Universal geocoding abstraction server-side and client-side with multiple built-in providers
150 lines • 8 kB
JavaScript
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