⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svgexporter.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	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 + -