【问题标题】:Display Directions with React Google Maps使用 React Google Maps 显示路线
【发布时间】:2019-07-18 08:03:40
【问题描述】:

我是 React 新手,正在尝试使用谷歌地图来显示路线。我已经能够让它显示一个标记,但还没有找到如何重新配置​​代码来显示方向。以下是我最近的尝试,但它只会显示地图......感谢任何帮助:

import React, { Component } from 'react';
import { withGoogleMap, GoogleMap, DirectionsRenderer } from 'react-google-maps';
class Map extends Component {
   render() {
   const GoogleMapExample = withGoogleMap(props => (
      <GoogleMap
        defaultCenter = { { lat: 40.756795, lng: -73.954298 } }
        defaultZoom = { 13 }
      >

<DirectionsRenderer origin={{ lat: 40.756795, lng: -73.954298 }} destination={{ lat: 41.756795, lng: -78.954298 }} />
      </GoogleMap>
   ));
   return(
      <div>
        <GoogleMapExample
          containerElement={ <div style={{ height: `500px`, width: '500px' }} /> }
          mapElement={ <div style={{ height: `100%` }} /> }
        />
      </div>
   );
   }
};
export default Map;

我在 index.html 的脚本标签中有 API 密钥

【问题讨论】:

    标签: reactjs google-maps react-google-maps


    【解决方案1】:

    DirectionsRenderer component 不接受origindestination 道具,需要提供directions 道具来代替代表DirectionsService 的响应的值,例如:

    <DirectionsRenderer
          directions={this.state.directions}
     />
    

    在哪里

    const directionsService = new google.maps.DirectionsService();
    
    const origin = { lat: 40.756795, lng: -73.954298 };
    const destination = { lat: 41.756795, lng: -78.954298 };
    
    directionsService.route(
      {
        origin: origin,
        destination: destination,
        travelMode: google.maps.TravelMode.DRIVING
      },
      (result, status) => {
        if (status === google.maps.DirectionsStatus.OK) {
          this.setState({
            directions: result
          });
        } else {
          console.error(`error fetching directions ${result}`);
        }
      }
    );
    

    Demo

    【讨论】:

    • 谢谢!这帮助很大
    • 请记住,在 Google Cloud Platform 中,您需要启用“Directions API”才能使其工作。 Google Cloud Platform > APIs & Services > Library > 在框中搜索“Directions API”,然后启用。
    【解决方案2】:

    这应该是您可以使用的足够示例

    import React from 'react';
    import logo from './logo.svg';
    import './App.css';
    import { withScriptjs } from "react-google-maps";
    
    
    
    
    import  Map from './components/Map';
    
    function App() {
    
      const MapLoader = withScriptjs(Map);
    
      return (
    
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
    
      </header>
      <MapLoader
          googleMapURL="https://maps.googleapis.com/maps/api/js?key=Key"
          loadingElement={<div style={{ height: `100%` }} />}
      />
    </div>
      );
    }
    
    export default App;
    

    你的 Map.js 文件应该是这样的

    /*global google*/
    import React, { Component } from "react";
    import {
        withGoogleMap,
        withScriptjs,
        GoogleMap,
        DirectionsRenderer
    } from "react-google-maps";
    class Map extends Component {
        state = {
            directions: null,
    
    
    };
    
    componentDidMount() {
        const directionsService = new google.maps.DirectionsService();
    
        const origin = { lat: 6.5244, lng:  3.3792 };
        const destination = { lat: 6.4667, lng:  3.4500};
    
        directionsService.route(
            {
                origin: origin,
                destination: destination,
                travelMode: google.maps.TravelMode.DRIVING,
                waypoints: [
                    {
                        location: new google.maps.LatLng(6.4698,  3.5852)
                    },
                    {
                        location: new google.maps.LatLng(6.6018,3.3515)
                    }
                ]
            },
            (result, status) => {
                if (status === google.maps.DirectionsStatus.OK) {
                    console.log(result)
                    this.setState({
                        directions: result
                    });
                } else {
                    console.error(`error fetching directions ${result}`);
                }
            }
        );
    }
    
    render() {
        const GoogleMapExample = withGoogleMap(props => (
            <GoogleMap
                defaultCenter={{ lat: 6.5244, lng:  3.3792 }}
                defaultZoom={13}
            >
                <DirectionsRenderer
                    directions={this.state.directions}
                />
            </GoogleMap>
        ));
    
        return (
            <div>
                <GoogleMapExample
                    containerElement={<div style={{ height: `500px`, width: "500px" }} />}
                    mapElement={<div style={{ height: `100%` }} />}
                />
            </div>
    
    
           );
        }
    }
    
    export default Map;
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      类似于@VadimGremyachev 和@EmmanuelAdebayo 的答案(非常感谢!),但带有箭头函数和 useState 钩子:

      import React, { useState } from "react";
      import { GoogleMap, Marker, DirectionsRenderer } from "react-google-maps";
      /* global google */
      
      const Map = ({ formattedOrigin, formattedDestination }) => {
        const DirectionsService = new google.maps.DirectionsService();
        let [directions, setDirections] = useState("");
      
        DirectionsService.route(
          {
            origin: formattedOrigin,
            destination: formattedDestination,
            travelMode: google.maps.TravelMode.DRIVING,
          },
          (result, status) => {
            if (status === google.maps.DirectionsStatus.OK) {
              setDirections(result);
            } else {
              console.error(`error fetching directions ${result}`);
            }
          }
        );
        return (
          <section className="googleMap">
            <GoogleMap defaultZoom={9} defaultCenter={{ lat: 41.75, lng: 1.8 }}>
              <Marker position={formattedOrigin} />
              <Marker position={formattedDestination} />
              {directions && <DirectionsRenderer directions={directions} />}
            </GoogleMap>
          </section>
        );
      };
      
      export default Map;
      

      然后从你的高阶组件:

      import React from "react";
      import "../styles/Home.css";
      import { useSelector } from "react-redux";
      import { googleMapsApiKey } from "../../data/constants";
      import { withScriptjs, withGoogleMap } from "react-google-maps";
      import Map from "../presentational/Map";
      
      const Home = () => {
        const WrappedMap = withScriptjs(withGoogleMap(Map));
        const formattedOrigin = useSelector(
          (state) => state.routeCalculatorReducer.loadCost?.originGeoCodedFormatted
        );
        const formattedDestination = useSelector(
          (state) =>
            state.routeCalculatorReducer.loadCost?.destinationGeoCodedFormatted
        );
      
        return (
          <main className="home">
            <section className="map">
              <WrappedMap
                googleMapURL={`https://maps.googleapis.com/maps/api/js?libraries=geometry,drawing,places&key=${googleMapsApiKey}`}
                loadingElement={<div style={{ height: `100%` }} />}
                containerElement={<div style={{ height: "80vh" }} />}
                mapElement={<div style={{ height: `100%` }} />}
                formattedOrigin={formattedOrigin}
                formattedDestination={formattedDestination}
              />
            </section>
          </main>
        );
      };
      
      export default Home;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-12
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多