Javascript 如何在React中加载Google Places API
我想在我的React应用程序中使用Google地图和Places API,以便用户能够在地图上找到他们所在地区的医院 我正在使用@react google maps/api和使用places autocomplete npm包与api交互以显示地图和地点。我正在使用useLoadScript钩子加载API密钥,并声明我将使用的库 在本例中,正如我启用了位置和映射JavaScript API一样,我在库数组中提供了位置 我已尝试将以下脚本添加到index.html文件:Javascript 如何在React中加载Google Places API,javascript,reactjs,google-maps,google-places-api,Javascript,Reactjs,Google Maps,Google Places Api,我想在我的React应用程序中使用Google地图和Places API,以便用户能够在地图上找到他们所在地区的医院 我正在使用@react google maps/api和使用places autocomplete npm包与api交互以显示地图和地点。我正在使用useLoadScript钩子加载API密钥,并声明我将使用的库 在本例中,正如我启用了位置和映射JavaScript API一样,我在库数组中提供了位置 我已尝试将以下脚本添加到index.html文件: <script sr
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"></script>
但是我得到了一个错误:你正在加载地图多次
下面是我的代码片段,我使用@react google maps/api中的useLoadScript钩子
请说明如何解决此问题?如果您使用@react google maps/api库的useLoadScript并使用places autocomplete,则需要提供['places']作为库的值,以便在代码中使用places autocomplete。请注意,这个useLoadScript将在您的代码中加载Google Maps JavaScript脚本标记,您不再需要在html文件中添加脚本标记
据我所知,在您的用例中,用户将从自动完成下拉列表中选择一个位置,并且最近的医院应该在地图中返回
要实现这一点,您需要有以下流程:
使用“使用地点自动完成”在搜索地点时提供地点建议。这个库有一个GetGeocode和一个可用于获取所选位置坐标的。
获得坐标后,您可以在请求中使用关键字hospital并定义半径。这将搜索定义半径内以所选地点为中心的医院列表。
您可以在结果列表中循环,并将每个坐标作为标记固定在地图中。
在这里;下面是示例和代码段。确保添加API密钥:
Index.js
import React from "react";
import { render } from "react-dom";
import Map from "./Map";
render(<Map />, document.getElementById("root"));
Map.js
/*global google*/
import React from "react";
import { GoogleMap, useLoadScript } from "@react-google-maps/api";
import Search from "./Search";
let service;
const libraries = ["places"];
const mapContainerStyle = {
height: "100vh",
width: "100vw"
};
const options = {
disableDefaultUI: true,
zoomControl: true
};
const center = {
lat: 43.6532,
lng: -79.3832
};
export default function App() {
const { isLoaded, loadError } = useLoadScript({
googleMapsApiKey: "YOUR_API_KEY",
libraries
});
const mapRef = React.useRef();
const onMapLoad = React.useCallback(map => {
mapRef.current = map;
}, []);
const panTo = React.useCallback(({ lat, lng }) => {
mapRef.current.panTo({ lat, lng });
mapRef.current.setZoom(12);
let map = mapRef.current;
let request = {
location: { lat, lng },
radius: "500",
type: ["hospital"]
};
service = new google.maps.places.PlacesService(mapRef.current);
service.nearbySearch(request, callback);
function callback(results, status) {
if (status === google.maps.places.PlacesServiceStatus.OK) {
for (let i = 0; i < results.length; i++) {
let place = results[i];
new google.maps.Marker({
position: place.geometry.location,
map
});
}
}
}
}, []);
return (
<div>
<Search panTo={panTo} />
<GoogleMap
id="map"
mapContainerStyle={mapContainerStyle}
zoom={8}
center={center}
options={options}
onLoad={onMapLoad}
/>
</div>
);
}
Search.js
从React导入React;
导入使用地点完成{
获取地理编码,
getLatLng
}从使用地点自动完成;
导出默认函数搜索{panTo}{
常数{
准备好的
价值
建议:{状态,数据},
设置值,
明确的建议
}=使用placesauto完成{
请求选项:{
/*在此处定义搜索范围*/
},
去盎司:300
};
常量handleInput=e=>{
//更新输入元素的关键字
setValuee.target.value;
};
const handleSelect={description}=>=>{
//当用户选择一个位置时,我们可以替换关键字,而无需从API请求数据
//通过将第二个参数设置为false
setValuedescription,false;
明确建议;
//通过实用程序函数获取纬度和经度
getGeocode{地址:description}
.thenresults=>getLatLngresults[0]
.然后{lat,lng}=>{
潘托{lat,lng};
}
.catcherror=>{
console.log请参阅