001: /* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
002: * This code is licensed under the GPL 2.0 license, availible at the root
003: * application directory.
004: */
005: package org.geoserver.wfs;
006:
007: import org.geoserver.feature.DefaultCRSFilterVisitor;
008: import org.geoserver.feature.ReprojectingFilterVisitor;
009: import org.geotools.factory.CommonFactoryFinder;
010: import org.geotools.factory.GeoTools;
011: import org.geotools.feature.FeatureType;
012: import org.geotools.gml2.bindings.GML2EncodingUtils;
013: import org.geotools.referencing.CRS;
014: import org.opengis.filter.Filter;
015: import org.opengis.filter.FilterFactory2;
016: import org.opengis.referencing.crs.CoordinateReferenceSystem;
017:
018: /**
019: * Utility class used to handle common WFS reprojection issues
020: *
021: * @author Andrea Aime, TOPP
022: *
023: */
024: class WFSReprojectionUtil {
025:
026: static FilterFactory2 ff = CommonFactoryFinder
027: .getFilterFactory2(GeoTools.getDefaultHints());
028:
029: /**
030: * Returns the declared CRS given the native CRS and the request WFS version
031: *
032: * @param nativeCRS
033: * @param wfsVersion
034: * @return
035: */
036: public static CoordinateReferenceSystem getDeclaredCrs(
037: CoordinateReferenceSystem nativeCRS, String wfsVersion) {
038: try {
039: if (nativeCRS == null)
040: return null;
041:
042: if (wfsVersion.equals("1.0.0")) {
043: return nativeCRS;
044: } else {
045: String code = GML2EncodingUtils.epsgCode(nativeCRS);
046: return CRS.decode("urn:x-ogc:def:crs:EPSG:6.11.2:"
047: + code);
048: }
049: } catch (Exception e) {
050: throw new WFSException(
051: "We have had issues trying to flip axis of "
052: + nativeCRS, e);
053: }
054: }
055:
056: /**
057: * Returns the declared CRS given a feature type and the request WFS version
058: *
059: * @param nativeCRS
060: * @param wfsVersion
061: * @return
062: */
063: public static CoordinateReferenceSystem getDeclaredCrs(
064: FeatureType schema, String wfsVersion) {
065: CoordinateReferenceSystem crs = (schema.getDefaultGeometry() != null) ? schema
066: .getDefaultGeometry().getCoordinateSystem()
067: : null;
068:
069: if (schema == null)
070: return null;
071: return getDeclaredCrs(crs, wfsVersion);
072: }
073:
074: /**
075: * Applies a default CRS to all geometric filter elements that do not
076: * already have one
077: *
078: * @param nativeCRS
079: * @param wfsVersion
080: * @return
081: */
082: public static Filter applyDefaultCRS(Filter filter,
083: CoordinateReferenceSystem defaultCRS) {
084: DefaultCRSFilterVisitor defaultVisitor = new DefaultCRSFilterVisitor(
085: ff, defaultCRS);
086: return (Filter) filter.accept(defaultVisitor, null);
087: }
088:
089: /**
090: * Reprojects all geometric filter elements to the native CRS of the
091: * provided schema
092: *
093: * @param filter
094: * @param schema
095: * @return
096: */
097: public static Filter reprojectFilter(Filter filter,
098: FeatureType schema) {
099: ReprojectingFilterVisitor visitor = new ReprojectingFilterVisitor(
100: ff, schema);
101: return (Filter) filter.accept(visitor, null);
102: }
103:
104: /**
105: * Convenience method, same as calling {@link #applyDefaultCRS} and then
106: * {@link #reprojectFilter(Filter, FeatureType)} in a row
107: *
108: * @param filter
109: * @param schema
110: * @param defaultCRS
111: * @return
112: */
113: public static Filter normalizeFilterCRS(Filter filter,
114: FeatureType schema, CoordinateReferenceSystem defaultCRS) {
115: Filter defaulted = applyDefaultCRS(filter, defaultCRS);
116: return reprojectFilter(defaulted, schema);
117: }
118:
119: }
|