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


PipelineCropAndMaskFromRegion.sml


# PipelineCropAndMaskFromRegion.sml

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

# Sample standalone script to demonstrate use of a region as a pipeline
# source to mask and crop a source image.

# Script inputs: a single raster in a Project File, and a vector object
# with polygons designating the part of the input raster to retain.
# The polygons are converted to a region, which is then used to create a
# pipeline region source.

# Script output: a new raster with areas outside the polygons masked out,
# and cropped to the extents of the polygons.

# Requires Version 2008:74 or later of the TNT products.

numeric err;

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


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

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


# CHOOSE INPUT RASTER
class RVC_OBJITEM rastInObjItem;
DlgGetObject("Choose input raster:", "Raster", rastInObjItem, "ExistingOnly");


# SET UP PIPELINE SOURCE FOR IMAGE
class IMAGE_PIPELINE_SOURCE_RVC sourceImg(rastInObjItem);
err = sourceImg.Initialize();
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);
else {
	numeric numLins, numCols;
	numLins = sourceImg.GetTotalRows();
	numCols = sourceImg.GetTotalColumns();
	print("Source image initialized.");
	printf("Image size = %d lines, %d columns\n", numLins, numCols);
	}

# Get georeference and coordinate reference system from the image.
class IMAGE_PIPELINE_GEOREFERENCE georefImg;
georefImg = sourceImg.GetGeoreference();

class SR_COORDREFSYS imgCRS = georefImg.GetCRS();

if (!imgCRS.IsDefined() ) {
	print("Image is not georeferenced; exiting now.");
	Exit();
	}
else if (imgCRS.IsLocal() ) {
	print("Image has local engineering georeference; exiting now.");
	Exit();
	}
else
	printf("Image coordinate reference system = %s\n", imgCRS.Name );

# Get coordinate transformation from image to its defined CRS
class TRANS2D_MAPGEN imgToCRS = georefImg.GetTransGen();


# CHOOSE VECTOR OBJECT WITH POLYGONS TO INDICATE AREAS TO PROCESS
class RVC_VECTOR polyVect;
class RVC_OBJITEM vectObjItem;
class RVC_GEOREFERENCE vectGeoref;
class SR_COORDREFSYS vectCRS;
DlgGetObject("Choose vector object with polygons outlining areas to process:", "Vector", vectObjItem, "ExistingOnly");
polyVect.Open(vectObjItem, "Read");

if (polyVect.$Info.NumPolys == 0) {
	print("Vector object contains no polygons; exiting now.");
	Exit();
	}

err = polyVect.GetDefaultGeoref(vectGeoref);
if (err < 0 ) {
	ReportError(_context.CurrentLineNum, err);
	print("Polygon vector must be georeferenced and is not; exiting now.");
	Exit();
	}

vectCRS = vectGeoref.GetCoordRefSys();
printf("Vector coordinate reference system = %s\n", vectCRS.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.
class RVC_OBJITEM rastOutObjItem;
DlgGetObject("Choose new raster for result:", "Raster", rastOutObjItem, "NewOnly");


# CONVERT INPUT VECTOR TO A REGION FOR USE AS A PIPELINE SOURCE
class REGION2D RegFromVect = ConvertVectToRegion(polyVect, GetLastUsedGeorefObject(polyVect) );

# if vector has different coordinate reference system from image, reproject region
if (vectCRS.Name <> imgCRS.Name) {
	printf("Converting region to image CRS: %s\n", imgCRS.Name);
	RegFromVect.ConvertTo(imgCRS);
	}

class RECT vecRegionExtents = RegFromVect.Extents;
printf("Minimum map extents of polyVect region: %.2f, %.2f\n", vecRegionExtents.x1, vecRegionExtents.y1);
printf("Maximum map extents of polyVect region: %.2f, %.2f\n\n", vecRegionExtents.x2, vecRegionExtents.y2);


# GET EXTENTS OF THE IMAGE SOURCE AS A REGION
class REGION2D imgReg;
err = sourceImg.ComputeGeoreferenceRegion(imgReg);
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);


# CHECK THAT REGION FROM VECTOR IS CONTAINED WITHIN IMAGE REGION
if (imgReg.TestRegion(RegFromVect, "FullInside") ) {
	print("Image region contains vector extents.");
	}
else {
	print("Input vector is not contained within the source image.  Exiting now.");
	Exit();
	}

# PIPELINE SOURCE FOR REGION CREATED FROM THE VECTOR POLYGONS
# Construct using TRANS2D_MAPGEN with coordinate transformation from source image to its CRS.
# Use source image as a reference so the "image dimensions" of the region source match,
# enabling the region source to be used as a mask in the MASKVALIDITY filter
class IMAGE_PIPELINE_SOURCE_REGION sourceReg(RegFromVect, sourceImg);
err = sourceReg.Initialize();
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);
else {
	print("Initialized region source.");
	printf("Size of region = %d lines, %d columns\n", sourceReg.GetTotalRows(), sourceReg.GetTotalColumns() );
	}

# Get the extents of the region as a RECT in image coordinates
# to use to crop the source image.  These are the extents of the region used to
# create the region source, not those of the image used as its reference.
class RECT regExtents;
regExtents = sourceReg.GetRegionExtents();
printf("Minimum values of cropping rectangle from polygons: x = %.2f, y = %.2f\n", regExtents.x1, regExtents.y1);
printf("Maximum values of cropping rectangle from polygons: x = %.2f, y = %.2f\n", regExtents.x2, regExtents.y2);


# SET UP PIPELINE FILTER TO MASK PORTIONS OF SOURCE IMAGE
# mask area outside the region created from the vector polygons
class IMAGE_PIPELINE_FILTER_MASKVALIDITY filterMask(sourceImg, sourceReg);
err = filterMask.Initialize();
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);
else {
	print("Initialized image mask filter.");
	}


# SET UP PIPELINE FILTER TO CROP THE SOURCE IMAGE
class IMAGE_PIPELINE_FILTER_CROP	filterCrop(filterMask, regExtents);
err = filterCrop.Initialize();
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);
else {
	print("Initialized image crop filter.");
	}


# PIPELINE TARGET
class IMAGE_PIPELINE_TARGET_RVC target(filterCrop, rastOutObjItem);
err = target.Initialize();
if (err < 0 )
	ReportError(_context.CurrentLineNum, err);
else {
	print("Initialized target.");
	}

target.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