62 BYTE CSG_Grid::m_Bitmask[8] = { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
82 if( !pGrid->
is_Valid() ) {
delete(pGrid);
return( NULL ); }
return( pGrid );
92 if( !pGrid->
is_Valid() ) {
delete(pGrid);
return( NULL ); }
return( pGrid );
98 pGrid =
new CSG_Grid(pGrid, Type, bCached);
100 if( !pGrid->
is_Valid() ) {
delete(pGrid);
return( NULL ); }
return( pGrid );
108 if( !pGrid->
is_Valid() ) {
delete(pGrid);
return( NULL ); }
return( pGrid );
114 CSG_Grid *pGrid =
new CSG_Grid(Type, NX, NY, Cellsize, xMin, yMin, bCached);
116 if( !pGrid->
is_Valid() ) {
delete(pGrid);
return( NULL ); }
return( pGrid );
203 void CSG_Grid::_On_Construction(
void)
209 m_Cache_Stream = NULL;
211 m_Cache_bSwap =
false;
212 m_Cache_bFlip =
false;
241 #pragma omp parallel for
242 for(
int y=0; y<
Get_NY(); y++)
for(
int x=0; x<
Get_NX(); x++)
273 switch( (m_Type = Type) )
293 if( m_System.
Create(System) ==
false )
305 return( _Memory_Create(bCached) );
319 if( _Load_PGSQL (File, bCached, bLoadData)
320 || _Load_Native (File, bCached, bLoadData)
321 || _Load_Compressed(File, bCached, bLoadData)
322 || _Load_Surfer (File, bCached, bLoadData)
323 || _Load_External (File, bCached, bLoadData) )
400 if( (Scale != m_zScale && Scale != 0.) || Offset != m_zOffset )
437 return( m_Values != NULL ||
is_Cached() );
467 return( m_System == System );
487 if( y >= 0 && y <
Get_NY() )
491 for(
int x=0; x<
Get_NX(); x++)
505 for(
int x=0; x<
Get_NX(); x++)
540 return(
Get_Value(p.
x, p.
y, Value, Resampling, bNoData, bByteWise) );
551 if( bNoData ||
is_InGrid(ix + (
int)(0.5 + dx), iy + (
int)(0.5 + dy)) )
574 inline bool CSG_Grid::_Get_ValAtPos_NearestNeighbour(
double &Value,
int x,
int y,
double dx,
double dy)
const
576 if(
is_InGrid(x = x + (
int)(0.5 + dx), y = y + (
int)(0.5 + dy)) )
592 #define BILINEAR_ADD(ix, iy, d) if( is_InGrid(ix, iy) ) {\
593 n += d; z += d * asDouble(ix, iy);\
597 #define BILINEAR_ADD_BYTE(ix, iy, d) if( is_InGrid(ix, iy) ) {\
598 n += d; sLong v = asInt(ix, iy);\
599 z[0] += d * SG_GET_BYTE_0(v);\
600 z[1] += d * SG_GET_BYTE_1(v);\
601 z[2] += d * SG_GET_BYTE_2(v);\
602 z[3] += d * SG_GET_BYTE_3(v);\
606 inline bool CSG_Grid::_Get_ValAtPos_BiLinear(
double &Value,
int x,
int y,
double dx,
double dy,
bool bByteWise)
const
610 double z = 0., n = 0.;
655 inline double CSG_Grid::_Get_ValAtPos_BiCubicSpline(
double dx,
double dy,
double v_xy[4][4])
const
657 #define BiCubicSpline(d, v) (v[1] + 0.5 * d * (v[2] - v[0] + d * (2 * v[0] - 5 * v[1] + 4 * v[2] - v[3] + d * (3 * (v[1] - v[2]) + v[3] - v[0]))))
661 for(
int ix=0; ix<4; ix++)
670 inline bool CSG_Grid::_Get_ValAtPos_BiCubicSpline(
double &Value,
int x,
int y,
double dx,
double dy,
bool bByteWise)
const
676 if( _Get_ValAtPos_Fill4x4Submatrix(x, y, v_xy) )
678 Value = _Get_ValAtPos_BiCubicSpline(dx, dy, v_xy);
685 double v_xy[4][4][4];
687 if( _Get_ValAtPos_Fill4x4Submatrix(x, y, v_xy) )
690 _Get_ValAtPos_BiCubicSpline(dx, dy, v_xy[0]),
691 _Get_ValAtPos_BiCubicSpline(dx, dy, v_xy[1]),
692 _Get_ValAtPos_BiCubicSpline(dx, dy, v_xy[2]),
693 _Get_ValAtPos_BiCubicSpline(dx, dy, v_xy[3])
709 inline double CSG_Grid::_Get_ValAtPos_BSpline(
double dx,
double dy,
double v_xy[4][4])
const
713 for(
int i=0; i<4; i++)
718 if( (d = i - dx + 1.) > 0. ) s += d*d*d;
719 if( (d = i - dx + 0.) > 0. ) s += -4. * d*d*d;
720 if( (d = i - dx - 1.) > 0. ) s += 6. * d*d*d;
721 if( (d = i - dx - 2.) > 0. ) s += -4. * d*d*d;
726 if( (d = i - dy + 1.) > 0. ) s += d*d*d;
727 if( (d = i - dy + 0.) > 0. ) s += -4. * d*d*d;
728 if( (d = i - dy - 1.) > 0. ) s += 6. * d*d*d;
729 if( (d = i - dy - 2.) > 0. ) s += -4. * d*d*d;
736 for(
int iy=0; iy<4; iy++)
738 for(
int ix=0; ix<4; ix++)
740 z += v_xy[ix][iy] * Rx[ix] * Ry[iy];
748 inline bool CSG_Grid::_Get_ValAtPos_BSpline(
double &Value,
int x,
int y,
double dx,
double dy,
bool bByteWise)
const
754 if( _Get_ValAtPos_Fill4x4Submatrix(x, y, v_xy) )
756 Value = _Get_ValAtPos_BSpline(dx, dy, v_xy);
763 double v_xy[4][4][4];
765 if( _Get_ValAtPos_Fill4x4Submatrix(x, y, v_xy) )
768 _Get_ValAtPos_BSpline(dx, dy, v_xy[0]),
769 _Get_ValAtPos_BSpline(dx, dy, v_xy[1]),
770 _Get_ValAtPos_BSpline(dx, dy, v_xy[2]),
771 _Get_ValAtPos_BSpline(dx, dy, v_xy[3])
787 inline bool CSG_Grid::_Get_ValAtPos_Fill4x4Submatrix(
int x,
int y,
double v_xy[4][4])
const
789 int ix, iy, jx, jy, nNoData = 0;
792 for(iy=0, jy=y-1; iy<4; iy++, jy++)
794 for(ix=0, jx=x-1; ix<4; ix++, jx++)
810 for(
int i=0; nNoData>0 && nNoData<16 && i<16; i++)
814 for(iy=0; iy<4; iy++)
for(ix=0; ix<4; ix++)
816 t_xy[ix][iy] = v_xy[ix][iy];
819 for(iy=0; iy<4; iy++)
for(ix=0; ix<4; ix++)
826 for(jy=iy-1; jy<=iy+1; jy++)
for(jx=ix-1; jx<=ix+1; jx++)
830 s +=
asDouble(jx + x - 1, jy + y - 1);
833 else if( jy >= 0 && jy < 4 && jx >= 0 && jx < 4 && !
is_NoData_Value(t_xy[jx][jy]) )
842 v_xy[ix][iy] = s / n;
851 return( nNoData == 0 );
855 inline bool CSG_Grid::_Get_ValAtPos_Fill4x4Submatrix(
int x,
int y,
double v_xy[4][4][4])
const
857 int ix, iy, jx, jy, nNoData = 0;
860 for(iy=0, jy=y-1; iy<4; iy++, jy++)
862 for(ix=0, jx=x-1; ix<4; ix++, jx++)
866 int z =
asInt(jx, jy);
875 v_xy[0][ix][iy] = -1;
883 for(
int i=0; nNoData>0 && nNoData<16 && i<16; i++)
885 double t_xy[4][4][4];
887 for(iy=0; iy<4; iy++)
for(ix=0; ix<4; ix++)
889 t_xy[0][ix][iy] = v_xy[0][ix][iy];
890 t_xy[1][ix][iy] = v_xy[1][ix][iy];
891 t_xy[2][ix][iy] = v_xy[2][ix][iy];
892 t_xy[3][ix][iy] = v_xy[3][ix][iy];
895 for(iy=0; iy<4; iy++)
for(ix=0; ix<4; ix++)
897 if( t_xy[0][ix][iy] < 0 )
900 double s[4]; s[0] = s[1] = s[2] = s[3] = 0.;
902 for(jy=iy-1; jy<=iy+1; jy++)
for(jx=ix-1; jx<=ix+1; jx++)
906 int z =
asInt(jx + x - 1, jy + y - 1);
914 else if( jy >= 0 && jy < 4 && jx >= 0 && jx < 4 && !
is_NoData_Value(t_xy[0][jx][jy]) )
916 s[0] += t_xy[0][jx][jy];
917 s[1] += t_xy[1][jx][jy];
918 s[2] += t_xy[2][jx][jy];
919 s[3] += t_xy[3][jx][jy];
926 v_xy[0][ix][iy] = s[0] / n;
927 v_xy[1][ix][iy] = s[1] / n;
928 v_xy[2][ix][iy] = s[2] / n;
929 v_xy[3][ix][iy] = s[3] / n;
938 return( nNoData == 0 );
973 m_Statistics += Scaling ? Offset + Scaling * Value : Value;
985 for(
int x=0; x<
Get_NX(); x++)
987 double Value =
asDouble(x, y,
false);
991 m_Statistics += Scaling ? Offset + Scaling * Value : Value;
1047 if( Quantile <= 0. ) {
return(
Get_Min() ); }
1048 if( Quantile >= 1. ) {
return(
Get_Max() ); }
1050 if( bFromHistogram )
1070 return(
Get_Quantile(0.01 * Percentile, bFromHistogram) );
1087 Update();
return( m_Statistics );
1104 if( xMin > xMax || yMin > yMax )
1109 Statistics.
Create(bHoldValues);
1111 int nx = 1 + (xMax - xMin);
1112 int ny = 1 + (yMax - yMin);
1113 sLong nCells = nx * ny;
1121 for(
double i=0; i<(double)nCells; i+=d)
1123 int y = yMin + (int)i / nx;
1124 int x = xMin + (int)i % nx;
1126 double Value =
asDouble(x, y,
false);
1130 Statistics += Scaling ? Offset + Scaling * Value : Value;
1136 for(
int y=yMin; y<=yMax; y++)
1138 for(
int x=xMin; x<=xMax; x++)
1140 double Value =
asDouble(x, y,
false);
1144 Statistics += Scaling ? Offset + Scaling * Value : Value;
1154 #define SG_GRID_HISTOGRAM_CLASSES_DEFAULT 255
1175 return( m_Histogram );
1193 if( xMin > xMax || yMin > yMax )
1200 int nx = 1 + (xMax - xMin);
1201 int ny = 1 + (yMax - yMin);
1202 sLong nCells = nx * ny;
1210 for(
double i=0; i<(double)nCells; i+=d)
1212 int y = yMin + (int)i / nx;
1213 int x = xMin + (int)i % nx;
1215 double Value =
asDouble(x, y,
false);
1219 Histogram += Scaling ? Offset + Scaling * Value : Value;
1225 for(
int y=yMin; y<=yMax; y++)
1227 for(
int x=xMin; x<=xMax; x++)
1229 double Value =
asDouble(x, y,
false);
1233 Histogram += Scaling ? Offset + Scaling * Value : Value;
1239 return( Histogram.
Update() );
1250 bool CSG_Grid::_Set_Index(
void)
1263 sLong i, j, k, l, ir, n, *istack, jstack, nstack, indxt, itemp, nData;
1273 m_Index[--nData] = i;
1312 for(j=l+1; j<=ir; j++)
1317 for(i=j-1; i>=0; i--)
1324 m_Index[i + 1] = m_Index[i];
1327 m_Index[i + 1] = indxt;
1335 ir = istack[jstack--];
1336 l = istack[jstack--];
1342 #define SORT_SWAP(a,b) {itemp=(a);(a)=(b);(b)=itemp;}
1364 do i++;
while(
asDouble(m_Index[i]) < a);
1365 do j--;
while(
asDouble(m_Index[j]) > a);
1377 m_Index[l] = m_Index[j];
1381 if( jstack >= nstack )
1387 if( ir - i + 1 >= j - l )
1389 istack[jstack] = ir;
1390 istack[jstack - 1] = i;
1395 istack[jstack] = j - 1;
1396 istack[jstack - 1] = l;