反应和 google 方向 API 没有地图
react and google Directions API without map
我需要在我的内部应用程序中使用 .route()
的结果,而不是进入任何地图。我需要起点和终点之间的持续时间和距离,以便在我的应用中进一步计算。
到目前为止我用回调函数试过了:
function getTravelTime(origin, destination, cb) {
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: "DRIVING"
},
(result, status) => {
if (status === google.maps.DirectionsStatus.OK) {
cb(null, {
duration: moment.utc(moment.duration(result.routes[0].legs[0].duration.value, 'seconds').as('milliseconds')).format('HH:mm'),
distance: result.routes[0].legs[0].distance.value
});
} else {
cb('error');
console.log(result);
}
}
);
};
我试着这样读:
let tInfo = getTravelTime(origin, destination, function (err, dist) {
if (!err) {
let distanceBetweenLocations = dist.distance;
let durationBetweenLocations = dist.duration;
// Or with saving to a state
setTravelInformation(prevState => ({
distance: dist.distance,
duration: dist.duration
}));
}
});
是否可以在不需要渲染地图的情况下计算距离和旅行时间?
到目前为止我得到了这个,由于我在同一文件中为其他组件获得了更多逻辑,所以大大缩短了:
import {
withGoogleMap,
GoogleMap,
withScriptjs,
Marker,
DirectionsRenderer
} from "react-google-maps";
const getTravelTime = (origin, destination) => {
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: google.maps.TravelMode.DRIVING
},
(result, status) => {
console.log(result)
if (status === google.maps.DirectionsStatus.OK) {
setDirections(result);
} else {
setError(result);
}
}
);
}
我是否需要使用 HoC withScriptjs 并将我的组件包装在它周围?
您可以使用 useState
和 useEffect
,请参阅 https://reactjs.org/docs/hooks-effect.html
const [distance, setDistance] = useState(0);
const [duration, setDuration] = useState(0);
useEffect(() => {
if (distance && duration) {
console.log("Distance & Duration have updated", distance, duration);
}
}, [distance, duration]);
收到路线结果后,使用您需要的任何值更新距离和持续时间:
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.TravelMode.DRIVING
},
(result, status) => {
if (status === google.maps.DirectionsStatus.OK) {
setDistance(result.routes[0].legs[0].distance.value);
setDuration(result.routes[0].legs[0].duration.value);
} else {
console.error("error fetching directions", result, status);
}
}
);
这是一个使用 @react-google-maps/api
的工作片段
https://codesandbox.io/s/react-google-mapsapi-directions-service-m7qif
您需要使用有效的 API 密钥以防它不起作用。
import React, { Component } from "react";
import { withGoogleMap, GoogleMap, withScriptjs, DirectionsRenderer, Marker } from "react-google-maps";
import { compose, withProps } from "recompose";
import PropTypes from "prop-types";
class MapDirectionsRenderer extends Component {
static propTypes = {
waypoints: PropTypes.array,
places: PropTypes.array
};
state = {
directionsRef: '',
directions: null,
error: null
};
componentDidMount() {
const { places, origDest } = this.props;
const waypointsArray = places.map(p => ({
location: p.geocode,
stopover: true
}));
const origin = origDest.origin_geocode;
const destination = origDest.destination_geocode;
const directionsService = new window.google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: window.google.maps.TravelMode.DRIVING,
waypoints: waypointsArray.length >= 1 ? waypointsArray : [],
},
(result, status) => {
if (status === window.google.maps.DirectionsStatus.OK) {
this.setState({
directions: result,
});
}
}
);
}
render() {
return (
this.state.directions && (
<DirectionsRenderer
directions={this.state.directions}
/>
)
);
}
}
const MapView = compose(
withProps({
googleMapURL: "https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY_HERE&v=3.exp",
loadingElement: <div style={{ height: `100%` }} />,
containerElement: <div style={{ height: `300px`, width: '100%' }} />,
mapElement: <div style={{ height: `100%` }} />
}),
withScriptjs,
withGoogleMap
)(props => (
<GoogleMap
key={props.travelMode}
defaultZoom={12}
center={{ lat: 0, lng: 0 }}
>
<MapDirectionsRenderer
places={props.wayPoints}
origDest={props.originDestination}
/>
</GoogleMap >
));
export default MapView;
我需要在我的内部应用程序中使用 .route()
的结果,而不是进入任何地图。我需要起点和终点之间的持续时间和距离,以便在我的应用中进一步计算。
到目前为止我用回调函数试过了:
function getTravelTime(origin, destination, cb) {
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: "DRIVING"
},
(result, status) => {
if (status === google.maps.DirectionsStatus.OK) {
cb(null, {
duration: moment.utc(moment.duration(result.routes[0].legs[0].duration.value, 'seconds').as('milliseconds')).format('HH:mm'),
distance: result.routes[0].legs[0].distance.value
});
} else {
cb('error');
console.log(result);
}
}
);
};
我试着这样读:
let tInfo = getTravelTime(origin, destination, function (err, dist) {
if (!err) {
let distanceBetweenLocations = dist.distance;
let durationBetweenLocations = dist.duration;
// Or with saving to a state
setTravelInformation(prevState => ({
distance: dist.distance,
duration: dist.duration
}));
}
});
是否可以在不需要渲染地图的情况下计算距离和旅行时间?
到目前为止我得到了这个,由于我在同一文件中为其他组件获得了更多逻辑,所以大大缩短了:
import {
withGoogleMap,
GoogleMap,
withScriptjs,
Marker,
DirectionsRenderer
} from "react-google-maps";
const getTravelTime = (origin, destination) => {
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: google.maps.TravelMode.DRIVING
},
(result, status) => {
console.log(result)
if (status === google.maps.DirectionsStatus.OK) {
setDirections(result);
} else {
setError(result);
}
}
);
}
我是否需要使用 HoC withScriptjs 并将我的组件包装在它周围?
您可以使用 useState
和 useEffect
,请参阅 https://reactjs.org/docs/hooks-effect.html
const [distance, setDistance] = useState(0);
const [duration, setDuration] = useState(0);
useEffect(() => {
if (distance && duration) {
console.log("Distance & Duration have updated", distance, duration);
}
}, [distance, duration]);
收到路线结果后,使用您需要的任何值更新距离和持续时间:
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.TravelMode.DRIVING
},
(result, status) => {
if (status === google.maps.DirectionsStatus.OK) {
setDistance(result.routes[0].legs[0].distance.value);
setDuration(result.routes[0].legs[0].duration.value);
} else {
console.error("error fetching directions", result, status);
}
}
);
这是一个使用 @react-google-maps/api
的工作片段https://codesandbox.io/s/react-google-mapsapi-directions-service-m7qif
您需要使用有效的 API 密钥以防它不起作用。
import React, { Component } from "react";
import { withGoogleMap, GoogleMap, withScriptjs, DirectionsRenderer, Marker } from "react-google-maps";
import { compose, withProps } from "recompose";
import PropTypes from "prop-types";
class MapDirectionsRenderer extends Component {
static propTypes = {
waypoints: PropTypes.array,
places: PropTypes.array
};
state = {
directionsRef: '',
directions: null,
error: null
};
componentDidMount() {
const { places, origDest } = this.props;
const waypointsArray = places.map(p => ({
location: p.geocode,
stopover: true
}));
const origin = origDest.origin_geocode;
const destination = origDest.destination_geocode;
const directionsService = new window.google.maps.DirectionsService();
directionsService.route(
{
origin: origin,
destination: destination,
travelMode: window.google.maps.TravelMode.DRIVING,
waypoints: waypointsArray.length >= 1 ? waypointsArray : [],
},
(result, status) => {
if (status === window.google.maps.DirectionsStatus.OK) {
this.setState({
directions: result,
});
}
}
);
}
render() {
return (
this.state.directions && (
<DirectionsRenderer
directions={this.state.directions}
/>
)
);
}
}
const MapView = compose(
withProps({
googleMapURL: "https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY_HERE&v=3.exp",
loadingElement: <div style={{ height: `100%` }} />,
containerElement: <div style={{ height: `300px`, width: '100%' }} />,
mapElement: <div style={{ height: `100%` }} />
}),
withScriptjs,
withGoogleMap
)(props => (
<GoogleMap
key={props.travelMode}
defaultZoom={12}
center={{ lat: 0, lng: 0 }}
>
<MapDirectionsRenderer
places={props.wayPoints}
origDest={props.originDestination}
/>
</GoogleMap >
));
export default MapView;