📄 reprojectingfiltervisitor.java
字号:
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 + -