Seamless Aerial Photograph Mosaic

This is a sample of an seamless 1:10000 scale color aerial photograph mosaic of Halifax, Nova Scotia. The actual image was plotted out on a 4 foot by 4 foot poster. The mosaic image was generated using PCI OrthoEngine software to seamlessly combine seven individual ortho photos.

Seamless aerial photograph mosaic of Halifax, Nova Scotia

For more information on mosaicking ortho photos with PCI Orthoengine software refer to the following document that I created for a remote sensing course at COGS:

3D Toronto Images

Below are a few 3D Toronto images from a demonstration that I gave comparing Esri Arc Scene with FLY in PCI Geomatica. I generated the digital surface model (DSM) from some demo LIDAR all hits data that we had. The coverage area is for a small portion of downtown Toronto centered around Toronto City Hall.

Toronto City Hall 3D LIDAR image made with ESRI Arc Scene

Toronto City Hall 3D LIDAR image made with PCI Geomatica

LIDAR all hits point data of downtown Toronto

3D perspective view with LIDAR all hits point data of downtown Toronto

Aerial Photograph

Aerial photography is the method of taking of photographs of the ground from an elevated position. The term usually refers to images in which the camera is not supported by a ground-based structure. Cameras may be hand held or mounted, and photographs may be taken by a photographer, triggered remotely or triggered automatically. Platforms for aerial photography include fixed-wing aircraft, helicopters, balloons, blimps, kites and other airborne systems. Tradionaly they are produced in photogrammetric surveys, which are often the basis for topographic maps, land-use planning, archaeology, environmental studies, surveillance, commercial advertising, and other such projects.

This is a sample of scanned 1:10000 scale color Aerial Photograph. This photo was one of seven photos that I used to generate a seamless color mosaic of of Halifax, Nova Scotia.

Scanned Aerial Photograph of Halifax, Nova Scotia

RADARSAT Fine Mode Imagery

This is a poster of RADARSAT fine mode imagery of Nova Scotia that I created for a presentation at COGS in 1999.

RADARSAT fine modes - map of Nova Scotia

RADARSAT Fine Mode images are intended for applications that require the best spatial resolution. The azimuth resolution is 8.4m for all 5 fine modes and the range resolution varies from 7.1m (F%) to 8.3 (F1). Incidence angles range from 37 degrees to 48 degrees. The Fine mode images in the seamless RADARSAT Nova Scotia mosaic poster above include Digby, Wolfville, Truro, Cape Smokey Area, Brookfield and Halifax.

For more info on RADARSAT see https://en.wikipedia.org/wiki/RADARSAT-1

Remote Sensing

Remote sensing is merely the science of acquiring information about a surface without physically being in contact with it. It involves the use of technical instruments or sensors to record reflected or emitted energy and then processing, analyzing, and applying that information to determine the spectral and spatial relations of distance objects and materials.

Remote SensingThis is possible due to the fact that the examined objects (such as vegetation, buildings, water, air masses etc.) reflect or emit radiation in different wavelengths and intensities according to their current condition. Modern remote sensing typically involves digital processes but can also be done with non-digital methods.

Probably the most common example of remote sensing is an aerial photograph but there are probably hundreds of applications related to remote sensing ranging from space-borne satellites to under-ground geophysical systems. It has become a major component in the evolving Geomatics industry. In order to generate maps for GIS, most remote sensing systems expect to convert a photograph or other data item to actual measurable distance on the surface. However, this almost always depends on the precision of the instrument that is being used to capture the data. For example, distortion in an aerial photographic lens can cause severe distortions when photographs are used to measure ground distances. Using sophisticated software like PCI OrthoEngine can convert the photograph into an ortho photo which can be used to measure ground distances.

In order to coordinate a series of observations, most sensing systems need to know where they are, what time it is, and the rotation and orientation of the instrument. High-end instruments now often use positional information from satellite navigation systems. The rotation and orientation is often provided within a degree or two with electronic compasses.

The resolution determines how many pixels are available in measurement, but more importantly, higher resolutions are more informative, giving more data about more points. However, large amounts of high resolution data can clog a storage or transmission system with useless data, when a few low resolution images might be a better use of the system.

Like I mentioned earlier examples of remote sensing are very numerous. I have over the past decade and have used the many projects that I have been involved with along with actual examples of my work to help illustrate the principals of the various topics covered on the web site. I have included basic overviews for each along with images, presentations, papers and links to other related resources.

