From df782a815b424697ffbaf563263e7c8436c14e60 Mon Sep 17 00:00:00 2001 From: Arpit Jain Date: Thu, 18 Jun 2026 10:09:04 +0900 Subject: [PATCH] fix: restore nominatim lookup endpoint Signed-off-by: Arpit Jain --- src/util/NominatimGeocoder.js | 18 +++---- test/util/NominatimGeocoder.test.js | 82 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 test/util/NominatimGeocoder.test.js diff --git a/src/util/NominatimGeocoder.js b/src/util/NominatimGeocoder.js index 430a9c282..7798c89e5 100644 --- a/src/util/NominatimGeocoder.js +++ b/src/util/NominatimGeocoder.js @@ -38,15 +38,15 @@ define([ * Constructs a Nominatim geocoder. * @alias NominatimGeocoder * @constructor - * @classdesc Provides a gazetteer that uses Open Street Map Nominatim geocoder at Mapquest. + * @classdesc Provides a gazetteer that uses the OpenStreetMap Nominatim geocoder. */ var NominatimGeocoder = function () { /** * The URL of the geocoder service. * @type {String} - * @default http://open.mapquestapi.com/nominatim/v1/search/ + * @default https://nominatim.openstreetmap.org/search */ - this.service = "https://open.mapquestapi.com/nominatim/v1/search/"; + this.service = "https://nominatim.openstreetmap.org/search"; }; /** @@ -56,16 +56,16 @@ define([ * function is passed two arguments: this geocoder and an array containing the query results. See * [the OpenStreetMap Nominatim Wiki] {@link http://wiki.openstreetmap.org/wiki/Nominatim} for a description * of the results. The result passed to the callback is parsed JSON. - * @param {String} accessKey The MapQuest API access key to use for the request. See - * https://developer.mapquest.com/plan_purchase/free/business_edition/business_edition_free - * to obtain a key. + * @param {String} accessKey An optional API access key for geocoder services that require one. */ NominatimGeocoder.prototype.lookup = function (queryString, callback, accessKey) { - var url = this.service + queryString.replace(" ", "%20") + "?format=json", + var url = this.service + "?format=json&q=" + encodeURIComponent(queryString), xhr = new XMLHttpRequest(), thisGeocoder = this; - url += "&key=" + (accessKey || "lUvVRchXGGDh5Xwk3oidrXeIDAAevOUS"); + if (accessKey) { + url += "&key=" + encodeURIComponent(accessKey); + } xhr.open("GET", url, true); @@ -81,4 +81,4 @@ define([ }; return NominatimGeocoder; - }); \ No newline at end of file + }); diff --git a/test/util/NominatimGeocoder.test.js b/test/util/NominatimGeocoder.test.js new file mode 100644 index 000000000..b63ea7c0f --- /dev/null +++ b/test/util/NominatimGeocoder.test.js @@ -0,0 +1,82 @@ +/* + * Copyright 2003-2006, 2009, 2017, 2020 United States Government, as represented + * by the Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The NASAWorldWind/WebWorldWind platform is licensed under the Apache License, + * Version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * NASAWorldWind/WebWorldWind also contains the following 3rd party Open Source + * software: + * + * ES6-Promise - under MIT License + * libtess.js - SGI Free Software License B + * Proj4 - under MIT License + * JSZip - under MIT License + * + * A complete listing of 3rd Party software notices and licenses included in + * WebWorldWind can be found in the WebWorldWind 3rd-party notices and licenses + * PDF found in code directory. + */ +require([ + 'src/util/NominatimGeocoder' +], function ( + NominatimGeocoder +) { + "use strict"; + + describe("NominatimGeocoder", function () { + it("builds a query URL with encoded input", function () { + var geocoder = new NominatimGeocoder(), + xhr = { + open: jasmine.createSpy("open"), + send: jasmine.createSpy("send") + }; + + spyOn(window, "XMLHttpRequest").and.returnValue(xhr); + + geocoder.lookup("Washington, DC", function () { + }); + + expect(xhr.open).toHaveBeenCalledWith( + "GET", + "https://nominatim.openstreetmap.org/search?format=json&q=Washington%2C%20DC", + true + ); + expect(xhr.send).toHaveBeenCalledWith(null); + }); + + it("passes results to callback after a successful response", function () { + var geocoder = new NominatimGeocoder(), + callback = jasmine.createSpy("callback"), + xhr = { + open: jasmine.createSpy("open"), + send: jasmine.createSpy("send") + }; + + spyOn(window, "XMLHttpRequest").and.returnValue(xhr); + + geocoder.lookup("Madrid", callback, "key-123"); + + expect(xhr.open).toHaveBeenCalledWith( + "GET", + "https://nominatim.openstreetmap.org/search?format=json&q=Madrid&key=key-123", + true + ); + + xhr.readyState = 4; + xhr.status = 200; + xhr.responseText = '[{"lat":"40.4167","lon":"-3.7036"}]'; + xhr.onreadystatechange(); + + expect(callback).toHaveBeenCalledWith(geocoder, [{lat: "40.4167", lon: "-3.7036"}]); + }); + }); +});