D3如何改变SVG的宽度和长度

时间:2012-06-04 15:03:32

标签: d3.js

我在谷歌地图上创建了一个SVG,我想控制SVG对象的宽度和长度

尺寸合适,但SVG的位置不在正确的位置。

我如何控制对象的位置?

我尝试为

添加转换
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")

然后尺寸不起作用。 当我还尝试添加比例并转换为投影时,尺寸也不起作用。 你能告诉我如何控制位置和大小吗? SVG的第一个位置应该是相同位置的想法只有大小应该改变但位置应该始终相同。 当我更改缩放时,当前的问题是SVG也会改变位置

   <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://mbostock.github.com/d3/d3.v2.js?2.8.1"></script>
<script type="text/javascript"
    src="http://maps.google.com/maps/api/js?sensor=true"></script>
<style>
html,body,#map {
    width: 95%;
    height: 95%;
    margin: 0;
    padding: 0;
}

.stations,.stations svg {
    position: absolute;
}

.stations svg {
    width: 60px;
    height: 20px;
    padding-right: 100px;
    font: 10px sans-serif;
}

.stations circle {
    fill: brown;
    stroke: black;
    stroke-width: 1.5px;
}

.background {
    fill: none;
    pointer-events: all;
}

#states path:hover {
    stroke: white;
}

#state-titels text {
    font-family: "ff-dagny-web-pro-1", "ff-dagny-web-pro-2", sans-serif;
    font-size: 8px;
    font-weight: 700;
    font-style: normal;
    font-size-adjust: none;
    color: #333333;
    text-transform: none;
    text-decoration: none;
    letter-spacing: normal;
    word-spacing: 0;
    text-align: start;
    vertical-align: baseline;
    direction: ltr;
    text-overflow: clip;
}

#states path {
    fill: #ccc;
    stroke: #fff;
    stroke-width: 1.5px;
}
</style>
</head>
<body>
    <div id="map"></div>
    <script type="text/javascript">
        //Create the Google Map…

        var first = 1;
        var zoom = 2;
        var map = new google.maps.Map(d3.select("#map").node(), {
            zoom : 2,
            center : new google.maps.LatLng(-53.76487, -110.41948),
            mapTypeId : google.maps.MapTypeId.TERRAIN
        });

        google.maps.event.addListener(map, 'zoom_changed', function() {
            zoom = map.getZoom();
        });

        var width = 10000, height = 1000, centered;

        var projection = d3.geo.albersUsa();

        var path = d3.geo.path().projection(projection);

        var count = 1;

        d3.json("../d3/us-states.json", function(json) {

            var overlay = new google.maps.OverlayView();
                overlay.onAdd = function() {


                var layer = d3.select(this.getPanes().overlayLayer).append("div");

                var width1 = 1000;
                var height1 = 1000;
                var svg = layer.append("svg").attr("width", width1).attr(
                        "height", height1);


                var states = svg.append("g").attr("id",
                        "states");

                states.selectAll("path").data(json.features).enter()
                .append("path").attr("d", path)//.attr("transform", "scale(" + (zoom) + ")")//.each(transform)
                .style("opacity", "0.7");

                overlay.draw = function() {
                    if ( zoom == 2)
                states.transition().attr("transform", "scale(" + (zoom / 8 ) + ")").style("stroke-width", 2 / zoom + "px");
                    else if ( zoom == 3)
                         states.transition().attr("transform", "scale(" + (zoom / 6 ) + ")").style("stroke-width", 2 / zoom + "px");
                    else if ( zoom == 4)
                     states.transition().attr("transform", "scale(" + (zoom / 4 ) + ")").style("stroke-width", 2 / zoom + "px");
                    else if ( zoom == 5)
                         states.transition().attr("transform", "scale(" + (zoom / 2 ) + ")").style("stroke-width", 2 / zoom + "px");

                };

            };

            overlay.setMap(map);

        });
    </script>
</body>
</html>

1 个答案:

答案 0 :(得分:22)

除非我误解了这个问题,否则您应该只需使用CSS即可控制SVG的大小。因此,使用d3,而不是使用attr()使用style()

layer.append("svg")
  .style("width", width1 + 'px')
  .style("height", height1 + 'px');

同样地,你可以用.style("left", ...).style("top", ...)控制位置,假设你的svg绝对定位。