我正在尝试使用d3.geo和GeoJson将地图叠加到Google Maps上。我已经设法强制d3使用Google Map的投影来绘制路径,这非常简单。这是我到目前为止所知道的:
http://www.caudillweb.com/temp/d3_choropleth.html
当我放大和缩小时,效果很好:


但是当我平移时,SVG覆盖也会移动,因为它的大小是固定的,所以形状会被截断:

有没有人用过这样的东西?有什么想法可以让我从这里开始吗?上面的例子是一个独立的HTML文件,如果有人想要使用它的话。
发布于 2012-08-20 00:02:43
在this example中,svg的宽度和高度被设置为8000x8000,这似乎可以达到大约9-10的缩放级别。顶部和左侧设置为-4000 x -4000以居中。最后,对投影进行移位/偏移,使其绘制在svg的中心:
放大并居中svg:
.SvgOverlay svg {
position: absolute;
top: -4000px;
left: -4000px;
width: 8000px;
height: 8000px;
}偏移投影:
return [pixelCoordinates.x + 4000, pixelCoordinates.y + 4000];发布于 2012-08-18 12:25:35
一种选择是将初始贴图大小设置为非常大的值,例如,1000 x 1000像素或更大。这将强制SVG覆盖在可见区域内呈现(这似乎是Firefox的限制)。我意识到这可能会破坏您站点的设计,所以您可能想要考虑用div包装地图以隐藏溢出。
#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_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
});Here is a working example (在火狐和Chrome上测试)。
一些注意事项:
发布于 2012-08-18 02:18:55
我可以通过将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覆盖的有用性会降低。
这里有一个小提琴演示了这个想法。http://jsfiddle.net/VHWqq/7/
编辑:正如Herb指出的那样,这种方法在Firefox上不起作用。
https://stackoverflow.com/questions/11909099
复制相似问题