Google Maps API를 React.js와 통합하는 방법

Google 지도를 ReactJS와 통합하는 방법을 찾는 과정에서 npm google-maps-react를 사용하도록 권장되는 많은 기사를 우연히 발견했습니다.


풀 스택 반응 / Google 지도 반응


"Google Maps React 구성요소를 작성하는 방법" 자습서에 대한 부속 코드








Google Map React 구성요소 튜토리얼



A declarative Google Map React component using React, lazy-loading dependencies, current-location finder and a test-driven approach by the Fullstack React team.



demoaccompanying blog post을 참조하십시오.

빠른 시작


먼저 라이브러리를 설치합니다.
npm install --save google-maps-react

자동 지연 로딩 Google API

The library includes a helper to wrap around the Google maps API. The GoogleApiWrapper Higher-Order component accepts a configuration object which must include an apiKey. See lib/GoogleApi.js for all options it accepts.

import {GoogleApiWrapper} from 'google-maps-react';
// ...
export class MapContainer extends React.Component {}
export default GoogleApiWrapper({
  apiKey: (YOUR_GOOGLE_API_KEY_GOES_HERE)
})(MapContainer)

Alternatively, the GoogleApiWrapper Higher-Order component can be configured by passing a function that will be called with whe wrapped component's props and should returned the configuration object.

