Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用D3.js绘制SVG?

我试图用我从这个API带来的GEOJSON数据在SVG中绘制一张地图,SVG路径充满了数据,然而,SVG是空白的,执行下面的代码可以看到。注意document.write,数据被正确返回。

代码语言:javascript
运行
AI代码解释
复制
var svg = d3.select("svg")
d3.json('https://api.mocki.io/v1/d214eb47')
    .then(data => {      
       svg.append('g')
          .selectAll('path')
          .data(data.features)
          .enter()
          .append('path')
          .attr('d', d3.geoPath().projection(d3.geoMercator()))

          document.write(JSON.stringify(data));
    })
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.0/d3.min.js"></script>
<svg  width="600" height="600"></svg>

我用另一个GEOJSON file测试了它,并设法在SVG中绘制,如执行以下代码所示:

代码语言:javascript
运行
AI代码解释
复制
const link = "https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world.geojson";   

var svg = d3.select("svg")

d3.json(link)
        .then(data => {    
         svg.append("g")
        .selectAll("path")
        .data(data.features)
        .enter()
        .append("path")          
          .attr("d", d3.geoPath()
              .projection(d3.geoMercator())
          )
          
         //document.write('data ', JSON.stringify(data))
        
        });
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.0/d3.min.js"></script>
<svg width="600" height="600"></svg>

有人知道第一个代码片段出了什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-25 00:11:16

数据中没有问题,这里的问题只是您试图绘制一个非常小的区域(旧金山),而不是您的第二个示例中的世界地图。也就是说,您应该设置投影的scalecenter。在您的案例中:

代码语言:javascript
运行
AI代码解释
复制
const projection = d3.geoMercator()
    .scale(100000)
    .center([-122.3, 37.75])

生成的代码如下:

代码语言:javascript
运行
AI代码解释
复制
var svg = d3.select("svg");
const projection = d3.geoMercator()
  .scale(100000)
  .center([-122.3, 37.75])
d3.json('https://api.mocki.io/v1/d214eb47')
  .then(data => {
    svg.append('g')
      .selectAll('path')
      .data(data.features)
      .enter()
      .append('path')
      .attr('d', d3.geoPath().projection(projection))
  })
代码语言:javascript
运行
AI代码解释
复制
path {
  fill: wheat;
  stroke: darkslateblue;
}
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.0/d3.min.js"></script>
<svg width="600" height="600"></svg>

但只需将fitExtent与您的SVG宽度和高度一起使用就更简单了:

代码语言:javascript
运行
AI代码解释
复制
const projection = d3.geoMercator()
  .fitExtent([
    [0, 0],
    [600, 600]
  ], data)

下面是生成的代码:

代码语言:javascript
运行
AI代码解释
复制
var svg = d3.select("svg");
d3.json('https://api.mocki.io/v1/d214eb47')
  .then(data => {
    const projection = d3.geoMercator()
      .fitExtent([
        [0, 0],
        [600, 600]
      ], data)
    svg.append('g')
      .selectAll('path')
      .data(data.features)
      .enter()
      .append('path')
      .attr('d', d3.geoPath().projection(projection))
  })
代码语言:javascript
运行
AI代码解释
复制
path {
  fill: wheat;
  stroke: darkslateblue;
}
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.0/d3.min.js"></script>
<svg width="600" height="600"></svg>

票数 3
EN

Stack Overflow用户

发布于 2021-03-25 00:18:18

您的GeoJSON文件有非常小的显示区域,但在给定的投影和默认的SVG viewBox中几乎没有大小的形状。

检查我是如何使用您的地理数据找到SVG G元素的边界的。然后我用它来定义SVG的viewBox属性。如果未设置SVG的宽度或高度,则SVG将扩展到可用的“容器”大小。因此,如果愿意,您可以添加周围的DIV元素并设置其大小(在容器中适合SVG,从而在布局中适合SVG)。

更新:您甚至可以稍后使用javascript使用getBBox()函数的返回值来更改SVG viewBox属性。另一种答案中的另一种可能性当然也很大(适合您的SVG范围)。

代码语言:javascript
运行
AI代码解释
复制
var svg = d3.select("svg");

const link = "https://api.mocki.io/v1/d214eb47";   
//const link = "https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world.geojson";   

d3.json(link)
    .then(data => {      
    svg.append('g')
      .selectAll('path')
      .data(data.features)
      .enter()
      .append('path')
      .attr('d', d3.geoPath().projection(d3.geoMercator()));

        //console.log(data.features);
        console.log(document.getElementsByTagName("g")[0].getBBox());
  })
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.0/d3.min.js"></script>
<svg viewBox="152.95315551757812 140.7493133544922 0.421722412109375 0.4228363037109375"></svg>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66789452

