карта-листовка React отображается некорректно

Я пытаюсь использовать react-leaflet для отображения карты. Я использую код из этой скрипки, которая работает, но на моем компьютере у меня есть этот вывод

введите описание изображения здесь

Вот мой код:

DeviceMap.js

import React from 'react'
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';

export class DeviceMap extends React.Component {
  constructor() {
    super();
    this.state = {
      lat: 51.505,
      lng: -0.09,
      zoom: 13,
    };
  }

  render() {
    const position = [this.state.lat, this.state.lng];
    return (
      <Map center={position} zoom={this.state.zoom} scrollWheelZoom={false}>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
        />
        <Marker position={position}>
          <Popup>
            <span>A pretty CSS3 popup. <br/> Easily customizable.</span>
          </Popup>
        </Marker>
      </Map>
    );
  }
}

export default DeviceMap

DeviceTabs.js

export class DeviceTabs extends React.Component {
  state = {
    index: 0
  };

  handleTabChange = (index) => {
    this.setState({ index })
  };

  render () {
    return (
      <Tabs index={this.state.index} onChange={this.handleTabChange}>
        <Tab label='Values'>
          <DeviceTable {...this.props} />
        </Tab>
        <Tab label='Map'>
          <div className={style.leaflet}>
            <DeviceMap />
          </div>
        </Tab>
      </Tabs>
    )
  }
}

style.scss

.leaflet {
  height: 300px;
  width: 100%;
}

В консоли нет ошибки, и я больше не знаю, где искать. Поскольку скрипка работает, это не ошибка. Я что-то пропустил ?


person ThomasThiebaud    schedule 01.11.2016    source источник


Ответы (15)


На всякий случай, если кто-то столкнется с той же проблемой, я решил ее, просто добавив это:

import 'leaflet/dist/leaflet.css';
person Ange Loron    schedule 17.04.2019

Я также новичок в использовании этой библиотеки и не нашел достаточно ясной документации. Но вот несколько вещей, которые я считаю необходимыми для того, чтобы это работало.

1. пакет буклетов React

2. Буклет:

Либо установите его с помощью npm

npm install leaflet и
import 'leaflet/dist/leaflet.css'; в файле, где вы используете Map из react-leaf.

OR

Включите эти две строки в index.html:

<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css"
  integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
  crossorigin=""/>

<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"
  integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
  crossorigin=""></script>

3. Добавьте это в App.css или index.css и импортируйте файл: (и это обязательно)

.leaflet-container {
  width: 100wh; 
  height: 100vh;
}

// ИЛИ добавляем стиль прямо в контейнер карты

<Map
   center={position}
   zoom={1}
   style={{ height: '100vh', width: '100wh' }}
   >
   <TileLayer .... />
</Map>

person Bikram Karki    schedule 02.04.2020
comment
Спасибо, просто нужно исправить букву по ширине style = {{height: '100vh', width: '100wh'}} - person Beginer; 07.06.2020
comment
@Beginer спасибо, я поправил. - person Bikram Karki; 23.01.2021

Попробуй это

import React, { Component } from 'react'
import Leaflet from 'leaflet';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet'
import 'leaflet/dist/leaflet.css';

Leaflet.Icon.Default.imagePath =
'../node_modules/leaflet'

delete Leaflet.Icon.Default.prototype._getIconUrl;

Leaflet.Icon.Default.mergeOptions({
    iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
    iconUrl: require('leaflet/dist/images/marker-icon.png'),
    shadowUrl: require('leaflet/dist/images/marker-shadow.png')
});



export default class MapDisplay extends Component {
state = {
    lat: 41.257017,
    lng: 29.077524,
    zoom: 13,
}


render() {
    const position = [this.state.lat, this.state.lng]
    return (
    <Map center={position} zoom={this.state.zoom} style={{height : '400px'}}>
        <TileLayer
        attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
        <Marker position={position}>
        <Popup>
            Son Konum
        </Popup>
        </Marker>
    </Map>
    )
}
}
person Cem Karakurt    schedule 17.05.2019
comment
это помогает увидеть карту. но я не вижу значка маркера - person yehonatan yehezkel; 08.09.2019
comment
нет ... это решит мою проблему - ›Leaflet.Icon.Default.imagePath = '//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.4/images/'; - person yehonatan yehezkel; 16.09.2019

Вы можете исправить это, добавив следующие строки кода внутри элемента head в свой index.html.

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css">

<style>
  body {
    padding-bottom: 30px;
  }
  h1, h2, p {
    font-family: sans-serif;
    text-align: center;
  }
  .leaflet-container {
    height: 400px;
    width: 80%;
    margin: 0 auto;
  }
</style>

Примечание. Вы можете изменить CSS в соответствии со своими потребностями.

person edgar mlowe    schedule 24.09.2018

import leaflet.css

import 'leaflet/dist/leaflet.css';

иногда после добавления файла листовки возникают две ошибки при загрузке изображения. для устранения этих ошибок импортируйте marker-icon.png и marker-shadow.png в части импорта, а затем определите L.Marker.prototype.options.icon:

