javascript - 如何在react-leaflet中调用fitBounds和getBounds?

标签 javascript reactjs leaflet material-ui react-leaflet

我不知道如何在 Leaflet map 上调用 fitBounds()。

基本上,我试图在 map 上显示多个标记,并相应地调整 View (放大、缩小、飞向等)。我还看到了一些示例How do you call fitBounds() when using leaflet-react?,我尝试实现但它不起作用。 这是我尝试过的代码。

import React, { createRef, Component } from "react";
import {
  Map,
  TileLayer,
  Marker,
  Popup
} from "react-leaflet";
import L from "leaflet";
import Header from "../Layout/Header";
import Card from "@material-ui/core/Card";
import CardContent from "@material-ui/core/CardContent";
import Typography from "@material-ui/core/Typography";
import "leaflet/dist/leaflet.css";

export class Mapp extends Component {
  constructor(props) {
    super(props);

    this.state = {
      map: [],
      open: false,
      bounds: null,
      center: [35.000074, 104.999927]
    };
    this.mapRef = createRef();
    this.groupRef = createRef();
  }

  toggleHiddden1() {
    this.setState({
      open: false
    });

  async componentDidMount() {
    try {
      await fetch(`https://coronaviva.herokuapp.com/api/1/infected/data/`, {
        method: "GET",
        headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
          Authorization: "Bearer F9bQK456iUpJVZJLTZsMEKhhENqnGJ"
        }
      })
        .then(map => map.json())
        .then(map => {
          this.setState({
            map
          });
        });
    } catch (err) {
      console.log(err);
    }

    let mapInst = this.refs.map.leafletElement.fitBounds;
    console.log(mapInst);  // i tried this but this not working.
  }

  // centerUpdated(center) {
  //   this.center = center;
  // }
  // boundsUpdated(bounds) {
  //   this.bounds = bounds;
  // }

  render() {
    const { map } = this.state;

    const pointerIcon = new L.Icon({
      iconUrl:
        "https://icons.iconarchive.com/icons/paomedia/small-n-flat/512/map-marker-icon.png",
      iconAnchor: [25, 40],
      iconSize: [50, 50]
    });
    return (
      <div>
        <Header
          state={this.state}
          load={this.onChange}
          submit={this.handleSubmit}
        />
        <Map
          center={[51.9194, 19.1451]}
          style={{ height: "100vh", width: "auto" }}
          zoom={6}
          ref="map"
          bounceAtZoomLimits={true}
          maxBoundsViscosity={0.95}
          maxBounds={[
            [-180, -90],
            [180, 90]
          ]}
          className="map_map margin-zero map-padding"
        >
          {map.map(c => (
            <Marker
              position={[c.latitude, c.longitude]}
              icon={pointerIcon}
              onclick={this.toggleHiddden.bind(this)}
            >
              <Popup autoPan={false}>
                <Card className="carrr">
                  {c.location === "Israel" ? (
                    <img
                      className="image"
                      src="https://thehill.com/sites/default/files/styles/article_full/public/telaviv_skyline_09202018.jpg?itok=pxhk1Rtl"
                      alt="Contemplative Reptile"
                    />
                  ) : (
                    <img
                      className="image"
                      src="https://www.dwf.law/-/media/DWF/Images/Locations-Assets/Warsaw/Warsaw-700-x-388.ashx"
                      alt="Contemplative Reptile"
                    />
                  )}
                  <CardContent>
                    <Typography gutterBottom variant="h5" component="h2">
                      {c.location && <span> Place : {c.location} </span>}
                    </Typography>

                    <h6>Address : {c.address}</h6>
                    <p className="text-dark" style={{ marginTop: "-5px" }}>
                      {c.info && (
                        <span>
                          <strong> Info</strong>: {c.info}{" "}
                        </span>
                      )}
                    </p>

                    <p
                      color="textSecondary text-secondary"
                      component="p"
                      className="lodl"
                    >
                      PlaceType : {c.place_type}
                      <br></br>
                      {c.start_hour && (
                        <span>
                          Start Hour : {c.start_hour}{" "}
                          {c.start_hour > "12" ? "PM" : "AM"}
                        </span>
                      )}
                      <br></br>
                      {c.end_hour && (
                        <span>
                          End Hour : {c.end_hour}{" "}
                          {c.end_hour > "12" ? "PM" : "AM"}
                        </span>
                      )}
                    </p>
                  </CardContent>
                </Card>
              </Popup>
            </Marker>
          ))}

          <TileLayer
            noWrap={true}
            url="https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png"
            subdomains="1234"
            attribution='&copy; <a href="http://osm.org/copyright">OpenStreepMap</a>  '
          />
        </Map>
      </div>
    );
  }
}

export default Mapp;

最佳答案

您的代码中有几个错误:

  1. 您不能使用 } 关闭 toggleHiddden1。此外,您在组件中将其称为 toggleHiddden 。您应该为该方法使用一个名称。

  2. map 实例源自
    let mapInst = this.mapRef.current.leafletElement;

    不是来自let mapInst = this.refs.map.leafletElement;

    然后你可以调用fitBounds()

  3. react-leaflet Map wrapper 中的 ref 应该是 ref={this.mapRef} 并且 不是 ref="map"

  4. 在标记上循环时放置关键点。

刚刚使用了 openstreet map 图 block url 来演示演示。

编辑 要同时对标记使用 fitBounds 和 getBounds,您需要使用 FeatureGroup 包装标记循环并给它一个引用,然后执行

let mapInst = this.mapRef.current.leafletElement;
const group = this.groupRef.current.leafletElement; //get native featureGroup instance
mapInst.fitBounds(group.getBounds());

在你的componentDidMount

然后你就会得到想要的结果。

Demo

关于javascript - 如何在react-leaflet中调用fitBounds和getBounds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60734165/

相关文章:

javascript - Jquery 在 firebug 中有效,但在页面中无效

javascript - 数据结构,将svg存储在数组中

gis - 水平传单控件

javascript - 如何避免传单 javascript 库中多个 MultiPolygon GeoJSON 层重叠?

javascript - Node 应用程序工作环境中的 AWS Elastic Beanstalk cron

javascript - D3弧形中心的弯曲标签

javascript - 在缓存页面中调用动态内容(当前使用 ajax)的正确方法是什么?

javascript - 使用服务器端代理避免react中的跨域策略错误

javascript - 访问 React 事件的 props

r - 在 Shiny 的传单 map 上控制点过滤的最有效方法