/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2011, Open Source Geospatial Foundation (OSGeo) * * 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; * version 2.1 of the License. * * 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. */ package org.geotools.gml3.bindings.ext; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import org.geotools.geometry.jts.CurvedGeometryFactory; import org.geotools.gml3.ArcParameters; import org.geotools.gml3.GML; import org.geotools.gml3.bindings.GML3ParsingUtils; import org.geotools.gml3.bindings.LineStringTypeBinding; import org.geotools.xml.ElementInstance; import org.geotools.xml.Node; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateList; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.CoordinateSequenceFactory; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiLineString; /** * Simple type binding for Composite Curve GML elements. * @source $URL$ */ public class CompositeCurveTypeBinding extends LineStringTypeBinding { private final GeometryFactory gFactory; private ArcParameters arcParameters; public CompositeCurveTypeBinding(GeometryFactory gFactory, CoordinateSequenceFactory csFactory) { super(gFactory, csFactory); this.gFactory = gFactory; } public void setArcParameters(ArcParameters arcParameters) { this.arcParameters = arcParameters; } @Override public QName getTarget() { return GML.CompositeCurveType; } @Override public Class getType() { return LineString.class; } @Override public Object parse(ElementInstance instance, Node node, Object value) throws Exception { List children = node.getChildren("curveMember"); List<LineString> components = new ArrayList<>(); for (Iterator it = children.iterator(); it.hasNext();) { Node child = (Node) it.next(); if (child.getValue() instanceof LineString) { LineString ls = (LineString) child.getValue(); components.add(ls); } } if (components.isEmpty()) { return gFactory.createLineString(new Coordinate[0]); } else { CoordinateSequence cs = components.get(0).getCoordinateSequence(); CurvedGeometryFactory factory = GML3ParsingUtils.getCurvedGeometryFactory( arcParameters, gFactory, cs); return factory.createCurvedGeometry(components); } } /** * Construct a line string from CurveMembers coordinates. * * @param node * @return */ public static CoordinateList extractCurveMemberCoordinates(Node node) { List curveMembers = node.getChildren("curveMember"); CoordinateList clist = new CoordinateList(); for (int i = 0; i < curveMembers.size(); i++) { List curves = ((Node) curveMembers.get(i)) .getChildren(MultiLineString.class); for (int j = 0; j < curves.size(); j++) { MultiLineString mls = (MultiLineString) ((Node) curves.get(j)) .getValue(); clist.add(mls.getCoordinates(), false); } } return clist; } }