【问题标题】:Plot polygon using D3使用 D3 绘制多边形
【发布时间】:2018-08-07 16:23:56
【问题描述】:

我正在尝试使用 .json 文件绘制多边形。

*编辑添加样本坐标

{  "type": "FeatureCollection",  "features": [    {
  "type": "Feature",
  "geometry": {
                "type": "Polygon",
        "coordinates": [
            [
                [
                    -0.0691250297447329,
                    51.5462448874379
                ],
                [
                    -0.0691510961928943,
                    51.5459630404703
                ],
                [
                    -0.0692056531364391,
                    51.5456827414947
                ],
                [
                    -0.0692883661627076,
                    51.5454050640766
                ],
                [
                    -0.0693070134960316,
                    51.545356361588
                ],.....

脚本看起来像

var width = 960;
    var height = 600;

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


    d3.json("/GeoJsonFiles/samplePolygon1.json", function (error, json) {
        if (error) console.error(error);

        var projection = d3.geoMercator()
            .fitSize([width, height], json);
        var path = d3.geoPath().projection(projection);
        svg.selectAll("path")
            .data(json.features)
            .enter()
            .append("path")
            .attr("d", path)
            .attr("fill", "gray")
            .attr("stroke", "black");});

据我所知,没有错误,但 svg 没有显示任何内容。我也尝试过scale()center()offset()之类的方法。到目前为止没有任何效果。这是我的第一个 D3 脚本 - 请帮忙。

【问题讨论】:

  • 你的坐标是什么样的?在您的示例 geojson 中分享一些将是有益的。你也验证过geojson吗?
  • 你好安德鲁!谢谢你的评论。请参阅样本坐标的更新。我使用了 [链接] (npm.runkit.com/geojson-validation),它使用 geojson-validation 来验证坐标。他们是正确的。请问有什么想法吗?
  • 可以在 [link] (api.myjson.com/bins/vfga0) 上找到多边形的完整坐标
  • @Max 你用的是什么版本的 D3?
  • @altocumulus 它是 v4。我喜欢 d3.js 在顺时针方向使用右手规则/坐标,因此检查以确保多边形是顺时针方向的。希望有帮助

标签: javascript d3.js polygon geojson


【解决方案1】:

找到这个D3 polygon 原来下面的代码是必不可少的。

.attr("points", function (d) {
  return d.map;
})

完整代码如下。

d3.json("/GeoJsonFiles/samplePolygon1.json", function (error, json) {
                if (error) console.error(error);

                var projection = d3.geoMercator()
                    .fitSize([width, height], json);
                var path = d3.geoPath().projection(projection);
                svg.selectAll("path")
                    .data([json])
                    .enter()
                    .append("path")
                    .attr("points", function (d) {
                        return d.map;
                    })
                    .attr("d", path)
                    .attr("fill", "gray")
                    .attr("stroke", "black");
            });

【讨论】:

  • 不应该需要 d3.polygon,尤其是 path 没有引用 points 属性。我很容易用投影和路径显示你的 geojson:bl.ocks.org/Andrew-Reid/19d88c2ff1dba0fa0f1963babbf1bf9c。也许特征集合(而不是共享的单个特征)存在一个奇怪的问题。
  • 谢谢安德鲁。那很奇怪。我试过没有任何错误,而是一个空白的 SVG。只是再次尝试以确保。一样的。不过,您对功能集的看法可能是对的。
  • D3 的 geojson 验证相对严格,据我所知不会抛出错误,这可以解释您所看到的行为。一种选择是记录 path(featureCollection) 并查看返回的任何内容是否类似于路径数据。
  • 你的解释很有道理。谢谢你。不幸的是,我无法记录它,因为控制台一直说Uncaught ReferenceError: path is not defined 虽然你可以看到我正在使用路径来绘制。我真的无法理解
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多