Google maps 在谷歌地图上覆盖d3路径?
我正在尝试使用d3.geo和GeoJson将地图覆盖到Google地图上。我已经设法强迫d3使用谷歌地图的投影来绘制路径,这非常简单。以下是我目前掌握的情况: 这在我放大和缩小时效果很好: 但当我平移时,SVG覆盖也会移动,因为它的大小是固定的,所以形状会被截断:Google maps 在谷歌地图上覆盖d3路径?,google-maps,d3.js,Google Maps,D3.js,我正在尝试使用d3.geo和GeoJson将地图覆盖到Google地图上。我已经设法强迫d3使用谷歌地图的投影来绘制路径,这非常简单。以下是我目前掌握的情况: 这在我放大和缩小时效果很好: 但当我平移时,SVG覆盖也会移动,因为它的大小是固定的,所以形状会被截断: 有人用过这样的东西吗?你知道我能从这里走到哪里吗?上面的示例是一个独立的HTML文件,如果有人想使用它的话。我能够在缩放级别解决这个问题,方法是将svg放大,添加一些填充,并提供一个负的顶部和左侧位置,如下所示: .S
有人用过这样的东西吗?你知道我能从这里走到哪里吗?上面的示例是一个独立的HTML文件,如果有人想使用它的话。我能够在缩放级别解决这个问题,方法是将svg放大,添加一些填充,并提供一个负的顶部和左侧位置,如下所示:
.SvgOverlay, .SvgOverlay svg {
position: absolute;
top: -250px;
left: -250px;
padding: 500px;
}
var svg = layer.append("svg")
.attr("width", 1000)
.attr("height", 1000)
如果您想允许用户进一步放大,则必须增加所有这些数字。例如,将它们增加10倍似乎可以解决所有缩放级别的问题。但是,您可能希望限制用户的缩放能力,因为随着您进一步放大,svg覆盖的有用性会降低
这里有一把小提琴来演示这个想法。
编辑:正如赫伯指出的,这种方法在Firefox上不起作用。一个选项是将初始地图大小设置为非常大的值,比如1000 x 1000像素或更大。这将强制SVG覆盖在可视区域内渲染(这似乎是Firefox的限制)。我意识到这可能会影响到网站的设计,所以你可能想考虑用DIV来包装地图来隐藏溢出。< /P>
#map-wrap {
width: 500px;
height: 500px;
overflow: hidden;
}
#map {
width: 1000px; /* just big enough to show the whole thing at zoom #6 */
height: 1000px;
}
贴图渲染后,可以将贴图大小重新调整为所需大小(500 x 500),然后将贴图重新居中。这可以在bounds\u changed
事件中完成:
google.maps.event.addListener(map, 'bounds_changed', function() {
$map.css({ height: '500px', width: '500px' }); // back to desired dims
google.maps.event.trigger(map, 'resize'); // trigger a 'refresh'
map.setCenter(new google.maps.LatLng(-18.2, 35.1)); // re-center map
google.maps.event.clearListeners(map, 'bounds_changed'); // don't do this again
});
(在Firefox和Chrome中测试)
一些警告:
.SvgOverlay svg {
position: absolute;
top: -4000px;
left: -4000px;
width: 8000px;
height: 8000px;
}
return [pixelCoordinates.x + 4000, pixelCoordinates.y + 4000];
偏移投影:
.SvgOverlay svg {
position: absolute;
top: -4000px;
left: -4000px;
width: 8000px;
height: 8000px;
}
return [pixelCoordinates.x + 4000, pixelCoordinates.y + 4000];
有趣。看起来您可以将数字设置为任意高(例如,顶部/左侧:2500000px,填充:5000000px等),而不会出现任何问题。这似乎只适用于webkit浏览器,但在firefox中,它仍然会切断形状。此外,我同意在这种情况下,放大近距离不是很有用,但在其他可视化场景中(例如,在不同位置放置根据某个指标大小的气泡)。谢谢,Derek。这在首次加载时起作用-最初隐藏的贴图部分在平移时渲染良好。但是,无论您将
#map
的原始尺寸设置得多大,当您放大一个级别然后平移时,SVG在Chrome和Firefox中都会被裁剪为500x500。这是因为你重置了$map
监听器中bounds\u changed
的维度,这让我们回到了开始的地方。无论如何,这种方法仍然非常有限——实际地图画布越大,你必须等待Google加载的底图图像就越多。而在@Districe的方法中,您可以将SVG设置为任意大,唯一的结果是浏览器必须使用更大的数字进行计算。在这种情况下,为什么不将SVG设置为极大,并偏移投影以在中心绘制?我已经用一个例子更新了我的答案。回想起来,一次渲染整个场景时,性能并不太好。我可能会有另一个解决方案,将SVG保持在500 x 500,但会将其移动,使其充当窗口。内部投影也需要偏移。如果它能工作,在任何缩放级别上的性能都会非常好。德里克-选项1看起来可能是赢家。也许可以把它分解成一个单独的答案?