home products news downloads documentation support gallery online maps resellers search
TNTmips Downloads Menu

HOME

CONTACT US

CURRENT RELEASE
  TNT 2013

DEVELOPMENT VERSION
  TNT 2014

TNTmips Pro
PRIOR RELEASES
  TNT 2012

FREE SOFTWARE
  TNTmips Free
  TNTatlas
  TNTsdk

MORE DOWNLOADS
  HASP Key Driver
  Screen Recorder
  TNT Language Kits
  Sample Geodata
  TNT Scripts

DOCUMENTATION
  TNTmips Tutorials
  Tutorial Datasets
  Technical Guides
  Scripts
  Quick Guides

MORE INFO
  Download FAQs
  FTP
  Download Managers
  Find Reseller

SITE MAP


PipelineResampleToUTM.sml


# PipelineResampleToUTM.sml

# Sample standalone script to demonstrate a simple image pipeline application:
# resampling/reprojecting a source raster to a different coordinate reference
# system.  In this example the image is reprojected to the UTM zone appropriate 
# for its location while maintaining the same datum. 

# 21 February 2008
# Randy Smith, MicroImages, Inc.

# Requires Version 2007:73 or later of the TNT products.

numeric err;										# error code returned

# error checking procedure
proc ReportError(numeric linenum, numeric err) {
	printf("FAILED -line: %d, error: %d\n", linenum, err);
	PopupError(err); 
	}

#####################################  Main program  ##############################
clear();

# set context so script does not exit on error, allowing manual
# handling of errors.
_context.AbortOnError = 0;


# variables for setting up UTM coordinate reference system for the output raster
class SR_COORDREFSYS utmCRS;			# UTM coordinate reference system
class SR_COORDSYS utmCoordSys;		# coordinate system for UTM zone
class SR_COORDOPDEF projectDef;		# projection parameters for the UTM zone
class SR_COORDOPMETHOD method;		# projection method

utmCoordSys.Assign("Projected2D_EN_m");	# assign projected coordinate system
method.Assign("1909");					# assign using numeric ID for Transverse Mercator projection;
												# code can be found on Details panel of Coordinate Reference System window
projectDef.Method = method;			# assign method to projection

# assign projection parameters that are the same for all UTM zones
projectDef.SetParmValueNum("LatitudeOfNaturalOrigin", 0);
projectDef.SetParmValueNum("ScaleFactorAtNaturalOrigin", 0.9996);
projectDef.SetParmValueNum("FalseEasting", 500000);


# CHOOSE INPUT RASTER to be resampled.
class RVC_OBJITEM riObjItem;					# objItem for input raster
DlgGetObject("Select raster to resample:", "Raster", riObjItem, "ExistingOnly");


