/*---------------- FILE HEADER --------------------------------------- This file is part of Geoide. Copyright (C) 2005-2006 by: IDgis B.V. http://www.idgis.nl This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Herman Assink IDgis bv P.O. Box 15 7450 AA Holten The Netherlands E-Mail: herman.assink@idgis.nl * @version 1.4.0 * @author IDgis team * ------------------------------------------------------------------------*/ import nl.idgis.giclient.geoma.Envelope; import nl.idgis.giclient.geoma.Geometry; import nl.idgis.giclient.geoma.NullGeometry; import nl.idgis.giclient.geoma.Point; class nl.idgis.giclient.geoma.GeometryTools { static function getIntersection(geometries:Array):Geometry { return null; // TO BE IMPLEMENTED } static function getMerge(geometries:Array):Geometry { return null; // TO BE IMPLEMENTED } static function getEnvelope(envelopes:Array):Envelope { if ((envelopes == null) || (envelopes.length == 0)) { // EXCEPTION return null; } var minX:Number = Number.MAX_VALUE; var minY:Number = Number.MAX_VALUE; var maxX:Number = Number.MIN_VALUE; var maxY:Number = Number.MIN_VALUE; var envelope:Envelope = null; for (var i:String in envelopes) { envelope = Envelope(envelopes[i]); if (!(envelope instanceof NullGeometry) && envelope != null) { if (minX > envelope.getMinX()) { minX = envelope.getMinX(); } if (minY > envelope.getMinY()) { minY = envelope.getMinY(); } if (maxX < envelope.getMaxX()) { maxX = envelope.getMaxX(); } if (maxY < envelope.getMaxY()) { maxY = envelope.getMaxY(); } } } // From this point on the envelope variable is no longer used for the individual envelopes but for the bounding envelope. if (minX == Number.MAX_VALUE && maxX == Number.MIN_VALUE) { envelope = null; } else { envelope = new Envelope(envelopes[0].getSRS(), minX, minY, maxX, maxY); } return envelope; } static function isWithin(geometry:Geometry, envelope:Envelope):Boolean { var points:Array = geometry.getCoords(); var point:Point = null; for (var i:String in points) { point = Point(points[i]); if ((point.getX() < envelope.getMinX()) || (point.getX() > envelope.getMaxX()) || (point.getY() < envelope.getMinY()) || (point.getY() > envelope.getMaxY())) { return false; } } return true; } static function getCornersInBetween(point0:Point, point1:Point, envelope:Envelope):Array { var WEST:Number = 0; var NORTH:Number = 1; var EAST:Number = 2; var SOUTH:Number = 3; var point0X:Number = point0.getX(); var point0Y:Number = point0.getY(); var point1X:Number = point1.getX(); var point1Y:Number = point1.getY(); var envelopeMinX:Number = envelope.getMinX(); var envelopeMinY:Number = envelope.getMinY(); var envelopeMaxX:Number = envelope.getMaxX(); var envelopeMaxY:Number = envelope.getMaxY(); var point0Tation:Number = -1; var point1Tation:Number = -1; if (point0X == envelopeMinX) { if (point0Y != envelopeMaxY) { point0Tation = WEST; } else { point0Tation = NORTH; } } else if (point0Y == envelopeMaxY) { if (point0X != envelopeMaxX) { point0Tation = NORTH; } else { point0Tation = EAST; } } else if (point0X == envelopeMaxX) { if (point0Y != envelopeMinY) { point0Tation = EAST; } else { point0Tation = SOUTH; } } else if (point0Y == envelopeMinY) { if (point0X != envelopeMinX) { point0Tation = SOUTH; } else { point0Tation = WEST; } } if (point1X == envelopeMinX) { if (point1Y != envelopeMaxY) { point1Tation = WEST; } else { point1Tation = NORTH; } } else if (point1Y == envelopeMaxY) { if (point1X != envelopeMaxX) { point1Tation = NORTH; } else { point1Tation = EAST; } } else if (point1X == envelopeMaxX) { if (point1Y != envelopeMinY) { point1Tation = EAST; } else { point1Tation = SOUTH; } } else if (point1Y == envelopeMinY) { if (point1X != envelopeMinX) { point1Tation = SOUTH; } else { point1Tation = WEST; } } if (point1Tation < point0Tation) { point1Tation += 4; } var envelopeCornerPoints:Array = envelope.getCornerPoints(); var cornersInBetween:Array = new Array(); for (var i:Number = point0Tation; i < point1Tation; i++) { cornersInBetween.push(envelopeCornerPoints[(i + 1) % 4]); } return cornersInBetween; } }