import nl.idgis.giclient.template.ParameterSource; import nl.idgis.giclient.template.Parameter; import nl.idgis.giclient.geoma.Geometry; import nl.idgis.giclient.geoma.GeometryCollection; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.geoma.Envelope; import nl.idgis.giclient.gis.GIS; import nl.idgis.giclient.geoma.GMLFactory; import nl.idgis.giclient.gis.Map; /** * @author copierrj */ class nl.idgis.giclient.template.Util implements ParameterSource { private var gis:GIS; private var defaultScaleFactor:Number = 30; public function Util(gis:GIS) { this.gis = gis; } private function getGeometryCollection(templateGeometries:Array):GeometryCollection { var geometries:Array = new Array(); for(var i:Number = 0; i < templateGeometries.length; i++) { var obj:Object = templateGeometries[i]; if(obj instanceof Geometry) { geometries.push(obj); } else if(obj instanceof Feature) { geometries.push(Feature(obj).getGeometry()); } } if(geometries != null && geometries.length > 0) { var collection:GeometryCollection = new GeometryCollection( Geometry(geometries[0]).getSRS(), geometries); return collection; } else { return null; } } public function getValue(parameter : Parameter) { var name:String = parameter.getSourceName(); if(name == "centrePoint") { var geometryCollection:GeometryCollection = getGeometryCollection(Array(parameter.getValue("geometries"))); if(geometryCollection != null) { parameter.setValue(geometryCollection.getEnvelope().getCenterPoint()); } else { parameter.setValue(null); } } else if(name == "overviewScale") { var scale:Number = Number(parameter.getValue("scale")); var coordPixFactor:Number = gis.getCoordPixFactorForSrs(String( parameter.getValue("srs"))); var map:Map = gis.getActiveMap(); var mapWidth:Number = Number(parameter.getValue("width")); var mapHeight:Number = Number(parameter.getValue("height")); var minScale:Number = 0.7 * map.getInitEnvelope().toCentreScale(mapWidth, mapHeight, coordPixFactor).getScale(); var maxScale:Number = 1.3 * map.getEnvelope().toCentreScale(mapWidth, mapHeight, coordPixFactor).getScale(); var scaleFactor:Number; if (scale * defaultScaleFactor < minScale) { scaleFactor = minScale / scale; } else if (scale * defaultScaleFactor > maxScale) { scaleFactor = maxScale / scale; } else { scaleFactor = defaultScaleFactor; } scale *= scaleFactor; parameter.setValue(scale); } else if(name == "boundingScale") { var factorObj:Object = parameter.getValue("factor"); var factor:Number = factorObj != null ? Number(factorObj) : 1; var width:Number = Number(parameter.getValue("width")); var height:Number = Number(parameter.getValue("height")); var max:Number = height > width ? height : width; var geometryCollection:GeometryCollection = getGeometryCollection(Array(parameter.getValue("geometries"))); var envelope:Envelope = geometryCollection.getEnvelope(); var geomWidth:Number = envelope.getMaxX() - envelope.getMinX(); var geomHeight:Number = envelope.getMaxY() - envelope.getMinY(); var geomMax:Number = geomHeight > geomWidth ? geomHeight : geomWidth; var scale:Number = geomMax / gis.getCoordPixFactor() / max; parameter.setValue(scale * factor); } else if(name == "gmlGeometry") { var geometryCollection:GeometryCollection = getGeometryCollection(Array(parameter.getValue("geometries"))); parameter.setValue(GMLFactory.createGMLNode(geometryCollection.getGeometry(0))); } else if(name == "round") { var number:Number = Number(parameter.getValue("number")); parameter.setValue(Math.round(number)); } else { parameter.setValue(null); } } }