universal-geocoder
Version:
Universal geocoding abstraction server-side and client-side with multiple built-in providers
226 lines • 11.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);
};
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