universal-geocoder
Version:
Universal geocoding abstraction server-side and client-side with multiple built-in providers
199 lines • 10.3 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 { 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