/** * @param provider * @param properties */ public GMLFileResource(GMLCRSProvider provider, Properties properties) { super(provider, properties, "Dictionary", CommonNamespaces.GML3_2_NS.toASCIIString()); try { transformations = XMLTools.getElements(getRootElement(), TRANSFORM_XPATH, nsContext); } catch (XMLParsingException e) { LOG.logError(e.getLocalizedMessage(), e); } cachedWGS84Transformations = new HashMap<CoordinateSystem, Helmert>(); }
public Transformation getTransformation(CoordinateSystem sourceCRS, CoordinateSystem targetCRS) { if (sourceCRS == null) { return null; } List<Element> toBeRemoved = new ArrayList<Element>(transformations.size()); List<String> sourceIDs = Arrays.asList(sourceCRS.getIdentifiers()); List<String> targetIDs = null; if (targetCRS != null) { targetIDs = Arrays.asList(targetCRS.getIdentifiers()); } else { targetIDs = new ArrayList<String>(); } Transformation result = null; for (int i = 0; i < transformations.size() && result == null; ++i) { Element transElem = transformations.get(i); if (transElem != null) { try { Element sourceCRSProp = XMLTools.getRequiredElement(transElem, PRE + "sourceCRS", nsContext); String transformSourceID = null; String transformTargetID = null; if (sourceCRSProp != null) { transformSourceID = sourceCRSProp.getAttributeNS(CommonNamespaces.XLNNS.toASCIIString(), "href"); if ("".equals(transformSourceID)) { transformSourceID = XMLTools.getRequiredNodeAsString( sourceCRSProp, "*[1]/" + PRE + "identifier", nsContext); } } if (targetCRS != null) { Element targetCRSProp = XMLTools.getRequiredElement(transElem, PRE + "targetCRS", nsContext); if (targetCRSProp != null) { transformTargetID = targetCRSProp.getAttributeNS(CommonNamespaces.XLNNS.toASCIIString(), "href"); if ("".equals(transformTargetID)) { transformTargetID = XMLTools.getRequiredNodeAsString( targetCRSProp, "*[1]/" + PRE + "identifier", nsContext); } } } if (sourceIDs.contains(transformSourceID)) { result = getProvider().parseTransformation(transElem); if (targetCRS == null) { // Trying to find a helmert transformation LOG.logDebug("Resolving a possible transformation."); if (result != null && !(result instanceof Helmert)) { result = getTransformation(result.getTargetCRS(), null); } } else { if (!targetIDs.contains(transformTargetID)) { LOG.logDebug( "Found a transformation with gml:id: " + transElem.getAttributeNS(CommonNamespaces.GML3_2_NS.toASCIIString(), "id") + ", but the target does not match the source crs, trying to build transformation chain."); Transformation second = getTransformation(result.getTargetCRS(), targetCRS); if (second != null) { result = new ConcatenatedTransform(result, second); } else { LOG.logDebug( "The transformation with gml:id: " + transElem.getAttributeNS( CommonNamespaces.GML3_2_NS.toASCIIString(), "id") + " is not the start of transformation chain, discarding it. "); result = null; } } } } } catch (XMLParsingException e) { toBeRemoved.add(transElem); LOG.logWarning( "No source CRS id could be found in this transformation(gml:id): " + transElem.getAttributeNS(CommonNamespaces.GML3_2_NS.toASCIIString(), "id") + " this is not correct, removing transformation from cache."); LOG.logWarning(e.getMessage()); } } if (toBeRemoved.size() > 0) { transformations.removeAll(toBeRemoved); } } return result; }