Author: ssmiweve Date: 2009-01-29 15:22:22 +0100 (Thu, 29 Jan 2009) New Revision: 7182
Modified: branches/2.18/generic.sesam/search-command-control/default/src/main/java/no/sesat/search/mode/command/GeoSearchUtil.java Log: cleanup and doc Modified: branches/2.18/generic.sesam/search-command-control/default/src/main/java/no/sesat/search/mode/command/GeoSearchUtil.java =================================================================== --- branches/2.18/generic.sesam/search-command-control/default/src/main/java/no/sesat/search/mode/command/GeoSearchUtil.java 2009-01-29 13:22:16 UTC (rev 7181) +++ branches/2.18/generic.sesam/search-command-control/default/src/main/java/no/sesat/search/mode/command/GeoSearchUtil.java 2009-01-29 14:22:22 UTC (rev 7182) @@ -1,4 +1,4 @@ -/* Copyright (2006-2007) Schibsted Søk AS +/* Copyright (2006-2009) Schibsted Søk AS * This file is part of SESAT. * * SESAT is free software: you can redistribute it and/or modify @@ -27,13 +27,21 @@ import org.jscience.geography.coordinates.crs.ReferenceEllipsoid; /** - * Utility class for GEO search. + * Utility class for Geographical bounding box and circle transformations. * + * Converts a bounding box to a centerpoint with radius. * + * An example usecase is from map's current bounding box to be able to + * using the centerpoint with radius to search in this geographical area. * + * @todo implement the methods to go from the centerpoint+radius back to the bounding box. + * one method is the smallest possible box enclosing the circle, + * the other method giving the largest possible box inside the cirle. + * + * * @version $Id$ */ -public class GeoSearchUtil { +public final class GeoSearchUtil { /** Logger for this class. */ private static final Logger LOG = Logger.getLogger(GeoSearchUtil.class); @@ -53,19 +61,23 @@ /** Request parameter name for radius restriction in GEO search. */ private static final String RADIUS_PARAMETER_NAME = "radius"; - /** Measure unit to use. */ + /** Measure unit to use for radius. + * @deprecated will be removed in next release. is a definition provided by the search, not this class. + */ public static final String RADIUS_MEASURE_UNIT_TYPE = "km"; - /** The sort by to use when the search is a geo search. */ + /** The sort by to use when the search is a geo search. + * @deprecated will be removed in next release. is a definition provided by the search, not this class. + */ public static final String GEO_SORT_BY = "geo_spec_sortable"; + private static final String ERR_MISSING_PARAMETERS + = "Given requestParameter object must contain parameters: minX,maxX,minY,maxY"; + /** Utility class, should be used by calling static methods. */ - private GeoSearchUtil() { + private GeoSearchUtil() {} - } - - /** * Calcluates a center point from minX,maxX,minY,maxY parameters. * If a centerpoint is given in the request, return new LatLong converted centerpoint. @@ -74,56 +86,64 @@ */ public static String getCenter(final ParametersDataObject requestParameters) { - if (!isGeoSearch(requestParameters)) { - throw new IllegalArgumentException( - "Given requestParameter object must contain parameters: minX,maxX,minY,maxY"); - } + if (isGeoSearch(requestParameters)) { - if(hasCenterPoint(requestParameters)){ - int centerX = Integer.parseInt(requestParameters.getValue(CENTER_X).getString()); - int centerY = Integer.parseInt(requestParameters.getValue(CENTER_Y).getString()); - final UTM utm = UTM.valueOf(33, 'W', centerX, centerY, SI.METER); - LatLong latLong = UTM.utmToLatLong(utm, ReferenceEllipsoid.WGS84); - final double latLongX = latLong.getOrdinate(0); - final double latLongY = latLong.getOrdinate(1); + if(hasCenterPoint(requestParameters)){ - StringBuilder centerPoint = new StringBuilder(); - centerPoint.append("(").append(latLongX).append(",").append(latLongY).append(")"); - return centerPoint.toString(); - } + final int centerX = Integer.parseInt(requestParameters.getValue(CENTER_X).getString()); + final int centerY = Integer.parseInt(requestParameters.getValue(CENTER_Y).getString()); + final UTM utm = UTM.valueOf(33, 'W', centerX, centerY, SI.METER); + final LatLong latLong = UTM.utmToLatLong(utm, ReferenceEllipsoid.WGS84); + final double latLongX = latLong.getOrdinate(0); + final double latLongY = latLong.getOrdinate(1); - final int minX = Integer.parseInt((String) requestParameters.getValue(MIN_X).getString()); - final int maxX = Integer.parseInt((String) requestParameters.getValue(MAX_X).getString()); - final int minY = Integer.parseInt((String) requestParameters.getValue(MIN_Y).getString()); - final int maxY = Integer.parseInt((String) requestParameters.getValue(MAX_Y).getString()); + final StringBuilder centerPoint = new StringBuilder(); + centerPoint.append("(").append(latLongX).append(",").append(latLongY).append(")"); + return centerPoint.toString(); - final UTM utmMin = UTM.valueOf(33, 'W', minX, minY, SI.METER); - final UTM utmMax = UTM.valueOf(33, 'W', maxX, maxY, SI.METER); + }else{ - final LatLong llMin = UTM.utmToLatLong(utmMin, ReferenceEllipsoid.WGS84); - final LatLong llMax = UTM.utmToLatLong(utmMax, ReferenceEllipsoid.WGS84); + final int minX = Integer.parseInt(requestParameters.getValue(MIN_X).getString()); + final int maxX = Integer.parseInt(requestParameters.getValue(MAX_X).getString()); + final int minY = Integer.parseInt(requestParameters.getValue(MIN_Y).getString()); + final int maxY = Integer.parseInt(requestParameters.getValue(MAX_Y).getString()); - final double llMinX = llMin.getOrdinate(0); - final double llMaxX = llMax.getOrdinate(0); - final double llMinY = llMin.getOrdinate(1); - final double llMaxY = llMax.getOrdinate(1); + final UTM utmMin = UTM.valueOf(33, 'W', minX, minY, SI.METER); + final UTM utmMax = UTM.valueOf(33, 'W', maxX, maxY, SI.METER); - LOG.debug("(" + minX + "," + minY + ") (" + llMinX + "," + llMinY + ")"); - LOG.debug("(" + maxX + "," + maxY + ") (" + llMaxX + "," + llMaxY + ")"); + final LatLong llMin = UTM.utmToLatLong(utmMin, ReferenceEllipsoid.WGS84); + final LatLong llMax = UTM.utmToLatLong(utmMax, ReferenceEllipsoid.WGS84); - final String center = new StringBuilder("(").append(llMinX + (llMaxX - llMinX) / 2).append(",").append( - llMinY + (llMaxY - llMinY) / 2).append(")").toString(); - return center; + final double llMinX = llMin.getOrdinate(0); + final double llMaxX = llMax.getOrdinate(0); + final double llMinY = llMin.getOrdinate(1); + final double llMaxY = llMax.getOrdinate(1); + LOG.debug("(" + minX + "," + minY + ") (" + llMinX + "," + llMinY + ")"); + LOG.debug("(" + maxX + "," + maxY + ") (" + llMaxX + "," + llMaxY + ")"); + + final StringBuilder center = new StringBuilder("(") + .append(llMinX + (llMaxX - llMinX) / 2) + .append(",") + .append(llMinY + (llMaxY - llMinY) / 2) + .append(")"); + + return center.toString(); + } + } + throw new IllegalArgumentException(ERR_MISSING_PARAMETERS); } /** - * Responsible for checking if a ParameterDataObject is a geosearch. + * Responsible for checking if the parameters found in the ParameterDataObject + * is enough to calculate getCenter(..) getRadiusRestriction(..) + * * @param requestParameters * @return true if the given parameter object contains minX,maxX,minY,maxY values. */ public static boolean isGeoSearch(final ParametersDataObject requestParameters) { + //centerpoint is also a geo search. if(hasCenterPoint(requestParameters)){ return true; @@ -152,13 +172,15 @@ * @return true if the given object has x,y and restriction radius. */ public static boolean hasCenterPoint(ParametersDataObject requestParameters) { - if(requestParameters.getValue(CENTER_X) == null || requestParameters.getValue(CENTER_Y) == null || - requestParameters.getValue(RADIUS_PARAMETER_NAME) == null){ + + if(requestParameters.getValue(CENTER_X) == null || requestParameters.getValue(CENTER_Y) == null + || requestParameters.getValue(RADIUS_PARAMETER_NAME) == null){ return false; } - if(requestParameters.getValue(CENTER_X).getString().length() == 0 || requestParameters.getValue(CENTER_Y).getString().length() == 0|| - requestParameters.getValue(RADIUS_PARAMETER_NAME).getString().length() == 0){ + if(requestParameters.getValue(CENTER_X).getString().length() == 0 + || requestParameters.getValue(CENTER_Y).getString().length() == 0 + || requestParameters.getValue(RADIUS_PARAMETER_NAME).getString().length() == 0){ return false; } @@ -171,16 +193,18 @@ * @return The radius from the centerpoint to search. */ public static String getRadiusRestriction(final ParametersDataObject pdo) { + if (isGeoSearch(pdo)) { if(hasCenterPoint(pdo)){ return pdo.getValue(RADIUS_PARAMETER_NAME).getString(); + }else{ + final int minX = Integer.parseInt(pdo.getValue(MIN_X).getString()); + final int maxX = Integer.parseInt(pdo.getValue(MAX_X).getString()); + + final double restrictedRadius = ((maxX - minX) / 2) / 1000.0; + return Double.toString(restrictedRadius); } - final int minX = Integer.parseInt((String) pdo.getValue(MIN_X).getString()); - final int maxX = Integer.parseInt((String) pdo.getValue(MAX_X).getString()); - - double restrictedRadius = ((maxX - minX) / 2) / 1000.0; - return Double.toString(restrictedRadius); } - throw new IllegalArgumentException("Given requestParameter object must contain parameters: minX,maxX,minY,maxY"); + throw new IllegalArgumentException(ERR_MISSING_PARAMETERS); } } \ No newline at end of file _______________________________________________ Kernel-commits mailing list Kernel-commits@sesat.no http://sesat.no/mailman/listinfo/kernel-commits