【发布时间】:2020-08-25 19:08:36
【问题描述】:
我使用deck.gl 创建了一些弧线。当您单击不同的点/多边形时,国家之间会出现不同的弧线。执行此操作时,我希望地图缩放到这些弧的边界。
为清楚起见,这里是一个示例:单击 Glasgow 时,我想放大到显示的弧线(尽可能紧密):
看来,使用 WebMercatorViewport,您可以调用 fitBounds (见:https://deck.gl/docs/api-reference/core/web-mercator-viewport#webmercatorviewport)
不过,我不清楚它是如何使用的。我试图找到例子,但没有找到。我怎样才能将它添加到我拥有的东西中?
这是弧的代码:
fetch('countries.json')
.then(res => res.json())
.then(data => {
console.log('data',data)
const inFlowColors = [
[0, 55, 255]
];
const outFlowColors = [
[255, 200, 0]
];
const countyLayer = new deck.GeoJsonLayer({
id: 'geojson',
data: data,
stroked: true,
filled: true,
autoHighlight: true,
lineWidthScale: 20,
lineWidthMinPixels: 1,
pointRadiusMinPixels: 10,
opacity:.5,
getFillColor: () => [0, 0, 0],
getLineColor: () => [0,0,0],
getLineWidth: 1,
onClick: info => updateLayers(info.object),
pickable: true
});
const deckgl = new deck.DeckGL({
mapboxApiAccessToken: 'pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2pudzRtaWloMDAzcTN2bzN1aXdxZHB5bSJ9.2bkj3IiRC8wj3jLThvDGdA',
mapStyle: 'mapbox://styles/mapbox/light-v9',
initialViewState: {
longitude: -19.903283,
latitude: 36.371449,
zoom: 1.5,
maxZoom: 15,
pitch: 0,
bearing: 0
},
controller: true,
layers: []
});
updateLayers(
data.features.find(f => f.properties.name == 'United States' )
);
function updateLayers(selectedFeature) {
const {exports, centroid, top_exports, export_value} = selectedFeature.properties;
const arcs = Object.keys(exports).map(toId => {
const f = data.features[toId];
return {
source: centroid,
target: f.properties.centroid,
value: exports[toId],
top_exports: top_exports[toId],
export_value: export_value[toId]
};
});
arcs.forEach(a => {
a.vol = a.value;
});
const arcLayer = new deck.ArcLayer({
id: 'arc',
data: arcs,
getSourcePosition: d => d.source,
getTargetPosition: d => d.target,
getSourceColor: d => [0, 55, 255],
getTargetColor: d => [255, 200, 0],
getHeight: 0,
getWidth: d => d.vol
});
deckgl.setProps({
layers: [countyLayer, arcLayer]
});
}
});
这是一个 Plunker: https://plnkr.co/edit/4L7HUYuQFM19m9rI
【问题讨论】:
-
在弧层上开启pickable,为onClick事件添加事件句柄,计算弧的范围,然后FlyToInterpolator?只是一个基本的想法。
-
我没有在没有 ReactJS 的情况下使用 Deck.gl 的经验,但我可以尝试给你一个想法如何在 ReactJS 中解决它,然后我们可以尝试将它移植到 vanilla。第一个想法:它使用 onClick 处理程序、草皮、WebMercatorViewport 和 LinearInterpolator。基本思路:打开弧层上的可拾取属性,然后使用 Turf 计算对象的范围,创建具有新边界的新视口,并使用 LinearInterpolator(或 FlyToInterpolator)过渡到新视口。
-
我需要更好地理解“这些弧的边界”的含义。您想要一个从源到目的地的所有弧线(从选定区域开始)都可见的视图吗?
-
@lezan re:“那些弧线的边界”:是的,这正是我的意思。我在帖子中添加了一个示例来进一步解释。
-
@lezan FlyToInterpolator 似乎是正确的方法,但我不确定如何添加边界。看这个例子--codepen.io/vis-gl/pen/pKvrGP-- 我只看到如何添加纬度/经度。感谢您的帮助!
标签: deck.gl