Examples of Remote Sensing

Remote Sensing Links

PCI EASI Script [PIX_to_SHP_batch_export.eas]

This simple EASI script used with the MODEL command in PCI will batch convert vector files stored in PCIDSK (PIX) format into Shape File (SHP) format with the exact same file name as the input files. This was originally created for PCI Geomatica v9.1 but was last tested and working with no problems in PCI Geomatica v10.0


!—————————————————————————-
!—————————————————————————-
!
! Batch Export PIX Vector to SHP Script
! [PIX_to_SHP_batch_export.eas]
!
! This script will export vector segments from PIX files located in a
! given directory into Shape files and place the new files into the same
! directory. The script assumes that no SHP files with the same names
! already exist and all the input files are setup the same with the
! vector segments stored the same.
!
!—————————————————————————-
!—————————————————————————-
! Define variables
!—————————————————————————-

!to store location of input & output files

local string in_files

!for the file format and extension types

local string type, ext

!file names

local string bn, fn

!to store directory listing of input files

local mstring dirlist

!to store vector segment number

local integer vec

local integer i

local $Z

!—————————————————————————-
! Clear the EASI window and then show the header information
!—————————————————————————-

PRINT @(1 ,1,CLREOS)

print “———————————————————————–”
print @reverse,” ‘Batch export PIX vector to SHP’ EASI Script “,@alloff
print “”
print “”
print “”
print “———————————————————————–”
print “”
print ” This script will export vectors from PIX files in a given directory ”
print ” into SHP format using the same file names as the input files. ”
print “”
print ” All input vector files are expected to be setup the same with all ”
print ” vectors to be exported, stored using the same segment number.”
print “”
print “———————————————————————–”
print “”

!—————————————————————————-
! Collect input from user
!—————————————————————————-

print “Enter the directory that contains the PIX files to export to SHP:”

input “>” in_files

print “Enter the vector segment number that the vector is stored in:”

input “>” vec

!——————————————————————-
! Get the contents of the directory
!——————————————————————-

type =”pix

dirlist = getdirectory(in_files)

let $Z = “\

for i = 1 to f$len(dirlist)

!——————————————————————-
! Extract parts of the filenames
!——————————————————————-

fn = in_files + $Z + dirlist[i]

ext = getfileextension(fn)

bn = getfilebasename(fn)

if (ext ~= type) then

print “”
print “Exporting:”, bn, “from PIX to SHP”
print “”

!—————————————————————-
! Set up the parameters and execute the FEXPORT command
!—————————————————————-

fili = in_files + $Z + dirlist[i]
filo = in_files + $Z + bn
dbiw =
dbic =
dbib =
dbvs = vec
dblut =
dbpct =
ftype =”SHP
foptions =

R Fexport

PRINT @(1 ,1,CLREOS)

endif

endfor

PRINT @(1 ,1,CLREOS)

print “——————————————————————-”
print “”
print @reverse,” ‘Batch export PIX vector to SHP’ EASI Script Finished “,@alloff
print “”
print “——————————————————————-”

return

!—————————————————————————-
!—————————————————————————-

Multiple File Subset Script – PCI EASI Script

This simple EASI script used with the MODEL command in PCI will batch subset a directory of input files based on a defined input window. It assumes that all the input files will all be located within the same specified directory, all the files will be of the same format with three channels and that the output directory does not already contain any files.

This was originally created for PCI Geomatica v9.1 but was last tested and working with no problems in PCI Geomatica v10.0 – Just copy the code below into a blank text file and edit as needed.

!—————————————————————————-
!—————————————————————————-
! Multiple File Subset Script [mul_subset.eas]
!
! This script was originally written for a user who wanted
! to have all of the fiducial marks and details removed from
! their air photos.
!
! This script assumes that all the input files will all be located
! within a given directory, all the files will be of the same format
! with three channels and that the output directory does not contain
! any files.
!
!—————————————————————————-

! Define variables
!—————————————————————————-

!for input and output directory local string in_files, out_files
!for directory listing of the input directories

local mstring dirlist

!for the file format and extension types

local string type, ext

!file names

local string bn, fn

!Parameters for the subset window

local integer x, y, width, height

local integer i