复制
相关文章
Java异常抛出及try,catch应用实例
1 class lanpingException extends Exception 2 { 3 lanpingException(String msg) 4 { 5 super(msg); 6 } 7 } 8 9 class maoyanException extends Exception 10 { 11 maoyanException(String msg) 12 { 13 super(msg); 14
Angel_Kitty
2018/04/09
7450
捕获异常try…catch…finally
try:该代码块中编写可能产生异常的代码。 catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。 finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
秋白
2019/02/21
1.3K0
捕获异常try…catch…finally
try()catch{}写法
当生活像一首歌那样轻快流畅时,笑颜常开乃易事;而在一切事都不妙时仍能微笑的人,是真正的乐观。——威尔科克斯 曾经我们使用java的IO流复制文件时是这么写的 package com.ruben; import java.io.*; import java.util.Optional; /** * @ClassName: FileDemo * @Description: 我还没有写描述 * @Date: 2021/1/10 0010 21:38 * * * @author: <achao1
阿超
2022/08/16
1.3K0
js处理异常try{}catch(e){}
程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers)。如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面。否则,就会让访问者对莫名的现象感到真正的“意外”。   一、什么是例外处理   当JavaScript程序在运行中发生了诸如数组索引越界、类型不匹配或者语法错误时,JavaScript解释器就会引发例外处理。ECMAScript定义了六种类型的错误,除此之外,我们可以使用Error对象和throw语句来创建并引发自定义的
逸鹏
2018/04/10
3.2K0
替代try catch处理异常的优雅方式
小熊学Java个人网站:https://javaxiaobear.gitee.io/
小熊学Java
2023/07/16
4680
替代try catch处理异常的优雅方式
try catch 中的异常怎么处理?
在我们日常开发中, 经常会遇到一些异常需要去手动处理, 或者说是一些可能出现的异常去处理, 又或者说你不知道的异常, 等着暴露出来发现后去处理, 无论哪种异常, 当它出现的时候都是头疼的.
星尘的一个朋友
2020/11/25
1.2K0
try catch的作用
public static void main(String[] args) { int i; i = 2/0; System.out.println(i); System.out.println(1111111111);
全栈程序员站长
2022/09/07
1.5K0
深入理解try catch吃掉异常,及catch(Exception e)中的异常
说明:这算是比较正常的异常写法。aa()方法抛出异常,mian方法捕获异常,并打印出异常原因。
全栈程序员站长
2022/06/30
2.1K0
Java 异常 总结 try catch finally Exception
表示程序在运行过程中出现的非正常情况,编写代码的过程中尽可能少的减少异常出现的情况
红目香薰
2022/11/28
3500
C++的异常处理 try-catch-throw
异常是指在程序执行期间发生的意外或异常情况,比如除以零、访问无效的内存地址等。这些异常可能导致程序崩溃或产生错误结果。
叶茂林
2023/07/30
4530
Java 异常的捕捉 try...catch语句
一.try ..catch语句  语法: try{     被捕获的代码 }catch ( 异常类型 ){      对应解决方法 } public class Test { public static void main(String[] args) { try{ int a = 1; System.out.println(a); }catch (Exception exception){ exception.printStackTrace(); } } }  二
用户2965768
2019/03/08
9180
Java 异常的捕捉 try...catch语句
python抛出异常会终止程序吗_catch里面抛出异常
如果没有 try 和 except 语句覆盖抛出异常的 raise 语句,该程序就会崩溃,并显示异常的出错信息。通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise 语句在一个函数中,try 和 except 语句在调用该函数的代码中。
全栈程序员站长
2022/11/19
2.2K0
try和catch的使用。
// 报错,a找不到,程序终止,不往下继续。 console.log(a) // 放在try里 try { // a不打印 console.log(a) }catch(e){ // e是错误信息 console.log(e) // 弹出123 alert("123") } // 如果放在try中 弹出2 // 否则终止 alert("2") // 使用 let 不变量提升 let a = 0 总结:在使用try和catch时,程序报错但依然可以向下进行(node中系统错误,因为不可预知,需要大量代码来cat
biaoblog.cn 个人博客
2022/08/11
1.8K0
替代try catch处理异常的优雅方式
软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的try {…} catch {…} finally {…} 代码块,不仅有大量的冗余代码,而且还影响代码的可读性。
搜云库技术团队
2023/03/15
1K0
替代try catch处理异常的优雅方式
Java异常处理只有Try-Catch吗?
今天,我们将讨论一个非常重要的主题-Java 中的异常处理。尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息。
武培轩
2019/12/03
1.3K0
try-catch-finally
总结: 1、finally语句中没有return时,执行完try或catch语句的return之后还会执行finally。(而return的值会暂存在栈里面,等待finally执行后再返回) 2、finally语句中有return时,依然会执行try或catch语句的return,但是最终返回的是finally语句中的return。
用户9854323
2022/06/25
8270
为什么不建议用try catch处理异常?
原文:http://u6.gg/kpz4f 软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的 try {...} catch {...} finally {...} 代码块,不仅有大量的冗余代码,而且还影响代码的可读性。 比较下面两张图,看看您现在编写的代码属于哪一种风格?然后哪种编码风格您更喜欢? 丑陋的 try catch 代码块: 优雅的 Controller: 上面的示例,还只是在 Controller 层,如果是
java思维导图
2022/03/18
1.8K0
Try catch如何使用[通俗易懂]
浏览器的兼容性是程序员很头痛的事儿,往往一些出错会让我们查找许久,在使用try catch能更好的解决兼容性出错的问题:由于不同浏览器报错提示也不尽相同,通过使用try catch捕获的浏览器的报错提示,来判断用户使用的浏览器,然后做出对应的解决方法;那么,你如果用if,就只能反馈真或假,而不能直接抛出浏览器的报错内容。
全栈程序员站长
2022/08/31
1.9K0
SAP ABAP TRY CATCH
SAP 开发中会遇到两种系统异常,一种是基于异常类的异常,可以通过系统变量SY-SUBRC来进行判断;另外一种是非类异常,系统的异常,例如0作为除数的情况。
matinal
2023/10/13
2960
点击加载更多

相似问题

try catch抛出异常终止

11

try/catch与抛出异常

961

嵌套的Try/ Catch -仅外部Catch重要(MS SQL)

13

将异常传递给嵌套Try/Catch中的更高Try/Catch [需要嵌套]

113

异常(try & catch?)

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档