【问题标题】:JavaGraphics to svg with batikJavaGraphics 到 svg 与蜡染
【发布时间】:2017-07-15 07:33:37
【问题描述】:

有人可以帮我将 Java 图形导出到 SVG 吗?我知道如何将 Java 图形导出到 SVG,但需要定义一个放置符号的框,以便我可以使用它在 geotools 中进行样式设置。功能的一个问题是我将符号放在左上角(0,0),因此只有四分之一的符号显示在 geotools 中,而在 QGIS 中完美显示。我正在发布一些我用于此的示例

绘制函数

  public void draw(Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    float r = 5*_f;
    // circle
    crtajPodlogu(g2,new Ellipse2D.Float(_x-r,_y-r,2*r,2*r));
    //point in middle 
    g2.fill(new Ellipse2D.Float(_x-r/5,_y-r/5,2*r/5,2*r/5));
    g2.draw(new Ellipse2D.Float(_x-r/5,_y-r/5,2*r/5,2*r/5));
    // vert. line
    g2.draw(new Line2D.Float(_x,_y+r,_x,_y-5*r/2));
    //hor. line
    g2.draw(new Line2D.Float(_x,_y-2*r,_x+r,_y-2*r));
    //arrow
    g2.draw(new Line2D.Float(_x+r,_y-2*r,_x+r/2,_y-5*r/2));
    g2.draw(new Line2D.Float(_x+r,_y-2*r,_x+r/2,_y-3*r/2));
  }

转换函数

        // Get a DOMImplementation.
        DOMImplementation domImpl =
          GenericDOMImplementation.getDOMImplementation();

        // Create an instance of org.w3c.dom.Document.
        String svgNS = "http://www.w3.org/2000/svg";
        Document document = domImpl.createDocument(svgNS, "svg", null);
        SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
        String[] myStrings = new String[] {
                "symbolForSvg",
                };
        List mylist = Arrays.asList(myStrings );
        Iterator itr= mylist.iterator();
        while(itr.hasNext()){
            try {
                Class clazz = Class.forName("key."+itr.next().toString());
                java.lang.reflect.Method method = clazz.getMethod("draw", Graphics.class);
                method.invoke(clazz.newInstance(), svgGenerator);
                // Finally, stream out SVG to the standard output using
                // UTF-8 encoding.
                //boolean useCSS = true; // we want to use CSS style attributes
                Writer out = null;
                System.out.println(clazz.getSimpleName());
                out =  new BufferedWriter(new OutputStreamWriter(
                          new FileOutputStream("tkey/"+clazz.getSimpleName()+".svg"), "utf-8"));
                svgGenerator.stream(out, false);
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException 
                    | SecurityException | IllegalArgumentException | InvocationTargetException | UnsupportedEncodingException | FileNotFoundException | SVGGraphics2DIOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();

        }
        }

我用这个得到的 svg

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
          'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" style="fill-opacity:1; color-rendering:auto; color-interpolation:auto; text-rendering:auto; stroke:black; stroke-linecap:square; stroke-miterlimit:10; shape-rendering:auto; stroke-opacity:1; fill:black; stroke-dasharray:none; font-weight:normal; stroke-width:1; font-family:'Dialog'; font-style:normal; stroke-linejoin:miter; font-size:12px; stroke-dashoffset:0; image-rendering:auto;" xmlns="http://www.w3.org/2000/svg"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
  /><g
  ><g
    ><circle r="5" style="fill:none;" cx="0" cy="0"
      /><circle r="1" style="stroke:none;" cx="0" cy="0"
      /><circle r="1" style="fill:none;" cx="0" cy="0"
      /><line y2="-12.5" style="fill:none;" x1="0" x2="0" y1="5"
      /><line y2="-10" style="fill:none;" x1="0" x2="5" y1="-10"
      /><line y2="-12.5" style="fill:none;" x1="5" x2="2.5" y1="-10"
      /><line y2="-7.5" style="fill:none;" x1="5" x2="2.5" y1="-10"
    /></g
  ></g
></svg>

【问题讨论】:

    标签: java svg batik


    【解决方案1】:

    我不熟悉 GeoTools,但我怀疑您需要在生成的 SVG 中添加一个 viewBox。

    我没有测试过以下内容,但应该是这样的:

    SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
    // Get the root SVG element
    Element root = svgGenerator.getRoot();
    // Add a viewBox attribute
    root.setAttributeNS(null, "viewBox", "0 0 800 600"); 
    

    您需要根据自己的几何形状计算正确的 viewBox 值。值中的四个数字分别是:minX、minY、width和height。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2014-08-16
      • 1970-01-01
      • 2014-09-08
      • 2013-09-06
      • 2018-08-10
      相关资源
      最近更新 更多