Initialize React Google Maps StandaloneSearchBox with geocode

后端 未结 2 374
日久生厌
日久生厌 2021-01-15 21:31

Can someone tell me how to initialize React Google Maps\'s StandaloneSearchBox component with types: [\'geocode\'] (like in the original google.maps.places.Autocomplete, so

相关标签:
2条回答
  • 2021-01-15 22:13

    StandaloneSearchBox is a wrapper around google.maps.places.SearchBox.
    So Google documentation for SearchBox says that:

    The SearchBox constructor takes two arguments:

    • An HTML input element of type text. This is the input field that the SearchBox service will monitor and attach its results to.
    • An options argument, which can contain the bounds property: bounds is a google.maps.LatLngBounds object specifying the area in which to search for places. The results are biased towards, but not restricted to, places contained within these bounds.

    Source: https://developers.google.com/maps/documentation/javascript/places-autocomplete#places_searchbox

    So you can call this component like this:

    <StandaloneSearchBox
          ref={props.onSearchBoxMounted}
          bounds={props.bounds}
          onPlacesChanged={props.onPlacesChanged}
          defaultBounds={new google.maps.LatLngBounds(
                new google.maps.LatLng(40.712216, -74.22655),
                new google.maps.LatLng(40.773941, -74.12544)
          )}
    

    Where defaultBounds is a LatLngBounds class which is represents a rectangle in geographical coordinates.

    0 讨论(0)
  • 2021-01-15 22:14

    I was able to do something like this with alexandar's suggestion. Pass an address into the address search and use geocode to do a near by search. Hope this helps.

    import React from 'react';
    import { compose, withProps, lifecycle } from 'recompose';
    import { withScriptjs } from 'react-google-maps';
    import StandaloneSearchBox from 'react-google-maps/lib/components/places/StandaloneSearchBox';
    import get from 'lodash/get';
    import head from 'lodash/head';
    import { Search } from '../components';
    
    const GOOGLE_API_KEY = '123';
    
    const AddressSearchbox = compose(
      withProps(props => {
        return {
          ...props,
          googleMapURL: `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_API_KEY}&v=3.exp&libraries=geometry,drawing,places`,
          loadingElement: <div style={{ height: `100%` }} />,
          containerElement: <div style={{ height: `400px` }} />,
        };
      }),
      withScriptjs,
      lifecycle({
        componentDidMount() {
          const refs = {};
    
          this.setState({
            places: [],
            searchText: '',
            error: null,
            onSearchBoxMounted: ref => {
              refs.searchBox = ref;
            },
            onPlacesChanged: () => {
              const places = refs.searchBox.getPlaces();
              this.setState({
                places,
                searchText: '',
              });
            },
          });
    
          ***
          const geocoder = new google.maps.Geocoder();
          geocoder.geocode({ address: this.props.placeName }, (results, status) => {
          if (status === google.maps.DirectionsStatus.OK) {
            const lngs = results[0].geometry.bounds.j;
            const lats = results[0].geometry.bounds.l;
            this.setState({
              boundSearch: new google.maps.LatLngBounds(
                new google.maps.LatLng(lats.l, lngs.l),
                new google.maps.LatLng(lats.j, lngs.j)
              ),
            });
          } else {
            this.setState({
              error: status,
            });
          }
          ***
          });
        },
      })
    )(props => {
      return (
        <div data-standalone-searchbox="">
          <StandaloneSearchBox
            ref={props.onSearchBoxMounted}
            onPlacesChanged={props.onPlacesChanged}
            bounds={props.boundSearch}
          >
            <Search searchText={props.searchText} />
          </StandaloneSearchBox>
          <div>{get(head(props.places), 'formatted_address')}</div>
        </div>
      );
    });
    
    export default AddressSearchbox;
    
    <AddressSearchbox address="cleveland, oh" />
    
    0 讨论(0)
提交回复
热议问题