import icon from 'leaflet/dist/images/marker-icon.png';
import iconShadow from 'leaflet/dist/images/marker-shadow.png';
import iconRetina from 'leaflet/dist/images/marker-icon-2x.png';
let DefaultIcon = L.icon({
            ...L.Icon.Default.prototype.options,
            iconUrl: icon,
            iconRetinaUrl: iconRetina,
            shadowUrl: iconShadow
        });
        L.Marker.prototype.options.icon = DefaultIcon;

если карта не отображается, добавьте высоту и ширину (style = {{width: '100%', height: '400px'}}) в тег Map как стиль:

<Map
center={[35.6892, 51.3890]}
style={{width: '100%',height: '400px'}}
>

Добавить высоту и ширину

person Mohammad    schedule 16.08.2019

В моем случае с добавлением React это помогло:

<MapContainer
        center={{ lat: 51.505, lng: -0.09 }}
        zoom={13}
        style={{ height: "50vh", width: "100%" }}
        scrollWheelZoom={false}
      >

Это должен быть как минимум 1 параметр высоты или ширины с vh, иначе, если вы используете только 100% / 100%, не сработает

person Hvitis    schedule 27.11.2020

если кто-то искал, как встроить это в отдельный компонент, я понял, как это сделать после некоторых проблем

import React from 'react';
import { MapContainer, Marker, Popup, TileLayer } from "react-leaflet";
import './MapObject.css'

const position = [51.505, -0.09]
class MapObject extends React.Component {
    render() {

        return (
                <MapContainer center={position} zoom={13} scrollWheelZoom={false}>
                <TileLayer
                attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
                />
                <Marker position={position}>
                <Popup>
                    A pretty CSS3 popup. <br /> Easily customizable.
                </Popup>
                </Marker>
            </MapContainer>           
        );
    }
}

Затем это просто загружается

import MapObject from './MapObject'

И MapObject.css должен выглядеть так (без этого он вообще не отображается)

.leaflet-container {
    width: 100%;
    height: 100vh;
  }

Результирующая карта находится здесь:

введите описание изображения здесь

person DovaX    schedule 05.02.2021

Вы должны просто добавить это в свой файл CSS, у меня была такая же проблема, как и у вас, и этот метод устранил мою проблему:

  @import url("~leaflet/dist/leaflet.css");

.leaflet-container {
  width: 100%;
  height: 100vh;
}
person Chris Lopez    schedule 25.01.2021

это решило мою проблему:

добавив это в index.html

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css">

<style>
  .leaflet-container {
   height: 400px;
   width: 800px;
 }
</style>

источник: https://medium.com/@eugenebelkovich/map-for-react-apps-with-leaflet-365f9df82d55

person Bruno Filgueiras    schedule 01.01.2020

попробуй это :

 var mapid = $(this).find('[id^=leaflet-map]').attr('id');
      var map = settings.leaflet[mapid].lMap;
      map.invalidateSize();
person Matoeil    schedule 06.01.2020

В Leaflet Map, если ваша карта не отображается должным образом, эта проблема связана с файлом CSS.

Попробуйте этот CSS в своем общедоступном / index.html

<link href='https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.3/leaflet.css' rel='stylesheet'>
person Nadeem Kazi    schedule 28.10.2020

Если это не работает для вас, вы можете попробовать вручную изменить размер окна при загрузке страницы.

window.dispatchEvent(new Event('resize'));
person Adrian Golda    schedule 17.11.2020

Моя карта полностью не отображалась даже после установки высоты и CSS. Для работы вам необходимо добавить следующие листовки cdn и css в файл index.html:

<link rel="stylesheet" 
href="//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css">    
<style>
     .leaflet-container {
       height: 500px;
       width: 960px;
     }    </style>

    <!-- Make sure you put this AFTER Leaflet's CSS -->
    <script src="https://unpkg.com/[email protected]/dist/leaflet.js"
      integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA=="
      crossorigin=""></script>
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
person briancoder    schedule 23.11.2020

Я не знаю почему, недостаточно добавить файл Leaflet css ...

Кажется, вам еще нужно добавить:

.leaflet-container{
  height:500px;
}
person Forwithy New    schedule 09.04.2021

person    schedule
comment
Спасибо за Ваш ответ. С этой строкой я теряю все (ошибок нет, ничего не отображается). Думаю, есть еще одна проблема с высотой карты, потому что я использую модули css. Я займусь расследованием завтра. - person ThomasThiebaud; 01.11.2016
comment
@ThomasThiebaud звучит хорошо, также хочу убедиться, что ваша версия листовки соответствует указанной мной ссылке, и установить высоту компонента / контейнера карты. - person rambossa; 02.11.2016
comment
Проблема осталась прежней. Я пробую с [email protected] и [email protected], а также с [email protected] и [email protected]. Я также исправляю высоту моего компонента, используя <div id={style.map}> с #map { height: 300px } - person ThomasThiebaud; 02.11.2016
comment
Я понял ! Вы также должны установить высоту .leaflet-container - person ThomasThiebaud; 02.11.2016
comment
Забавно, что ответы stackoverflow иногда предоставляют лучшую информацию, чем официальные документы. - person Konrad; 09.07.2020
comment
Вы прекрасный человек. этот комментарий сохранил мой проект - person Gibs LeFleur; 18.08.2020