【发布时间】:2016-02-27 08:02:10
【问题描述】:
我正在使用 Leaflet 创建一个在顶部添加了 D3 图层的地图。我想自动缩放到覆盖层,类似于在纯 D3 (see example) 中自动将地理对象放入其容器中的方式。
为了让 Leaflet 和 D3 玩得很好,我必须使用每个 this example 的自定义地理转换:
function projectPoint(x, y) {
var point = map.latLngToLayerPoint(new L.LatLng(y, x));
this.stream.point(point.x, point.y);
}
var transform = d3.geo.transform({point: projectPoint}),
path = d3.geo.path().projection(transform);
这使得将 D3 投影到 Leaflet 地图上毫不费力,但我对如何确定图层地图的纬度/经度一无所知。我需要这些坐标来设置中心,然后我还需要设置缩放级别。
如何在 Leaflet 中自动设置 setView 和 setZoom 以适应 D3 覆盖层?
这是我的实现:
var map = new L.Map("map", {
// Initialize map with arbitrary center/zoom
center: [37.8, -96.9],
zoom: 4
})
var layer = map
.addLayer(new L.TileLayer("http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"));
var figure = d3.select('figure');
var width = figure.node().clientWidth;
var height = figure.node().clientHeight;
var svg = d3.select(map.getPanes().overlayPane)
.append("svg")
.style('width', width)
.style('height', height);
var g = svg.append("g").attr("class", "leaflet-zoom-hide");
function projectPoint(x, y) {
var point = map.latLngToLayerPoint(new L.LatLng(y, x));
this.stream.point(point.x, point.y);
}
var transform = d3.geo.transform({ point: projectPoint });
var path = d3.geo.path().projection(transform);
d3.json('conway-ar.json', function(error, collection) {
if (error) console.warn(error);
var city = g.append('path')
.datum(collection.city.geometry)
.attr('fill', 'none')
.attr('stroke', 'blue')
.attr('d', path);
// Update center/zoom based on location of "city"
// map.setView([someLat, someLng]);
// map.setZoom(someZoomLevel);
map.on('viewreset', update);
update();
function update() {
city.attr('d', path);
}
});
【问题讨论】:
标签: javascript d3.js leaflet