export default GoogleApiWrapper(
  (props) => ({

I love to research how to implement what I need without using third-party libraries and after long research, I found a way to integrate it.

먼저 구글 지도를 사용하기 위한 액세스 키를 얻는 방법

firstly, we need to get access key from google cloud google cloud and after login go to the console in the top right corner

If you are new to google cloud service you get a free 300$

then we open a new Project and in the dashboard go to the enable APIs and services button and search for those 3 API:
1.Geocoding API.

2.Maps JavaScript API.

3.Places API.

after adding those 3 APIs we press the hamburger button in the top left corner and go to APIs & Services -> Credentials
then we press the create credentials button and in the select list pick API key and the popup press restrict key
in the Application, restrictions pick HTTP referrers (websites)
then we add our website URL so only from this URL you can call with this key after it we go to API restrictions and pick Restrict key and pick the three APIs we enable earlier and saves it.
the process can take up to 5 min to the key to be activated or take effect after a change of the setting.
you can also see Google video about this if you want another explanation.

통합

now we start with the fun part and build our react app
The code here is written with a functional component and not a class component but it similar to each other.

반응 앱 만들기

npm init react-app my-app

env 파일 2개 생성



.env.development 및 .env.production 그리고 프로젝트 폴더(src 폴더가 아님)에 넣습니다.
거기에 액세스 키를 저장하여 REACT_APP_API_KEY와 같은 모든 변수의 시작 부분에서 REACT_APP를 사용해야 한다는 것을 인식하고 액세스 키와 동일하게 설정하는 env var를 추가할 수 있습니다.

REACT_APP_API_KEY = access_key


** .gitignore 해당 파일에서 git add로 코드를 업로드했는지 기억하십시오.

1. 컴포넌트에 useRef 추가



향후 코드에서 요소 참조를 가져와야 하므로 useRef가 필요합니다.

const googleMapRef = useRef();
<div
     id="google-map"
     ref={googleMapRef}
    style={{ width: '400px', height: '300px' }}/>


2. useEffect를 작성하여 스크립트 로드 구현



구성요소 렌더링 후 Google 지도 스크립트를 로드하려고 하기 때문에 여기서는 useEffect를 사용합니다.

useEffect(() => {
    const googleMapScript = document.createElement('script');
    googleMapScript.src=`https://maps.googleapis.com/maps/api/js?key=${process.env.REACT_APP_API_KEY}&libraries=places`;
    googleMapScript.async = true;
    window.document.body.appendChild(googleMapScript);
    googleMapScript.addEventListener('load', () => {
                        getLatLng();
                    });
                })
},[])
you can add at the end of the src &language=en to be only English without this it will be localized.


3. 구글 지도 기능 만들기



여기에서 ref에서 요소로 지도를 인쇄하는 코드를 확인합니다.

    const createGoogleMap = (coordinates) => {
        googleMap = new window.google.maps.Map(googleMapRef.current, {
            zoom: 16,
            center: {
                lat: coordinates.lat(),
                lng: coordinates.lng(),
            },
            disableDefaultUI: true,
        })
    };


isableDefaultUI: true 를 추가했는데, 아래 이미지처럼 딸려오는 기본 버튼을 제거하고 싶었기 때문입니다.

4. 지도용 LAT 및 LNG 가져오기



이 방법에서는 위치 장소를 삽입하고 위치의 LAT 및 LNG를 가져오고 결과를 이전 함수에 추가합니다. 또한 보시다시피 마커가 있으므로 위치를 인쇄할 때 위치를 인쇄합니다. 빨간 마커
(마커를 사용하지 않으면 빨간색 마커 없이 위치가 표시됩니다).

    const getLatLng = () => {
        let lat, lng, placeId;
        new window.google.maps.Geocoder().geocode({ 'address': `${placeName}` }, function (results, status) {
            if (status === window.google.maps.GeocoderStatus.OK) {
                placeId = results[0].place_id;
                createGoogleMap(results[0].geometry.location);
                lat = results[0].geometry.location.lat();
                lng = results[0].geometry.location.lng();
                new window.google.maps.Marker({
                    position: { lat, lng },
                    map: googleMap,
                    animation: window.google.maps.Animation.DROP,
                    title: `${placeName}`
                });
                setGoogleMapInfo({ ...GoogleMapInfo, lat, lng, placeId, isLoading: false, googleMap });
            } else {
                alert('Geocode was not successful for the following reason: ' + status);
            }
        });
    }


마커 없음:

마커 포함:


5. 하나의 구성 요소에 모든 것을 추가




const GoogleMap = ({ placeName }) => {
  const googleMapRef = useRef();
  let googleMap;
  useEffect(() => {
    const googleMapScript = document.createElement("script");
    googleMapScript.src = `https://maps.googleapis.com/maps/api/js?key=${process.env.REACT_APP_API_KEY}&libraries=places`;
    googleMapScript.async = true;
    window.document.body.appendChild(googleMapScript);
    googleMapScript.addEventListener("load", () => {
      getLatLng();
    });
  }, []);

  const createGoogleMap = (coordinates) => {
    googleMap = new window.google.maps.Map(googleMapRef.current, {
      zoom: 16,
      center: {
        lat: coordinates.lat(),
        lng: coordinates.lng(),
      },
      disableDefaultUI: true,
    });
  };
  const getLatLng = () => {
    let lat, lng, placeId;
    new window.google.maps.Geocoder().geocode(
      { address: `${placeName}` },
      function (results, status) {
        if (status === window.google.maps.GeocoderStatus.OK) {
          placeId = results[0].place_id;
          createGoogleMap(results[0].geometry.location);
          lat = results[0].geometry.location.lat();
          lng = results[0].geometry.location.lng();
          new window.google.maps.Marker({
            position: { lat, lng },
            map: googleMap,
            animation: window.google.maps.Animation.DROP,
            title: `${placeName}`,
          });
        } else {
          alert(
            "Geocode was not successful for the following reason: " + status
          );
        }
      }
    );
  };
  return (
    <div
      id="google-map"
      ref={googleMapRef}
      style={{ width: "400px", height: "300px" }}
    />
  );
};



거기다 쉽죠!!



보시다시피 매우 쉽고 이 라이브러리를 사용할 필요가 없으며 혼자서 모든 작업을 수행할 수 있습니다.
placeName 이름에 "Kennedy Space Center Historic Launch Complex 39A"와 같은 이름을 넣으십시오.

흥미롭고 도움이 되었기를 바랍니다.
이것은 나의 첫 번째 기사이며 읽기 환경을 개선하고 더 잘 작성하는 방법을 위해 내가 할 수 있는 리뷰와 물건을 얻게 되어 기쁩니다.

좋은 웹페이지 즐겨찾기