src/terralib/gdal/Plugin.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
3 
4  This file is part of the TerraLib - a Framework for building GIS enabled
5  applications.
6 
7  TerraLib is free software: you can redistribute it and/or modify
8  it under the terms of the GNU Lesser General Public License as published by
9  the Free Software Foundation, either version 3 of the License,
10  or (at your option) any later version.
11 
12  TerraLib is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with TerraLib. See COPYING. If not, write to
19  TerraLib Team at <terralib-team@terralib.org>.
20  */
21 
22 /*!
23  \file terralib/gdal/Plugin.cpp
24 
25  \brief Plugin interface for dynamic loading of GDAL Driver for TerraLib.
26 */
27 
28 #include "../Defines.h"
29 #include "../core/filesystem/FileSystem.h"
30 #include "../core/logger/Logger.h"
31 #include "../core/plugin/CppPlugin.h"
32 #include "../core/translator/Translator.h"
33 #include "../core/utils/Platform.h"
34 #include "../dataaccess/datasource/DataSourceCapabilities.h"
35 #include "../dataaccess/datasource/DataSourceFactory.h"
36 #include "../dataaccess/datasource/DataSourceManager.h"
37 #include "Config.h"
38 #include "DataSourceFactory.h"
39 #include "RasterFactory.h"
40 #include "Utils.h"
41 
42 // STL
43 #include <cstdlib>
44 
45 // Boost
46 #include <boost/filesystem.hpp>
47 
48 // GDAL
49 #include <gdal_priv.h>
50 namespace te
51 {
52  namespace gdal
53  {
55 
57  {
58  if(m_initialized)
59  return;
60 
61  // initializing the static mutex
63 
64  // for all platforms, first look at an environment variable
65  // defined by macro TERRALIB_GDAL_DATA.
66  // note: TERRALIB_GDAL_DATA is detected by CMAKE.
67  // note: installed versions on developers machine may look for this
68  // version of GDAL
69  std::string gdal_data_dir(TERRALIB_GDAL_DATA);
70 
71  // if the above variable is not set or it points to an invalid directory
72  if(gdal_data_dir.empty() ||
73  !te::core::FileSystem::isDirectory(gdal_data_dir))
74  {
75  // search for GDAL in a PATH relative to TerraLib.
76  // note: each SO will look in a different folder
77  #if defined(TE_PLATFORM) && defined(TE_PLATFORMCODE_MSWINDOWS)
78  #if TE_PLATFORM == TE_PLATFORMCODE_MSWINDOWS
79  gdal_data_dir = te::core::FindInTerraLibPath("/share/data");
80  #elif TE_PLATFORM == TE_PLATFORMCODE_APPLE
81  gdal_data_dir = te::core::FindInTerraLibPath("/share/gdal");
82  #elif TE_PLATFORM == TE_PLATFORMCODE_LINUX
83  gdal_data_dir = te::core::FindInTerraLibPath("/share/gdal");
84  #else
85  #error "unsupported plataform: please, contact terralib-team@terralib.org"
86  #endif
87  #else
88  #error \
89  "the macro TE_PLATFORM is not set, please, contact terralib-team@terralib.org"
90  #endif
91  }
92 
93  if(!gdal_data_dir.empty())
94  {
95  CPLSetConfigOption("GDAL_DATA", gdal_data_dir.c_str());
96  }
97 
98  CPLSetConfigOption("GDAL_PAM_ENABLED", "NO");
99 
100  CPLPushErrorHandler((CPLErrorHandler)te::gdal::GDALErrorHandler);
101 
104 
105  GDALAllRegister();
106 
108 
109  // DataType Capabilites
111  dataTypeCapabilities.setSupportRaster(true);
112 
113  // DataSetType Capabilites
115 
116  // DataSet Capabilities
118  dataSetCapabilities.setSupportEfficientDataSetSize(true);
119  dataSetCapabilities.setAsConnected(false);
120 
121  // Query Capabilities
123 
124  // DataSouce Capabilities
126  capabilities.setSupportAll();
127  capabilities.setSupportTransactions(false);
128  capabilities.setDataTypeCapabilities(dataTypeCapabilities);
129  capabilities.setDataSetTypeCapabilities(dataSetTypeCapabilities);
130  capabilities.setDataSetCapabilities(dataSetCapabilities);
131  capabilities.setQueryCapabilities(queryCapabilities);
133 
134  // Supported file extensions capability
135 
136  std::set<std::string> supportedRasterExtensionsSet;
137  std::set<std::string> supportedRasterCreationExtensionsSet;
138  std::set<std::string> supportedVectorExtensionsSet;
139 
140  for(std::map<std::string, DriverMetadata>::const_iterator it =
141  GetGDALDriversMetadata().begin();
142  it != GetGDALDriversMetadata().end(); ++it)
143  {
144  if(!it->second.m_extensions.empty())
145  {
146  for(std::size_t extensionsIdx = 0;
147  extensionsIdx < it->second.m_extensions.size(); ++extensionsIdx)
148  {
149  if(it->second.m_isRaster)
150  {
151  if(supportedRasterExtensionsSet.find(
152  it->second.m_extensions[extensionsIdx]) ==
153  supportedRasterExtensionsSet.end())
154  {
155  supportedRasterExtensionsSet.insert(
156  it->second.m_extensions[extensionsIdx]);
157  }
158 
159  if(it->second.m_supportCreation )
160  {
161  if(supportedRasterCreationExtensionsSet.find(
162  it->second.m_extensions[extensionsIdx]) ==
163  supportedRasterCreationExtensionsSet.end())
164  {
165  supportedRasterCreationExtensionsSet.insert(
166  it->second.m_extensions[extensionsIdx]);
167  }
168  }
169  }
170 
171  if(it->second.m_isVector)
172  {
173  if(supportedVectorExtensionsSet.find(
174  it->second.m_extensions[extensionsIdx]) ==
175  supportedVectorExtensionsSet.end())
176  {
177  supportedVectorExtensionsSet.insert(
178  it->second.m_extensions[extensionsIdx]);
179  }
180  }
181  }
182  }
183  }
184 
185  std::string supportedRasterExtensionsStr;
186 
187  for(std::set<std::string>::const_iterator it =
188  supportedRasterExtensionsSet.begin();
189  it != supportedRasterExtensionsSet.end(); ++it)
190  {
191  if(!supportedRasterExtensionsStr.empty())
192  {
193  supportedRasterExtensionsStr.append(";");
194  }
195  supportedRasterExtensionsStr.append(*it);
196  }
197 
198  std::string supportedRasterCreationExtensionsStr;
199 
200  for(std::set<std::string>::const_iterator it =
201  supportedRasterCreationExtensionsSet.begin();
202  it != supportedRasterCreationExtensionsSet.end(); ++it)
203  {
204  if(!supportedRasterCreationExtensionsStr.empty())
205  {
206  supportedRasterCreationExtensionsStr.append(";");
207  }
208  supportedRasterCreationExtensionsStr.append(*it);
209  }
210 
211  std::string supportedVectorExtensionsStr;
212 
213  for(std::set<std::string>::const_iterator it =
214  supportedVectorExtensionsSet.begin();
215  it != supportedVectorExtensionsSet.end(); ++it)
216  {
217  if(!supportedVectorExtensionsStr.empty())
218  {
219  supportedVectorExtensionsStr.append(";");
220  }
221  supportedVectorExtensionsStr.append(*it);
222  }
223 
224  capabilities.addSpecificCapability("SUPPORTED_RASTER_EXTENSIONS",
225  supportedRasterExtensionsStr);
226  capabilities.addSpecificCapability("SUPPORTED_RASTER_CREATION_EXTENSIONS",
227  supportedRasterCreationExtensionsStr);
228  capabilities.addSpecificCapability("SUPPORTED_VECTOR_EXTENSIONS",
229  supportedVectorExtensionsStr);
230 
232 
233  TE_LOG_TRACE(TE_TR("TerraLib GDAL driver startup!"));
234 
235  m_initialized = true;
236  }
237 
239  {
240  if(!m_initialized)
241  return;
242 
243  //! it finalizes the GDAL factory support.
245 
247 
248  //! free GDAL registered drivers
251 
252  TE_LOG_TRACE(TE_TR("TerraLib GDAL driver shutdown!"));
253 
254  m_initialized = false;
255  }
256 
257  TERRALIB_CPP_PLUGIN_END(te::gdal::Plugin)
258  }
259 }
void GDALErrorHandler(CPLErr eErrClass, int errNo, const char *msg)
A class that informs what kind of constraint and index is supported by a given data source...
static bool isDirectory(const std::string &path)
Checks if a given path in UTF-8 is a directory.
Definition: FileSystem.cpp:87
std::map< std::string, DriverMetadata > & GetGDALDriversMetadata()
Returns metadata from all registered GDAL drivers (key: driver name).
#define TERRALIB_CPP_PLUGIN_END(plugin_class_name)
This is the concrete factory for GDAL rasters.
void setDataSetTypeCapabilities(const DataSetTypeCapabilities &capabilities)
void addSpecificCapability(const std::string &key, const std::string &value)
static void initialize()
It initializes the factory: the singleton instance will be registered in the abstract factory DataSou...
static void setCapabilities(const te::da::DataSourceCapabilities &capabilities)
te::da::QueryCapabilities queryCapabilities
A class that represents the known capabilities of a specific data source, i.e. this class informs all...
void setAccessPolicy(const te::common::AccessPolicy &accessPolicy)
te::da::DataSource * Build(const te::core::URI &uri)
A class that informs what the dataset implementation of a given data source can perform.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
static void remove(const std::string &dsType)
it finalizes the GDAL factory support.
void setQueryCapabilities(const QueryCapabilities &capabilities)
void setAsConnected(const bool &connected)
te::da::DataSetTypeCapabilities dataSetTypeCapabilities
void setSupportTransactions(const bool &support)
A class that represents the supported data types of a specific data source.
te::da::DataTypeCapabilities dataTypeCapabilities
A class that informs the query support of a given data source.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
te::da::DataSourceCapabilities capabilities
URI C++ Library.
Definition: Attributes.h:37
Configuration flags for the GDAL Driver of TerraLib.
void setSupportRaster(const bool &support)
#define TERRALIB_CPP_PLUGIN_STARTUP
A factory for data sources.
te::da::DataSetCapabilities dataSetCapabilities
void setDataSetCapabilities(const DataSetCapabilities &capabilities)
TE_LOG_TRACE(TE_TR("TerraLib GDAL driver shutdown!"))
void setDataTypeCapabilities(const DataTypeCapabilities &capabilities)
TECOREEXPORT std::string FindInTerraLibPath(const std::string &path)
Returns the path relative to a directory or file in the context of TerraLib.
static void add(const std::string &dsType, FactoryFnctType f)
static void finalize()
It finalizes the factory: the singleton instance will be destroyed and will be unregistered from the ...
TEGDALEXPORT boost::mutex & getStaticMutex()
Returns a reference to a static mutex initialized when this module is initialized.
TERRALIB_CPP_PLUGIN_BEGIN(Plugin) TERRALIB_CPP_PLUGIN_STARTUP
void setSupportEfficientDataSetSize(const bool &support)
#define TE_GDAL_DRIVER_IDENTIFIER
Utilitary functions to access GDAL and match some of its concepts to TerraLib concepts.