[gdal-grass] 02/04: Imported Upstream version 2.2.0~beta1
Bas Couwenberg
sebastic at debian.org
Fri Apr 14 15:27:15 UTC 2017
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch experimental-2.2
in repository gdal-grass.
commit 2757bea279be2968b8ed96c19ef165867cec3256
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Fri Apr 14 17:22:32 2017 +0200
Imported Upstream version 2.2.0~beta1
---
README | 18 +-
VERSION | 2 +-
aclocal.m4 | 16 +-
configure.in | 2 +-
grass57dataset.cpp | 462 +++++++++++++-------------
ogrgrass.h | 137 ++++----
ogrgrassdatasource.cpp | 75 ++---
ogrgrassdriver.cpp | 33 +-
ogrgrasslayer.cpp | 886 ++++++++++++++++++++++++-------------------------
9 files changed, 772 insertions(+), 859 deletions(-)
diff --git a/README b/README
index cd545cd..dfd9f44 100644
--- a/README
+++ b/README
@@ -2,11 +2,11 @@ Standalone GRASS Drivers for GDAL and OGR
=========================================
This package contains standalone drivers for GRASS raster and vector
-files that can be built after GDAL has been built and installed as an
-"autoload" driver.
+files that can be built after GDAL has been built and installed as an
+"autoload" driver.
This is particularly useful in resolving problems with GRASS depending
-on GDAL, but GDAL with GRASS support depending on GRASS. With this
+on GDAL, but GDAL with GRASS support depending on GRASS. With this
package you can configure and install GDAL normally (--without-grass), then
build and install GRASS normally and finally build and install this driver.
@@ -52,12 +52,12 @@ libraries not found?
Answer:
-Your problem is likely to be solved by editing /etc/ld.so.conf to
-include the locations of proj, gdal, grass, and geos. Specifically,
-the full path to both gdal-config and geos-config, and the full paths
+Your problem is likely to be solved by editing /etc/ld.so.conf to
+include the locations of proj, gdal, grass, and geos. Specifically,
+the full path to both gdal-config and geos-config, and the full paths
to the library locations of proj (often /usr/local/lib) and grass (/
-usr/local/grass-6.0.1/lib). After editing ld.so.conf, run ldconfig,
+usr/local/grass-6.0.1/lib). After editing ld.so.conf, run ldconfig,
and you should be good to go.
-I ran into this problem this weekend (and posted for help to this
-list), so it seems to be a pretty common issue.
+I ran into this problem this weekend (and posted for help to this
+list), so it seems to be a pretty common issue.
diff --git a/VERSION b/VERSION
index ac2cdeb..ccbccc3 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.3
+2.2.0
diff --git a/aclocal.m4 b/aclocal.m4
index 7bffcf4..ec692bd 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -6,14 +6,14 @@ AC_DEFUN(AC_COMPILER_LOCALHACK,
echo 'int main() { int i = 1; if( *((unsigned char *) &i) == 0 ) printf( "BIGENDIAN"); return 0; }' >> conftest.c
${CC} $CPPFLAGS $EXTRA_INCLUDES -o conftest conftest.c 2> comp.out
COMP_CHECK=`grep "system directory" comp.out | grep /usr/local/include`
- if test -z "$COMP_CHECK" ; then
+ if test -z "$COMP_CHECK" ; then
AC_MSG_RESULT([no, everything is ok])
else
AC_MSG_RESULT([yes, stripping extras])
CXXFLAGS=`echo "$CXXFLAGS " | sed "s/-I\/usr\/local\/include //"`
CFLAGS=`echo "$CFLAGS " | sed "s/-I\/usr\/local\/include //"`
EXTRA_INCLUDES=`echo "$EXTRA_INCLUDES " | sed "s/-I\/usr\/local\/include //"`
- fi
+ fi
rm -f comp.out
])
@@ -61,7 +61,7 @@ AC_DEFUN(AC_COMPILER_PIC,
dnl
dnl Try to find something to link shared libraries with. Use "c++ -shared"
dnl in preference to "ld -shared" because it will link in required c++
-dnl run time support for us.
+dnl run time support for us.
dnl
AC_DEFUN(AC_LD_SHARED,
[
@@ -84,9 +84,9 @@ AC_DEFUN(AC_LD_SHARED,
if test "$with_ld_shared" != "" ; then
if test "$with_ld_shared" = "no" ; then
- echo "user disabled shared library support."
+ echo "user disabled shared library support."
else
- echo "using user supplied .so link command ... $with_ld_shared"
+ echo "using user supplied .so link command ... $with_ld_shared"
fi
LD_SHARED="$with_ld_shared"
fi
@@ -113,7 +113,7 @@ AC_DEFUN(AC_LD_SHARED,
fi
fi
- dnl Test special MacOS (Darwin) case.
+ dnl Test special MacOS (Darwin) case.
if test ! -z "`uname | grep Darwin`" \
-a "$LD_SHARED" = "/bin/true" \
@@ -157,7 +157,7 @@ AC_DEFUN(AC_LD_SHARED,
else
echo "checking for ${CXX} -shared ... no(2)"
fi
- else
+ else
if test "$LD_SHARED" = "/bin/true" ; then
echo "checking for ${CXX} -shared ... no(1)"
fi
@@ -195,7 +195,7 @@ AC_DEFUN(AC_LD_SHARED,
fi
fi
- rm -f conftest* libconftest*
+ rm -f conftest* libconftest*
AC_SUBST(LD_SHARED,$LD_SHARED)
AC_SUBST(SO_EXT,$SO_EXT)
diff --git a/configure.in b/configure.in
index ff96173..c9bf951 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
dnl ***************************************************************************
-dnl $Id: configure.in 37161 2017-01-17 07:34:30Z rouault $
+dnl $Id: configure.in 37160 2017-01-17 07:34:22Z rouault $
dnl
dnl Project: GDAL GRASS Plugin
dnl Purpose: Configure source file.
diff --git a/grass57dataset.cpp b/grass57dataset.cpp
index f7442d4..fc9e926 100644
--- a/grass57dataset.cpp
+++ b/grass57dataset.cpp
@@ -1,5 +1,4 @@
/******************************************************************************
- * $Id: grass57dataset.cpp 33893 2016-04-04 14:08:28Z rouault $
*
* Project: GRASS Driver
* Purpose: Implement GRASS raster read/write support
@@ -52,22 +51,24 @@ extern "C" {
#include <grass/gis.h>
#if GRASS_VERSION_MAJOR >= 7
-char *GPJ_grass_to_wkt(const struct Key_Value *,
- const struct Key_Value *,
- int, int);
+char *GPJ_grass_to_wkt( const struct Key_Value *,
+ const struct Key_Value *,
+ int, int );
#else
-char *GPJ_grass_to_wkt(struct Key_Value *,
- struct Key_Value *,
- int, int);
+char *GPJ_grass_to_wkt( struct Key_Value *,
+ struct Key_Value *,
+ int, int );
#endif
}
#define GRASS_MAX_COLORS 100000 // what is the right value
-CPL_CVSID("$Id: grass57dataset.cpp 33893 2016-04-04 14:08:28Z rouault $");
+CPL_CVSID("$Id: grass57dataset.cpp 37964 2017-04-11 18:04:50Z rouault $");
#if GRASS_VERSION_MAJOR >= 7
#define G_get_cellhd Rast_get_cellhd
+#define G_get_window Rast_get_window
+#define G_set_window Rast_set_window
#define G_raster_map_type Rast_map_type
#define G_read_fp_range Rast_read_fp_range
#define G_get_fp_range_min_max Rast_get_fp_range_min_max
@@ -96,7 +97,7 @@ CPL_CVSID("$Id: grass57dataset.cpp 33893 2016-04-04 14:08:28Z rouault $");
/* Grass2CPLErrorHook() */
/************************************************************************/
-int Grass2CPLErrorHook( char * pszMessage, int bFatal )
+static int Grass2CPLErrorHook( char * pszMessage, int bFatal )
{
if( !bFatal )
@@ -110,7 +111,7 @@ int Grass2CPLErrorHook( char * pszMessage, int bFatal )
/************************************************************************/
/* ==================================================================== */
-/* GRASSDataset */
+/* GRASSDataset */
/* ==================================================================== */
/************************************************************************/
@@ -120,22 +121,22 @@ class GRASSDataset : public GDALDataset
{
friend class GRASSRasterBand;
- char *pszGisdbase;
- char *pszLocation; /* LOCATION_NAME */
- char *pszElement; /* cellhd or group */
+ char *pszGisdbase;
+ char *pszLocation; /* LOCATION_NAME */
+ char *pszElement; /* cellhd or group */
struct Cell_head sCellInfo; /* raster region */
- char *pszProjection;
+ char *pszProjection;
- double adfGeoTransform[6];
+ double adfGeoTransform[6];
public:
GRASSDataset();
~GRASSDataset();
- virtual const char *GetProjectionRef(void);
- virtual CPLErr GetGeoTransform( double * );
+ virtual const char *GetProjectionRef(void) override;
+ virtual CPLErr GetGeoTransform( double * ) override;
static GDALDataset *Open( GDALOpenInfo * );
@@ -155,7 +156,7 @@ class GRASSRasterBand : public GDALRasterBand
char *pszCellName;
char *pszMapset;
- int hCell;
+ int hCell;
int nGRSType; // GRASS raster type: CELL_TYPE, FCELL_TYPE, DCELL_TYPE
bool nativeNulls; // use GRASS native NULL values
@@ -164,11 +165,11 @@ class GRASSRasterBand : public GDALRasterBand
struct Cell_head sOpenWindow; /* the region when the raster was opened */
- int bHaveMinMax;
- double dfCellMin;
- double dfCellMax;
+ int bHaveMinMax;
+ double dfCellMin;
+ double dfCellMax;
- double dfNoData;
+ double dfNoData;
bool valid;
@@ -178,42 +179,40 @@ class GRASSRasterBand : public GDALRasterBand
const char *, const char * );
virtual ~GRASSRasterBand();
- virtual CPLErr IReadBlock( int, int, void * );
+ virtual CPLErr IReadBlock( int, int, void * ) override;
virtual CPLErr IRasterIO ( GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType,
GSpacing nPixelSpace,
GSpacing nLineSpace,
- GDALRasterIOExtraArg* psExtraArg);
- virtual GDALColorInterp GetColorInterpretation();
- virtual GDALColorTable *GetColorTable();
- virtual double GetMinimum( int *pbSuccess = NULL );
- virtual double GetMaximum( int *pbSuccess = NULL );
- virtual double GetNoDataValue( int *pbSuccess = NULL );
+ GDALRasterIOExtraArg* psExtraArg) override;
+ virtual GDALColorInterp GetColorInterpretation() override;
+ virtual GDALColorTable *GetColorTable() override;
+ virtual double GetMinimum( int *pbSuccess = NULL ) override;
+ virtual double GetMaximum( int *pbSuccess = NULL ) override;
+ virtual double GetNoDataValue( int *pbSuccess = NULL ) override;
private:
CPLErr ResetReading( struct Cell_head * );
-
};
-
/************************************************************************/
/* GRASSRasterBand() */
/************************************************************************/
-GRASSRasterBand::GRASSRasterBand( GRASSDataset *poDS, int nBand,
- const char * pszMapset,
- const char * pszCellName )
+GRASSRasterBand::GRASSRasterBand( GRASSDataset *poDSIn, int nBandIn,
+ const char * pszMapsetIn,
+ const char * pszCellNameIn )
{
- struct Cell_head sCellInfo;
+ struct Cell_head sCellInfo;
// Note: GISDBASE, LOCATION_NAME ans MAPSET was set in GRASSDataset::Open
- this->poDS = poDS;
- this->nBand = nBand;
+ this->poDS = poDSIn;
+ this->nBand = nBandIn;
this->valid = false;
- this->pszCellName = G_store ( (char *) pszCellName );
- this->pszMapset = G_store ( (char *) pszMapset );
+ this->pszCellName = G_store ( (char *) pszCellNameIn );
+ this->pszMapset = G_store ( (char *) pszMapsetIn );
G_get_cellhd( (char *) pszCellName, (char *) pszMapset, &sCellInfo );
nGRSType = G_raster_map_type( (char *) pszCellName, (char *) pszMapset );
@@ -244,66 +243,66 @@ GRASSRasterBand::GRASSRasterBand( GRASSDataset *poDS, int nBand,
// full raster values range is used -> no checks if shorter type could be used
if( nGRSType == CELL_TYPE ) {
- if ( sCellInfo.format == 0 ) { // 1 byte / cell -> possible range 0,255
- if ( bHaveMinMax && dfCellMin > 0 ) {
+ if ( sCellInfo.format == 0 ) { // 1 byte / cell -> possible range 0,255
+ if ( bHaveMinMax && dfCellMin > 0 ) {
this->eDataType = GDT_Byte;
- dfNoData = 0.0;
- } else if ( bHaveMinMax && dfCellMax < 255 ) {
+ dfNoData = 0.0;
+ } else if ( bHaveMinMax && dfCellMax < 255 ) {
this->eDataType = GDT_Byte;
- dfNoData = 255.0;
- } else { // maximum is not known or full range is used
- this->eDataType = GDT_UInt16;
- dfNoData = 256.0;
- }
- nativeNulls = false;
- } else if ( sCellInfo.format == 1 ) { // 2 bytes / cell -> possible range 0,65535
- if ( bHaveMinMax && dfCellMin > 0 ) {
- this->eDataType = GDT_UInt16;
- dfNoData = 0.0;
- } else if ( bHaveMinMax && dfCellMax < 65535 ) {
+ dfNoData = 255.0;
+ } else { // maximum is not known or full range is used
+ this->eDataType = GDT_UInt16;
+ dfNoData = 256.0;
+ }
+ nativeNulls = false;
+ } else if ( sCellInfo.format == 1 ) { // 2 bytes / cell -> possible range 0,65535
+ if ( bHaveMinMax && dfCellMin > 0 ) {
+ this->eDataType = GDT_UInt16;
+ dfNoData = 0.0;
+ } else if ( bHaveMinMax && dfCellMax < 65535 ) {
this->eDataType = GDT_UInt16;
- dfNoData = 65535;
- } else { // maximum is not known or full range is used
- CELL cval;
- this->eDataType = GDT_Int32;
- G_set_c_null_value ( &cval, 1);
- dfNoData = (double) cval;
- nativeNulls = true;
- }
- nativeNulls = false;
- } else { // 3-4 bytes
- CELL cval;
- this->eDataType = GDT_Int32;
- G_set_c_null_value ( &cval, 1);
- dfNoData = (double) cval;
- nativeNulls = true;
- }
+ dfNoData = 65535;
+ } else { // maximum is not known or full range is used
+ CELL cval;
+ this->eDataType = GDT_Int32;
+ G_set_c_null_value ( &cval, 1);
+ dfNoData = (double) cval;
+ nativeNulls = true;
+ }
+ nativeNulls = false;
+ } else { // 3-4 bytes
+ CELL cval;
+ this->eDataType = GDT_Int32;
+ G_set_c_null_value ( &cval, 1);
+ dfNoData = (double) cval;
+ nativeNulls = true;
+ }
}
else if( nGRSType == FCELL_TYPE ) {
- FCELL fval;
+ FCELL fval;
this->eDataType = GDT_Float32;
- G_set_f_null_value ( &fval, 1);
- dfNoData = (double) fval;
- nativeNulls = true;
+ G_set_f_null_value ( &fval, 1);
+ dfNoData = (double) fval;
+ nativeNulls = true;
}
else if( nGRSType == DCELL_TYPE )
{
- DCELL dval;
+ DCELL dval;
this->eDataType = GDT_Float64;
- G_set_d_null_value ( &dval, 1);
- dfNoData = (double) dval;
- nativeNulls = true;
+ G_set_d_null_value ( &dval, 1);
+ dfNoData = (double) dval;
+ nativeNulls = true;
}
- nBlockXSize = poDS->nRasterXSize;;
+ nBlockXSize = poDSIn->nRasterXSize;
nBlockYSize = 1;
- G_set_window( &(((GRASSDataset *)poDS)->sCellInfo) );
+ G_set_window( &(poDSIn->sCellInfo) );
if ( (hCell = G_open_cell_old((char *) pszCellName, (char *) pszMapset)) < 0 ) {
- CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
- return;
+ CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
+ return;
}
- G_copy((void *) &sOpenWindow, (void *) &(((GRASSDataset *)poDS)->sCellInfo), sizeof(struct Cell_head));
+ G_copy((void *) &sOpenWindow, (void *) &(poDSIn->sCellInfo), sizeof(struct Cell_head));
/* -------------------------------------------------------------------- */
/* Do we have a color table? */
@@ -311,34 +310,34 @@ GRASSRasterBand::GRASSRasterBand( GRASSDataset *poDS, int nBand,
poCT = NULL;
if( G_read_colors( (char *) pszCellName, (char *) pszMapset, &sGrassColors ) == 1 )
{
- int maxcolor;
- CELL min, max;
+ int maxcolor;
+ CELL min, max;
- G_get_color_range ( &min, &max, &sGrassColors);
+ G_get_color_range ( &min, &max, &sGrassColors);
if ( bHaveMinMax ) {
- if ( max < dfCellMax ) {
- maxcolor = max;
+ if ( max < dfCellMax ) {
+ maxcolor = max;
} else {
- maxcolor = (int) ceil ( dfCellMax );
- }
- if ( maxcolor > GRASS_MAX_COLORS ) {
- maxcolor = GRASS_MAX_COLORS;
+ maxcolor = (int) ceil ( dfCellMax );
+ }
+ if ( maxcolor > GRASS_MAX_COLORS ) {
+ maxcolor = GRASS_MAX_COLORS;
CPLDebug( "GRASS", "Too many values, color table cut to %d entries.", maxcolor );
- }
- } else {
- if ( max < GRASS_MAX_COLORS ) {
- maxcolor = max;
+ }
+ } else {
+ if ( max < GRASS_MAX_COLORS ) {
+ maxcolor = max;
} else {
- maxcolor = GRASS_MAX_COLORS;
+ maxcolor = GRASS_MAX_COLORS;
CPLDebug( "GRASS", "Too many values, color table set to %d entries.", maxcolor );
- }
+ }
}
poCT = new GDALColorTable();
for( int iColor = 0; iColor <= maxcolor; iColor++ )
{
- int nRed, nGreen, nBlue;
+ int nRed, nGreen, nBlue;
GDALColorEntry sColor;
#if GRASS_VERSION_MAJOR >= 7
@@ -424,33 +423,32 @@ CPLErr GRASSRasterBand::ResetReading ( struct Cell_head *sNewWindow )
/* Check if the window has changed */
if ( sNewWindow->north != sOpenWindow.north || sNewWindow->south != sOpenWindow.south ||
- sNewWindow->east != sOpenWindow.east || sNewWindow->west != sOpenWindow.west ||
- sNewWindow->ew_res != sOpenWindow.ew_res || sNewWindow->ns_res != sOpenWindow.ns_res ||
- sNewWindow->rows != sOpenWindow.rows || sNewWindow->cols != sOpenWindow.cols )
+ sNewWindow->east != sOpenWindow.east || sNewWindow->west != sOpenWindow.west ||
+ sNewWindow->ew_res != sOpenWindow.ew_res || sNewWindow->ns_res != sOpenWindow.ns_res ||
+ sNewWindow->rows != sOpenWindow.rows || sNewWindow->cols != sOpenWindow.cols )
{
- if( hCell >= 0 ) {
+ if( hCell >= 0 ) {
G_close_cell( hCell );
- hCell = -1;
- }
+ hCell = -1;
+ }
- /* Set window */
- G_set_window( sNewWindow );
+ /* Set window */
+ G_set_window( sNewWindow );
- /* Open raster */
- G__setenv( "GISDBASE", ((GRASSDataset *)poDS)->pszGisdbase );
- G__setenv( "LOCATION_NAME", ((GRASSDataset *)poDS)->pszLocation );
- G__setenv( "MAPSET", pszMapset);
- G_reset_mapsets();
- G_add_mapset_to_search_path ( pszMapset );
+ /* Open raster */
+ G__setenv( "GISDBASE", ((GRASSDataset *)poDS)->pszGisdbase );
+ G__setenv( "LOCATION_NAME", ((GRASSDataset *)poDS)->pszLocation );
+ G__setenv( "MAPSET", pszMapset);
+ G_reset_mapsets();
+ G_add_mapset_to_search_path ( pszMapset );
- if ( (hCell = G_open_cell_old( pszCellName, pszMapset)) < 0 ) {
- CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
+ if ( (hCell = G_open_cell_old( pszCellName, pszMapset)) < 0 ) {
+ CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster '%s'", pszCellName );
this->valid = false;
- return CE_Failure;
- }
-
- G_copy((void *) &sOpenWindow, (void *) sNewWindow, sizeof(struct Cell_head));
+ return CE_Failure;
+ }
+ G_copy((void *) &sOpenWindow, (void *) sNewWindow, sizeof(struct Cell_head));
}
else
{
@@ -470,7 +468,6 @@ CPLErr GRASSRasterBand::ResetReading ( struct Cell_head *sNewWindow )
}
}
-
return CE_None;
}
@@ -479,7 +476,7 @@ CPLErr GRASSRasterBand::ResetReading ( struct Cell_head *sNewWindow )
/* */
/************************************************************************/
-CPLErr GRASSRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff,
+CPLErr GRASSRasterBand::IReadBlock( int /*nBlockXOff*/, int nBlockYOff,
void *pImage )
{
@@ -491,29 +488,32 @@ CPLErr GRASSRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff,
}
if ( eDataType == GDT_Byte || eDataType == GDT_UInt16 ) {
- CELL *cbuf;
-
- cbuf = G_allocate_c_raster_buf();
- G_get_c_raster_row ( hCell, cbuf, nBlockYOff );
-
- /* Reset NULLs */
- for ( int col = 0; col < nBlockXSize; col++ ) {
- if ( G_is_c_null_value(&(cbuf[col])) )
- cbuf[col] = (CELL) dfNoData;
- }
+ CELL *cbuf = G_allocate_c_raster_buf();
+ G_get_c_raster_row ( hCell, cbuf, nBlockYOff );
- GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL),
- pImage, eDataType, GDALGetDataTypeSize(eDataType)/8,
- nBlockXSize );
+ /* Reset NULLs */
+ for ( int col = 0; col < nBlockXSize; col++ ) {
+ if ( G_is_c_null_value(&(cbuf[col])) )
+ cbuf[col] = (CELL) dfNoData;
+ }
- G_free ( cbuf );
+ GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL),
+ pImage, eDataType, GDALGetDataTypeSize(eDataType)/8,
+ nBlockXSize );
- } else if ( eDataType == GDT_Int32 ) {
- G_get_c_raster_row ( hCell, (CELL *) pImage, nBlockYOff );
- } else if ( eDataType == GDT_Float32 ) {
- G_get_f_raster_row ( hCell, (FCELL *) pImage, nBlockYOff );
- } else if ( eDataType == GDT_Float64 ) {
- G_get_d_raster_row ( hCell, (DCELL *) pImage, nBlockYOff );
+ G_free ( cbuf );
+ }
+ else if ( eDataType == GDT_Int32 )
+ {
+ G_get_c_raster_row ( hCell, (CELL *) pImage, nBlockYOff );
+ }
+ else if ( eDataType == GDT_Float32 )
+ {
+ G_get_f_raster_row ( hCell, (FCELL *) pImage, nBlockYOff );
+ }
+ else if ( eDataType == GDT_Float64 )
+ {
+ G_get_d_raster_row ( hCell, (DCELL *) pImage, nBlockYOff );
}
return CE_None;
@@ -525,12 +525,12 @@ CPLErr GRASSRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff,
/************************************************************************/
CPLErr GRASSRasterBand::IRasterIO ( GDALRWFlag eRWFlag,
- int nXOff, int nYOff, int nXSize, int nYSize,
- void * pData, int nBufXSize, int nBufYSize,
- GDALDataType eBufType,
- GSpacing nPixelSpace,
- GSpacing nLineSpace,
- GDALRasterIOExtraArg* psExtraArg )
+ int nXOff, int nYOff, int nXSize, int nYSize,
+ void * pData, int nBufXSize, int nBufYSize,
+ GDALDataType eBufType,
+ GSpacing nPixelSpace,
+ GSpacing nLineSpace,
+ GDALRasterIOExtraArg* /*psExtraArg*/ )
{
/* GRASS library does that, we have only calculate and reset the region in map units
* and if the region has changed, reopen the raster */
@@ -539,6 +539,7 @@ CPLErr GRASSRasterBand::IRasterIO ( GDALRWFlag eRWFlag,
struct Cell_head sWindow;
struct Cell_head *psDsWindow;
+ if( eRWFlag != GF_Read ) return CE_Failure;
if ( ! this->valid ) return CE_Failure;
psDsWindow = &(((GRASSDataset *)poDS)->sCellInfo);
@@ -569,63 +570,63 @@ CPLErr GRASSRasterBand::IRasterIO ( GDALRWFlag eRWFlag,
/* Reset space if default (0) */
if ( nPixelSpace == 0 )
- nPixelSpace = GDALGetDataTypeSize ( eBufType ) / 8;
+ nPixelSpace = GDALGetDataTypeSize ( eBufType ) / 8;
if ( nLineSpace == 0 )
- nLineSpace = nBufXSize * nPixelSpace;
+ nLineSpace = nBufXSize * nPixelSpace;
if ( nGRSType == CELL_TYPE && ( !nativeNulls || eBufType != GDT_Int32 || sizeof(CELL) != 4 ||
- nPixelSpace != sizeof(CELL) ) )
+ nPixelSpace != sizeof(CELL) ) )
{
- cbuf = G_allocate_c_raster_buf();
+ cbuf = G_allocate_c_raster_buf();
} else if( nGRSType == FCELL_TYPE && ( eBufType != GDT_Float32 || nPixelSpace != sizeof(FCELL) ) ) {
- fbuf = G_allocate_f_raster_buf();
+ fbuf = G_allocate_f_raster_buf();
} else if( nGRSType == DCELL_TYPE && ( eBufType != GDT_Float64 || nPixelSpace != sizeof(DCELL) ) ) {
- dbuf = G_allocate_d_raster_buf();
+ dbuf = G_allocate_d_raster_buf();
} else {
- direct = true;
+ direct = true;
}
for ( int row = 0; row < nBufYSize; row++ ) {
char *pnt = (char *)pData + row * nLineSpace;
- if ( nGRSType == CELL_TYPE ) {
- if ( direct ) {
- G_get_c_raster_row ( hCell, (CELL *) pnt, row );
- } else {
- G_get_c_raster_row ( hCell, cbuf, row );
-
- /* Reset NULLs */
- for ( int col = 0; col < nBufXSize; col++ ) {
- if ( G_is_c_null_value(&(cbuf[col])) )
- cbuf[col] = (CELL) dfNoData;
- }
-
- GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL),
- (void *) pnt, eBufType, nPixelSpace,
- nBufXSize );
- }
- } else if( nGRSType == FCELL_TYPE ) {
- if ( direct ) {
- G_get_f_raster_row ( hCell, (FCELL *) pnt, row );
- } else {
- G_get_f_raster_row ( hCell, fbuf, row );
-
- GDALCopyWords ( (void *) fbuf, GDT_Float32, sizeof(FCELL),
- (void *) pnt, eBufType, nPixelSpace,
- nBufXSize );
- }
- } else if( nGRSType == DCELL_TYPE ) {
- if ( direct ) {
- G_get_d_raster_row ( hCell, (DCELL *) pnt, row );
- } else {
- G_get_d_raster_row ( hCell, dbuf, row );
-
- GDALCopyWords ( (void *) dbuf, GDT_Float64, sizeof(DCELL),
- (void *) pnt, eBufType, nPixelSpace,
- nBufXSize );
- }
- }
+ if ( nGRSType == CELL_TYPE ) {
+ if ( direct ) {
+ G_get_c_raster_row ( hCell, (CELL *) pnt, row );
+ } else {
+ G_get_c_raster_row ( hCell, cbuf, row );
+
+ /* Reset NULLs */
+ for ( int col = 0; col < nBufXSize; col++ ) {
+ if ( G_is_c_null_value(&(cbuf[col])) )
+ cbuf[col] = (CELL) dfNoData;
+ }
+
+ GDALCopyWords ( (void *) cbuf, GDT_Int32, sizeof(CELL),
+ (void *) pnt, eBufType, nPixelSpace,
+ nBufXSize );
+ }
+ } else if( nGRSType == FCELL_TYPE ) {
+ if ( direct ) {
+ G_get_f_raster_row ( hCell, (FCELL *) pnt, row );
+ } else {
+ G_get_f_raster_row ( hCell, fbuf, row );
+
+ GDALCopyWords ( (void *) fbuf, GDT_Float32, sizeof(FCELL),
+ (void *) pnt, eBufType, nPixelSpace,
+ nBufXSize );
+ }
+ } else if( nGRSType == DCELL_TYPE ) {
+ if ( direct ) {
+ G_get_d_raster_row ( hCell, (DCELL *) pnt, row );
+ } else {
+ G_get_d_raster_row ( hCell, dbuf, row );
+
+ GDALCopyWords ( (void *) dbuf, GDT_Float64, sizeof(DCELL),
+ (void *) pnt, eBufType, nPixelSpace,
+ nBufXSize );
+ }
+ }
}
if ( cbuf ) G_free ( cbuf );
@@ -719,7 +720,6 @@ double GRASSRasterBand::GetNoDataValue( int *pbSuccess )
/* ==================================================================== */
/************************************************************************/
-
/************************************************************************/
/* GRASSDataset() */
/************************************************************************/
@@ -734,6 +734,9 @@ GRASSDataset::GRASSDataset()
adfGeoTransform[3] = 0.0;
adfGeoTransform[4] = 0.0;
adfGeoTransform[5] = 1.0;
+ pszGisdbase = NULL;
+ pszLocation = NULL;
+ pszElement = NULL;
}
/************************************************************************/
@@ -744,13 +747,13 @@ GRASSDataset::~GRASSDataset()
{
if ( pszGisdbase )
- G_free ( pszGisdbase );
+ G_free ( pszGisdbase );
if ( pszLocation )
G_free ( pszLocation );
if ( pszElement )
- G_free ( pszElement );
+ G_free ( pszElement );
G_free( pszProjection );
}
@@ -788,31 +791,37 @@ CPLErr GRASSDataset::GetGeoTransform( double * padfGeoTransform )
/* false - failed */
/************************************************************************/
bool GRASSDataset::SplitPath( char *path, char **gisdbase, char **location,
- char **mapset, char **element, char **name )
+ char **mapset, char **element, char **name )
{
- char *p, *ptr[5], *tmp;
- int i = 0;
+ char *p;
+ char *ptr[5];
+ char *tmp;
+ int i = 0;
- *gisdbase = *location = *mapset = *element = *name = NULL;
+ *gisdbase = NULL;
+ *location = NULL;
+ *mapset = NULL;
+ *element = NULL;
+ *name = NULL;
if ( !path || strlen(path) == 0 )
- return false;
+ return false;
tmp = G_store ( path );
while ( (p = strrchr(tmp,'/')) != NULL && i < 4 ) {
- *p = '\0';
+ *p = '\0';
- if ( strlen(p+1) == 0 ) /* repeated '/' */
- continue;
+ if ( strlen(p+1) == 0 ) /* repeated '/' */
+ continue;
- ptr[i++] = p+1;
+ ptr[i++] = p+1;
}
/* Note: empty GISDBASE == 0 is not accepted (relative path) */
if ( i != 4 ) {
G_free ( tmp );
- return false;
+ return false;
}
*gisdbase = G_store ( tmp );
@@ -838,8 +847,8 @@ typedef int (*GrassErrorHandler)(char *, int);
GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
{
- char *pszGisdb = NULL, *pszLoc = NULL;
- char *pszMapset = NULL, *pszElem = NULL, *pszName = NULL;
+ char *pszGisdb = NULL, *pszLoc = NULL;
+ char *pszMapset = NULL, *pszElem = NULL, *pszName = NULL;
char **papszCells = NULL;
char **papszMapsets = NULL;
@@ -862,7 +871,6 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
// Set error function
G_set_error_routine ( (GrassErrorHandler) Grass2CPLErrorHook );
-
// GISBASE is path to the directory where GRASS is installed,
if ( !getenv( "GISBASE" ) ) {
static char* gisbaseEnv = NULL;
@@ -880,19 +888,19 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
if ( !SplitPath( poOpenInfo->pszFilename, &pszGisdb, &pszLoc, &pszMapset,
&pszElem, &pszName) ) {
- return NULL;
+ return NULL;
}
/* -------------------------------------------------------------------- */
/* Check element name */
/* -------------------------------------------------------------------- */
if ( strcmp(pszElem,"cellhd") != 0 && strcmp(pszElem,"group") != 0 ) {
- G_free(pszGisdb);
+ G_free(pszGisdb);
G_free(pszLoc);
G_free(pszMapset);
G_free(pszElem);
G_free(pszName);
- return NULL;
+ return NULL;
}
/* -------------------------------------------------------------------- */
@@ -911,12 +919,12 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
if ( strcmp(pszElem,"cellhd") == 0 ) {
if ( G_find_file2("cell", pszName, pszMapset) == NULL ) {
- G_free(pszGisdb); G_free(pszLoc); G_free(pszMapset); G_free(pszElem); G_free(pszName);
- return NULL;
- }
+ G_free(pszGisdb); G_free(pszLoc); G_free(pszMapset); G_free(pszElem); G_free(pszName);
+ return NULL;
+ }
- papszMapsets = CSLAddString( papszMapsets, pszMapset );
- papszCells = CSLAddString( papszCells, pszName );
+ papszMapsets = CSLAddString( papszMapsets, pszMapset );
+ papszCells = CSLAddString( papszCells, pszName );
}
/* -------------------------------------------------------------------- */
/* Check if this is a valid GRASS imagery group. */
@@ -926,12 +934,12 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
I_init_group_ref( &ref );
if ( I_get_group_ref( pszName, &ref ) == 0 ) {
- G_free(pszGisdb); G_free(pszLoc); G_free(pszMapset); G_free(pszElem); G_free(pszName);
- return NULL;
- }
+ G_free(pszGisdb); G_free(pszLoc); G_free(pszMapset); G_free(pszElem); G_free(pszName);
+ return NULL;
+ }
for( int iRef = 0; iRef < ref.nfiles; iRef++ )
- {
+ {
papszCells = CSLAddString( papszCells, ref.file[iRef].name );
papszMapsets = CSLAddString( papszMapsets, ref.file[iRef].mapset );
G_add_mapset_to_search_path ( ref.file[iRef].mapset );
@@ -946,9 +954,7 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
/* -------------------------------------------------------------------- */
/* Create a corresponding GDALDataset. */
/* -------------------------------------------------------------------- */
- GRASSDataset *poDS;
-
- poDS = new GRASSDataset();
+ GRASSDataset*poDS = new GRASSDataset();
/* notdef: should only allow read access to an existing cell, right? */
poDS->eAccess = poOpenInfo->eAccess;
@@ -997,14 +1003,14 @@ GDALDataset *GRASSDataset::Open( GDALOpenInfo * poOpenInfo )
/* -------------------------------------------------------------------- */
for( int iBand = 0; papszCells[iBand] != NULL; iBand++ )
{
- GRASSRasterBand *rb = new GRASSRasterBand( poDS, iBand+1, papszMapsets[iBand],
+ GRASSRasterBand *rb = new GRASSRasterBand( poDS, iBand+1, papszMapsets[iBand],
papszCells[iBand] );
- if ( !rb->valid ) {
- CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster band %d", iBand);
- delete rb;
- delete poDS;
- return NULL;
+ if ( !rb->valid ) {
+ CPLError( CE_Warning, CPLE_AppDefined, "GRASS: Cannot open raster band %d", iBand);
+ delete rb;
+ delete poDS;
+ return NULL;
}
poDS->SetBand( iBand+1, rb );
diff --git a/ogrgrass.h b/ogrgrass.h
index 3cda766..b98e358 100644
--- a/ogrgrass.h
+++ b/ogrgrass.h
@@ -1,5 +1,5 @@
/******************************************************************************
- * $Id: ogrgrass.h 33713 2016-03-12 17:41:57Z goatbar $
+ * $Id: ogrgrass.h 36501 2016-11-25 14:09:24Z rouault $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Private definitions for OGR/GRASS driver.
@@ -50,81 +50,76 @@ extern "C" {
class OGRGRASSLayer : public OGRLayer
{
public:
- OGRGRASSLayer( int layer, struct Map_info * map );
- ~OGRGRASSLayer();
+ OGRGRASSLayer( int layer, struct Map_info * map );
+ virtual ~OGRGRASSLayer();
// Layer info
- OGRFeatureDefn * GetLayerDefn() { return poFeatureDefn; }
- GIntBig GetFeatureCount( int );
- OGRErr GetExtent(OGREnvelope *psExtent, int bForce);
- virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce)
+ OGRFeatureDefn * GetLayerDefn() override { return poFeatureDefn; }
+ GIntBig GetFeatureCount( int ) override;
+ OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
+ virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, int bForce) override
{ return OGRLayer::GetExtent(iGeomField, psExtent, bForce); }
- virtual OGRSpatialReference *GetSpatialRef();
- int TestCapability( const char * );
+ virtual OGRSpatialReference *GetSpatialRef() override;
+ int TestCapability( const char * ) override;
// Reading
- void ResetReading();
- virtual OGRErr SetNextByIndex( GIntBig nIndex );
- OGRFeature * GetNextFeature();
- OGRFeature *GetFeature( GIntBig nFeatureId );
+ void ResetReading() override;
+ virtual OGRErr SetNextByIndex( GIntBig nIndex ) override;
+ OGRFeature * GetNextFeature() override;
+ OGRFeature *GetFeature( GIntBig nFeatureId ) override;
// Filters
- virtual OGRErr SetAttributeFilter( const char *query );
- virtual void SetSpatialFilter( OGRGeometry * poGeomIn );
- virtual void SetSpatialFilter( int iGeomField, OGRGeometry *poGeom )
+ virtual OGRErr SetAttributeFilter( const char *query ) override;
+ virtual void SetSpatialFilter( OGRGeometry * poGeomIn ) override;
+ virtual void SetSpatialFilter( int iGeomField, OGRGeometry *poGeom ) override
{ OGRLayer::SetSpatialFilter(iGeomField, poGeom); }
- // Write access, not supported:
- virtual OGRErr CreateField( OGRFieldDefn *poField, int bApproxOK = TRUE );
- OGRErr ISetFeature( OGRFeature *poFeature );
- OGRErr ICreateFeature( OGRFeature *poFeature );
-
private:
- char *pszName;
+ char *pszName;
OGRSpatialReference *poSRS;
- OGRFeatureDefn *poFeatureDefn;
- char *pszQuery; // Attribute filter string
+ OGRFeatureDefn *poFeatureDefn;
+ char *pszQuery; // Attribute filter string
- int iNextId;
- int nTotalCount;
- int iLayer; // Layer number
- int iLayerIndex; // Layer index (in GRASS category index)
- int iCatField; // Field where category (key) is stored
- int nFields;
- int *paFeatureIndex; // Array of indexes to category index array
+ int iNextId;
+ int nTotalCount;
+ int iLayer; // Layer number
+ int iLayerIndex; // Layer index (in GRASS category index)
+ int iCatField; // Field where category (key) is stored
+ int nFields;
+ int *paFeatureIndex; // Array of indexes to category index array
// Vector map
- struct Map_info *poMap;
+ struct Map_info *poMap;
struct field_info *poLink;
// Database connection
- bool bHaveAttributes;
+ bool bHaveAttributes;
- dbString *poDbString;
- dbDriver *poDriver;
- dbCursor *poCursor;
+ dbString *poDbString;
+ dbDriver *poDriver;
+ dbCursor *poCursor;
- bool bCursorOpened; // Sequential database cursor opened
- int iCurrentCat; // Current category in select cursor
+ bool bCursorOpened; // Sequential database cursor opened
+ int iCurrentCat; // Current category in select cursor
- struct line_pnts *poPoints;
- struct line_cats *poCats;
+ struct line_pnts *poPoints;
+ struct line_cats *poCats;
- bool StartDbDriver ();
- bool StopDbDriver ();
+ bool StartDbDriver ();
+ bool StopDbDriver ();
- OGRGeometry *GetFeatureGeometry ( long nFeatureId, int *cat );
- bool SetAttributes ( OGRFeature *feature, dbTable *table );
+ OGRGeometry *GetFeatureGeometry ( long nFeatureId, int *cat );
+ bool SetAttributes ( OGRFeature *feature, dbTable *table );
// Features matching spatial filter for ALL features/elements in GRASS
- char *paSpatialMatch;
- bool SetSpatialMatch();
+ char *paSpatialMatch;
+ bool SetSpatialMatch();
// Features matching attribute filter for ALL features/elements in GRASS
- char *paQueryMatch;
- bool OpenSequentialCursor();
- bool ResetSequentialCursor();
- bool SetQueryMatch();
+ char *paQueryMatch;
+ bool OpenSequentialCursor();
+ bool ResetSequentialCursor();
+ bool SetQueryMatch();
};
/************************************************************************/
@@ -134,33 +129,26 @@ class OGRGRASSDataSource : public OGRDataSource
{
public:
OGRGRASSDataSource();
- ~OGRGRASSDataSource();
+ virtual ~OGRGRASSDataSource();
int Open( const char *, int bUpdate, int bTestOpen,
int bSingleNewFile = FALSE );
- const char *GetName() { return pszName; }
- int GetLayerCount() { return nLayers; }
- OGRLayer *GetLayer( int );
-
- int TestCapability( const char * );
-
- // Not implemented (returns NULL):
- virtual OGRLayer *ICreateLayer( const char *,
- OGRSpatialReference * = NULL,
- OGRwkbGeometryType = wkbUnknown,
- char ** = NULL );
+ const char *GetName() override { return pszName; }
+ int GetLayerCount() override { return nLayers; }
+ OGRLayer *GetLayer( int ) override;
+ int TestCapability( const char * ) override;
private:
OGRGRASSLayer **papoLayers;
- char *pszName; // Date source name
- char *pszGisdbase; // GISBASE
- char *pszLocation; // location name
- char *pszMapset; // mapset name
- char *pszMap; // name of vector map
+ char *pszName; // Date source name
+ char *pszGisdbase; // GISBASE
+ char *pszLocation; // location name
+ char *pszMapset; // mapset name
+ char *pszMap; // name of vector map
- struct Map_info map;
+ struct Map_info map;
int nLayers;
int bOpened;
@@ -174,17 +162,12 @@ class OGRGRASSDataSource : public OGRDataSource
class OGRGRASSDriver : public OGRSFDriver
{
public:
- ~OGRGRASSDriver();
-
- const char *GetName();
- OGRDataSource *Open( const char *, int );
+ virtual ~OGRGRASSDriver();
- int TestCapability( const char * );
+ const char *GetName() override;
+ OGRDataSource *Open( const char *, int ) override;
- // Not implemented (return error/NULL):
- virtual OGRDataSource *CreateDataSource( const char *pszName,
- char ** = NULL );
- OGRErr DeleteDataSource( const char *pszDataSource );
+ int TestCapability( const char * ) override;
};
#endif /* ndef OGRGRASS_H_INCLUDED */
diff --git a/ogrgrassdatasource.cpp b/ogrgrassdatasource.cpp
index e454f0a..df184b9 100644
--- a/ogrgrassdatasource.cpp
+++ b/ogrgrassdatasource.cpp
@@ -1,5 +1,4 @@
/******************************************************************************
- * $Id: ogrgrassdatasource.cpp 33713 2016-03-12 17:41:57Z goatbar $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Implements OGRGRASSDataSource class.
@@ -32,7 +31,7 @@
#include "cpl_conv.h"
#include "cpl_string.h"
-CPL_CVSID("$Id: ogrgrassdatasource.cpp 33713 2016-03-12 17:41:57Z goatbar $");
+CPL_CVSID("$Id: ogrgrassdatasource.cpp 36368 2016-11-21 01:47:49Z rouault $");
#if GRASS_VERSION_MAJOR >= 7
#define G__setenv G_setenv_nogisrc
@@ -41,7 +40,7 @@ CPL_CVSID("$Id: ogrgrassdatasource.cpp 33713 2016-03-12 17:41:57Z goatbar $");
/************************************************************************/
/* Grass2CPLErrorHook() */
/************************************************************************/
-int Grass2OGRErrorHook( char * pszMessage, int bFatal )
+static int Grass2OGRErrorHook( char * pszMessage, int bFatal )
{
if( !bFatal )
CPLError( CE_Warning, CPLE_AppDefined, "GRASS warning: %s", pszMessage );
@@ -95,8 +94,8 @@ typedef int (*GrassErrorHandler)(const char *, int);
typedef int (*GrassErrorHandler)(char *, int);
#endif
-int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
- int bTestOpen, int bSingleNewFileIn )
+int OGRGRASSDataSource::Open( const char * pszNewName, int /*bUpdate*/,
+ int bTestOpen, int /*bSingleNewFileIn*/ )
{
VSIStatBuf stat;
@@ -110,11 +109,11 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
if ( strstr(pszName,"vector") == NULL || strstr(pszName,"head") == NULL )
{
if( !bTestOpen )
- {
+ {
CPLError( CE_Failure, CPLE_AppDefined,
"%s is not GRASS vector, access failed.\n", pszName );
- }
- return FALSE;
+ }
+ return FALSE;
}
/* -------------------------------------------------------------------- */
@@ -123,10 +122,10 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
if( CPLStat( pszName, &stat ) != 0 || !VSI_ISREG(stat.st_mode) )
{
if( !bTestOpen )
- {
+ {
CPLError( CE_Failure, CPLE_AppDefined,
"%s is not GRASS vector, access failed.\n", pszName );
- }
+ }
return FALSE;
}
@@ -135,15 +134,15 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
/* Parse datasource name */
/* -------------------------------------------------------------------- */
if ( !SplitPath(pszName, &pszGisdbase, &pszLocation,
- &pszMapset, &pszMap) )
+ &pszMapset, &pszMap) )
{
if( !bTestOpen )
- {
+ {
CPLError( CE_Failure, CPLE_AppDefined,
"%s is not GRASS datasource name, access failed.\n",
- pszName );
- }
- return FALSE;
+ pszName );
+ }
+ return FALSE;
}
CPLDebug ( "GRASS", "Gisdbase: %s", pszGisdbase );
@@ -202,7 +201,7 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
if ( level < 2 ) {
CPLError( CE_Failure, CPLE_AppDefined,
"Cannot open GRASS vector %s on level 2.\n", pszName );
- return FALSE;
+ return FALSE;
}
CPLDebug ( "GRASS", "Num lines = %d", Vect_get_num_lines(&map) );
@@ -214,15 +213,13 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
CPLDebug ( "GRASS", "Num layers = %d", ncidx );
for ( int i = 0; i < ncidx; i++ ) {
- // Create the layer object
- OGRGRASSLayer *poLayer;
-
- poLayer = new OGRGRASSLayer( i, &map );
+ // Create the layer object
+ OGRGRASSLayer *poLayer = new OGRGRASSLayer( i, &map );
// Add layer to data source layer list
- papoLayers = (OGRGRASSLayer **)
- CPLRealloc( papoLayers, sizeof(OGRGRASSLayer *) * (nLayers+1) );
- papoLayers[nLayers++] = poLayer;
+ papoLayers = (OGRGRASSLayer **)
+ CPLRealloc( papoLayers, sizeof(OGRGRASSLayer *) * (nLayers+1) );
+ papoLayers[nLayers++] = poLayer;
}
bOpened = TRUE;
@@ -231,25 +228,9 @@ int OGRGRASSDataSource::Open( const char * pszNewName, int bUpdate,
}
/************************************************************************/
-/* ICreateLayer() */
-/************************************************************************/
-OGRLayer *
-OGRGRASSDataSource::ICreateLayer( const char * pszLayerName,
- OGRSpatialReference *poSRS,
- OGRwkbGeometryType eType,
- char ** papszOptions )
-
-{
- CPLError( CE_Failure, CPLE_NoWriteAccess,
- "CreateLayer is not supported by GRASS driver" );
-
- return NULL;
-}
-
-/************************************************************************/
/* TestCapability() */
/************************************************************************/
-int OGRGRASSDataSource::TestCapability( const char * pszCap )
+int OGRGRASSDataSource::TestCapability( const char * /* pszCap*/ )
{
return FALSE;
}
@@ -275,7 +256,7 @@ OGRLayer *OGRGRASSDataSource::GetLayer( int iLayer )
/* false - failed */
/************************************************************************/
bool OGRGRASSDataSource::SplitPath( char *path, char **gisdbase,
- char **location, char **mapset, char **map )
+ char **location, char **mapset, char **map )
{
char *p, *ptr[5], *tmp;
int i = 0;
@@ -285,23 +266,23 @@ bool OGRGRASSDataSource::SplitPath( char *path, char **gisdbase,
*gisdbase = *location = *mapset = *map = NULL;
if ( !path || strlen(path) == 0 )
- return false;
+ return false;
tmp = G_store ( path );
while ( (p = strrchr(tmp,'/')) != NULL && i < 5 ) {
- *p = '\0';
+ *p = '\0';
- if ( strlen(p+1) == 0 ) /* repeated '/' */
- continue;
+ if ( strlen(p+1) == 0 ) /* repeated '/' */
+ continue;
- ptr[i++] = p+1;
+ ptr[i++] = p+1;
}
/* Note: empty GISDBASE == 0 is not accepted (relative path) */
if ( i != 5 ) {
free ( tmp );
- return false;
+ return false;
}
if ( strcmp(ptr[0],"head") != 0 || strcmp(ptr[2],"vector") != 0 ) {
diff --git a/ogrgrassdriver.cpp b/ogrgrassdriver.cpp
index f1a9521..c09d45d 100644
--- a/ogrgrassdriver.cpp
+++ b/ogrgrassdriver.cpp
@@ -1,5 +1,4 @@
/******************************************************************************
- * $Id: ogrgrassdriver.cpp 32110 2015-12-10 17:19:40Z goatbar $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Implements OGRGRASSDriver class.
@@ -31,7 +30,7 @@
#include "cpl_conv.h"
#include "cpl_string.h"
-CPL_CVSID("$Id: ogrgrassdriver.cpp 32110 2015-12-10 17:19:40Z goatbar $");
+CPL_CVSID("$Id: ogrgrassdriver.cpp 36368 2016-11-21 01:47:49Z rouault $");
/************************************************************************/
/* ~OGRGRASSDriver() */
@@ -54,9 +53,7 @@ const char *OGRGRASSDriver::GetName()
OGRDataSource *OGRGRASSDriver::Open( const char * pszFilename,
int bUpdate )
{
- OGRGRASSDataSource *poDS;
-
- poDS = new OGRGRASSDataSource();
+ OGRGRASSDataSource *poDS = new OGRGRASSDataSource();
if( !poDS->Open( pszFilename, bUpdate, TRUE ) )
{
@@ -70,32 +67,9 @@ OGRDataSource *OGRGRASSDriver::Open( const char * pszFilename,
}
/************************************************************************/
-/* CreateDataSource() */
-/************************************************************************/
-OGRDataSource *OGRGRASSDriver::CreateDataSource( const char * pszName,
- char **papszOptions )
-{
- CPLError( CE_Failure, CPLE_AppDefined,
- "CreateDataSource is not supported by GRASS driver.\n" );
-
- return NULL;
-}
-
-/************************************************************************/
-/* DeleteDataSource() */
-/************************************************************************/
-OGRErr OGRGRASSDriver::DeleteDataSource( const char *pszDataSource )
-{
- CPLError( CE_Failure, CPLE_AppDefined,
- "DeleteDataSource is not supported by GRASS driver" );
-
- return OGRERR_FAILURE;
-}
-
-/************************************************************************/
/* TestCapability() */
/************************************************************************/
-int OGRGRASSDriver::TestCapability( const char * pszCap )
+int OGRGRASSDriver::TestCapability( const char * /*pszCap*/ )
{
return FALSE;
}
@@ -120,4 +94,3 @@ void RegisterOGRGRASS()
OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
-
diff --git a/ogrgrasslayer.cpp b/ogrgrasslayer.cpp
index a2be8ea..ea2030e 100644
--- a/ogrgrasslayer.cpp
+++ b/ogrgrasslayer.cpp
@@ -1,5 +1,4 @@
/******************************************************************************
- * $Id: ogrgrasslayer.cpp 33713 2016-03-12 17:41:57Z goatbar $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Implements OGRGRASSLayer class.
@@ -32,7 +31,7 @@
#include "ogrgrass.h"
#include "cpl_conv.h"
-CPL_CVSID("$Id: ogrgrasslayer.cpp 33713 2016-03-12 17:41:57Z goatbar $");
+CPL_CVSID("$Id: ogrgrasslayer.cpp 36368 2016-11-21 01:47:49Z rouault $");
/************************************************************************/
/* OGRGRASSLayer() */
@@ -50,6 +49,7 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
pszQuery = NULL;
paQueryMatch = NULL;
paSpatialMatch = NULL;
+ iCurrentCat = 0;
iLayer = Vect_cidx_get_field_number ( poMap, iLayerIndex);
CPLDebug ( "GRASS", "iLayer = %d", iLayer );
@@ -59,13 +59,13 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
// Layer name
if ( poLink && poLink->name )
{
- pszName = CPLStrdup( poLink->name );
+ pszName = CPLStrdup( poLink->name );
}
else
{
- char buf[20];
- sprintf ( buf, "%d", iLayer );
- pszName = CPLStrdup( buf );
+ char buf[20];
+ snprintf ( buf, sizeof(buf), "%d", iLayer );
+ pszName = CPLStrdup( buf );
}
// Because we don't represent centroids as any simple feature, we have to scan
@@ -78,12 +78,12 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
int cnt = 0;
for ( int i = 0; i < n; i++ )
{
- int cat,type, id;
+ int cat,type, id;
- Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, i, &cat, &type, &id );
+ Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, i, &cat, &type, &id );
- if ( !( type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
- paFeatureIndex[cnt++] = i;
+ if ( !( type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
+ paFeatureIndex[cnt++] = i;
}
poFeatureDefn = new OGRFeatureDefn( pszName );
@@ -94,10 +94,10 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
int nTypes = Vect_cidx_get_num_types_by_index ( poMap, iLayerIndex );
int types = 0;
for ( int i = 0; i < nTypes; i++ ) {
- int type, count;
- Vect_cidx_get_type_count_by_index ( poMap, iLayerIndex, i, &type, &count);
- if ( !(type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
- types |= type;
+ int type, count;
+ Vect_cidx_get_type_count_by_index ( poMap, iLayerIndex, i, &type, &count);
+ if ( !(type & (GV_POINT|GV_LINES|GV_AREA) ) ) continue;
+ types |= type;
CPLDebug ( "GRASS", "type = %d types = %d", type, types );
}
@@ -131,72 +131,71 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
db_init_string ( poDbString );
if ( poLink )
{
- if ( StartDbDriver() )
- {
- db_set_string ( poDbString, poLink->table );
- dbTable *table;
- if ( db_describe_table ( poDriver, poDbString, &table) == DB_OK )
- {
- nFields = db_get_table_number_of_columns ( table );
- iCatField = -1;
- for ( int i = 0; i < nFields; i++)
- {
- dbColumn *column = db_get_table_column ( table, i );
- int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
-
- OGRFieldType ogrFtype = OFTInteger;
- switch ( ctype ) {
- case DB_C_TYPE_INT:
- ogrFtype = OFTInteger;
- break;
- case DB_C_TYPE_DOUBLE:
- ogrFtype = OFTReal;
- break;
- case DB_C_TYPE_STRING:
- ogrFtype = OFTString;
- break;
- case DB_C_TYPE_DATETIME:
- ogrFtype = OFTDateTime;
- break;
- }
-
- CPLDebug ( "GRASS", "column = %s type = %d",
- db_get_column_name(column), ctype );
-
- OGRFieldDefn oField ( db_get_column_name(column), ogrFtype );
- poFeatureDefn->AddFieldDefn( &oField );
-
- if ( G_strcasecmp(db_get_column_name(column),poLink->key) == 0 )
- {
- iCatField = i;
- }
- }
- if ( iCatField >= 0 )
- {
- bHaveAttributes = true;
- }
- else
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot find key field" );
- db_close_database_shutdown_driver ( poDriver );
- poDriver = NULL;
+ if ( StartDbDriver() )
+ {
+ db_set_string ( poDbString, poLink->table );
+ dbTable *table = NULL;
+ if ( db_describe_table ( poDriver, poDbString, &table) == DB_OK )
+ {
+ nFields = db_get_table_number_of_columns ( table );
+ iCatField = -1;
+ for ( int i = 0; i < nFields; i++)
+ {
+ dbColumn *column = db_get_table_column ( table, i );
+ int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
+
+ OGRFieldType ogrFtype = OFTInteger;
+ switch ( ctype ) {
+ case DB_C_TYPE_INT:
+ ogrFtype = OFTInteger;
+ break;
+ case DB_C_TYPE_DOUBLE:
+ ogrFtype = OFTReal;
+ break;
+ case DB_C_TYPE_STRING:
+ ogrFtype = OFTString;
+ break;
+ case DB_C_TYPE_DATETIME:
+ ogrFtype = OFTDateTime;
+ break;
+ }
+
+ CPLDebug ( "GRASS", "column = %s type = %d",
+ db_get_column_name(column), ctype );
+
+ OGRFieldDefn oField ( db_get_column_name(column), ogrFtype );
+ poFeatureDefn->AddFieldDefn( &oField );
+
+ if ( G_strcasecmp(db_get_column_name(column),poLink->key) == 0 )
+ {
+ iCatField = i;
+ }
+ }
+ if ( iCatField >= 0 )
+ {
+ bHaveAttributes = true;
+ }
+ else
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot find key field" );
+ db_close_database_shutdown_driver ( poDriver );
+ poDriver = NULL;
}
}
- else
+ else
{
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot describe table %s",
- poLink->table );
-
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot describe table %s",
+ poLink->table );
}
- db_close_database_shutdown_driver ( poDriver );
- poDriver = NULL;
+ db_close_database_shutdown_driver ( poDriver );
+ poDriver = NULL;
}
}
if ( !bHaveAttributes && iLayer > 0 ) // Because features in layer 0 have no cats
{
- OGRFieldDefn oField("cat", OFTInteger);
- poFeatureDefn->AddFieldDefn( &oField );
+ OGRFieldDefn oField("cat", OFTInteger);
+ poFeatureDefn->AddFieldDefn( &oField );
}
if ( getenv("GISBASE") ) // We have some projection info in GISBASE
@@ -208,13 +207,13 @@ OGRGRASSLayer::OGRGRASSLayer( int layerIndex, struct Map_info * map )
// where those variables are set
projinfo = G_get_projinfo();
- projunits = G_get_projunits();
+ projunits = G_get_projunits();
- char *srsWkt = GPJ_grass_to_wkt ( projinfo, projunits, 0, 0);
+ char *srsWkt = GPJ_grass_to_wkt ( projinfo, projunits, 0, 0);
if ( srsWkt )
{
- poSRS = new OGRSpatialReference ( srsWkt );
- G_free ( srsWkt );
+ poSRS = new OGRSpatialReference ( srsWkt );
+ G_free ( srsWkt );
}
G_free_key_value(projinfo);
@@ -229,12 +228,12 @@ OGRGRASSLayer::~OGRGRASSLayer()
{
if ( bCursorOpened )
{
- db_close_cursor ( poCursor);
+ db_close_cursor ( poCursor);
}
if ( poDriver )
{
- StopDbDriver();
+ StopDbDriver();
}
if ( pszName ) CPLFree ( pszName );
@@ -271,16 +270,16 @@ bool OGRGRASSLayer::StartDbDriver()
if ( !poLink )
{
- return false;
+ return false;
}
poDriver = db_start_driver_open_database ( poLink->driver, poLink->database );
if ( poDriver == NULL)
{
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot open database %s by driver %s, "
- "check if GISBASE environment variable is set, the driver is available "
- " and the database is accessible.", poLink->driver, poLink->database );
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot open database %s by driver %s, "
+ "check if GISBASE environment variable is set, the driver is available "
+ " and the database is accessible.", poLink->driver, poLink->database );
+ return false;
}
return true;
}
@@ -292,8 +291,8 @@ bool OGRGRASSLayer::StopDbDriver()
{
if ( !poDriver )
{
- CPLError( CE_Failure, CPLE_AppDefined, "Driver is not started" );
- return true; // I think that true is OK here
+ CPLError( CE_Failure, CPLE_AppDefined, "Driver is not started" );
+ return true; // I think that true is OK here
}
// TODO!!!: Because of bug in GRASS library it is impossible
@@ -341,25 +340,25 @@ OGRErr OGRGRASSLayer::SetNextByIndex( GIntBig nIndex )
{
if( m_poFilterGeom != NULL || m_poAttrQuery != NULL )
{
- iNextId = 0;
- int count = 0;
+ iNextId = 0;
+ int count = 0;
- while ( true ) {
- if( iNextId >= nTotalCount ) break;
- if ( count == nIndex ) break;
+ while ( true ) {
+ if( iNextId >= nTotalCount ) break;
+ if ( count == nIndex ) break;
- // Attributes
- if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
- iNextId++;
- continue;
+ // Attributes
+ if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
+ iNextId++;
+ continue;
}
- // Spatial
- if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
- iNextId++;
- continue;
- }
- count++;
+ // Spatial
+ if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
+ iNextId++;
+ continue;
+ }
+ count++;
}
}
@@ -376,16 +375,16 @@ OGRErr OGRGRASSLayer::SetAttributeFilter( const char *query )
CPLDebug ( "GRASS", "SetAttributeFilter: %s", query );
if ( query == NULL ) {
- // Release old if any
- if ( pszQuery ) {
- CPLFree ( pszQuery );
- pszQuery = NULL;
- }
- if ( paQueryMatch ) {
- CPLFree ( paQueryMatch );
- paQueryMatch = NULL;
- }
- return OGRERR_NONE;
+ // Release old if any
+ if ( pszQuery ) {
+ CPLFree ( pszQuery );
+ pszQuery = NULL;
+ }
+ if ( paQueryMatch ) {
+ CPLFree ( paQueryMatch );
+ paQueryMatch = NULL;
+ }
+ return OGRERR_NONE;
}
paQueryMatch = (char *) CPLMalloc ( nTotalCount );
@@ -396,53 +395,53 @@ OGRErr OGRGRASSLayer::SetAttributeFilter( const char *query )
if ( bHaveAttributes ) {
- if ( !poDriver )
- {
- StartDbDriver();
- }
-
- if ( poDriver )
- {
- if ( bCursorOpened )
- {
- db_close_cursor ( poCursor );
- bCursorOpened = false;
- }
- OpenSequentialCursor();
- if ( bCursorOpened )
- {
- SetQueryMatch();
- db_close_cursor ( poCursor );
- bCursorOpened = false;
- }
- else
- {
- CPLFree ( pszQuery );
- pszQuery = NULL;
- return OGRERR_FAILURE;
- }
- db_close_database_shutdown_driver ( poDriver );
- poDriver = NULL;
- }
- else
- {
- CPLFree ( pszQuery );
- pszQuery = NULL;
- return OGRERR_FAILURE;
- }
+ if ( !poDriver )
+ {
+ StartDbDriver();
+ }
+
+ if ( poDriver )
+ {
+ if ( bCursorOpened )
+ {
+ db_close_cursor ( poCursor );
+ bCursorOpened = false;
+ }
+ OpenSequentialCursor();
+ if ( bCursorOpened )
+ {
+ SetQueryMatch();
+ db_close_cursor ( poCursor );
+ bCursorOpened = false;
+ }
+ else
+ {
+ CPLFree ( pszQuery );
+ pszQuery = NULL;
+ return OGRERR_FAILURE;
+ }
+ db_close_database_shutdown_driver ( poDriver );
+ poDriver = NULL;
+ }
+ else
+ {
+ CPLFree ( pszQuery );
+ pszQuery = NULL;
+ return OGRERR_FAILURE;
+ }
}
else
{
- // Use OGR to evaluate category match
- for ( int i = 0; i < nTotalCount; i++ )
- {
- OGRFeature *feature = GetFeature(i);
- CPLDebug ( "GRASS", "i = %d eval = %d", i, m_poAttrQuery->Evaluate ( feature ) );
- if ( m_poAttrQuery->Evaluate ( feature ) )
- {
- paQueryMatch[i] = 1;
- }
- }
+ // Use OGR to evaluate category match
+ for ( int i = 0; i < nTotalCount; i++ )
+ {
+ OGRFeature *feature = GetFeature(i);
+ CPLDebug ( "GRASS", "i = %d eval = %d", i, m_poAttrQuery->Evaluate ( feature ) );
+ if ( m_poAttrQuery->Evaluate ( feature ) )
+ {
+ paQueryMatch[i] = 1;
+ }
+ }
}
return OGRERR_NONE;
@@ -459,8 +458,8 @@ bool OGRGRASSLayer::SetQueryMatch()
// this method is called immediately after OpenSequentialCursor()
if ( !bCursorOpened ) {
- CPLError( CE_Failure, CPLE_AppDefined, "Cursor is not opened.");
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Cursor is not opened.");
+ return false;
}
int more;
@@ -470,58 +469,58 @@ bool OGRGRASSLayer::SetQueryMatch()
int ncats = Vect_cidx_get_num_cats_by_index ( poMap, iLayerIndex );
dbTable *table = db_get_cursor_table ( poCursor );
while ( true ) {
- if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
- return false;
- }
- if ( !more ) break;
-
- dbColumn *column = db_get_table_column ( table, iCatField );
- dbValue *value = db_get_column_value ( column );
- int cat = db_get_value_int ( value );
-
- // NOTE: because of bug in GRASS library it is impossible to use
- // Vect_cidx_find_next
-
- // Go through category index until first record of current category
- // is found or a category > current is found
- int cidxcat, type, id;
- while ( cidx < ncats ) {
- Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx,
- &cidxcat, &type, &id );
-
- if ( cidxcat < cat ) {
- cidx++;
- continue;
- }
- if ( cidxcat > cat ) break; // Not found
-
- // We have the category we want, check type
- if ( !(type & (GV_POINT|GV_LINES|GV_AREA)) )
- {
- cidx++;
- continue;
- }
-
- // Both category and type match -> find feature and set it on
- while ( true ) {
- if ( fidx > nTotalCount || paFeatureIndex[fidx] > cidx ) {
- // should not happen
- break;
- }
-
- if ( paFeatureIndex[fidx] == cidx ) {
- paQueryMatch[fidx] = 1;
- fidx++;
- break;
- }
- fidx++;
- }
- cidx++;
- }
-
- if ( id < 0 ) continue; // not found
+ if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
+ return false;
+ }
+ if ( !more ) break;
+
+ dbColumn *column = db_get_table_column ( table, iCatField );
+ dbValue *value = db_get_column_value ( column );
+ int cat = db_get_value_int ( value );
+
+ // NOTE: because of bug in GRASS library it is impossible to use
+ // Vect_cidx_find_next
+
+ // Go through category index until first record of current category
+ // is found or a category > current is found
+ int cidxcat, type, id;
+ while ( cidx < ncats ) {
+ Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx,
+ &cidxcat, &type, &id );
+
+ if ( cidxcat < cat ) {
+ cidx++;
+ continue;
+ }
+ if ( cidxcat > cat ) break; // Not found
+
+ // We have the category we want, check type
+ if ( !(type & (GV_POINT|GV_LINES|GV_AREA)) )
+ {
+ cidx++;
+ continue;
+ }
+
+ // Both category and type match -> find feature and set it on
+ while ( true ) {
+ if ( fidx > nTotalCount || paFeatureIndex[fidx] > cidx ) {
+ // should not happen
+ break;
+ }
+
+ if ( paFeatureIndex[fidx] == cidx ) {
+ paQueryMatch[fidx] = 1;
+ fidx++;
+ break;
+ }
+ fidx++;
+ }
+ cidx++;
+ }
+
+ if ( id < 0 ) continue; // not found
}
return true;
@@ -536,41 +535,41 @@ bool OGRGRASSLayer::OpenSequentialCursor()
if ( !poDriver )
{
- CPLError( CE_Failure, CPLE_AppDefined, "Driver not opened.");
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Driver not opened.");
+ return false;
}
if ( bCursorOpened )
{
- db_close_cursor ( poCursor );
- bCursorOpened = false;
+ db_close_cursor ( poCursor );
+ bCursorOpened = false;
}
char buf[2000];
- sprintf ( buf, "SELECT * FROM %s ", poLink->table );
+ snprintf ( buf, sizeof(buf), "SELECT * FROM %s ", poLink->table );
db_set_string ( poDbString, buf);
if ( pszQuery ) {
- sprintf ( buf, "WHERE %s ", pszQuery );
- db_append_string ( poDbString, buf);
+ snprintf ( buf, sizeof(buf), "WHERE %s ", pszQuery );
+ db_append_string ( poDbString, buf);
}
- sprintf ( buf, "ORDER BY %s", poLink->key);
+ snprintf ( buf, sizeof(buf), "ORDER BY %s", poLink->key);
db_append_string ( poDbString, buf);
CPLDebug ( "GRASS", "Query: %s", db_get_string(poDbString) );
if ( db_open_select_cursor ( poDriver, poDbString,
- poCursor, DB_SCROLL) == DB_OK )
+ poCursor, DB_SCROLL) == DB_OK )
{
- iCurrentCat = -1;
- bCursorOpened = true;
- CPLDebug ( "GRASS", "num rows = %d", db_get_num_rows ( poCursor ) );
+ iCurrentCat = -1;
+ bCursorOpened = true;
+ CPLDebug ( "GRASS", "num rows = %d", db_get_num_rows ( poCursor ) );
}
else
{
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
+ return false;
}
return true;
}
@@ -585,13 +584,13 @@ bool OGRGRASSLayer::ResetSequentialCursor()
int more;
if( db_fetch ( poCursor, DB_FIRST, &more) != DB_OK )
{
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
+ return false;
}
if( db_fetch ( poCursor, DB_PREVIOUS, &more) != DB_OK )
{
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
- return false;
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot reset cursor.");
+ return false;
}
return true;
}
@@ -606,12 +605,12 @@ void OGRGRASSLayer::SetSpatialFilter( OGRGeometry * poGeomIn )
OGRLayer::SetSpatialFilter ( poGeomIn );
if ( poGeomIn == NULL ) {
- // Release old if any
- if ( paSpatialMatch ) {
- CPLFree ( paSpatialMatch );
- paSpatialMatch = NULL;
- }
- return;
+ // Release old if any
+ if ( paSpatialMatch ) {
+ CPLFree ( paSpatialMatch );
+ paSpatialMatch = NULL;
+ }
+ return;
}
SetSpatialMatch();
@@ -626,51 +625,50 @@ bool OGRGRASSLayer::SetSpatialMatch()
if ( !paSpatialMatch )
{
- paSpatialMatch = (char *) CPLMalloc ( nTotalCount );
+ paSpatialMatch = (char *) CPLMalloc ( nTotalCount );
}
memset ( paSpatialMatch, 0x0, nTotalCount );
- OGRGeometry *geom;
OGRLineString *lstring = new OGRLineString();
lstring->setNumPoints ( 5 );
- geom = lstring;
+ OGRGeometry *geom = lstring;
for ( int i = 0; i < nTotalCount; i++ ) {
- int cidx = paFeatureIndex[i];
+ int cidx = paFeatureIndex[i];
- int cat, type, id;
+ int cat, type, id;
- Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx, &cat, &type, &id );
+ Vect_cidx_get_cat_by_index ( poMap, iLayerIndex, cidx, &cat, &type, &id );
#if GRASS_VERSION_MAJOR >= 7
struct bound_box box;
#else
- BOUND_BOX box;
+ BOUND_BOX box;
#endif
- switch ( type )
- {
- case GV_POINT:
- case GV_LINE:
- case GV_BOUNDARY:
- Vect_get_line_box ( poMap, id, &box );
- break;
-
- case GV_AREA:
- Vect_get_area_box ( poMap, id, &box );
- break;
- }
-
- lstring->setPoint( 0, box.W, box.N, 0. );
- lstring->setPoint( 1, box.W, box.S, 0. );
- lstring->setPoint( 2, box.E, box.S, 0. );
- lstring->setPoint( 3, box.E, box.N, 0. );
- lstring->setPoint( 4, box.W, box.N, 0. );
-
- if ( FilterGeometry(geom) ) {
- CPLDebug ( "GRASS", "Feature %d in filter", i );
- paSpatialMatch[i] = 1;
- }
+ switch ( type )
+ {
+ case GV_POINT:
+ case GV_LINE:
+ case GV_BOUNDARY:
+ Vect_get_line_box ( poMap, id, &box );
+ break;
+
+ case GV_AREA:
+ Vect_get_area_box ( poMap, id, &box );
+ break;
+ }
+
+ lstring->setPoint( 0, box.W, box.N, 0. );
+ lstring->setPoint( 1, box.W, box.S, 0. );
+ lstring->setPoint( 2, box.E, box.S, 0. );
+ lstring->setPoint( 3, box.E, box.N, 0. );
+ lstring->setPoint( 4, box.W, box.N, 0. );
+
+ if ( FilterGeometry(geom) ) {
+ CPLDebug ( "GRASS", "Feature %d in filter", i );
+ paSpatialMatch[i] = 1;
+ }
}
delete lstring;
return true;
@@ -688,36 +686,36 @@ OGRFeature *OGRGRASSLayer::GetNextFeature()
// Get next iNextId
while ( true ) {
- if( iNextId >= nTotalCount ) // No more features
- {
- // Close cursor / driver if opened
- if ( bCursorOpened )
- {
- db_close_cursor ( poCursor);
- bCursorOpened = false;
- }
- if ( poDriver )
- {
- db_close_database_shutdown_driver ( poDriver );
- poDriver = NULL;
- }
-
- return NULL;
- }
-
- // Attributes
- if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
- iNextId++;
- continue;
- }
-
- // Spatial
- if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
- iNextId++;
- continue;
- }
-
- break; // Attributes & spatial filter match
+ if( iNextId >= nTotalCount ) // No more features
+ {
+ // Close cursor / driver if opened
+ if ( bCursorOpened )
+ {
+ db_close_cursor ( poCursor);
+ bCursorOpened = false;
+ }
+ if ( poDriver )
+ {
+ db_close_database_shutdown_driver ( poDriver );
+ poDriver = NULL;
+ }
+
+ return NULL;
+ }
+
+ // Attributes
+ if( pszQuery != NULL && !paQueryMatch[iNextId] ) {
+ iNextId++;
+ continue;
+ }
+
+ // Spatial
+ if( m_poFilterGeom && !paSpatialMatch[iNextId] ) {
+ iNextId++;
+ continue;
+ }
+
+ break; // Attributes & spatial filter match
}
OGRGeometry *poOGR = GetFeatureGeometry ( iNextId, &cat );
@@ -731,51 +729,51 @@ OGRFeature *OGRGRASSLayer::GetNextFeature()
CPLDebug ( "GRASS", "bHaveAttributes = %d", bHaveAttributes );
if ( bHaveAttributes )
{
- if ( !poDriver )
- {
- StartDbDriver();
- }
- if ( poDriver ) {
- if ( !bCursorOpened )
- {
- OpenSequentialCursor();
- }
- if ( bCursorOpened )
- {
- dbTable *table = db_get_cursor_table ( poCursor );
- if ( iCurrentCat < cat )
- {
- while ( true ) {
- int more;
- if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
- {
- CPLError( CE_Failure, CPLE_AppDefined,
- "Cannot fetch attributes.");
- break;
- }
- if ( !more ) break;
-
- dbColumn *column = db_get_table_column ( table, iCatField );
- dbValue *value = db_get_column_value ( column );
- iCurrentCat = db_get_value_int ( value );
-
- if ( iCurrentCat >= cat ) break;
- }
- }
- if ( cat == iCurrentCat )
- {
- SetAttributes ( poFeature, table );
- }
- else
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
- }
- }
- }
+ if ( !poDriver )
+ {
+ StartDbDriver();
+ }
+ if ( poDriver ) {
+ if ( !bCursorOpened )
+ {
+ OpenSequentialCursor();
+ }
+ if ( bCursorOpened )
+ {
+ dbTable *table = db_get_cursor_table ( poCursor );
+ if ( iCurrentCat < cat )
+ {
+ while ( true ) {
+ int more;
+ if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
+ {
+ CPLError( CE_Failure, CPLE_AppDefined,
+ "Cannot fetch attributes.");
+ break;
+ }
+ if ( !more ) break;
+
+ dbColumn *column = db_get_table_column ( table, iCatField );
+ dbValue *value = db_get_column_value ( column );
+ iCurrentCat = db_get_value_int ( value );
+
+ if ( iCurrentCat >= cat ) break;
+ }
+ }
+ if ( cat == iCurrentCat )
+ {
+ SetAttributes ( poFeature, table );
+ }
+ else
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
+ }
+ }
+ }
}
else if ( iLayer > 0 ) // Add category
{
- poFeature->SetField( 0, cat );
+ poFeature->SetField( 0, cat );
}
m_nFeaturesRead++;
@@ -787,7 +785,8 @@ OGRFeature *OGRGRASSLayer::GetNextFeature()
OGRFeature *OGRGRASSLayer::GetFeature( GIntBig nFeatureId )
{
- CPLDebug ( "GRASS", "OGRGRASSLayer::GetFeature nFeatureId = %ld", nFeatureId );
+ CPLDebug ( "GRASS", "OGRGRASSLayer::GetFeature nFeatureId = " CPL_FRMT_GIB,
+ nFeatureId );
int cat;
OGRFeature *poFeature = NULL;
@@ -801,57 +800,57 @@ OGRFeature *OGRGRASSLayer::GetFeature( GIntBig nFeatureId )
// Get attributes
if ( bHaveAttributes && !poDriver )
{
- StartDbDriver();
+ StartDbDriver();
}
if ( poDriver )
{
- if ( bCursorOpened )
- {
- db_close_cursor ( poCursor);
- bCursorOpened = false;
- }
- CPLDebug ( "GRASS", "Open cursor for key = %d", cat );
- char buf[2000];
- sprintf ( buf, "SELECT * FROM %s WHERE %s = %d",
- poLink->table, poLink->key, cat );
- db_set_string ( poDbString, buf);
- if ( db_open_select_cursor ( poDriver, poDbString,
- poCursor, DB_SEQUENTIAL) == DB_OK )
- {
- iCurrentCat = cat; // Not important
- bCursorOpened = true;
- }
- else
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
- }
-
- if ( bCursorOpened )
- {
- int more;
- if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
- }
- else
- {
- if ( !more )
- {
- CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
- }
- else
- {
- dbTable *table = db_get_cursor_table ( poCursor );
- SetAttributes ( poFeature, table );
- }
- }
- db_close_cursor ( poCursor);
- bCursorOpened = false;
- }
+ if ( bCursorOpened )
+ {
+ db_close_cursor ( poCursor);
+ bCursorOpened = false;
+ }
+ CPLDebug ( "GRASS", "Open cursor for key = %d", cat );
+ char buf[2000];
+ snprintf ( buf, sizeof(buf), "SELECT * FROM %s WHERE %s = %d",
+ poLink->table, poLink->key, cat );
+ db_set_string ( poDbString, buf);
+ if ( db_open_select_cursor ( poDriver, poDbString,
+ poCursor, DB_SEQUENTIAL) == DB_OK )
+ {
+ iCurrentCat = cat; // Not important
+ bCursorOpened = true;
+ }
+ else
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot open cursor.");
+ }
+
+ if ( bCursorOpened )
+ {
+ int more;
+ if( db_fetch ( poCursor, DB_NEXT, &more) != DB_OK )
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Cannot fetch attributes.");
+ }
+ else
+ {
+ if ( !more )
+ {
+ CPLError( CE_Failure, CPLE_AppDefined, "Attributes not found.");
+ }
+ else
+ {
+ dbTable *table = db_get_cursor_table ( poCursor );
+ SetAttributes ( poFeature, table );
+ }
+ }
+ db_close_cursor ( poCursor);
+ bCursorOpened = false;
+ }
}
else if ( iLayer > 0 ) // Add category
{
- poFeature->SetField( 0, cat );
+ poFeature->SetField( 0, cat );
}
m_nFeaturesRead++;
@@ -876,9 +875,9 @@ OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
int bIs3D = Vect_is_3d(poMap);
switch ( type ) {
- case GV_POINT:
+ case GV_POINT:
{
- Vect_read_line ( poMap, poPoints, poCats, id);
+ Vect_read_line ( poMap, poPoints, poCats, id);
if (bIs3D)
poOGR = new OGRPoint( poPoints->x[0], poPoints->y[0], poPoints->z[0] );
else
@@ -886,11 +885,11 @@ OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
}
break;
- case GV_LINE:
- case GV_BOUNDARY:
+ case GV_LINE:
+ case GV_BOUNDARY:
{
- Vect_read_line ( poMap, poPoints, poCats, id);
- OGRLineString *poOGRLine = new OGRLineString();
+ Vect_read_line ( poMap, poPoints, poCats, id);
+ OGRLineString *poOGRLine = new OGRLineString();
if (bIs3D)
poOGRLine->setPoints( poPoints->n_points,
poPoints->x, poPoints->y, poPoints->z );
@@ -902,15 +901,13 @@ OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
}
break;
- case GV_AREA:
+ case GV_AREA:
{
- Vect_get_area_points ( poMap, id, poPoints );
+ Vect_get_area_points ( poMap, id, poPoints );
- OGRPolygon *poOGRPoly;
- poOGRPoly = new OGRPolygon();
+ OGRPolygon *poOGRPoly = new OGRPolygon();
- OGRLinearRing *poRing;
- poRing = new OGRLinearRing();
+ OGRLinearRing *poRing = new OGRLinearRing();
if (bIs3D)
poRing->setPoints( poPoints->n_points,
poPoints->x, poPoints->y, poPoints->z );
@@ -918,15 +915,15 @@ OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
poRing->setPoints( poPoints->n_points,
poPoints->x, poPoints->y );
- poOGRPoly->addRingDirectly( poRing );
+ poOGRPoly->addRingDirectly( poRing );
- // Islands
- int nisles = Vect_get_area_num_isles ( poMap, id );
- for ( int i = 0; i < nisles; i++ ) {
- int isle = Vect_get_area_isle ( poMap, id, i );
- Vect_get_isle_points ( poMap, isle, poPoints );
+ // Islands
+ int nisles = Vect_get_area_num_isles ( poMap, id );
+ for ( int i = 0; i < nisles; i++ ) {
+ int isle = Vect_get_area_isle ( poMap, id, i );
+ Vect_get_isle_points ( poMap, isle, poPoints );
- poRing = new OGRLinearRing();
+ poRing = new OGRLinearRing();
if (bIs3D)
poRing->setPoints( poPoints->n_points,
poPoints->x, poPoints->y, poPoints->z );
@@ -934,17 +931,17 @@ OGRGeometry *OGRGRASSLayer::GetFeatureGeometry ( long nFeatureId, int *cat )
poRing->setPoints( poPoints->n_points,
poPoints->x, poPoints->y );
- poOGRPoly->addRingDirectly( poRing );
- }
+ poOGRPoly->addRingDirectly( poRing );
+ }
- poOGR = poOGRPoly;
+ poOGR = poOGRPoly;
}
break;
- default: // Should not happen
+ default: // Should not happen
{
- CPLError( CE_Failure, CPLE_AppDefined, "Unknown GRASS feature type.");
- return NULL;
+ CPLError( CE_Failure, CPLE_AppDefined, "Unknown GRASS feature type.");
+ return NULL;
}
}
@@ -960,50 +957,34 @@ bool OGRGRASSLayer::SetAttributes ( OGRFeature *poFeature, dbTable *table )
for ( int i = 0; i < nFields; i++)
{
- dbColumn *column = db_get_table_column ( table, i );
- dbValue *value = db_get_column_value ( column );
-
- int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
-
- if ( !db_test_value_isnull(value) )
- {
- switch ( ctype ) {
- case DB_C_TYPE_INT:
- poFeature->SetField( i, db_get_value_int ( value ));
- break;
- case DB_C_TYPE_DOUBLE:
- poFeature->SetField( i, db_get_value_double ( value ));
- break;
- case DB_C_TYPE_STRING:
- poFeature->SetField( i, db_get_value_string ( value ));
- break;
- case DB_C_TYPE_DATETIME:
- db_convert_column_value_to_string ( column, poDbString );
- poFeature->SetField( i, db_get_string ( poDbString ));
- break;
- }
- }
-
- db_convert_column_value_to_string ( column, poDbString );
- //CPLDebug ( "GRASS", "val = %s", db_get_string ( poDbString ));
- }
- return true;
-}
+ dbColumn *column = db_get_table_column ( table, i );
+ dbValue *value = db_get_column_value ( column );
-/************************************************************************/
-/* ISetFeature() */
-/************************************************************************/
-OGRErr OGRGRASSLayer::ISetFeature( OGRFeature *poFeature )
-{
- return OGRERR_FAILURE;
-}
+ int ctype = db_sqltype_to_Ctype ( db_get_column_sqltype(column) );
-/************************************************************************/
-/* ICreateFeature() */
-/************************************************************************/
-OGRErr OGRGRASSLayer::ICreateFeature( OGRFeature *poFeature )
-{
- return OGRERR_FAILURE;
+ if ( !db_test_value_isnull(value) )
+ {
+ switch ( ctype ) {
+ case DB_C_TYPE_INT:
+ poFeature->SetField( i, db_get_value_int ( value ));
+ break;
+ case DB_C_TYPE_DOUBLE:
+ poFeature->SetField( i, db_get_value_double ( value ));
+ break;
+ case DB_C_TYPE_STRING:
+ poFeature->SetField( i, db_get_value_string ( value ));
+ break;
+ case DB_C_TYPE_DATETIME:
+ db_convert_column_value_to_string ( column, poDbString );
+ poFeature->SetField( i, db_get_string ( poDbString ));
+ break;
+ }
+ }
+
+ db_convert_column_value_to_string ( column, poDbString );
+ // CPLDebug ( "GRASS", "val = %s", db_get_string ( poDbString ));
+ }
+ return true;
}
/************************************************************************/
@@ -1031,7 +1012,7 @@ GIntBig OGRGRASSLayer::GetFeatureCount( int bForce )
/* */
/* Returns OGRERR_NONE/OGRRERR_FAILURE. */
/************************************************************************/
-OGRErr OGRGRASSLayer::GetExtent (OGREnvelope *psExtent, int bForce)
+OGRErr OGRGRASSLayer::GetExtent (OGREnvelope *psExtent, int /*bForce*/)
{
#if GRASS_VERSION_MAJOR >= 7
struct bound_box box;
@@ -1074,17 +1055,6 @@ int OGRGRASSLayer::TestCapability( const char * pszCap )
}
/************************************************************************/
-/* CreateField() */
-/************************************************************************/
-OGRErr OGRGRASSLayer::CreateField( OGRFieldDefn *poField, int bApproxOK )
-{
- CPLError( CE_Failure, CPLE_NotSupported,
- "Can't create fields on a GRASS layer.\n");
-
- return OGRERR_FAILURE;
-}
-
-/************************************************************************/
/* GetSpatialRef() */
/************************************************************************/
OGRSpatialReference *OGRGRASSLayer::GetSpatialRef()
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/gdal-grass.git
More information about the Pkg-grass-devel
mailing list