18

Google マップで 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>
4

1 に答える 1

26

質問を誤解しない限り、CSSを使用するだけでSVGのサイズを制御できるはずです。したがって、useを使用するのではなく、d3をattr()使用しstyle()ます。

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

同様に、 svgが絶対的に配置されていると仮定して、.style("left", ...)とで位置を制御します。.style("top", ...)

于 2012-06-04T15:27:19.060 に答える