local $Z

local string confirm

!—————————————————————————-
! Clear the EASI window and then show the header information
!—————————————————————————-

PRINT @(1 ,1,CLREOS)

print “——————————————————————-“

print @reverse,” Multiple Subset “,@alloff

print “”
print “This script assumes that all the input files will all be located”
print “within a given directory, the files will be of the same format,”
print “have three image channels, will be clipped to the same extents and”
print “that the output directory will not contain any files.”

print “”

print “——————————————————————-“

!—————————————————————————-
! Collect input from user
!—————————————————————————-

print “”

print “Enter the directory that contains the input files:”

input “>” in_files

print “”

print “Enter the directory for the output files:”

input “>” out_files

print “”

print “Enter the file format of the files (3-letter file extension) : “

input “>” type

print “”
print “Enter the X coordinate for the dbiw parameter : “

input “>” x

print “”
print “Enter the Y coordinate for the dbiw parameter : “

input “>” y

print “”
print “Enter the width for the dbiw parameter : “

input “>” width

print “”
print “Enter the height for the dbiw parameter : “

input “>” height

print “”

PRINT @(1 ,1,CLREOS)

!—————————————————————————-
! Confirm with user to ensure that the parameters are correct
! If they are correct then continue with the script and if they are not
! then run the script over again.
!—————————————————————————-

print “—————————————————————————–“
print “”
print “The input directory you specified was:”

print ” “, in_files

print “”

print “The output directory you specified was:”

print ” “, out_files

print “”

print “The file format you specified was:”

print ” “, type

print “”

print “The initial coordinate of the clip you specified was:”

print ” “, x, ” “, y

print “”

print “Your image size you specified was:”
print ” “, width, ” “, height
print “”
print “—————————————————————————–“

print “Are these parameters correct? (Y/N)”

print “”

input “>” confirm

if (confirm ~= “y” or confirm ~= “Y” ) then

!——————————————————————-
! Get the contents of the directory
!——————————————————————-

dirlist = getdirectory(in_files)

let $Z = “\

for i = 1 to f$len(dirlist)

!——————————————————————-
! Extract parts of the filenames
!——————————————————————-

fn = in_files + $Z + dirlist[i]

ext = getfileextension(fn)

bn = getfilebasename(fn)

if (ext ~= type) then

print “”

print “Clipping:”, bn, “.”, ext

print “”

!——————————————————————-
! Set up the parameters and execute the FEXPORT command
!——————————————————————-

fili = in_files + $Z + dirlist[i]
filo = out_files + $Z + bn +”_clipped”
dbiw = x, y, width, height
dbic = 1,2,3
dbib =
dbvs =
dblut =
dbpct =
ftype = type
foptions =

R Fexport

PRINT @(1 ,1,CLREOS)

endif

endfor

else

run “mul_subset.eas

endif

PRINT @(1 ,1,CLREOS)

print “——————————————————————-“
print “”
print “The clipped files are stored in the following directory:”
print ” “, out_files
print “”
print “”

print @reverse,” Multiple Subset EASI Script Finished “,@alloff

print “”
print “——————————————————————-“

return

!—————————————————————————-
!—————————————————————————-

 

Script to generate a PIX file large enough to contain all input DEM files

Below is a simple EASI script used with the MODEL command in PCI will generate an output PIX file with extents large enough to contain all of the input files PIX files and then mosaic each of the input files into the output pix file. It was designed to mosaic several DEM files into one large DEM file.

This was originally created for PCI Geomatica v9.1 but was last tested and working with no problems in PCI Geomatica v10.0 – Just copy the code below into a blank text file and edit as needed.

!—————————————————————————-

! Multiple DEM Mosaic Script
! [mul_DEM_mosaic.eas]

! Ted MacKinnon – tmackinnon.com
!
! This script will generate an output PIX file with extents large enough
! to contain all of the input files and then mosaic each of the input
! files into the new output pix file.
!
! This script was designed to mosaic several DEM files into one large
! DEM file. Each input DEM file must have the same projection,
! resolution and at each DEM should have at least 150m overlap.
!
! The user is expected that the user will enter (or verify) the parameters
! of ‘CIMPRO’ at the bottom of this script prior to running the script.
! Parmaters such as BXPXSZ and DBIC have been hard coded.

!—————————————————————————-
!—————————
! Define variables
!—————————

