# arrow.qry # This is a sample script for drawing an unfilled arrow symbol # indicating the direction and rate of plate motion on a # geotectonic map. The arrow points in the direction of motion # and a text label shows the associated rate. Direction and rate # values are obtained for each point from specific fields in an # attached database. To use the script you will need to edit # the field and table names to correctly reference your # attribute data. # Modified to provide scaling for LegendView samples, August 2002; # Modified to declare all variables, October 2005; # Version Dec. 2007 # Requires TNTmips 2007:73 or later. # Modified to adjust scale based on georeference map units numeric red, green, blue, scale; numeric azAngle, rate1, arrowLengthMap, arrowLength, widthMap, width; numeric heightMap, height, baseSize, stemLength, sweepAngle, offset; numeric direction, perpDirect, next_x ,next_y, labelLength; numeric headLength, headSize, arrowWingSize, shift; string fontname$, label$; class RVC_GEOREFERENCE vGeoref; class SR_COORDREFSYS vectCRS; ###################### Set Parameters ############################## # Read azimuth and rate of motion vector from table.field azAngle = PlateMotion.Azimuth ###### change to fit your data rate1 = PlateMotion.Rate ###### change to fit your data # red, green, blue variables define the color of the lines red = 255; green = 0; blue = 0; # This variable defines the denominator of the intended map scale. # It is used as the basis for defining line width and symbol size. # Example: for 1:24,000 map scale, Scale = 24000 scale = 24000; # This variable defines the dimensions of the arrow symbol # ArrowLengthMap is the desired overall arrow length in mm, # assuming vector coordinates are in meters. arrowLengthMap = 10; # These variables control the width of the lines. # WidthMap is the desired map width in mm, assuming vector # coordinates are in meters. widthMap = 0.3 # These variables control the drawing of the label # text string. HeightMap is the desired height of the # letters in mm, assuming vector coordinates are in meters. heightMap = 3 # Check if vector has geographic coordinates (units of degrees instead of meters) # and if so adjust scale factor to draw symbols of appropriate size. Vect.GetDefaultGeoref(vGeoref); vectCRS = vGeoref.GetCoordRefSys(); if (vectCRS.IsProjected() <> 1) { if (vectCRS.IsLocal() <> 1) { scale = scale * 0.000009; } } else { # CRS is projected; check coordinate units to adjust scale # get coordinate unit from the first axis of the planar coordinate system coordUnit$ = vectCRS.Coordsys.GetAxis(1).Unit.GetSymbol(); scale = scale * GetUnitConvDist("m", coordUnit$); } # set final dimensions for drawing if (DrawingLegendView == 1) { # set dimensions for LegendView based on sample size arrowLength = 0.5 * SampleRect.GetWidth(); width = 0.1 * SampleRect.GetHeight(); height = 0.3 * SampleRect.GetHeight(); } else { scale = scale / 1000; arrowLength = arrowLengthMap * scale; width = widthMap * scale; height = heightMap * scale; } offset = 0.2 * arrowLength; # offset of label from base of arrow baseSize = arrowLength / 10; # half width of base stemLength = arrowLength * 0.67; # length of arrow stem sweepAngle = 30; # sweep angle of arrow wings in degrees headLength = arrowLength - stemLength; headSide = headLength / cosd(sweepAngle) arrowWingSize = headLength * tand(sweepAngle) - baseSize; fontname$ = "ARIALBD.TTF"; ######################## Process ########################### # Convert motion vector azimuth to internal coordinates. direction = -(azAngle - 90); if (direction < 0) direction = direction + 360; perpDirect = direction + 90; # Convert motion rate value to a string and assign it to a # string variable for use as label LineStyleSetFont(fontname$); LineStyleSetTextColor(red, green, blue); label$ = sprintf("%.1f", rate1); # Find length of label text for label positioning LineStyleTextNextPosition(label$, height, 0, 1, next_x ,next_y, labelLength); # Compute final parameters and draw arrow LineStyleSetColor(red, green, blue); LineStyleSetLineWidth(width); LineStyleDropAnchor(1); LineStyleLineTo(perpDirect, baseSize); LineStyleLineTo(direction, stemLength); LineStyleLineTo(perpDirect, arrowWingSize) LineStyleLineTo(direction - sweepAngle, headSide) LineStyleLineTo(direction - 180 + sweepAngle, headSide) LineStyleLineTo(perpDirect, arrowWingSize) LineStyleLineTo(direction + 180, stemLength) LineStyleLineToAnchor(1); # Place rate of motion label at base of arrow if (direction >= 0 and direction < 90) shift = offset + labelLength * cosd(direction) + height * sind(direction); if (direction >= 90 and direction < 180) shift = offset + height * sind(direction); if (direction >= 180 and direction < 270) shift = offset; if (direction >= 270 and direction <= 360) shift = offset + labelLength * cosd(direction); LineStyleMoveTo(direction - 180, shift); LineStyleDrawText(label$, height, 0, 1);