/* LWKT - A light WKT parser written in Java Copyright (C) 2011 Francesco Cutruzzula' (www.cutruzzula.it) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package it.cutruzzula.lwkt; import it.cutruzzula.lwkt.geometry.LineString; import it.cutruzzula.lwkt.geometry.MultiLineString; import it.cutruzzula.lwkt.geometry.MultiPoint; import it.cutruzzula.lwkt.geometry.MultiPolygon; import it.cutruzzula.lwkt.geometry.Point; import it.cutruzzula.lwkt.geometry.Polygon; import it.cutruzzula.lwkt.util.XmlUtils; /** The GML version 3 writer, for internal use */ public class GML3 { private GML3() {} protected static String writePoint(Point p, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(p.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:Point" + ns + s1 + s2 + ">"); sb.append("<gml:pos" + s2 + ">" + p.getX() + " " + p.getY()); if(p.getDimensions() == 3) { sb.append(" " + p.getZ()); } sb.append("</gml:pos>"); sb.append("</gml:Point>"); return sb.toString(); } protected static String writeMultiPoint(MultiPoint mp, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(mp.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:MultiPoint" + ns + s1 + s2 + ">"); for(int i = 0; i < mp.getPoints().size(); i++) { sb.append("<gml:pointMember>"); sb.append(writePoint(mp.getPoints().get(i), "", null)); sb.append("</gml:pointMember>"); } sb.append("</gml:MultiPoint>"); return sb.toString(); } protected static String writeCurve(LineString ls, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(ls.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:Curve" + ns + s1 + s2 + ">"); sb.append("<gml:segments>"); sb.append("<gml:LineStringSegment>"); sb.append("<gml:posList" + s2 + ">"); StringBuilder sbPos = new StringBuilder(); for(int i = 0; i < ls.getPoints().size(); i++) { sbPos.append(ls.getPoints().get(i).getX() + " " + ls.getPoints().get(i).getY() + " "); if(ls.getDimensions() == 3) { sbPos.append(ls.getPoints().get(i).getZ() + " "); } } sb.append(sbPos.toString().trim()); sb.append("</gml:posList>"); sb.append("</gml:LineStringSegment>"); sb.append("</gml:segments>"); sb.append("</gml:Curve>"); return sb.toString(); } protected static String writeMultiCurveV3(MultiLineString mls, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(mls.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:MultiCurve" + ns + s1 + s2 + ">"); for(int i = 0; i < mls.getLineStrings().size(); i++) { sb.append("<gml:curveMember>"); sb.append(writeCurve(mls.getLineStrings().get(i), "", null)); sb.append("</gml:curveMember>"); } sb.append("</gml:MultiCurve>"); return sb.toString(); } protected static String writePolygon(Polygon p, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; MultiPoint mp; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(p.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:Polygon" + ns + s1 + s2 + ">"); sb.append("<gml:exterior>"); sb.append("<gml:LinearRing" + s2 + ">"); sb.append("<gml:posList" + s2 + ">"); mp = p.getExterior(); StringBuilder sbPos = new StringBuilder(); for(int i = 0; i < mp.getPoints().size(); i++) { sbPos.append(mp.getPoints().get(i).getX() + " " + mp.getPoints().get(i).getY() + " "); if(mp.getDimensions() == 3) { sbPos.append(mp.getPoints().get(i).getZ() + " "); } } sb.append(sbPos.toString().trim()); sb.append("</gml:posList>"); sb.append("</gml:LinearRing>"); sb.append("</gml:exterior>"); for(int i = 0; i < p.getInteriors().size(); i++) { sb.append("<gml:interior>"); sb.append("<gml:LinearRing" + s2 + ">"); sb.append("<gml:posList" + s2 + ">"); mp = p.getInteriors().get(i); sbPos = new StringBuilder(); for(int j = 0; j < mp.getPoints().size(); j++) { sbPos.append(mp.getPoints().get(j).getX() + " " + mp.getPoints().get(j).getY() + " "); if(mp.getDimensions() == 3) { sbPos.append(mp.getPoints().get(j).getZ() + " "); } } sb.append(sbPos.toString().trim()); sb.append("</gml:posList>"); sb.append("</gml:LinearRing>"); sb.append("</gml:interior>"); } sb.append("</gml:Polygon>"); return sb.toString(); } protected static String writeMultiSurface(MultiPolygon mp, String ns, String srsName) { StringBuilder sb = new StringBuilder(); String s1, s2; if(srsName != null) { s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\""; } else { s1 = ""; } if(mp.getDimensions() == 3) { s2 = " srsDimension=\"3\""; } else { s2 = " srsDimension=\"2\""; } sb.append("<gml:MultiSurface" + ns + s1 + s2 + ">"); for(int i = 0; i < mp.getPolygons().size(); i++) { sb.append("<gml:surfaceMember>"); sb.append(writePolygon(mp.getPolygons().get(i), "", null)); sb.append("</gml:surfaceMember>"); } sb.append("</gml:MultiSurface>"); return sb.toString(); } }