Geocode with Nominatim
Geocode with Nominatim and the maplibre-gl-geocoder plugin.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Geocode with Nominatim</title>
<meta property="og:description" content="Geocode with Nominatim and the maplibre-gl-geocoder plugin." />
<meta charset='utf-8'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='https://unpkg.com/maplibre-gl@4.7.0/dist/maplibre-gl.css' />
<script src='https://unpkg.com/maplibre-gl@4.7.0/dist/maplibre-gl.js'></script>
<style>
body { margin: 0; padding: 0; }
html, body, #map { height: 100%; }
</style>
</head>
<body>
<!-- Load the `maplibre-gl-geocoder` plugin. -->
<script src="https://unpkg.com/@maplibre/maplibre-gl-geocoder@1.5.0/dist/maplibre-gl-geocoder.min.js"></script>
<link
rel="stylesheet"
href="https://unpkg.com/@maplibre/maplibre-gl-geocoder@1.5.0/dist/maplibre-gl-geocoder.css"
/>
<div id="map"></div>
<script>
/* eslint-disable camelcase */
const map = new maplibregl.Map({
container: 'map',
// Use a minimalist raster style
style: {
'version': 8,
'name': 'Blank',
'center': [0, 0],
'zoom': 0,
'sources': {
'raster-tiles': {
'type': 'raster',
'tiles': ['https://tile.openstreetmap.org/{z}/{x}/{y}.png'],
'tileSize': 256,
'minzoom': 0,
'maxzoom': 19
}
},
'layers': [
{
'id': 'background',
'type': 'background',
'paint': {
'background-color': '#e0dfdf'
}
},
{
'id': 'simple-tiles',
'type': 'raster',
'source': 'raster-tiles'
}
],
'id': 'blank'
},
center: [-87.61694, 41.86625],
zoom: 15.99,
pitch: 40,
bearing: 20,
antialias: true
});
const geocoderApi = {
forwardGeocode: async (config) => {
const features = [];
try {
const request =
`https://nominatim.openstreetmap.org/search?q=${
config.query
}&format=geojson&polygon_geojson=1&addressdetails=1`;
const response = await fetch(request);
const geojson = await response.json();
for (const feature of geojson.features) {
const center = [
feature.bbox[0] +
(feature.bbox[2] - feature.bbox[0]) / 2,
feature.bbox[1] +
(feature.bbox[3] - feature.bbox[1]) / 2
];
const point = {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: center
},
place_name: feature.properties.display_name,
properties: feature.properties,
text: feature.properties.display_name,
place_type: ['place'],
center
};
features.push(point);
}
} catch (e) {
console.error(`Failed to forwardGeocode with error: ${e}`);
}
return {
features
};
}
};
map.addControl(
new MaplibreGeocoder(geocoderApi, {
maplibregl
})
);
</script>
</body>
</html>