Есть ли способ ограничить панорамирование мирового края? На этой картине коричневый - это мир, серый - пустота. Я хочу сделать невозможным панорамирование таким образом.
Есть ли способ ограничить панорамирование мирового края? На этой картине коричневый - это мир, серый - пустота. Я хочу сделать невозможным панорамирование таким образом.
Листовка позволяет вам контролировать, насколько карта сопротивляется вытягиванию за пределы с помощью параметра maxBoundsViscosity
(значение: от 0 до 1). Максимальное значение параметра для этого параметра полностью отключает перетаскивание за пределы.
var map = new L.Map('map', {
center: bounds.getCenter(),
zoom: 5,
layers: [osm],
maxBounds: bounds,
maxBoundsViscosity: 1.0
});
Эта функция соответствующий запрос на тягу включает рабочий пример:
var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
osmAttrib = '© <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
osm1 = L.tileLayer(osmUrl, {
maxZoom: 18,
attribution: osmAttrib
}),
osm2 = L.tileLayer(osmUrl, {
maxZoom: 18,
attribution: osmAttrib
}),
bounds = new L.LatLngBounds(new L.LatLng(49.5, -11.3), new L.LatLng(61.2, 2.5));
var map1 = new L.Map('map1', {
center: bounds.getCenter(),
zoom: 5,
layers: [osm1],
maxBounds: bounds,
maxBoundsViscosity: 0.75
});
var map2 = new L.Map('map2', {
center: bounds.getCenter(),
zoom: 5,
layers: [osm2],
maxBounds: bounds,
maxBoundsViscosity: 1.0
});
var latlngs = L.rectangle(bounds).getLatLngs();
L.polyline(latlngs[0].concat(latlngs[0][0])).addTo(map1);
L.polyline(latlngs[0].concat(latlngs[0][0])).addTo(map2);
html,
body,
#map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<h1>Left: Bouncy maxBounds. Right: Not bouncy.</h1>
<div id="map1" style="float: left; width:45%; height: 80%;"></div>
<div id="map2" style="float: left; width:45%; height: 80%;"></div>
Вот как я решил это для карты мира
var map = L.map('map').setView([51.505, -0.09], 3);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(map);
var southWest = L.latLng(-89.98155760646617, -180),
northEast = L.latLng(89.99346179538875, 180);
var bounds = L.latLngBounds(southWest, northEast);
map.setMaxBounds(bounds);
map.on('drag', function() {
map.panInsideBounds(bounds, { animate: false });
});
См. рабочий пример для версии .7.0.7 http://jsfiddle.net/exqar2w4/18/ и для версии 1.0. 3 http://jsfiddle.net/exqar2w4/20/
Я использую react-leaflet
, поэтому синтаксис немного отличается от приведенного выше, но я подумал, что было бы полезно показать некоторые разумные границы для использования (ни один из ответов выше не делает этого).
import Leaflet from 'leaflet'
import { Map as LeafletMap} from 'react-leaflet'
// Set map bounds.
// Allow scroll over the international date line, so users can comfortably zoom into locations near the date line.
const corner1 = Leaflet.latLng(-90, -200)
const corner2 = Leaflet.latLng(90, 200)
const bounds = Leaflet.latLngBounds(corner1, corner2)
Который затем отображается как...
<LeafletMap
maxBoundsViscosity={1.0}
maxBounds={bounds}
{...otherProps}
>