@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
111 lines (96 loc) • 3.17 kB
JavaScript
import Check from "./Check.js";
import Credit from "./Credit.js";
import Frozen from "./Frozen.js";
import Rectangle from "./Rectangle.js";
import Resource from "./Resource.js";
import defined from "./defined.js";
import DeveloperError from "./DeveloperError.js";
import RuntimeError from "./RuntimeError.js";
const API_URL = "https://maps.googleapis.com/maps/api/geocode/json";
const CREDIT_HTML = `<img alt="Google" src="https://assets.ion.cesium.com/google-credit.png" style="vertical-align:-5px">`;
/**
* Provides geocoding through Google.
*
* @see {@link https://developers.google.com/maps/documentation/geocoding/policies|Google Geocoding Policies}
* @alias GoogleGeocoderService
* @constructor
*
* @param {object} options Object with the following properties:
* @param {string} options.key An API key to use with the Google geocoding service
*/
function GoogleGeocoderService(options) {
options = options ?? Frozen.EMPTY_OBJECT;
const key = options.key;
//>>includeStart('debug', pragmas.debug);
if (!defined(key)) {
throw new DeveloperError("options.key is required.");
}
//>>includeEnd('debug');
this._resource = new Resource({
url: API_URL,
queryParameters: { key },
});
this._credit = new Credit(CREDIT_HTML, true);
}
Object.defineProperties(GoogleGeocoderService.prototype, {
/**
* Gets the credit to display after a geocode is performed. Typically this is used to credit
* the geocoder service.
* @memberof GoogleGeocoderService.prototype
* @type {Credit|undefined}
* @readonly
*/
credit: {
get: function () {
return this._credit;
},
},
});
/**
* Get a list of possible locations that match a search string.
*
* @function
*
* @param {string} query The query to be sent to the geocoder service
* @returns {Promise<GeocoderService.Result[]>}
* @throws {RuntimeError} If the services returns a status other than <code>OK</code> or <code>ZERO_RESULTS</code>
*/
GoogleGeocoderService.prototype.geocode = async function (query) {
// See API documentation at https://developers.google.com/maps/documentation/geocoding/requests-geocoding
//>>includeStart('debug', pragmas.debug);
Check.typeOf.string("query", query);
//>>includeEnd('debug');
const resource = this._resource.getDerivedResource({
queryParameters: {
address: query,
},
});
const response = await resource.fetchJson();
if (response.status === "ZERO_RESULTS") {
return [];
}
if (response.status !== "OK") {
throw new RuntimeError(
`GoogleGeocoderService got a bad response ${response.status}: ${response.error_message}`,
);
}
const results = response.results.map((result) => {
const southWest = result.geometry.viewport.southwest;
const northEast = result.geometry.viewport.northeast;
return {
displayName: result.formatted_address,
destination: Rectangle.fromDegrees(
southWest.lng,
southWest.lat,
northEast.lng,
northEast.lat,
),
attribution: {
html: CREDIT_HTML,
collapsible: false,
},
};
});
return results;
};
export default GoogleGeocoderService;