OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimClosestToCenterCombiner.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // Copyright (C) 2005 Garrett Potts.
3 //
4 // License: LGPL
5 //
6 // See LICENSE.txt file in the top level directory for more details.
7 //
8 // Author: Garrett Potts
9 //
10 //*************************************************************************
11 // $Id: ossimClosestToCenterCombiner.cpp 11955 2007-10-31 16:10:22Z gpotts $
14 
15 RTTI_DEF1(ossimClosestToCenterCombiner, "ossimClosestToCenterCombiner", ossimImageMosaic);
16 
19 {
20 }
21 
23  ossim_uint32 resLevel)
24 {
25  ossim_uint32 layerIdx = 0;
26  if(!isSourceEnabled())
27  {
28  return ossimImageMosaic::getTile(rect, resLevel);
29  }
30  if(!theTile.valid())
31  {
32  allocate();
33  if(!theTile.valid())
34  {
35  return 0;
36  }
37  }
39  theTile->makeBlank();
40  std::vector<ossimClosestToCenterCombinerInfo > normTileList;
41  ossimRefPtr<ossimImageData> currentTile = getNextNormTile(layerIdx, 0, rect);
42  while(currentTile.valid())
43  {
44  normTileList.push_back(ossimClosestToCenterCombinerInfo((ossimImageData*)currentTile->dup(),
45  layerIdx));
46  currentTile = getNextNormTile(layerIdx, rect, resLevel);
47  }
48 
49 
50  if(normTileList.size() == 1)
51  {
53  }
54  else if(normTileList.size() > 1)
55  {
58  copyTile->setImageRectangleAndBands(rect,
60  copyTile->initialize();
61 
62  ossim_int32 idx = 0;
63  ossim_uint32 w = rect.width();
64  ossim_uint32 h = rect.height();
65  ossim_uint32 idxW = 0;
66  ossim_uint32 idxH = 0;
67  ossimIpt origin = rect.ul();
68  ossimIpt ulPt = rect.ul();
69  ossim_uint32 band = 0;
70  ossim_uint32 bands = copyTile->getNumberOfBands();
71  ossim_uint32 srcBandIdx = 0;
72  std::vector<ossim_float32*> bandList(bands);
73 
74  for(band = 0; band < bands; ++band)
75  {
76  bandList[band] = (ossim_float32*)copyTile->getBuf(band);
77  }
78  ossim_uint32 offset = 0;
79  origin.y = ulPt.y;
80  for(idxH = 0; idxH < h; ++idxH)
81  {
82  origin.x = ulPt.x;
83  for(idxW = 0; idxW < w;++idxW)
84  {
85  idx = findIdx(normTileList, origin, offset);
86 
87  if(idx >=0)
88  {
89  ossim_uint32 tileBands = normTileList[idx].theTile->getNumberOfBands();
90  if (tileBands > 0)
91  {
92  tileBands -= 1;
93  for(band = 0; band < bands; ++band)
94  {
95  srcBandIdx = ossim::min( tileBands, band );
96  bandList[band][offset] = *(((ossim_float32*)normTileList[idx].theTile->getBuf(srcBandIdx))+offset);
97  }
98  }
99  }
100  ++offset;
101  ++origin.x;
102  }
103  ++origin.y;
104  }
106  }
107 
108  theTile->validate();
109 
110  return theTile;
111 
112 }
113 
114 ossim_int32 ossimClosestToCenterCombiner::findIdx(const std::vector<ossimClosestToCenterCombinerInfo >& normTileList,
115  const ossimIpt& pt, ossim_uint32 offset)const
116 {
117  ossim_float32 distance = 1000000;
118  ossim_int32 returnIdx = -1;
119  ossim_float32 tempDistance;
120  ossim_int32 idx = 0;
121  ossim_int32 maxIdx = (ossim_int32)normTileList.size();
122  ossimIpt midPt;
123  ossimIrect rect;
124  for(idx = 0; idx < maxIdx; ++ idx)
125  {
126  rect = theFullResBounds[ normTileList[idx].theIndex ];
127  midPt = rect.midPoint();
128 
129  tempDistance = (pt-midPt).length();
130  if(tempDistance < distance)
131  {
132  if(normTileList[idx].theTile->getDataObjectStatus() == OSSIM_FULL)
133  {
134  distance = tempDistance;
135  returnIdx = idx;
136  }
137  else if(!normTileList[idx].theTile->isNull(offset))
138  {
139  distance = tempDistance;
140  returnIdx = idx;
141  }
142  }
143  }
144 
145  return returnIdx;
146 }
virtual bool isSourceEnabled() const
Definition: ossimSource.cpp:79
ossimRefPtr< ossimImageData > theTile
virtual ossim_uint32 getNumberOfBands() const
virtual void setImageRectangle(const ossimIrect &rect)
ossim_int32 findIdx(const std::vector< ossimClosestToCenterCombinerInfo > &normTileList, const ossimIpt &pt, ossim_uint32 offset) const
virtual ossim_uint32 getNumberOfOutputBands() const
Returns the number of bands in a tile returned from this TileSource.
bool valid() const
Definition: ossimRefPtr.h:75
This implements a closest to center combiner.
float ossim_float32
virtual ossimRefPtr< ossimImageData > getNextNormTile(ossim_uint32 &returnedIdx, const ossim_uint32 index, const ossimIrect &tileRect, ossim_uint32 resLevel=0)
ossim_uint32 height() const
Definition: ossimIrect.h:487
const ossimIpt & ul() const
Definition: ossimIrect.h:274
virtual ossimDataObjectStatus getDataObjectStatus() const
virtual ossimRefPtr< ossimImageData > getTile(const ossimIrect &origin, ossim_uint32 resLevel=0)
An image mosaic is a simple combiner that will just do a simple mosaic.
virtual void initialize()
Initialize the data buffer.
virtual ossimObject * dup() const
bool isNull(ossim_uint32 offset) const
void allocate()
Called on first getTile, will initialize all data needed.
static ossimImageDataFactory * instance()
virtual ossimDataObjectStatus validate() const
virtual void setImageRectangleAndBands(const ossimIrect &rect, ossim_uint32 numberOfBands)
ossimIpt midPoint() const
Definition: ossimIrect.h:750
std::vector< ossimIrect > theFullResBounds
unsigned int ossim_uint32
32 bit normalized floating point
virtual void copyNormalizedBufferToTile(ossim_float64 *buf)
Copies buf passed in to tile.
T min(T a, T b)
Definition: ossimCommon.h:203
virtual ossimRefPtr< ossimImageData > create(ossimSource *owner, ossimScalarType scalar, ossim_uint32 bands=1) const
ossim_uint32 width() const
Definition: ossimIrect.h:500
virtual void makeBlank()
Initializes data to null pixel values.
ossim_int32 y
Definition: ossimIpt.h:142
virtual const void * getBuf() const
ossim_int32 x
Definition: ossimIpt.h:141
virtual ossimRefPtr< ossimImageData > getTile(const ossimIrect &rect, ossim_uint32 resLevel=0)
Executes the ossimClosestToCenterCombiner algorithm.
float distance(double lat1, double lon1, double lat2, double lon2, int units)
RTTI_DEF1(ossimClosestToCenterCombiner, "ossimClosestToCenterCombiner", ossimImageMosaic)
int ossim_int32