【问题标题】:How to call a function if Current position within Polygon in google-,maps-react?如果google-,maps-react中Polygon中的当前位置如何调用函数?
【发布时间】:2021-03-16 07:25:44
【问题描述】:

我正在实施 google-maps-react。如果用户当前位置在多边形中,我需要功能,我需要启用一个按钮。我搜索了 containslocation() 但没有得到适当的答案。这是我的代码:

import { Map, GoogleApiWrapper, InfoWindow, Marker, Polygon } from 'google-maps-react';
...
...

      <CurrentLocation
        centerAroundCurrentLocation
        google={this.props.google}
      >
          <Polygon
            paths={triangleCoords}
            strokeColor="#0000FF"
            strokeOpacity={0.8}
            strokeWeight={2}
            fillColor="#0000FF"
            fillOpacity={0.35} />
          <Marker
            position={{ lat: this.state.currentPosition.lat, lng: this.state.currentPosition.lng }}
            onClick={this.onMarkerClick}
            name={'Current Location'}
            />
            <InfoWindow
            marker={this.state.activeMarker}
            visible={this.state.showingInfoWindow}
            onClose={this.onClose}
            >
            <div>
                <h4>{this.state.selectedPlace.name}</h4>
            </div>
            </InfoWindow>
        </CurrentLocation>

【问题讨论】:

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


    【解决方案1】:

    这里是如何使用google-maps-react library 实现它:

    1. 每次地图准备就绪时,您都需要一个函数onReady。该函数将获取当前位置。

    2. 您可以使用HTML5 Geolocation feature 获取用户的当前位置。

    3. 您需要从 React 导入 useRef,以便您可以使用 ref 来获取您的多边形对象。

    4. 一旦你有了用户和多边形对象的坐标,你需要使用google.maps.geometry.poly.containsLocation来检查多边形是否包含坐标。

    5. 您还需要导入useState 来操作状态变量。您将需要它作为标志来确定坐标是否包含在多边形中,并且还将用于显示按钮时的条件。

    6. 所以要显示按钮 html,然后使用我们设置的 state 变量并检查它是否设置为 true,然后应该显示一个按钮。

    这是工作代码的代码 sn-p:

    import React, { useRef, useState } from "react";
    import { Map, GoogleApiWrapper, Polygon } from "google-maps-react";
    
    function MapContainer(props) {
      const refPoly = useRef(null);
      const style = {
        position: "absolute",
        width: "400px",
        height: "800px"
      };
    
      const containerStyle = {
        position: "absolute",
        width: "800px",
        height: "400px"
      };
    
      const [showBtn, setShowBtn] = useState(null);
    
      const triangleCoords = [
        { lat: 25.774, lng: -80.19 },
        { lat: 18.466, lng: -66.118 },
        { lat: 32.321, lng: -64.757 }
      ];
    
      const fetchCurrentPosition = () => {
        navigator.geolocation.getCurrentPosition(
          function(position) {
            var pos = new google.maps.LatLng(
              position.coords.latitude,
              position.coords.longitude
            );
    
            console.log(position.coords);
            google.maps.geometry.poly.containsLocation(pos, refPoly.current.polygon)
              ? setShowBtn(true)
              : setShowBtn(false);
          },
          function(error) {
            console.log(error);
          }
        );
      };
      return (
        <div>
          {showBtn === true && (
            <button display="block" type="button">
              Showing Button!
            </button>
          )}
          <div>
            <Map
              className="map"
              style={style}
              containerStyle={containerStyle}
              google={props.google}
              onReady={fetchCurrentPosition}
              initialCenter={{
                lat: 25.774,
                lng: -80.19
              }}
              style={{ height: "100%", position: "relative", width: "100%" }}
              zoom={3}
            >
              <Polygon
                ref={refPoly}
                paths={triangleCoords}
                strokeColor="#0000FF"
                strokeOpacity={0.8}
                strokeWeight={2}
                fillColor="#0000FF"
                fillOpacity={0.35}
              />
            </Map>
          </div>
        </div>
      );
    }
    
    export default GoogleApiWrapper({
      apiKey: "YOUR_API_KEY",
      libraries: ["geometry"]
    })(MapContainer);
    

    注意:要显示按钮,请更改您所在区域周围多边形的路径值,以便将条件设置为 true。还可以使用您自己的 API 密钥来使代码正常工作。这是working code。

    【讨论】:

    • 我用 geolib 包弄明白了
    猜你喜欢
    • 2019-03-28
    • 2021-03-31
    • 2018-09-14
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多