Geocoder react component that is using Geonames API. Geonames is geographical
database with various free webservices, this component is using webservice for location
search. You can use it with Mapbox map service or another map service. React mapbox library
is used in example. See demo here.
npm install --save react-geonames
import React, { Component } from 'react';
import Geocoder from 'react-geonames';
import ReactMapGL from 'react-map-gl';
import 'mapbox-gl/dist/mapbox-gl.css';
// Importing additional styles
import 'react-geonames/dist/geonames.css';
const queryParams = {
type: 'json',
maxRows: 10,
};
class App extends Component {
state = {
viewport: {
width: 700,
height: 500,
latitude: 37.7577,
longitude: -122.4376,
zoom: 10,
},
place: {},
};
onSelect = (place, placename) => {
this.setState((prevState) => ({
viewport: {
...prevState.viewport,
latitude: +place.lat,
longitude: +place.lng,
zoom: 10,
},
place: {
latitude: +place.lat,
longitude: +place.lng,
placename: placename,
},
}));
};
onClear = () => {
this.setState({ place: {} });
};
render() {
return (
<div>
<Geocoder
username=[YOUR_GEONAMES_USERNAME]
https
queryParams={queryParams}
placeholder="Search"
onSelect={this.onSelect}
onClear={this.onClear}
/>
<ReactMapGL
{...this.state.viewport}
onViewportChange={(nextViewport) => this.setState({ viewport: nextViewport })}
mapboxApiAccessToken=[YOUR_MAPBOX_TOKEN]
mapStyle="mapbox://styles/mapbox/streets-v11"
/>
</div>
);
}
}
export default App;
Property | Type | Description | Default |
---|---|---|---|
onSelect | function (required) | Function that sets viewport or marker, receives two arguments: selected location object and formated location name |
- |
username | string (required) | Geonames username | - |
onClear | function | Function triggered when clear button is clicked or input field is cleared | - |
timeout | number | Debounce time between requests while typing |
300 |
https | boolean | Use HTTPS Geonames endpoint (HTTP is used in their documentation examples) |
false |
placeholder | string | Input field placeholder | 'Search' |
label | string | Input field label | - |
queryParams | object | Geonames search parametars, you can see documentation here |
{ type: 'json', maxRows: 10 } |
formatResult | function | Function for formating single result | See below |
formatSelectedResult | function | Function for formating selected result shown in input field | See below |
Component has no style out of box,
you can style it yourself using classes from the list or import styling
import 'react-geonames/dist/geonames.css';
as shown in example above.
Element | Class |
---|---|
Geocoder container | .react-geonames |
Input area | .react-geonames-input-area |
Input element | .react-geonames-input |
Clear button | .react-geonames-clear-button |
Results list | .react-geonames-results |
Single result | .react-geonames-item |
Geocoder container
└── Input area
│ ├── Input element
│ └── Clear button
└── Results list
└── Single result
Single result can be customized by passing function to formatResult prop. For additional administrative regions add style: 'full'
to queryParams prop.
Default:
formatResult = (place) => (
<div>
<span>{place.toponymName}</span>
<div style={{ color: 'gray' }}>
{place.adminName1 ? ` ${place.adminName1}, ` : ''}
{place.countryName ? ` ${place.countryName}` : ''}
</div>
</div>
);
By passing function to formatSelectedResult you can customize selected result displayed in input field, which is also returned as argument to onSelect prop.
Default:
formatSelectedResult = (place) => (
place.toponymName
.concat(place.adminName1 ? `, ${place.adminName1}` : '')
.concat(place.countryName ? `, ${place.countryName}` : '')
);
MIT © nikolovskialeksandar