import nl.idgis.giclient.gis.GIS; import nl.idgis.giclient.template.TemplateElement; import nl.idgis.giclient.geoma.Point; import nl.idgis.giclient.geoma.Geometry; import nl.idgis.giclient.geoma.GeometryCollection; import nl.idgis.giclient.geoma.LineString; import nl.idgis.giclient.geoma.Polygon; import nl.idgis.giclient.geoma.Circle; import nl.idgis.giclient.geoma.Ellipse; import nl.idgis.giclient.geoma.Square; import nl.idgis.giclient.gis.CentreScale; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.geoma.LinearRing; import nl.idgis.giclient.print.PrintMovie; /** * @author copierrj */ class nl.idgis.giclient.template.GeometryElement extends TemplateElement { private var centre:Point = null; private var scale:Number = 0; private var srs:String = ""; private var features:Array = null; private var linewidth:Number = 2; private var linecolor:Number = 0xff0000; private var fillcolor:Number = 0xff0000; private var fillalpha:Number = 50; public function GeometryElement(gis : GIS) { super(gis); centre = new Point(); features = new Array(); } public function doDrawElement(mc:MovieClip, handler:Object):Void { var mask:MovieClip = mc.createEmptyMovieClip("mask", mc.getNextHighestDepth()); mask.beginFill(0x000000, 100); mask.moveTo(0, 0); mask.lineTo(width, 0); mask.lineTo(width, height); mask.lineTo(0, height); mask.lineTo(0, 0); mc.setMask(mask); var centreScale:CentreScale = new CentreScale(srs, centre.getX(), centre.getY(), scale); var coordPixFactor:Number = PrintMovie.toPoints(gis.getCoordPixFactorForSrs(srs)); for(var i:Number = 0; i < features.length; i++) { var obj:Object = features[i]; if(obj instanceof Feature) { var feature:Feature = Feature(obj); var geometry:Geometry = feature.getGeometry(); drawGeometry(mc, geometry, centreScale, coordPixFactor); var annotation:String = feature.getAnnotation(); if(annotation != null && annotation != "") { drawAnnotation(mc, annotation, geometry.getCenterPoint(), centreScale, coordPixFactor); } } else if(obj instanceof Geometry) { drawGeometry(mc, Geometry(obj), centreScale, coordPixFactor); } } handler.onReady(); } private function drawAnnotation(mc:MovieClip, text:String, point:Point, centreScale:CentreScale, coordPixFactor:Number) { var x:Number = centreScale.getPixX(width, point.getX(), coordPixFactor); var y:Number = centreScale.getPixY(height, point.getY(), coordPixFactor); var format:TextFormat = new TextFormat(); format.font = "_sans"; format.size = 12; format.color = 0x0000ff; var lines:Array = text.split("\r"); for(var i:Number = 0; i < lines.length; i++) { var line:String = lines[i]; var extend:Object = format.getTextExtent(line); var depth:Number = mc.getNextHighestDepth(); var width:Number = Math.round(extend["width"]) + 5; var height:Number = Math.round(extend["width"]) + 1; var textField:TextField = mc.createTextField("annotation" + depth, depth, x - width / 2, y + (height / 2) * i, width, height); textField.setNewTextFormat(format); textField.text = line; } } private function drawGeometry(mc:MovieClip, geometry:Geometry, centreScale:CentreScale, coordPixFactor:Number):Void { mc.beginFill(); mc.lineStyle(); if(geometry == null) { return; } if(geometry instanceof Point) { mc.lineStyle(linewidth, linecolor, 100); var point:Point = Point(geometry); var x:Number = centreScale.getPixX(width, point.getX(), coordPixFactor); var y:Number = centreScale.getPixY(height, point.getY(), coordPixFactor); mc.moveTo(x, y); mc.lineTo(x + 0.15, y + 0.45); } else if(geometry instanceof LineString) { mc.lineStyle(linewidth, linecolor, 100); var lineString:LineString = LineString(geometry); var coords:Array = lineString.getPoints(); if(coords.length > 1) { var point:Point = Point(coords[0]); var x:Number = centreScale.getPixX(width, point.getX(), coordPixFactor); var y:Number = centreScale.getPixY(height, point.getY(), coordPixFactor); mc.moveTo(x, y); for(var i:Number = 1; i < coords.length; i++) { point = Point(coords[i]); x = centreScale.getPixX(width, point.getX(), coordPixFactor); y = centreScale.getPixY(height, point.getY(), coordPixFactor); mc.lineTo(x, y); } } else { if(coords.length == 1) { drawGeometry(mc, Point(coords[0]), centreScale, coordPixFactor); } } } else if(geometry instanceof Polygon) { mc.lineStyle(linewidth, linecolor, 100); mc.beginFill(fillcolor, fillalpha); var polygon:Polygon = Polygon(geometry); var linearRings:Array = polygon.getGeometries(); if(linearRings.length > 0) { for(var i:Number = 0; i < linearRings.length; i++) { var linearRing:LinearRing = LinearRing(linearRings[i]); var coords:Array = linearRing.getCoords(); var point:Point = Point(coords[0]); var x:Number = centreScale.getPixX(width, point.getX(), coordPixFactor); var y:Number = centreScale.getPixY(height, point.getY(), coordPixFactor); mc.moveTo(x, y); for(var j:Number = 0; j < coords.length; j++) { point = Point(coords[j]); x = centreScale.getPixX(width, point.getX(), coordPixFactor); y = centreScale.getPixY(height, point.getY(), coordPixFactor); mc.lineTo(x, y); } } } } else if(geometry instanceof GeometryCollection) { var collection:GeometryCollection = GeometryCollection(geometry); var geometries:Array = collection.getGeometries(); for(var i:Number = 0; i < geometries.length; i++) { drawGeometry(mc, Geometry(geometries[i]), centreScale, coordPixFactor); } } else { trace("Unknown geometry"); } } }