!for input & output pix files and pixel size

local string inputFile, outputFile
local string pixel

!to obtain list of input files
local mstring inputList
local integer inputIndex

!for extracting georeferencing information

local GeoInfo geoInfo
local integer geoFile

!to contain bounding rectangle of all input files

local double boundULX, boundULY, boundLRX, boundLRY

!—————————————————————————-
! Clear the EASI window and then show the header information
!—————————————————————————-

PRINT @(1 ,1,CLREOS)

print “———————————————————————–

print @reverse,” ‘Mosaic multiple DEM files’ EASI Script “,@alloff
print “”
print “”
print “”
print “———————————————————————–“
print “”
print ” This script will generate an new output PIX file with extents large “
print ” enough to contain all of the PIX files in this directory and then “
print ” mosaic each of the PIX files into the new output file.”
print “”
print ” The output file will contain the following projection: “
print “”

! The projection will be printed to the screen as a general reminder

print ” UTM 11 S E000″

print “”
print “———————————————————————–“
print “”

!—————————————————————————-
! Collect input from user
!—————————————————————————-

print “”
print “Enter the Output file name:”
input “>” outputFile
print “”

print “Enter the pixel size for: “,outputfile

input “>” pixel

print “”
print “”

PRINT @(1 ,1,CLREOS)

!—————————————————————————-
! Create list of input files
!—————————————————————————-

sys “dir *.pix /b > pixlist.txt”

inputList = Text$Import(“pixlist.txt”)

!—————————————————————————
! Read georeferencing of each input file
!—————————————————————————-

for inputIndex = 1 to F$LEN(inputList)

print inputList(inputIndex)

geoFile = DBOpen(inputList(inputIndex), “r”)
call DBReadGeoInfo(geoFile, geoInfo)
call DBClose(geoFile)

print “Georeferencing: “, geoInfo.Units
print “Image extents: “,geoInfo.ULX, “, “, geoInfo.ULY, ” “, geoInfo.LRX, “, “, geoInfo.LRY

PRINT @(1 ,1,CLREOS)

!————————————————————————-
! initialize bounds using first file
!————————————————————————-

if inputIndex = 1 then

boundULX = geoInfo.ULX
boundULY = geoInfo.ULY
boundLRX = geoInfo.LRX
boundLRY = geoInfo.LRY

else

!———————————————————————–
! assumes UTM projection (ULY > LRY)
!———————————————————————–

if geoInfo.ULX < boundULX then
boundULX = geoInfo.ULX

endif

if geoInfo.ULY > boundULY then

boundULY = geoInfo.ULY

endif

if geoInfo.LRX > boundLRX then

boundLRX = geoInfo.LRX

endif

if geoInfo.LRY < boundLRY then
boundLRY = geoInfo.LRY

endif

endif

print “”

endfor

print outputFile, ” file extents: “, boundULX, ” “, boundULY, ” “, boundLRX, ” “, boundLRY

!—————————————————————————-
! create the output PIX file containing bounds
!—————————————————————————-

FILE = outputFile
TEX1 =

!Specify the # of channels here

DBNC = 1,0,0,0
DBLAYOUT = “PIXEL”

!Specify the projection info here

PROJECT = “UTM”
ZONE = 11
ROW = “S”
ELLIPS = “0”
LLBOUND = “N”

ULX = F$STRING(boundULX)
ULY = F$STRING(boundULY)
LRX = F$STRING(boundLRX)
LRY = F$STRING(boundLRY)
BXPXSZ = pixel
BYPXSZ = pixel
REPORT = “TERM”

run CIMPRO

!—————————————————————————-
! Mosaic each PIX file from the listing into the outputfile
!—————————————————————————-

inputList = Text$Import(“pixlist.txt”)

for inputIndex = 1 to F$LEN(inputList)

inputFile = inputList(inputIndex)

!————————————————————————–
! Clear the EASI window and show progress
!————————————————————————–

PRINT @(1 ,1,CLREOS)

print “”
print “Mosaicking “, inputFile, ” into “, outputFile
print “”

FILI = inputFile
DBIC = 1
DBVS =
DBLUT =
FILO = outputFile
DBOC = 1
BLEND =
BACKVAL = 0

run MOSAIC

endfor
!—————————————————————————-
!—————————————————————————-