【问题标题】:topojson / D3 / Map with longitude + latitudetopojson / D3 / 经度+纬度地图
【发布时间】:2016-11-11 05:28:01
【问题描述】:

我正在使用以下 UK Geo JSON 来渲染 UK SVG 地图 http://martinjc.github.io/UK-GeoJSON/json/eng/topo_eer.json

在这张地图上,我希望能够获取经度 + 纬度点并绘制到地图上。

我正在通过以下方式将 GeometryCollection 地点添加到地图:

 data.objects.places = {
        type: "GeometryCollection",
        geometries: [
            {
                type: "Point",
                coordinates: [-0.127758, 51.507351], // London
                properties: {
                    name: "London - Testing"
                }
            }
        ]
    };

但是坐标位置不对。

以下是完整的 javascript。

var width = 960;
var height = 1000;

var projection = d3.geo.albers()
        .center([0, 55.4])
        .rotate([4.4, 0])
        .parallels([50, 60])
        .scale(4000)
        .translate([width / 2, height / 2]);

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

var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height);

d3.json("topo_eer.json", function(error, data) {

    // Create path for the UK
    svg.selectAll(".subunit")
            .data(topojson.feature(data, data.objects.eer).features)
            .enter().append("path")
            .attr("class", function(d) { return "subunit " + d.id; })
            .attr("d", path);

    // Path around regions
    svg.append("path")
            .datum(topojson.mesh(data, data.objects.eer, function(a, b) { return a !== b; }))
            .attr("d", path)
            .attr("class", "subunit-boundary");

    // Add places to our data
    data.objects.places = {
        type: "GeometryCollection",
        geometries: [
            {
                type: "Point",
                coordinates: [-0.127758, 51.507351], // London
                properties: {
                    name: "London - Testing"
                }
            }
        ]
    };

    // try plotting a point
    svg.append("path")
            .datum(topojson.feature(data, data.objects.places))
            .attr("d", path)
            .attr("class", "place-online");

    console.log(data);

});

【问题讨论】:

    标签: javascript json d3.js svg topojson


    【解决方案1】:

    在 TopoJSON 中,coordinates 中的那些数字不是实际的纬度/经度值。他们必须被改造。该函数将量化拓扑转换为绝对坐标:

    function transformPoint(topology, position) {
        position = position.slice();
        position[0] = position[0] * topology.transform.scale[0] 
        + topology.transform.translate[0],
        position[1] = position[1] * topology.transform.scale[1] 
        + topology.transform.translate[1]
        return position;
    };
    

    您会在链接的 TopoJSON 末尾找到 scaletranslate

    "transform":
        {"scale":
            [0.000818229038834542,0.0005946917122888551],
        "translate":[-6.418556211736409,49.8647494628352]
        }
    

    基于该函数,我相信编写一个相反的函数很容易:

    function transformPointReversed(topology, position) {
        position = position.slice();
        position[0] = (position[0] - topology.transform.translate[0])
        /(topology.transform.scale[0]),
        position[1] = (position[1] - topology.transform.translate[1])
        /(topology.transform.scale[1]) 
        return position;
    };
    

    我尝试了我刚刚创建的这个函数,你的伦敦坐标返回了这个数组:

    [7688.309645789168, 2762.1059840278253]
    

    请在您的coordinates 中测试它是否有效。

    另一种方法是用 GeoJSON 覆盖您的 TopoJSON,它确实使用绝对坐标系统。

    这里是 API 参考:https://github.com/mbostock/topojson-specification/blob/master/README.md#22-geometry-objects

    【讨论】:

    • 感谢您的快速回复:)
    • 我把它放进去,我得到的坐标和你一样,但是它不在地图上的正确位置。
    • 你试过[7688.309645789168, 2762.1059840278253]去伦敦吗?
    • 运行 long / lat 虽然该函数产生与上述相同的数字并且它位于“中部附近”的同一个地方:(
    • 抱歉,刚刚又看了一遍,看来它确实有效。我认为您在上面粘贴的转换数据与我拥有的文件中的转换数据不匹配,这就是它被偏移的原因。非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 2017-10-09
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多