【问题标题】:How can I use SVG translate to center a d3.js projection to given latitude and longitude values?如何使用 SVG translate 将 d3.js 投影居中到给定的纬度和经度值?
【发布时间】:2013-05-23 01:26:41
【问题描述】:

我正在使用 d3 渲染 GeoJSON 世界地图的墨卡托投影。

我希望能够使用 d3 进行缩放,并在用户逐步浏览我的应用程序时将地图转换为已知的纬度和经度值。

projection.center (https://github.com/mbostock/d3/wiki/Geo-Projections#wiki-center) 结合transition().duration() 做我想做的事,但这需要重新绘制地图,因此继续重复似乎很昂贵。我想使用 SVG (https://developer.mozilla.org/en-US/docs/SVG/Attribute/transform) 附带的原生 translate()scale() 方法。

我找到了一些有用的示例,例如 Mike Bostock 的 (http://bl.ocks.org/mbostock/4699541),以及一些有用的问题,例如以下关于将地图居中到给定 GeoJSON 对象 (Center a map in d3 given a geoJSON object) 的问题,但我正在努力包装我的绕过他们。

请有人帮助我使用 SVG 的 transform="translate(x, y)" 将我的投影居中到给定的纬度和经度值?

非常感谢。


编辑 @Lars:首先,谢谢。我已经尝试了您的建议,并且发生了移动,但投影似乎移动得太远了。我在下面包含了一个屏幕截图和我的投影代码:

var SFMap = {
    initialise: function() {
        var width = "752";
        var height = "420";
        SFMap.projection = d3.geo.mercator()
            .scale(100)
            .translate([width/2, height/2])
            .center([0, 0]);

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

        SFMap.svg = d3.select("#sf__map")
            .append("svg")
            .attr("width", width)
            .attr("height", height);

        SFMap.g = SFMap.svg.append("g");

        d3.json("world-110m.topo.json", SFMap.draw);
    },

    draw: function(error, topology) {
        SFMap.g
            .selectAll("path")
            .data(topojson.feature(topology, topology.objects.countries)
                .features)
            .enter()
            .append("path")
            .attr("d", SFMap.path)
            .attr("class", "feature");
    },

(View full size)

translateing 到伦敦 - 51.5171° N,0.1062° W - 使用以下代码时,会发生上述情况:

var coordinates = SFMap.projection([0.1062, 51.5171]);
SFMap.g.attr("transform", "translate(" + (-coordinates[0]) + "," + (-coordinates[1]) + ")");

我也尝试过第二次反转这些值。

【问题讨论】:

    标签: svg maps d3.js geo


    【解决方案1】:

    假设您的投影中心是 (0,0),您只需将要居中的点的坐标提供给您的投影函数(转换为用户坐标)并给出倒数到translate。类似的东西

    var coordinates = projection(point);
    svg.attr("transform", "translate(" + (-coordinates[0]) + "," + (-coordinates[1]) + ")");
    

    如果您也翻译了投影,则需要考虑到这一点,例如

    svg.attr("transform", "translate(" + (-coordinates[0]+width/2) +
             "," + (-coordinates[1]+height/2) + ")");
    

    【讨论】:

    • 您好,谢谢!我已经更新了我的问题以显示结果。你能看出我做错了什么吗?
    • 这里的干扰是您添加到投影本身的翻译。我会更新答案。此外,您的宽度和高度应该是数字,而不是字符串。
    • 就是这样!感谢您的帮助,并发现类型错误。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2020-09-15
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多