This sample demonstrates how to create a custom search source to use the with the Search component. The Search component provides the capability to provide search capabilities to third-party services. The level of detail (LOD) at the center of the map depends on the data source, with higher quality data sources returning extents closer to the feature
obtained from the search.
To use a custom source with the search component, you must set the component's sources property with your own custom source.
To create a custom search source, you need to construct a search source with on object containing two functions, getSuggestions and getResults.
In these two functions, you can determine how to return a list of suggestions to display in the Search component and how to obtain and return the results.
const customSearchSource = new SearchSource({ placeholder: "example: 8 Boulevard", // Provide a getSuggestions method // to provide suggestions to the Search component getSuggestions: (params) => { // You can request data from a // third-party source to find some // suggestions with provided suggestTerm // the user types in the Search component return esriRequest(url + "search/", { query: { q: params.suggestTerm.replace(/ /g, "+"), limit: 6, lat: viewElement.center.latitude, lon: viewElement.center.longitude, }, responseType: "json", }).then((results) => { // Return Suggestion results to display // in the Search component return results.data.features.map((feature) => { return { key: feature.properties.id, text: feature.properties.label, sourceIndex: params.sourceIndex, }; }); }); }, // Provide a getResults method to find // results from the suggestions getResults: (params) => { // If the Search component passes the current location, // you can use this in your own custom source const operation = params.location ? "reverse/" : "search/"; let query = {}; // You can perform a different query if a location // is provided if (params.location) { query.lat = params.location.latitude; query.lon = params.location.longitude; } else { query.q = params.suggestResult.text.replace(/ /g, "+"); query.limit = 6; } return esriRequest(url + operation, { query: query, responseType: "json", }).then((results) => { // Parse the results of your custom search const searchResults = results.data.features.map((feature) => { // Create a Graphic the Search component can display const graphic = new Graphic({ geometry: new Point({ x: feature.geometry.coordinates[0], y: feature.geometry.coordinates[1], }), attributes: feature.properties, }); // Create a buffer to apply to the search result. // Optionally, you can provide an extent for // a point result, so the view can zoom to it const buffer = geodesicBufferOperator.execute(graphic.geometry, 120, { unit: "meters", }); // Return a Search result using the buffer's extent const searchResult = { extent: buffer.extent, feature: graphic, name: feature.properties.label, }; return searchResult; }); // Return an array of Search Results return searchResults; }); }, });