📄 svgexporter.java
字号:
private StringBuffer svgG(WebPolygon webPolygon, WebSimplePolygonSymbol symbol) {
// <path> tag attributes
String[][] pathAtts = { { SVGSyntax.SVG_D_ATTRIBUTE, svgPath(webPolygon.getRing(0))} };
return svgG(SVGSyntax.SVG_PATH_TAG, pathAtts, null, getRenderingAttributes(symbol));
}
private StringBuffer svgG(WebArc webArc, WebSimpleLineSymbol symbol) {
double radius = webArc.getRadius();
int startAngle = new Double(webArc.getStartAngle()).intValue();
int endAngle = new Double(webArc.getEndAngle()).intValue();
if(Math.abs(startAngle - endAngle) >= 360) {
// <circle> tag attributes
String[][] circleAtts = {
{ SVGSyntax.SVG_CX_ATTRIBUTE, String.valueOf(webArc.getCenter().getX()) },
{ SVGSyntax.SVG_CY_ATTRIBUTE, String.valueOf(90 - webArc.getCenter().getY()) },
{ SVGSyntax.SVG_R_ATTRIBUTE, String.valueOf(radius) },
{ SVGSyntax.SVG_FILL_ATTRIBUTE, SVGSyntax.SVG_NONE_VALUE }
};
return svgG(SVGSyntax.SVG_CIRCLE_TAG, circleAtts, null, getRenderingAttributes(symbol));
} else {
// Arc in SVG is represented as <path> element with elliptical arc command inside http://wiki.svg.org/Path
// Elliptical arc implementation notes available at http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
WebPoint startPoint = SVGUtils.calcArcPoint(webArc.getCenter(), radius, radius, 0, Math.toRadians(startAngle));
WebPoint endPoint = SVGUtils.calcArcPoint(webArc.getCenter(), radius, radius, 0, Math.toRadians(endAngle));
int phi = 0;
int angle = endAngle % 360 - startAngle % 360;
int fa = (angle <= 180 && Math.signum(angle) >= 0) ? 0 : 1;
int fs = 0;
StringBuffer buf = new StringBuffer();
buf.append("M").append(startPoint.getX()).append(",").append(90 - startPoint.getY()).append(" ");
buf.append("A").append(radius).append(",").append(radius).append(" ").append(phi).append(" ");
buf.append(fa).append(",").append(fs).append(" ");
buf.append(endPoint.getX()).append(",").append(90 - endPoint.getY());
// <path> tag attributes
String[][] pathAtts = {
{ SVGSyntax.SVG_FILL_ATTRIBUTE, SVGSyntax.SVG_NONE_VALUE },
{ SVGSyntax.SVG_D_ATTRIBUTE, buf.toString() }
};
return svgG(SVGSyntax.SVG_PATH_TAG, pathAtts, null, getRenderingAttributes(symbol));
}
}
private String[][] getRenderingAttributes(WebSymbol webSymbol) {
String[][] atts = null;
if(webSymbol instanceof WebSimpleMarkerSymbol) {
WebSimpleMarkerSymbol symbol = (WebSimpleMarkerSymbol) webSymbol;
atts = new String[6][2];
atts[0][0] = SVGSyntax.SVG_TRANSFORM_ATTRIBUTE; atts[0][1] = "translate(180,0)";
atts[1][0] = SVGSyntax.SVG_STROKE_ATTRIBUTE; atts[1][1] = ColorEncoder.toSVG(symbol.getOutlineColor());
atts[2][0] = SVGSyntax.SVG_STROKE_WIDTH_ATTRIBUTE; atts[2][1] = "3%";
atts[3][0] = SVGSyntax.SVG_STROKE_OPACITY_ATTRIBUTE; atts[3][1] = String.valueOf(symbol.getTransparency());
atts[4][0] = SVGSyntax.SVG_FILL_ATTRIBUTE; atts[4][1] = ColorEncoder.toSVG(symbol.getColor());
atts[5][0] = SVGSyntax.SVG_FILL_OPACITY_ATTRIBUTE; atts[5][1] = String.valueOf(symbol.getTransparency());
} else if(webSymbol instanceof WebPictureMarkerSymbol) {
atts = new String[1][2];
atts[0][0] = SVGSyntax.SVG_TRANSFORM_ATTRIBUTE; atts[0][1] = "translate(180,0)";
} else if(webSymbol instanceof WebTrueTypeMarkerSymbol) {
WebTrueTypeMarkerSymbol symbol = (WebTrueTypeMarkerSymbol) webSymbol;
atts = new String[8][2];
atts[0][0] = SVGSyntax.SVG_TRANSFORM_ATTRIBUTE; atts[0][1] = "translate(180,0)";
atts[1][0] = SVGSyntax.SVG_FILL_ATTRIBUTE; atts[1][1] = ColorEncoder.toSVG(symbol.getFontColor());
atts[2][0] = SVGSyntax.SVG_FONT_FAMILY_ATTRIBUTE; atts[2][1] = symbol.getFontName();
atts[3][0] = SVGSyntax.SVG_FONT_SIZE_ATTRIBUTE; atts[3][1] = String.valueOf(symbol.getFontSize());
atts[4][0] = SVGSyntax.SVG_FONT_STYLE_ATTRIBUTE; atts[4][1] = symbol.getFontStyle();
atts[5][0] = SVGSyntax.SVG_STROKE_ATTRIBUTE; atts[5][1] = ColorEncoder.toSVG(symbol.getFontColor());
atts[6][0] = SVGSyntax.SVG_STROKE_OPACITY_ATTRIBUTE; atts[6][1] = String.valueOf(symbol.getTransparency());
atts[7][0] = SVGSyntax.SVG_TEXT_RENDERING_ATTRIBUTE; atts[7][1] = "geometricPrecision";
} else if(webSymbol instanceof WebSimplePolygonSymbol) {
WebSimplePolygonSymbol symbol = (WebSimplePolygonSymbol) webSymbol;
atts = new String[11][2];
atts[0][0] = SVGSyntax.SVG_TRANSFORM_ATTRIBUTE; atts[0][1] = "translate(180,0)";
atts[1][0] = SVGSyntax.SVG_STROKE_DASHARRAY_ATTRIBUTE; atts[1][1] = svgLineType(symbol);
atts[2][0] = SVGSyntax.SVG_STROKE_ATTRIBUTE; atts[2][1] = ColorEncoder.toSVG(symbol.getColor());
atts[3][0] = SVGSyntax.SVG_STROKE_WIDTH_ATTRIBUTE; atts[3][1] = String.valueOf(symbol.getWidth());
atts[4][0] = SVGSyntax.SVG_STROKE_LINECAP_ATTRIBUTE; atts[4][1] = symbol.getCapType();
atts[5][0] = SVGSyntax.SVG_STROKE_LINEJOIN_ATTRIBUTE; atts[5][1] = symbol.getJoinType();
atts[6][0] = SVGSyntax.SVG_STROKE_MITERLIMIT_ATTRIBUTE; atts[6][1] = "10";
atts[7][0] = SVGSyntax.SVG_STROKE_DASHOFFSET_ATTRIBUTE; atts[7][1] = "0";
atts[8][0] = SVGSyntax.SVG_STROKE_OPACITY_ATTRIBUTE; atts[8][1] = String.valueOf(symbol.getTransparency());
atts[9][0] = SVGSyntax.SVG_FILL_ATTRIBUTE; atts[9][1] = svgFill(symbol);
atts[10][0] = SVGSyntax.SVG_FILL_OPACITY_ATTRIBUTE; atts[10][1] = String.valueOf(symbol.getFillTransparency());
} else if(webSymbol instanceof WebSimpleLineSymbol) {
WebSimpleLineSymbol symbol = (WebSimpleLineSymbol) webSymbol;
atts = new String[9][2];
atts[0][0] = SVGSyntax.SVG_TRANSFORM_ATTRIBUTE; atts[0][1] = "translate(180,0)";
atts[1][0] = SVGSyntax.SVG_STROKE_DASHARRAY_ATTRIBUTE; atts[1][1] = svgLineType(symbol);
atts[2][0] = SVGSyntax.SVG_STROKE_ATTRIBUTE; atts[2][1] = ColorEncoder.toSVG(symbol.getColor());
atts[3][0] = SVGSyntax.SVG_STROKE_WIDTH_ATTRIBUTE; atts[3][1] = String.valueOf(symbol.getWidth());
atts[4][0] = SVGSyntax.SVG_STROKE_LINECAP_ATTRIBUTE; atts[4][1] = symbol.getCapType();
atts[5][0] = SVGSyntax.SVG_STROKE_LINEJOIN_ATTRIBUTE; atts[5][1] = symbol.getJoinType();
atts[6][0] = SVGSyntax.SVG_STROKE_MITERLIMIT_ATTRIBUTE; atts[6][1] = "10";
atts[7][0] = SVGSyntax.SVG_STROKE_DASHOFFSET_ATTRIBUTE; atts[7][1] = "0";
atts[8][0] = SVGSyntax.SVG_STROKE_OPACITY_ATTRIBUTE; atts[8][1] = String.valueOf(symbol.getTransparency());
}
return atts;
}
private String svgPath(WebPath webPath) {
StringBuffer buf = new StringBuffer();
WebPoint firstPoint = null;
WebPoint webPoint = null;
if(webPath != null) {
List<WebPoint> points = webPath.getPoints();
if((webPath instanceof WebPath && points.size() >= 2) || (webPath instanceof WebRing && points.size() >= 3)) {
for(Iterator<WebPoint> i = points.iterator(); i.hasNext();) {
webPoint = new WebPoint(i.next());
webPoint.setY(90 - webPoint.getY());
if(firstPoint == null) {
firstPoint = webPoint;
buf.append("M");
buf.append(firstPoint.getX());
buf.append(" ");
buf.append(firstPoint.getY());
} else {
buf.append(" L");
buf.append(webPoint.getX());
buf.append(" ");
buf.append(webPoint.getY());
}
}
// Make sure WebRing is closed!
if(webPath instanceof WebRing && !webPoint.equals(firstPoint)) {
buf.append(" L");
buf.append(firstPoint.getX());
buf.append(" ");
buf.append(firstPoint.getY());
}
}
}
return buf.toString();
}
public String svgLineType(WebSimpleLineSymbol symbol) {
int[] pattern = new int[] {};
int w = symbol.getWidth();
if(symbol != null) {
if(symbol.getLineType().equals(WebSimpleLineSymbol.DASH))
pattern = new int[] { 12 + w, 5 + w };
else if(symbol.getLineType().equals(WebSimpleLineSymbol.DOT))
pattern = new int[] { 1, 3 + w };
else if(symbol.getLineType().equals(WebSimpleLineSymbol.DASH_DOT))
pattern = new int[] { 12 + w, 5 + w, 1, 3 + w };
else if(symbol.getLineType().equals(WebSimpleLineSymbol.DASH_DOT_DOT))
pattern = new int[] { 12 + w, 5 + w, 1, 3 + w, 1, 3 + w };
}
StringBuffer buf = new StringBuffer();
for(int i=0; i < pattern.length; i++) {
buf.append((buf.length() > 0) ? "," : "");
buf.append(pattern[i]);
}
return (buf.length() > 0) ? buf.toString() : SVGSyntax.SVG_NONE_VALUE;
}
// Generates svg encoded <pattern> based of attributes supplied
// @param - pAtts - array of <pattern> attributes (name/value pairs)
// @param - lAtts - array of <line> attributes
// returns svg link to generated pattern or empty string if pattern was not created
private String svgPattern(String[][] patternAtts, ArrayList<String[][]> lineAtts) {
if(patternAtts != null && lineAtts != null && lineAtts.size() > 0) {
String patternID = patternAtts[0][1];
StringBuffer buf = new StringBuffer();
Tag tagPattern = new Tag(SVGSyntax.SVG_PATTERN_TAG, patternAtts, null, true);
buf.append(tagPattern.open());
for(Iterator<String[][]> i = lineAtts.iterator(); i.hasNext();) {
buf.append(new Tag(SVGSyntax.SVG_LINE_TAG, i.next(), null, false).open());
}
buf.append(tagPattern.close());
_svgPatterns.add(buf.toString());
return "url(#" + patternID + ")";
}
return "";
}
// returns svg fill attribute parameter value based on ADF symbology information provided
// For solid fill color returns svg color encoded string
// For different types of ADF Fill Patterns adds correspondent svg encoded String to _svgFillPatterns repository -
// content of defs section of the SVG document and returns a link to it
// For all other fill types (transparent|texture) returns "none"
private String svgFill(WebSimplePolygonSymbol symbol) {
if(symbol != null) {
String sFillType = symbol.getFillType();
if(sFillType.equals(WebSimplePolygonSymbol.SOLID))
return ColorEncoder.toSVG(symbol.getFillColor());
else {
ArrayList<String[][]> lineAtts = new ArrayList<String[][]>();
String patternID = SVGSyntax.SVG_PATTERN_TAG + "_" + sFillType + "_" + SVGUtils.getUniqueModifier();
if(sFillType.equals(WebSimplePolygonSymbol.BDIAGONAL)) {
lineAtts.add(new String[][] {
{ SVGSyntax.SVG_X1_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_Y1_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_X2_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_Y2_ATTRIBUTE, "8" }});
return svgPattern(new String[][] {
{ SVGSyntax.SVG_ID_ATTRIBUTE, patternID },
{ SVGSyntax.SVG_X_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_Y_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_WIDTH_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_HEIGHT_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_STROKE_ATTRIBUTE, ColorEncoder.toSVG(symbol.getFillColor()) },
{ SVGSyntax.SVG_STROKE_WIDTH_ATTRIBUTE, ".5" },
{ SVGSyntax.SVG_PATTERN_UNITS_ATTRIBUTE, "userSpaceOnUse" }
}, lineAtts);
} else if(sFillType.equals(WebSimplePolygonSymbol.FDIAGONAL)) {
lineAtts.add(new String[][] {
{ SVGSyntax.SVG_X1_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_Y1_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_X2_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_Y2_ATTRIBUTE, "0" }});
return svgPattern(new String[][] {
{ SVGSyntax.SVG_ID_ATTRIBUTE, patternID },
{ SVGSyntax.SVG_X_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_Y_ATTRIBUTE, "0" },
{ SVGSyntax.SVG_WIDTH_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_HEIGHT_ATTRIBUTE, "8" },
{ SVGSyntax.SVG_STROKE_ATTRIBUTE, ColorEncoder.toSVG(symbol.getFillColor()) },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -