BufferMemory.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file BufferMemory.h
22 
23  \brief Buffer Vector Processing functions.
24 */
25 
26 //Terralib
27 
28 #include "../common/progress/TaskProgress.h"
29 #include "../core/logger/Logger.h"
30 #include "../core/translator/Translator.h"
31 
32 #include "../dataaccess/dataset/DataSet.h"
33 #include "../dataaccess/dataset/DataSetAdapter.h"
34 #include "../dataaccess/utils/Utils.h"
35 #include "../datatype/Property.h"
36 #include "../datatype/SimpleProperty.h"
37 #include "../datatype/StringProperty.h"
38 
39 #include "../geometry/Geometry.h"
40 #include "../geometry/GeometryCollection.h"
41 #include "../geometry/GeometryProperty.h"
42 #include "../geometry/Utils.h"
43 
44 #include "../memory/DataSet.h"
45 #include "../memory/DataSetItem.h"
46 
47 #include "../sam/rtree.h"
48 
49 #include "BufferMemory.h"
50 #include "Config.h"
51 #include "Exception.h"
52 #include "Utils.h"
53 
54 // STL
55 #include <map>
56 #include <string>
57 #include <vector>
58 
59 // BOOST
60 #include <boost/lexical_cast.hpp>
61 #include <boost/algorithm/string.hpp>
62 
64 
66 
67 bool te::vp::BufferMemory::run() throw(te::common::Exception)
68 {
69  std::unique_ptr<te::da::DataSetType> outDSType(GetDataSetType());
70  std::unique_ptr<te::mem::DataSet> outDSet(new te::mem::DataSet(outDSType.get()));
71  te::gm::GeometryProperty* geomProp = te::da::GetFirstGeomProperty(outDSType.get());
72 
73  int type;
74  int pk = 0;
75 
76  std::unique_ptr<te::da::DataSet> inDsetSrc;
77 
78  if(m_oidSet == nullptr)
79  inDsetSrc = m_inDsrc->getDataSet(m_inDsetName);
80  else
81  inDsetSrc = m_inDsrc->getDataSet(m_inDsetName, m_oidSet);
82 
83  std::unique_ptr<te::da::DataSetAdapter> inDset(te::da::CreateAdapter(inDsetSrc.get(), m_converter.get()));
84 
85  inDset->moveBeforeFirst();
86 
87  while(inDset->moveNext())
88  {
89  try
90  {
91  te::gm::Geometry* auxGeom = nullptr;
92 
93  for(int level = 1; level <= m_levels; ++level)
94  {
95  te::mem::DataSetItem* dataSetItem = new te::mem::DataSetItem(outDSet.get());
96 
97  for(std::size_t property = 0; property < inDset->getNumProperties(); ++property)
98  {
99  if(inDset->isNull(property))
100  continue;
101 
102  type = inDset->getPropertyDataType(property);
104  {
105  switch (type)
106  {
107  case te::dt::INT32_TYPE:
108  if(inDset->getPropertyName(property) != "FID")
109  dataSetItem->setInt32(property+2, inDset->getInt32(property));
110  break;
111  case te::dt::INT64_TYPE:
112  dataSetItem->setInt64(property+2, inDset->getInt64(property));
113  break;
114  case te::dt::DOUBLE_TYPE:
115  dataSetItem->setDouble(property+2, inDset->getDouble(property));
116  break;
117  case te::dt::STRING_TYPE:
118  dataSetItem->setString(property+2, inDset->getString(property));
119  break;
121  {
122  std::unique_ptr<te::gm::Geometry> currentGeom = inDset->getGeometry(property);
123  std::unique_ptr<te::gm::Geometry> outGeom;
124 
125  if (!currentGeom->isValid())
126  {
127  TE_LOG_INFO("Vector Processing - Buffer - Invalid geometry found");
128  continue;
129  }
130 
131  // Transform to a selected SRID.
132  int sourceSRID = currentGeom->getSRID();
133  if(sourceSRID != m_newSRID)
134  currentGeom->transform(m_newSRID);
135 
136  dataSetItem->setInt32(0, pk); //pk
137  dataSetItem->setInt32(1, level); //level
138 
139  if (m_attributePosition >= 0 && m_attributePosition < (int)inDset->getNumProperties())
140  {
141  double distance = getDistanceByAttribute(*inDset.get(), m_attributePosition);
142  dataSetItem->setDouble(2, distance*(level)); //distance
143 
144  if(distance != 0) //The distance can be negative.
145  outGeom.reset(setBuffer(currentGeom.get(), distance, level, auxGeom));
146 
147  //TO DO: EMITIR MSG PARA USUARIO AVISANDO QUE HÁ VALORES NULOS OU ZERADOS.
148  }
149  else
150  {
151  dataSetItem->setDouble(2, m_distance*(level)); //distance
152  outGeom.reset(setBuffer(currentGeom.get(), m_distance, level, auxGeom));
153  }
154 
155  // Return to Original SRID
156  if(sourceSRID != m_newSRID)
157  currentGeom->transform(m_newSRID);
158 
159  if(outGeom.get() && outGeom->isValid())
160  {
161  outGeom->setSRID(geomProp->getSRID());
162 
163  if(outGeom->getGeomTypeId() == te::gm::MultiPolygonType)
164  {
165  dataSetItem->setGeometry(property+2, outGeom.release());
166  }
167  else
168  {
169  std::unique_ptr<te::gm::GeometryCollection> mPolygon(new te::gm::GeometryCollection(0, te::gm::MultiPolygonType, outGeom->getSRID()));
170  mPolygon->add(outGeom.release());
171  dataSetItem->setGeometry(property+2, mPolygon.release());
172  }
173 
174  outDSet->add(dataSetItem);
175  ++pk;
176  }
177  }
178  break;
179  default:
180  {
181  TE_LOG_INFO(
182  "Vector Processing - Buffer - The type of input layer "
183  "attribute (" +
184  inDset->getPropertyName(property) + ") was not found.");
185  }
186  }
187  }
188  else
189  {
190  if(type == te::dt::GEOMETRY_TYPE)
191  {
192  std::unique_ptr<te::gm::Geometry> currentGeom = inDset->getGeometry(property);
193  std::unique_ptr<te::gm::Geometry> outGeom;
194 
195  if (!currentGeom->isValid())
196  {
197  TE_LOG_INFO("Vector Processing - Buffer - Invalid geometry found");
198 
199  continue;
200  }
201 
202  // Transform to a selected SRID.
203  int sourceSRID = currentGeom->getSRID();
204  if(sourceSRID != m_newSRID)
205  currentGeom->transform(m_newSRID);
206 
207  dataSetItem->setInt32(0, pk); //pk
208  dataSetItem->setInt32(1, level); //level
209 
210  if (m_attributePosition >= 0 && m_attributePosition < (int)inDset->getNumProperties())
211  {
212  double distance = getDistanceByAttribute(*inDset.get(), m_attributePosition);
213  dataSetItem->setDouble(2, distance*(level)); //distance
214 
215  if(distance != 0) //The distance can be negative.
216  outGeom.reset(setBuffer(currentGeom.get(), distance, level, auxGeom));
217 
218  //TO DO: EMITIR MSG PARA USUARIO AVISANDO QUE HÁ VALORES NULOS OU ZERADOS.
219  }
220  else
221  {
222  dataSetItem->setDouble(2, m_distance*(level)); //distance
223  outGeom.reset(setBuffer(currentGeom.get(), m_distance, level, auxGeom));
224  }
225 
226  // Return to Original SRID
227  if(sourceSRID != m_newSRID)
228  currentGeom->transform(m_newSRID);
229 
230  if(outGeom.get() && outGeom->isValid())
231  {
232  outGeom->setSRID(geomProp->getSRID());
233 
234  if(outGeom->getGeomTypeId() == te::gm::MultiPolygonType)
235  {
236  dataSetItem->setGeometry(3, outGeom.release());
237  }
238  else
239  {
240  std::unique_ptr<te::gm::GeometryCollection> mPolygon(new te::gm::GeometryCollection(0, te::gm::MultiPolygonType, outGeom->getSRID()));
241  mPolygon->add(outGeom.release());
242  dataSetItem->setGeometry(3, mPolygon.release());
243  }
244 
245  outDSet->add(dataSetItem);
246  ++pk;
247  }
248  }
249  }
250  }
251  }
252  }
253  catch(te::common::Exception& e)
254  {
255  TE_LOG_ERROR("Vector Processing - Buffer - " + e.what());
256 
257  continue;
258  }
259  }
260 
262  {
263  dissolveMemory(outDSet.get(), m_levels);
264  }
265 
266  te::vp::Save(m_outDsrc.get(), outDSet.get(), outDSType.get());
267  return true;
268 }
269 
270 
272  const double& distance,
273  const int& level,
274  te::gm::Geometry*& auxGeom)
275 {
276  te::gm::Geometry* geomResult = nullptr;
277  te::gm::Geometry* geomTemp = nullptr;
278  std::unique_ptr<te::gm::Geometry> outGeom;
279  std::unique_ptr<te::gm::Geometry> inGeom;
280  switch(m_bufferPolygonRule)
281  {
282  case (te::vp::INSIDE_OUTSIDE):
283  {
284  outGeom.reset(geom->buffer(distance * level, 16, te::gm::CapButtType));
285  inGeom.reset(geom->buffer(-distance * level, 16, te::gm::CapButtType));
286  geomResult = outGeom->difference(inGeom.get());
287 
288  geomTemp = (te::gm::Geometry*)geomResult->clone();
289  if (auxGeom && auxGeom->isValid())
290  geomResult = geomResult->difference(auxGeom);
291 
292  delete auxGeom;
293  auxGeom = geomTemp;
294  }
295  break;
296 
297  case (te::vp::ONLY_OUTSIDE):
298  {
299  outGeom.reset(geom->buffer(distance * level, 16, te::gm::CapButtType));
300  geomResult = outGeom->difference(geom);
301 
302  geomTemp = (te::gm::Geometry*)geomResult->clone();
303  if (auxGeom && auxGeom->isValid())
304  geomResult = geomResult->difference(auxGeom);
305 
306  delete auxGeom;
307  auxGeom = geomTemp;
308  }
309  break;
310 
311  case (te::vp::ONLY_INSIDE):
312  {
313  inGeom.reset(geom->buffer(-distance * level, 16, te::gm::CapButtType));
314  geomResult = geom->difference(inGeom.get());
315 
316  geomTemp = (te::gm::Geometry*)geomResult->clone();
317  if (auxGeom && auxGeom->isValid())
318  geomResult = geomResult->difference(auxGeom);
319 
320  delete auxGeom;
321  auxGeom = geomTemp;
322  }
323  break;
324 
325  default:
326  {
327  TE_LOG_INFO("Vector Processing - Buffer - Polygon rule not found.");
328  }
329  }
330  return geomResult;
331 }
332 
334  const int& levels)
335 {
336  std::vector<std::vector<te::gm::Geometry*> > vecGeom;
337 
338  int levelPos = (int)te::da::GetPropertyPos(outDSet, "level");
339  int geomPos = (int)te::da::GetPropertyPos(outDSet, "geom");
340  int level;
341 
342  //te::common::TaskProgress task1("Dissolving boundaries...");
343  //task1.setTotalSteps(levels*outDSet->size());
344  //task1.setCurrentStep(1);
345  for(int i = 1; i <= levels; ++i)
346  {
348 
349  outDSet->moveBeforeFirst();
350  while(outDSet->moveNext())
351  {
352  level = outDSet->getInt32(levelPos);
353  if(level == i)
354  {
355  if (outDSet->isNull(geomPos))
356  continue;
357 
358  te::gm::Geometry* geom = outDSet->getGeometry(geomPos).release();
359 
360  std::vector<te::gm::Geometry*> vec;
361 
362  rtree.search(*(geom->getMBR()), vec);
363 
364  if(!vec.empty())
365  {
366  for(std::size_t t = 0; t < vec.size(); ++t)
367  {
368  if(geom->intersects(vec[t]))
369  {
370  geom = geom->Union(vec[t]);
371  rtree.remove(*(vec[t]->getMBR()), vec[t]);
372  }
373  }
374  }
375  rtree.insert(*(geom->getMBR()), geom);
376  }
377  //task1.pulse();
378  }
379 
380  std::vector<te::gm::Geometry*> geomVec;
381  std::unique_ptr<te::gm::Envelope> e = outDSet->getExtent(geomPos);
382  rtree.search(*(e.get()), geomVec);
383 
384  vecGeom.push_back(geomVec);
385 
386  rtree.clear();
387  }
388 
389  outDSet->clear();
390  outDSet->moveBeforeFirst();
391 
392 
393  int pk = 0;
394  std::size_t vecSize = vecGeom.size();
395 
396  //task1.setTotalSteps(vecSize);
397  //task1.setCurrentStep(1);
398  if(levels > 1)
399  {
400  for(std::size_t i = vecSize - 1; i > 0; --i)
401  {
402  std::vector<te::gm::Geometry*> currentVec = vecGeom[i];
403  std::size_t c_vecSize = currentVec.size();
404 
405  for(std::size_t j = 0; j < i; ++j)
406  {
407  std::vector<te::gm::Geometry*> innerVec = vecGeom[j];
408  std::size_t i_vecSize = innerVec.size();
409 
410  for(std::size_t k = 0; k < c_vecSize; ++k)
411  {
412  for(std::size_t l = 0; l < i_vecSize; ++l)
413  {
414  te::gm::Geometry* k_geom = currentVec[k];
415  te::gm::Geometry* l_geom = innerVec[l];
416 
417  if(k_geom->intersects(l_geom))
418  {
419  te::gm::Geometry* tGeom = k_geom->difference(l_geom);
420  if(tGeom->isValid())
421  {
422  delete currentVec[k];
423  currentVec[k] = tGeom;
424  vecGeom[i] = currentVec;
425  }
426  }
427  }
428  }
429  }
430  //task1.pulse();
431  }
432  }
433 
434  //task1.setTotalSteps(vecSize);
435  //task1.setCurrentStep(1);
436  for (std::size_t i = 0; i < vecSize; ++i)
437  {
438  std::vector<te::gm::Geometry*> currentVec = vecGeom[i];
439  int c_vecSize = (int)currentVec.size();
440 
441  for(int j = 0; j < c_vecSize; ++j)
442  {
443  te::mem::DataSetItem* dataSetItem = new te::mem::DataSetItem(outDSet);
444  dataSetItem->setInt32(0, pk); //pk
445  dataSetItem->setInt32(1, (int)i+1); //level
446 
447  te::da::DataSetType* dsType = m_converter->getConvertee();
448 
449  if(m_attributePosition >= 0 && m_attributePosition < (int)dsType->getProperties().size())
450  dataSetItem->setDouble(2, 0); //the dissolve in buffer by attribute can use buffers with differents distances.
451  else
452  dataSetItem->setDouble(2, m_distance*((int)i+1)); //fixed distance.
453 
454  if(currentVec[j]->getGeomTypeId() == te::gm::MultiPolygonType)
455  {
456  dataSetItem->setGeometry(3, currentVec[j]);
457  }
458  else
459  {
460  std::unique_ptr<te::gm::GeometryCollection> mPolygon(new te::gm::GeometryCollection(0, te::gm::MultiPolygonType, currentVec[j]->getSRID()));
461  te::gm::GeometryCollection* gcIn = dynamic_cast<te::gm::GeometryCollection*>(currentVec[j]);
462  if(gcIn == nullptr)
463  mPolygon->add(currentVec[j]);
464  else
465  te::vp::SplitGeometryCollection(gcIn, mPolygon.get());
466 
467  dataSetItem->setGeometry(3, mPolygon.release());
468  }
469 
470  outDSet->add(dataSetItem);
471  ++pk;
472  }
473  //task1.pulse();
474  }
475 }
476 
478  const int& position)
479 {
480  double distance = 0;
481 
482  if(dataSet.isNull(position))
483  return distance;
484 
485  int type = dataSet.getPropertyDataType(position);
486 
487  switch (type) {
488  case te::dt::INT16_TYPE:
489  case te::dt::CINT16_TYPE:
490  case te::dt::UINT16_TYPE:
491  distance = (double)dataSet.getInt16(position);
492  break;
493  case te::dt::INT32_TYPE:
494  case te::dt::CINT32_TYPE:
495  case te::dt::UINT32_TYPE:
496  distance = (double)dataSet.getInt32(position);
497  break;
498  case te::dt::INT64_TYPE:
499  case te::dt::UINT64_TYPE:
500  distance = (double)dataSet.getInt64(position);
501  break;
502  case te::dt::FLOAT_TYPE:
503  case te::dt::CFLOAT_TYPE:
504  distance = (double)dataSet.getFloat(position);
505  break;
506  case te::dt::DOUBLE_TYPE:
508  distance = dataSet.getDouble(position);
509  break;
510  default:
511  te::common::Exception(TE_TR("The chosen attribute has not a valid type to execute the buffer operation!"));
512  break;
513  }
514  return distance;
515 }
An exception class for the Vector processing module.
bool remove(const te::gm::Envelope &mbr, const DATATYPE &data)
It removes an item from the tree.
virtual Geometry * difference(const Geometry *const rhs) const _NOEXCEPT_OP(false)
It returns a geometric object that represents the point set difference with another geometry...
Buffer Vector Processing functions.
Geometric property.
void setGeometry(std::size_t i, te::gm::Geometry *value)
It sets the value of the i-th property.
virtual double getDouble(std::size_t i) const =0
Method for retrieving a double attribute value.
double m_distance
The fixed distance.
Definition: BufferOp.h:142
void setDouble(std::size_t i, double value)
It sets the value of the i-th property.
A class that represents an R-tree.
std::unique_ptr< te::gm::Envelope > getExtent(std::size_t i)
It computes the bounding rectangle for a spatial property of the dataset.
int getPropertyDataType(std::size_t pos) const
It returns the type of the pos-th property.
Base exception class for plugin module.
A class that models the description of a dataset.
Definition: DataSetType.h:72
virtual float getFloat(std::size_t i) const =0
Method for retrieving a float attribute value.
virtual const char * what() const
It outputs the exception message.
virtual Geometry * buffer(const double &distance) const _NOEXCEPT_OP(false)
This method calculates the buffer of a geometry.
const te::da::ObjectIdSet * m_oidSet
The input objectid set.
Definition: BufferOp.h:140
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
double getDistanceByAttribute(te::da::DataSet &dataSet, const int &position)
It returns the distance of buffer by the attribute chosen.
std::unique_ptr< te::da::DataSetTypeConverter > m_converter
The input datasettype.
Definition: BufferOp.h:139
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
virtual Geometry * Union(const Geometry *const rhs) const _NOEXCEPT_OP(false)
It returns a geometric object that represents the point set union with another geometry.
virtual bool intersects(const Geometry *const rhs) const _NOEXCEPT_OP(false)
It returns true if the geometry object spatially intersects rhs geometry.
bool isNull(std::size_t i) const
It checks if the attribute value is NULL.
#define TE_LOG_INFO(message)
Use this tag in order to log a message to the TerraLib default logger with the INFO level...
Definition: Logger.h:315
te::gm::Geometry * setBuffer(te::gm::Geometry *geom, const double &distance, const int &level, te::gm::Geometry *&auxGeom)
It executes the buffer operator.
void add(DataSetItem *item)
It adds a new item to the dataset and takes its ownership.
void setInt32(std::size_t i, boost::int32_t value)
It sets the value of the i-th property.
TEVPEXPORT void Save(te::da::DataSource *source, te::da::DataSet *result, te::da::DataSetType *outDsType, const bool &enableProgress=true)
The buffer is generated only outside of the polygons.
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
int m_bufferPolygonRule
The buffer polygon rule (INSIDE_OUTSIDE = 0, ONLY_OUTSIDE = 1, ONLY_INSIDE = 2).
Definition: BufferOp.h:144
const std::vector< Property * > & getProperties() const
It returns the list of properties describing the CompositeProperty.
int m_levels
The number of levels buffer will have.
Definition: BufferOp.h:147
virtual boost::int16_t getInt16(std::size_t i) const =0
Method for retrieving a 16-bit integer attribute value (2 bytes long).
int getSRID() const
It returns the spatial reference system identifier associated to this property.
const Envelope * getMBR() const _NOEXCEPT_OP(true)
It returns the minimum bounding rectangle for the geometry in an internal representation.
virtual int getPropertyDataType(std::size_t i) const =0
It returns the underlying data type of the property at position pos.
boost::int32_t getInt32(std::size_t i) const
Method for retrieving a 32-bit integer attribute value (4 bytes long).
virtual bool isValid() const _NOEXCEPT_OP(false)
It tells if the geometry is well formed.
TEVPEXPORT void SplitGeometryCollection(te::gm::GeometryCollection *geomIn, te::gm::GeometryCollection *gcOut)
te::da::DataSetType * GetDataSetType()
It builds the output DataSetType.
Definition: BufferOp.cpp:96
int m_bufferBoundariesRule
The buffer boundary rule (DISSOLVE = 0 and NOT_DISSOLVE = 1).
Definition: BufferOp.h:145
std::unique_ptr< te::gm::Geometry > getGeometry(std::size_t i) const
Method for retrieving a geometric attribute value.
The buffer is generated only inside of the polygons.
URI C++ Library.
Definition: Attributes.h:37
virtual boost::int32_t getInt32(std::size_t i) const =0
Method for retrieving a 32-bit integer attribute value (4 bytes long).
virtual AbstractData * clone() const =0
It returns a clone of this object.
~BufferMemory()
Destructor.
int search(const te::gm::Envelope &mbr, std::vector< DATATYPE > &report) const
Range search query.
Utility functions for the data access module.
bool run()
It executes the operation.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
bool moveBeforeFirst()
It moves the internal pointer to a position before the first item in the collection.
void dissolveMemory(te::mem::DataSet *outDSet, const int &levels)
It dissolves the bounders between buffers.
bool moveNext()
It moves the internal pointer to the next item of the collection.
The buffer is generated Inside and outside of the polygons.
An implementation of the DatasetItem class for the TerraLib In-Memory Data Access driver...
A dataset is the unit of information manipulated by the data access module of TerraLib.
void insert(const te::gm::Envelope &mbr, const DATATYPE &data)
It inserts an item into the tree.
void add(Geometry *g)
It adds the geometry into the collection.
BufferMemory()
Default constructor.
Configuration flags for the Terrralib Vector Processing module.
#define TE_LOG_ERROR(message)
Use this tag in order to log a message to the TerraLib default logger with the ERROR level...
Definition: Logger.h:337
int m_attributePosition
The buffer can be calculated by attribute values. The attribute must be numeric type.
Definition: BufferOp.h:148
bool m_copyInputColumns
Copy columns from input DataSet.
Definition: BufferOp.h:146
virtual bool isNull(std::size_t i) const =0
It checks if the attribute value is NULL.
void clear()
It clears all the dataset items.
virtual boost::int64_t getInt64(std::size_t i) const =0
Method for retrieving a 64-bit integer attribute value (8 bytes long).
te::da::DataSourcePtr m_inDsrc
The input datasource.
Definition: BufferOp.h:137
void setString(std::size_t i, const std::string &value)
It sets the value of the i-th property.
te::da::DataSourcePtr m_outDsrc
The output datasource.
Definition: BufferOp.h:150
void setInt64(std::size_t i, boost::int64_t value)
It sets the value of the i-th property.
It is a collection of other geometric objects.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
std::string m_inDsetName
The input dataset name.
Definition: BufferOp.h:138
int m_newSRID
A new SRID if it&#39;s necessary to transform the data.
Definition: BufferOp.h:143
The boundaries between buffers will be dissolved.