⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reprojectingfiltervisitor.java

📁 电子地图服务器,搭建自己的地图服务
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            Object cloneFilter(BinarySpatialOperator filter, Object extraData) {
                return ReprojectingFilterVisitor.super.visit((Intersects) filter, extraData);
            }

            Object cloneFilter(BinarySpatialOperator bso, Object extraData, Expression ex1,
                    Expression ex2) {
                return factory.intersects(ex1, ex2);
            }
        }.transform(filter, extraData);
    }

    public Object visit(Overlaps filter, Object extraData) {
        return new GeometryFilterTransformer() {

            Object cloneFilter(BinarySpatialOperator filter, Object extraData) {
                return ReprojectingFilterVisitor.super.visit((Overlaps) filter, extraData);
            }

            Object cloneFilter(BinarySpatialOperator bso, Object extraData, Expression ex1,
                    Expression ex2) {
                return factory.overlaps(ex1, ex2);
            }
        }.transform(filter, extraData);
    }

    public Object visit(Touches filter, Object extraData) {
        return new GeometryFilterTransformer() {

            Object cloneFilter(BinarySpatialOperator filter, Object extraData) {
                return ReprojectingFilterVisitor.super.visit((Touches) filter, extraData);
            }

            Object cloneFilter(BinarySpatialOperator bso, Object extraData, Expression ex1,
                    Expression ex2) {
                return factory.touches(ex1, ex2);
            }
        }.transform(filter, extraData);
    }

    public Object visit(Within filter, Object extraData) {
        return new GeometryFilterTransformer() {

            Object cloneFilter(BinarySpatialOperator filter, Object extraData) {
                return ReprojectingFilterVisitor.super.visit((Within) filter, extraData);
            }

            Object cloneFilter(BinarySpatialOperator bso, Object extraData, Expression ex1,
                    Expression ex2) {
                return factory.within(ex1, ex2);
            }
        }.transform(filter, extraData);
    }
    
    public Object visit(Equals filter, Object extraData) {
        return new GeometryFilterTransformer() {

            Object cloneFilter(BinarySpatialOperator filter, Object extraData) {
                return ReprojectingFilterVisitor.super.visit((Equals) filter, extraData);
            }

            Object cloneFilter(BinarySpatialOperator bso, Object extraData, Expression ex1,
                    Expression ex2) {
                return factory.equal(ex1, ex2);
            }
        }.transform(filter, extraData);
    }

    /**
     * Factors out most of the logic needed to reproject a geometry filter, leaving subclasses
     * only the need to call the appropriate methods to create the new binary spatial filter
     * @author Andrea Aime - The Open Plannig Project
     *
     */
    private abstract class GeometryFilterTransformer {
        Object transform(BinarySpatialOperator filter, Object extraData) {
            // check working assumptions, first expression is a property
            if (!(filter.getExpression1() instanceof PropertyName))
                throw new IllegalArgumentException("Binary geometry filter, but first expression "
                        + "is not a property name? (it's a " + filter.getExpression1().getClass()
                        + ")");
            CoordinateReferenceSystem propertyCrs = findPropertyCRS((PropertyName) filter.getExpression1());

            if (propertyCrs == null)
                return cloneFilter(filter, extraData);

            // second expression is a geometry literal
            if (!(filter.getExpression2() instanceof Literal))
                throw new IllegalArgumentException("Binary geometry filter, but second expression "
                        + "is not a literal? (it's a " + filter.getExpression1().getClass() + ")");
            Object value = ((Literal) filter.getExpression2()).getValue();
            if (!(value instanceof Geometry))
                throw new IllegalArgumentException("Binary geometry filter, but second expression "
                        + "is not a geometry literal? (it's a " + value.getClass() + ")");
            Geometry geom = (Geometry) value;

            // does it make sense to proceed?
            if (geom.getUserData() == null
                    || !(geom.getUserData() instanceof CoordinateReferenceSystem))
                return cloneFilter(filter, extraData);

            try {
                // reproject
                CoordinateReferenceSystem geomCRS = (CoordinateReferenceSystem) geom.getUserData();
                Geometry transformed = JTS.transform(geom, CRS.findMathTransform(geomCRS, propertyCrs, true));
                transformed.setUserData(propertyCrs);
    
                // clone
                Expression ex1 = (Expression) filter.getExpression1().accept(
                        ReprojectingFilterVisitor.this, extraData);
                Expression ex2 = factory.literal(transformed);
                return cloneFilter(filter, extraData, ex1, ex2);
            } catch(Exception e) {
                throw new RuntimeException("Could not reproject geometry filter " + filter, e);
            }
        }

        /**
         * Straight cloning using cascaded visit
         * 
         * @param filter
         * @param extraData
         * @return
         */
        abstract Object cloneFilter(BinarySpatialOperator filter, Object extraData);

        /**
         * Clone with the provided parameters as first and second expressions
         * 
         * @param filter
         * @param extraData
         * @param ex1
         * @param ex2
         * @return
         */
        abstract Object cloneFilter(BinarySpatialOperator filter, Object extraData, Expression ex1,
                Expression ex2);
    }
    
    /**
     * Factors out most of the logic needed to reproject a binary comparison filter, leaving subclasses
     * only the need to call the appropriate methods to create the new binary spatial filter
     * @author Andrea Aime - The Open Plannig Project
     *
     */
    private abstract class BinaryComparisonTransformer {
        Object transform(BinaryComparisonOperator filter, Object extraData) {
            // check working assumptions, first expression is a property
            if (!(filter.getExpression1() instanceof PropertyName))
                throw new IllegalArgumentException("Binary geometry filter, but first expression "
                        + "is not a property name? (it's a " + filter.getExpression1().getClass()
                        + ")");
            CoordinateReferenceSystem propertyCrs = findPropertyCRS((PropertyName) filter.getExpression1());

            // we have to reproject only if the property is geometric and is compared against
            // a geometric literal
            if (!(propertyCrs != null && (filter.getExpression2() instanceof Literal) && 
                    ((Literal) filter.getExpression2()).getValue() instanceof Geometry))
                return cloneFilter(filter, extraData);

            // extract the geometry
            Object value = ((Literal) filter.getExpression2()).getValue();
            Geometry geom = (Geometry) value;

            // does it make sense to proceed?
            if (geom.getUserData() == null
                    || !(geom.getUserData() instanceof CoordinateReferenceSystem))
                return cloneFilter(filter, extraData);

            try {
                // reproject
                CoordinateReferenceSystem geomCRS = (CoordinateReferenceSystem) geom.getUserData();
                Geometry transformed = JTS.transform(geom, CRS.findMathTransform(geomCRS, propertyCrs, true));
                transformed.setUserData(propertyCrs);
    
                // clone
                Expression ex1 = (Expression) filter.getExpression1().accept(
                        ReprojectingFilterVisitor.this, extraData);
                Expression ex2 = factory.literal(transformed);
                return cloneFilter(filter, extraData, ex1, ex2);
            } catch(Exception e) {
                throw new RuntimeException("Could not reproject geometry filter " + filter, e);
            }
        }

        /**
         * Straight cloning using cascaded visit
         * 
         * @param filter
         * @param extraData
         * @return
         */
        abstract Object cloneFilter(BinaryComparisonOperator filter, Object extraData);

        /**
         * Clone with the provided parameters as first and second expressions
         * 
         * @param filter
         * @param extraData
         * @param ex1
         * @param ex2
         * @return
         */
        abstract Object cloneFilter(BinaryComparisonOperator filter, Object extraData, Expression ex1,
                Expression ex2);
        
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -