/*
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 2 writer, for internal use */
public class GML2 {
private GML2() {}
protected static String writePoint(Point p, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:Point" + ns + s1 + ">");
sb.append("<gml:coordinates>" + p.getX() + "," + p.getY());
if(p.getDimensions() == 3) {
sb.append("," + p.getZ());
}
sb.append("</gml:coordinates>");
sb.append("</gml:Point>");
return sb.toString();
}
protected static String writeMultiPoint(MultiPoint mp, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:MultiPoint" + ns + s1 + ">");
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 writeLineString(LineString ls, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:LineString" + ns + s1 + ">");
sb.append("<gml:coordinates>");
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());
}
sbPos.append(" ");
}
sb.append(sbPos.toString().trim());
sb.append("</gml:coordinates>");
sb.append("</gml:LineString>");
return sb.toString();
}
protected static String writeMultiLineString(MultiLineString mls, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:MultiLineString" + ns + s1 + ">");
for(int i = 0; i < mls.getLineStrings().size(); i++) {
sb.append("<gml:lineStringMember>");
sb.append(writeLineString(mls.getLineStrings().get(i), "", null));
sb.append("</gml:lineStringMember>");
}
sb.append("</gml:MultiLineString>");
return sb.toString();
}
protected static String writePolygon(Polygon p, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
MultiPoint mp;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:Polygon" + ns + s1 + ">");
sb.append("<gml:outerBoundaryIs>");
sb.append("<gml:LinearRing>");
sb.append("<gml:coordinates>");
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());
}
sbPos.append(" ");
}
sb.append(sbPos.toString().trim());
sb.append("</gml:coordinates>");
sb.append("</gml:LinearRing>");
sb.append("</gml:outerBoundaryIs>");
for(int i = 0; i < p.getInteriors().size(); i++) {
sb.append("<gml:innerBoundaryIs>");
sb.append("<gml:LinearRing>");
sb.append("<gml:coordinates>");
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());
}
sbPos.append(" ");
}
sb.append(sbPos.toString().trim());
sb.append("</gml:coordinates>");
sb.append("</gml:LinearRing>");
sb.append("</gml:innerBoundaryIs>");
}
sb.append("</gml:Polygon>");
return sb.toString();
}
protected static String writeMultiPolygon(MultiPolygon mp, String ns, String srsName) {
StringBuilder sb = new StringBuilder();
String s1;
if(srsName != null) {
s1 = " srsName=\"" + XmlUtils.escapeTags(srsName) + "\"";
}
else {
s1 = "";
}
sb.append("<gml:MultiPolygon" + ns + s1 + ">");
for(int i = 0; i < mp.getPolygons().size(); i++) {
sb.append("<gml:polygonMember>");
sb.append(writePolygon(mp.getPolygons().get(i), "", null));
sb.append("</gml:polygonMember>");
}
sb.append("</gml:MultiPolygon>");
return sb.toString();
}
}