# PIPELINE SOURCE
# set input raster as source
class IMAGE_PIPELINE_SOURCE_RVC source_In( riObjItem );
err = source_In.Initialize();
if (err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Pipeline source intialized.");

printf("Source image has %d lines and %d columns.\n",  source_In.GetTotalRows(), source_In.GetTotalColumns() );


# CHECK THAT SOURCE HAS VALID COORDINATE REFERENCE SYSTEM
class IMAGE_PIPELINE_GEOREFERENCE sourceGeoref;
sourceGeoref = source_In.GetGeoreference();

# get coordinate reference system from the source georeference
class SR_COORDREFSYS inCRS;						# input raster's coordinate reference system
inCRS = sourceGeoref.GetCRS();

if (inCRS.IsDefined() == 0 or inCRS.IsLocal() ) {
	PopupMessage("Source coordinate reference system is undefined or local; exiting script.");
	Exit();
	}
else 
	printf("Input image coordinate reference system: %s\n", inCRS.Name );


# FIND GEOGRAPHIC (LAT/LON) COORDINATES OF IMAGE CENTER TO DETERMINE UTM ZONE
class POINT2D center, centerMap;	# point with coordinates of image center
center.x = source_In.GetTotalColumns() * 0.5;	# center in line/column coordinates
center.y = source_In.GetTotalRows() * 0.5;

# get coordinate transformation from image coordinates to map coordinates in its CRS
# in order to find map coordinates of the image center
class TRANS2D_MAPGEN transObjToMap;		# the coordinate transformation
transObjToMap = sourceGeoref.GetTransGen();

# transform image coordinates of image center to map coordinates 
centerMap = transObjToMap.ConvertPoint2DFwd(center);

# if input image's coordinate reference system is projected, convert its center coordinates 
# to Geographic (lat/lon) coordinate system to determine the appropriate UTM zone for the output image
if (inCRS.IsProjected() == 1) 	 
	{
	class SR_COORDSYS geogCoordSys("Ellipsoidal2D_Deg");	# geographic coordinate system
	class SR_COORDREFSYS geogCRS;
	geogCRS.Create(geogCoordSys, inCRS.Datum);

	# set up coordinate transformation from input CRS to geographic coordinates
	class TRANS2D_MAPGEN transToGeog;
	transToGeog.InputCoordRefSys = inCRS;
	transToGeog.OutputCoordRefSys = geogCRS;

	centerMap = transToGeog.ConvertPoint2DFwd(centerMap);	# image center in geographic coordinates
	}

printf("Geographic coordinates of image center: x = %.4f, y = %.4f\n", centerMap.x, centerMap.y);


# SET REMAINING UTM COORDINATE SYSTEM PARAMETERS
# assign false northing based on whether image center is north or south of equator
class STRING ns$;
if ( centerMap.y < 0) {
	projectDef.SetParmValueNum("FalseNorthing", 10000);
	ns$ = "S";
	}
else	{
	projectDef.SetParmValueNum("FalseNorthing", 0);
	ns$ = "N";
	}

# assign longitude of natural origin (central meridian of UTM zone) based on longitude of image center
numeric zoneNum, centMerid;		# UTM zone and longitude of its central meridian
zoneNum = ceil( (180 + centerMap.x) / 6 );
centMerid = (zoneNum * 6) - 183;
projectDef.SetParmValueNum("LongitudeOfNaturalOrigin", centMerid);

printf("Image will be reprojected to UTM zone %d%s\n", zoneNum, ns$);


# CREATE DEFINED OUTPUT UTM COORDINATE REFERENCE SYSTEM WITH SAME DATUM AS INPUT IMAGE CRS
err = utmCRS.Create(utmCoordSys, inCRS.Datum, projectDef);
if (err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	printf("Output coordinate reference system = %s\n", utmCRS.Name); 


# CHOOSE OUTPUT RASTER
# DlgGetObject creates only an ObjItem for the output; the new raster will then be created
# by the TARGET_RVC with the desired compression.  The ObjectPath of the ObjItem is not
# valid until the output raster is actually created by the pipeline process.
class RVC_OBJITEM rastOutObjItem;
DlgGetObject("Choose raster for resampled output", "Raster", rastOutObjItem, "NewOnly");

# get line and column cell sizes from source's georeference
class POINT2D scaleIn;		# line and column cell sizes as x and y values of POINT2D
sourceGeoref.ComputeScale(center, scaleIn, 1);	# cell sizes in meters
scaleIn.y = abs(scaleIn.y);
printf("Source image cell sizes: line = %.2f m, col = %.2f m\n", scaleIn.y, scaleIn.x);


# PROMPT USER TO ENTER DESIRED OUTPUT LINE AND COLUMN CELL SIZES
numeric lineCellSize, colCellSize;			# specified cell size for the output raster
string prompt$ = "Enter desired line cell size for output raster:";
lineCellSize = PopupNum(prompt$, scaleIn.y, 0, 1000, 2);
prompt$ = "Enter desired column cell size for output raster:";
colCellSize = PopupNum(prompt$, scaleIn.x, 0, 1000, 2);


# SET RESAMPLING METHOD BASED ON RELATIVE CELL SIZE OF INPUT AND OUTPUT
numeric inCellArea, outCellArea;
inCellArea = scaleIn.x * scaleIn.y;
outCellArea = colCellSize * lineCellSize;

string rsmpMethod$;
if (outCellArea > 2 * inCellArea) then rsmpMethod$ = "Average";
	else rsmpMethod$ = "CubicConvolution";
printf("Resampling method: %s\n", rsmpMethod$);


# PIPELINE FILTER to resample source image
class IMAGE_PIPELINE_FILTER_RESAMPLE filter_rsmp(source_In, utmCRS, lineCellSize, colCellSize, rsmpMethod$);
err = filter_rsmp.Initialize();
if (err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Resample filter initialized.");


# PIPELINE TARGET: set up the target for the pipeline
class IMAGE_PIPELINE_TARGET_RVC target_rvc(filter_rsmp, rastOutObjItem);
target_rvc.SetCompression("DPCM", 0);
err = target_rvc.Initialize();
if (err < 0) 
	ReportError(_context.CurrentLineNum, err);
else
	print("Pipeline target initialized.");


# EXECUTE pipeline process
print("Processing...");
target_rvc.Process();

print("Done."); 












Back Home ©MicroImages, Inc. 2013 Published in the United States of America
11th Floor - Sharp Tower, 206 South 13th Street, Lincoln NE 68508-2010   USA
Business & Sales: (402)477-9554  Support: (402)477-9562  Fax: (402)477-9559
Business info@microimages.com  Support support@microimages.com  Web webmaster@microimages.com

25 March 2009

page update: 26 May 11