Bagaimana cara memanggil fitBounds dan getBounds di selebaran reaksi?

Saya tidak tahu cara memanggil fitBounds() di peta Leaflet.

Pada dasarnya, saya mencoba menampilkan beberapa penanda di peta dan menyesuaikan tampilannya (memperbesar, memperkecil, terbang ke, dll.). saya juga melihat beberapa contoh Bagaimana Anda memanggil fitBounds() saat menggunakan leaflet-react? dan saya mencoba menerapkannya tetapi tidak berhasil. Ini kode saya yang saya coba.

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;

person Piotr    schedule 18.03.2020    source sumber


Jawaban (1)


Anda memiliki beberapa kesalahan dalam kode Anda:

  1. Anda tidak menutup toggleHiddden1 dengan }. Apalagi Anda menyebutnya sebagai toggleHiddden di komponen. Anda harus menggunakan satu nama untuk metode ini.

  2. contoh peta berasal dari
    let mapInst = this.mapRef.current.leafletElement;

    bukan dari let mapInst = this.refs.map.leafletElement;

    Kemudian Anda dapat menelepon fitBounds()

  3. Referensi di selebaran reaksi Peta wrpapper harus ref={this.mapRef} dan bukan ref="map"

  4. Tempatkan kunci saat Anda melewati penanda.

Cukup gunakan url ubin peta jalan terbuka untuk dapat mendemonstrasikan demo.

Edit Untuk menggunakan fitBounds dan getBounds secara bersamaan untuk penanda, Anda perlu membungkus loop penanda dengan FeatureGroup dan memberinya referensi, lalu lakukan

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

di dalam componentDidMount Anda

dan kemudian Anda akan mendapatkan hasil yang diinginkan.

Demo

person kboul    schedule 18.03.2020
comment
Terima kasih. ini berfungsi dan bagaimana memanggil getbounds dan flyto jika saya mencari suatu lokasi dan terbang ke lokasi tertentu.@kboul - person Piotr; 18.03.2020
comment
Cara yang sama Anda menelepon fitBounds. Gunakan mapInst. Terimalah jawabannya jika itu membantu Anda. - person kboul; 18.03.2020
comment
bagaimana saya bisa menggunakan keduanya sekaligus fitBounds dan getBounds untuk penanda, bisakah Anda memperbarui kode kotak sandi Anda maka saya akan menerima jawaban Anda? - person Piotr; 18.03.2020
comment
Saya memodifikasi demonya. Coba lihat - person kboul; 18.03.2020
comment
Terima kasih banyak !! - person Piotr; 18.03.2020