forked from ossimlabs/ossim
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreproject.cpp
More file actions
172 lines (136 loc) · 4.81 KB
/
Copy pathreproject.cpp
File metadata and controls
172 lines (136 loc) · 4.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*!
*
* OVERVIEW:
*
* Will reproject the input image to a utm projection.
*
* PURPOSE:
*
* Teach you how to create a renderer and set the view and connect it up to an input
*
*/
// iostream is used for general output
//
#include <iostream>
#include <iterator>
#include "base/data_types/ossimFilename.h"
#include "base/data_types/ossimString.h"
#include "imaging/factory/ossimImageHandlerRegistry.h"
#include "imaging/formats/ossimImageHandler.h"
#include "imaging/formats/ossimImageFileWriter.h"
#include "imaging/factory/ossimImageWriterFactoryRegistry.h"
// this is an ossim ground point and has a lat, lon, and datum
// associated with it.
#include "base/data_types/ossimGpt.h"
// Base class for accessing projection parameters.
#include "projections/ossimProjection.h"
// the projection used in the reprojection
#include "projections/map_projections/ossimUtmProjection.h"
// used to instantiate a projector
#include "projections/factory/ossimProjectionFactoryRegistry.h"
// The heart of the OSSIM resampling process for reprojecting imagery
#include "imaging/tile_sources/ossimImageRenderer.h"
// this is the most important class and is called as the first line of all applications.
// without this alll the important factories are not created.
#include "init/ossimInit.h"
using namespace std;
void usage();
void printOutputTypes();
ossimProjection* newUtmView(const ossimGpt& centerGround,
const ossimDpt& metersPerPixel);
int main(int argc, char* argv[])
{
ossimInit::instance()->initialize(argc, argv);
if(argc!=4)
{
usage();
}
else
{
// try to open up the passed in image
//
ossimImageHandler *handler = ossimImageHandlerRegistry::instance()->open(ossimFilename(argv[2]));
// try to create a writer for the output image type.
//
ossimImageFileWriter* writer = ossimImageWriterFactoryRegistry::instance()->createWriter(ossimString(argv[1]));
if(!handler)
{
cout << "Unable to open input image: "<< argv[2] << endl;
return 1;
}
if(!writer)
{
cout << "Unable to create writer of type: " << argv[1] << endl;
delete handler;
return 1;
}
ossimKeywordlist geom;
handler->getImageGeometry(geom);
// grab a projection if it exists
//
ossimProjection* inputProjection = ossimProjectionFactoryRegistry::instance()->createProjection(geom);
if (!inputProjection)
{
cout << "the input image has no input projection and can't be reprojected" << endl;
delete handler;
delete writer;
return 1;
}
// --------------------- SETUP The Resampleing process -------------
//
// the renderer is the resampler that fits into the chain.
// we will set it to a UTM view. We first get the inputs geometry and
// then get the scale from its projector.
//
// now lets set up the renderer
ossimImageRenderer* renderer = new ossimImageRenderer;
//
// get the center ground by running the center pixel
// through the handler's projection object
ossimIrect bounds = handler->getBoundingRect();
ossimGpt centerGround;
inputProjection->lineSampleToWorld(bounds.midPoint(), centerGround);
// now set the view to a new UTM view.
// I pass true in to tell the renderer that it owns the
// projection and will be responsible for deleting
//
renderer->setView(newUtmView(centerGround,
inputProjection->getMetersPerPixel()),
true);
// connect the renderer to the handler
renderer->connectMyInputTo(handler);
// specify the output file name
writer->setFilename(ossimFilename(argv[3]));
// now connect the writer to the renderer
writer->connectMyInputTo(0, renderer);
// execute the reprojection process.
writer->execute();
delete writer;
delete handler;
}
return 0;
}
void usage()
{
cout << "repoject <output_type> <input filename> <output filename>" << endl
<< "where output types are: " << endl;
printOutputTypes();
}
void printOutputTypes()
{
std::vector<ossimString> outputType;
ossimImageWriterFactoryRegistry::instance()->getImageTypeList(outputType);
std::copy(outputType.begin(),
outputType.end(),
std::ostream_iterator<ossimString>(std::cout, "\n"));
}
ossimProjection* newUtmView(const ossimGpt& centerGround,
const ossimDpt& metersPerPixel)
{
ossimUtmProjection* utm = new ossimUtmProjection;
// we will make it a square pixel in meters
double averageGsd = (metersPerPixel.x + metersPerPixel.y)*.5;
utm->setZone(centerGround);
utm->setMetersPerPixel(ossimDpt(metersPerPixel));
return utm;
}