universal-geocoder
Version:
Universal geocoding abstraction server-side and client-side with multiple built-in providers
144 lines • 6.87 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);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultBingProviderOptions = void 0;
var provider_1 = require("./..");
var AdminLevel_1 = __importDefault(require("../../AdminLevel"));
var error_1 = require("../../error");
exports.defaultBingProviderOptions = __assign(__assign({}, provider_1.defaultProviderOptions), { apiKey: "" });
var BingProvider = /** @class */ (function () {
function BingProvider(_externalLoader, options) {
if (options === void 0) { options = exports.defaultBingProviderOptions; }
this.externalLoader = _externalLoader;
this.options = __assign(__assign({}, exports.defaultBingProviderOptions), options);
if (!this.options.apiKey) {
throw new Error('An API key is required for the Bing provider. Please add it in the "apiKey" option.');
}
}
BingProvider.prototype.geocode = function (query, callback, errorCallback) {
var _this = this;
var geocodeQuery = provider_1.ProviderHelpers.getGeocodeQueryFromParameter(query);
if (geocodeQuery.getIp()) {
throw new Error("The Bing provider does not support IP geolocation, only location geocoding.");
}
this.externalLoader.setOptions({
protocol: this.options.useSsl ? "https" : "http",
host: "dev.virtualearth.net",
pathname: "REST/v1/Locations/" + geocodeQuery.getText(),
});
var params = this.withCommonParams({
maxRes: geocodeQuery.getLimit()
? geocodeQuery.getLimit().toString()
: 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);
};
BingProvider.prototype.geodecode = function (latitudeOrQuery, longitudeOrCallback, callbackOrErrorCallback, errorCallback) {
var _this = this;
var reverseQuery = provider_1.ProviderHelpers.getReverseQueryFromParameters(latitudeOrQuery, longitudeOrCallback);
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: "dev.virtualearth.net",
pathname: "REST/v1/Locations/" + reverseQuery.getCoordinates().latitude + "," + reverseQuery.getCoordinates().longitude,
});
var params = this.withCommonParams({}, 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);
};
BingProvider.prototype.withCommonParams = function (params, query) {
return __assign(__assign({}, params), { key: this.options.apiKey, incl: "ciso2", c: query.getLocale(), jsonpCallback: this.options.useJsonp ? "jsonp" : undefined });
};
BingProvider.prototype.executeRequest = function (params, callback, headers, body, errorCallback) {
this.externalLoader.executeRequest(params, function (data) {
callback(data.resourceSets[0].resources.map(function (result) {
return BingProvider.mapToGeocoded(result, data.copyright);
}));
}, headers, body, function (error) {
var response = error.getResponse();
response.json().then(function (data) {
var errorMessage = data.errorDetails && data.errorDetails.length > 0
? data.errorDetails[0]
: data.statusDescription || "";
if (errorCallback) {
errorCallback(new error_1.ResponseError(errorMessage, data));
return;
}
setTimeout(function () {
throw new Error(errorMessage);
});
});
});
};
BingProvider.mapToGeocoded = function (result, attribution) {
var latitude = result.point.coordinates[0];
var longitude = result.point.coordinates[1];
var formattedAddress = result.address.formattedAddress;
var streetName = result.address.addressLine;
var _a = result.address, locality = _a.locality, postalCode = _a.postalCode;
var region = result.address.adminDistrict;
var country = result.address.countryRegion;
var countryCode = result.address.countryRegionIso2;
var precision = result.confidence;
var geocoded = provider_1.BingGeocoded.create({
coordinates: {
latitude: latitude,
longitude: longitude,
},
formattedAddress: formattedAddress,
streetName: streetName,
locality: locality,
postalCode: postalCode,
region: region,
country: country,
countryCode: countryCode,
attribution: attribution,
precision: precision,
});
geocoded = geocoded.withBounds({
latitudeSW: result.bbox[0],
longitudeSW: result.bbox[1],
latitudeNE: result.bbox[2],
longitudeNE: result.bbox[3],
});
var adminLevels = [
"adminDistrict",
"adminDistrict2",
];
adminLevels.forEach(function (adminLevel, level) {
if (result.address[adminLevel]) {
geocoded.addAdminLevel(AdminLevel_1.default.create({
level: level + 1,
name: result.address[adminLevel] || "",
}));
}
});
return geocoded;
};
return BingProvider;
}());
exports.default = BingProvider;
//# sourceMappingURL=BingProvider.js.map