Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,19 @@ public boolean validate() throws ValidationException {

//Validate input Geometry
if (this.spatialFilter != null) {
if(spatialFilter.getGeometry() == null)
throw new ValidationException("Invalid arguments! Geometry cant be null!");

Geometry jtsGeometry = spatialFilter.getGeometry().getJTSGeometry();
spatialFilter.validateSpatialFilter();

//Enhanced Check validation check of Geometry with JTS
if(jtsGeometry != null && !jtsGeometry.isValid())
throw new ValidationException("Invalid geometry in spatialFilter!");

if(restrictExtendOfSpatialFilter) {
try {
Geometry bufferedGeo = GeoTools.applyBufferInMetersToGeometry((spatialFilter.getGeometry().getJTSGeometry()),
spatialFilter.getRadius());
Geometry bufferedGeo = GeoTools.applyBufferInMetersToGeometry(jtsGeometry, spatialFilter.getRadius());
int areaInSquareKilometersFromGeometry = (int) GeoTools.getAreaInSquareKilometersFromGeometry(bufferedGeo);
if (GeoTools.getAreaInSquareKilometersFromGeometry(bufferedGeo) > MAX_ALLOWED_SPATALFILTER_AREA_IN_SQUARE_KM) {
throw new ValidationException("Invalid SpatialFilter! Provided area of filter geometry is to large! ["
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ protected SQLQuery buildSelectClause(GetFeaturesByGeometryEvent event, int datas

@Override
protected SQLQuery buildFilterWhereClause(GetFeaturesByGeometryEvent event) {
return patchWhereClause(super.buildFilterWhereClause(event), additionalFilterFragment, clippingGeometry);
return patchWhereClause(super.buildFilterWhereClause(event), additionalFilterFragment, clippingGeometry, event.getGeometry());
}

@Override
Expand All @@ -124,29 +124,40 @@ protected SQLQuery buildRawGeoExpression(GetFeaturesByGeometryEvent event) {
}

//TODO: Check why this patch is necessary
private SQLQuery patchWhereClause(SQLQuery filterWhereClause, SQLQuery additionalFilterFragment, Geometry clippingGeometry) {
private SQLQuery patchWhereClause(SQLQuery filterWhereClause, SQLQuery additionalFilterFragment, Geometry clippingGeometry
,Geometry filterGeometry) {
SQLQuery clippingFragment = new SQLQuery("");
if(clippingGeometry != null && filterGeometry != null){
clippingFragment = new SQLQuery("""
AND ST_Intersects(geo,
ST_Intersection(
ST_Force3d(ST_GeomFromText(#{wktClipGeometry}, 4326)),
ST_Force3d(ST_GeomFromText(#{filterGeometry}, 4326))
)
)
""")
.withNamedParameter("filterGeometry", WKTHelper.geometryToWKT2d(filterGeometry))
.withNamedParameter("wktClipGeometry", WKTHelper.geometryToWKT2d(clippingGeometry));
}

if (additionalFilterFragment != null) {
SQLQuery patchedQuery = new SQLQuery("${{innerFilterWhereClause}} AND ${{customWhereClause}}")
.withQueryFragment("innerFilterWhereClause", filterWhereClause)
.withQueryFragment("customWhereClause", additionalFilterFragment);

if(clippingGeometry != null) {
patchedQuery = new SQLQuery("${{innerFilterWhereClause}} " +
" AND ST_Intersects(geo, ST_Force3d(ST_GeomFromText(#{wktClipGeometry}, 4326)))" +
" AND ${{customWhereClause}}")
.withNamedParameter("wktClipGeometry", WKTHelper.geometryToWKT2d(clippingGeometry))
.withQueryFragment("innerFilterWhereClause", filterWhereClause)
.withQueryFragment("customWhereClause", additionalFilterFragment);
}

return patchedQuery;
return new SQLQuery("""
${{innerFilterWhereClause}}
${{clippingFragment}}
AND ${{customWhereClause}}
"""
)
.withQueryFragment("clippingFragment", clippingFragment)
.withQueryFragment("innerFilterWhereClause", filterWhereClause)
.withQueryFragment("customWhereClause", additionalFilterFragment);
}

if(clippingGeometry != null) {
return new SQLQuery("${{innerFilterWhereClause}} AND ST_Intersects(geo, " +
"ST_Force3d(ST_GeomFromText(#{wktClipGeometry}, 4326)))")
.withNamedParameter("wktClipGeometry", WKTHelper.geometryToWKT2d(clippingGeometry))
if(clippingGeometry != null && filterGeometry !=null) {
return new SQLQuery("""
${{innerFilterWhereClause}}
${{clippingFragment}}
""")
.withQueryFragment("clippingFragment", clippingFragment)
.withQueryFragment("innerFilterWhereClause", filterWhereClause);
}
return filterWhereClause;
Expand All @@ -162,15 +173,9 @@ private SQLQuery overrideSelectClause(SQLQuery selectClause, SQLQuery selectClau

private SQLQuery overrideRawGeoExpression(SQLQuery selectClause, Geometry clippingGeometry, Geometry filterGeometry) {
//If there is a clipping geometry and a filter geometry, we need to use the intersection of both
if (clippingGeometry != null && filterGeometry != null)
return new SQLQuery("ST_Intersection(ST_MakeValid(geo), " +
"ST_Intersection(" +
"ST_Force3d(ST_GeomFromText(#{wktClipGeometry}, 4326))," +
"ST_Force3d(ST_GeomFromText(#{filterGeometry}, 4326))" +
")" +
")")
if (clippingGeometry != null)
return new SQLQuery("ST_Intersection(geo, ST_Force3d(ST_GeomFromText(#{wktClipGeometry}, 4326)))")
.withNamedParameter("wktClipGeometry", WKTHelper.geometryToWKT2d(clippingGeometry))
.withNamedParameter("filterGeometry", WKTHelper.geometryToWKT2d(filterGeometry))
.withLabelsEnabled(false);
return selectClause;
}
Expand Down