[DebianGIS-dev] [SCM] saga branch, master, updated. 94539575e5b8d35f1caca5ebb5ebcf2135d0115a

Johan Van de Wauw johan.vandewauw at gmail.com
Wed May 5 10:59:29 UTC 2010


The following commit has been merged in the master branch:
commit 94539575e5b8d35f1caca5ebb5ebcf2135d0115a
Author: Johan Van de Wauw <johan.vandewauw at gmail.com>
Date:   Wed May 5 12:50:21 2010 +0200

    Fix Esri E00 import
    
    Upstream commit of 2010-04-14
    SAGA treats xmin/ymin as "pixel-as-point" and not as "pixel-as-area"

diff --git a/src/modules_io/esri_e00/io_esri_e00/ESRI_E00_Import.cpp b/src/modules_io/esri_e00/io_esri_e00/ESRI_E00_Import.cpp
index 00f37f0..df75d2e 100644
--- a/src/modules_io/esri_e00/io_esri_e00/ESRI_E00_Import.cpp
+++ b/src/modules_io/esri_e00/io_esri_e00/ESRI_E00_Import.cpp
@@ -1,1571 +1,1574 @@
-
-///////////////////////////////////////////////////////////
-//                                                       //
-//                         SAGA                          //
-//                                                       //
-//      System for Automated Geoscientific Analyses      //
-//                                                       //
-//                    Module Library:                    //
-//                        Grid_IO                        //
-//                                                       //
-//-------------------------------------------------------//
-//                                                       //
-//                     ESRI_E00.cpp                      //
-//                                                       //
-//                 Copyright (C) 2003 by                 //
-//                      Olaf Conrad                      //
-//                                                       //
-//-------------------------------------------------------//
-//                                                       //
-// This file is part of 'SAGA - System for Automated     //
-// Geoscientific Analyses'. SAGA is free software; you   //
-// can redistribute it and/or modify it under the terms  //
-// of the GNU General Public License as published by the //
-// Free Software Foundation; version 2 of the License.   //
-//                                                       //
-// SAGA is distributed in the hope that it will be       //
-// useful, but WITHOUT ANY WARRANTY; without even the    //
-// implied warranty of MERCHANTABILITY or FITNESS FOR A  //
-// PARTICULAR PURPOSE. See the GNU General Public        //
-// License for more details.                             //
-//                                                       //
-// You should have received a copy of the GNU General    //
-// Public License along with this program; if not,       //
-// write to the Free Software Foundation, Inc.,          //
-// 59 Temple Place - Suite 330, Boston, MA 02111-1307,   //
-// USA.                                                  //
-//                                                       //
-//-------------------------------------------------------//
-//                                                       //
-//    e-mail:     oconrad at saga-gis.org                   //
-//                                                       //
-//    contact:    Olaf Conrad                            //
-//                Institute of Geography                 //
-//                University of Goettingen               //
-//                Goldschmidtstr. 5                      //
-//                37077 Goettingen                       //
-//                Germany                                //
-//                                                       //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-#include "ESRI_E00_Import.h"
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//						Import							 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-CESRI_E00_Import::CESRI_E00_Import(void)
-{
-	//-----------------------------------------------------
-	// 1. info_Table...
-
-	Set_Name	(_TL("Import ESRI E00 File"));
-
-	Set_Author		(SG_T("(c) 2004 by O.Conrad"));
-
-	Set_Description	(_TW(
-		"Import data sets from ESRI's E00 interchange format.\n\n"
-
-		"This import filter is based on the E00 format analysis of the GRASS GIS module "
-		"\'m.in.e00\' written by Michel J. Wurtz. Go to the "
-		"<a target=\"_blank\" href=\"http://grass.itc.it/\">GRASS GIS Hompage</a> "
-		"for more information.\n"
-
-		"The <a target=\"_blank\" href=\"http://avce00.maptools.org/e00compr/index.html\">\'E00Compr\' library</a> "
-		"written by Daniel Morissette has been used for e00 file access, so that "
-		"compressed e00 files also can be read.\n")
-	);
-
-
-	//-----------------------------------------------------
-	// 2. Parameters...
-
-	Parameters.Add_Grid_Output(
-		NULL	, "GRID"	, _TL("Grid"),
-		_TL("")
-	);
-
-	Parameters.Add_Shapes_Output(
-		NULL	, "ARCS"	, _TL("Arcs"),
-		_TL("")
-	);
-
-	Parameters.Add_Shapes_Output(
-		NULL	, "SITES"	, _TL("Sites"),
-		_TL("")
-	);
-
-	Parameters.Add_Shapes_Output(
-		NULL	, "LABELS"	, _TL("Labels"),
-		_TL("")
-	);
-
-	Parameters.Add_Shapes_Output(
-		NULL	, "BND"		, _TL("Boundary"),
-		_TL("")
-	);
-
-	Parameters.Add_Shapes_Output(
-		NULL	, "TIC"		, _TL("Tick Points"),
-		_TL("")
-	);
-
-	Parameters.Add_Table_Output(
-		NULL	, "TABLE"	, _TL("Table"),
-		_TL("")
-	);
-
-	Parameters.Add_FilePath(
-		NULL	, "FILE"	, _TL("File"),
-		_TL(""),
-		_TL("ESRI E00 Files|*.e00;*.e0*|All Files|*.*")
-	);
-}
-
-//---------------------------------------------------------
-CESRI_E00_Import::~CESRI_E00_Import(void)
-{}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-bool CESRI_E00_Import::On_Execute(void)
-{
-	bool	bResult;
-
-	bResult		= false;
-	hReadPtr	= NULL;
-
-	if( Open(Parameters("FILE")->asString()) )
-	{
-		bResult	= Load();
-	}
-
-	if( hReadPtr )
-	{
-		E00ReadClose(hReadPtr);
-	}
-
-	return( bResult );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-bool CESRI_E00_Import::E00GotoLine(int iLine)
-{
-	if( hReadPtr )
-	{
-		E00ReadRewind(hReadPtr);
-
-		while( E00ReadNextLine(hReadPtr) && hReadPtr->nInputLineNo != iLine );
-
-		return( hReadPtr->nInputLineNo == iLine );
-	}
-
-	return( false );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-bool CESRI_E00_Import::Open(const SG_Char *FileName)
-{
-	const char	*Line;
-
-	//-----------------------------------------------------
-	if( FileName == NULL || (hReadPtr = E00ReadOpen(CSG_String(FileName).b_str())) == NULL )
-	{
-		Error_Set(CSG_String::Format(_TL("%s - not found\n"), FileName));
-
-		return( false );
-	}
-
-	//-----------------------------------------------------
-	if( (Line = E00ReadNextLine(hReadPtr)) == NULL )
-	{
-		Error_Set(CSG_String::Format(_TL("\"%s\" is not an Arc-info_Table Export file !\n"), FileName));
-
-		return( false );
-	}
-
-	//-----------------------------------------------------
-	if( strncmp(Line, "EXP", 3) )
-	{
-		Error_Set(CSG_String::Format(_TL("\"%s\" is not an Arc-info_Table Export file !\n"), FileName));
-
-		return( false );
-	}
-
-	//-----------------------------------------------------
-	e00_Name	= FileName;
-
-	return( true );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-bool CESRI_E00_Import::Load(void)
-{
-	const char	*line;
-
-	int			prec_grd, prec_arc, prec_lab, prec_pal;
-
-	long		current_line,
-				offset_grd	= 0,
-				offset_arc	= 0,
-				offset_lab	= 0,
-				offset_pal	= 0;
-
-	double		scale		= 1.0;
-
-	TSG_Shape_Type	shape_type;
-
-	CSG_Grid		*pGrid;
-
-	CSG_Shapes		*pShapes;
-
-	//-----------------------------------------------------
-	pPAT	= NULL;
-	pAAT	= NULL;
-
-	//-----------------------------------------------------
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOS", 3) )
-	{
-		current_line = hReadPtr->nInputLineNo;
-
-		// GRID SECTION
-		if( !strncmp(line, "GRD  ", 5) )
-		{
-			offset_grd	= current_line;
-			prec_grd	= line[5] - '2';
-			skip("EOG");
-			continue;
-		}
-
-		// ARC SECTION
-		if( !strncmp(line, "ARC  ", 5) )
-		{
-			offset_arc	= current_line;
-			prec_arc	= line[5] - '2';
-			skip_arc(prec_arc);
-			continue;
-		}
-
-		// POLYGON TOPOLOGY
-		if(	!strncmp(line, "PAL  ", 5)
-		||	!strncmp(line, "PFF  ", 5)	)
-		{
-			offset_pal	= current_line;
-			prec_pal	= line[5] - '2';
-			skip_pal(prec_pal);
-			continue;
-		}
-
-		// CENTROID SECTION
-		if( !strncmp(line, "CNT  ", 5) )
-		{
-			skip_dat();
-			continue;
-		}
-
-		// LABEL SECTION
-		if( !strncmp(line, "LAB  ", 5))
-		{
-			offset_lab	= current_line;
-			prec_lab	= line[5] - '2';
-			skip_lab(prec_lab);
-			continue;
-		}
-
-		// INFO SECTION
-		if( !strncmp(line, "IFO  ", 5) )
-		{
-			info_Get_Tables();
-			continue;
-		}
-
-		// PROJECTION INFOS
-		if( !strncmp(line, "PRJ  ", 5) )
-		{
-			scale		= getproj();
-			continue;
-		}
-
-		// Annotations (text). To be imported ? Does anybody have an idea ?
-		if( !strncmp(line, "TXT  ", 5) )
-		{
-			skip_txt(line[5] - '2');
-			continue;
-		}
-
-		// Mask description ? Noting to do with it
-		if( !strncmp(line, "MSK  ", 5) )
-		{
-			skip_msk();
-			continue;
-		}
-
-		// TOLERANCE SECTION. Should we really use it ?
-		if( !strncmp(line, "TOL  ", 5) )
-		{
-			skip_dat();
-			continue;
-		}
-
-		// UNKNOW KEYWORD SECTION. Don't know what to do with. Does anybody have an idea?
-		if( !strncmp(line, "LNK  ", 5) )
-		{
-			skip("END OF LINK DATA");
-			continue;
-		}
-
-		// SPATIAL INDEX SECTION. Noting to do with it
-		if( !strncmp(line, "SIN  ", 5) )
-		{
-			skip("EOX");
-			continue;
-		}
-
-		// Line pattern and palette. Shade pattern and palette end same as e00 archive !
-		if(	!strncmp(line, "CLN  ", 5)
-		||	!strncmp(line, "CSH  ", 5)	)
-		{
-			skip("EOS");
-			continue;
-		}
-
-		// Font description ? Noting to do with it
-		if( !strncmp(line, "FNT  ", 5) )
-		{
-			skip("EOF");
-			continue;
-		}
-
-		// PLOT SECTION. Why should we import it ?
-		if( !strncmp(line, "PLT  ", 5) )
-		{
-			skip("EOP");
-			continue;
-		}
-
-		// LOG SECTION. Nothing to do with it
-		if( !strncmp(line, "LOG  ", 5) )
-		{
-			skip("EOL");
-			continue;
-		}
-
-		if(	!strncmp(line, "RPL  ", 5)		// Specific to regions. Contains PAL formated data for each subclass
-		||	!strncmp(line, "RXP  ", 5)		// Specific to regions. Seems to link regions IDs to PAL polygons IDs
-		||	!strncmp(line, "TX6  ", 5)		// Other kind of annotations not same termination. Other differences ?
-		||	!strncmp(line, "TX7  ", 5)	)	// Very close from TX6. So same questions and same rules...
-		{
-			skip("JABBERWOCKY");
-			continue;
-		}
-	}
-
-	//-----------------------------------------------------
-	switch( pPAT ? (pAAT ? 3 : 2) : (pAAT ? 1 : 0) )
-	{
-	case 0: default:
-		shape_type	= offset_arc != 0 ? SHAPE_TYPE_Line : SHAPE_TYPE_Point;
-		break;
-
-	case 1:	// pAAT
-		shape_type	= SHAPE_TYPE_Line;
-		break;
-
-	case 2:	// pPAT
-		shape_type	= offset_arc != 0 ? SHAPE_TYPE_Polygon : SHAPE_TYPE_Point;
-		break;
-
-	case 3:	// pAAT && pPAT
-		shape_type	= offset_pal != 0 || offset_lab != 0 ? SHAPE_TYPE_Polygon : SHAPE_TYPE_Line;
-		break;
-	}
-
-	//-----------------------------------------------------
-	// Extracting useful information as noted before...
-
-	//-----------------------------------------------------
-	if( offset_grd > 0 )
-	{
-		E00GotoLine(offset_grd);
-
-		if( (pGrid = getraster	(prec_grd, scale)) != NULL )
-		{
-			pGrid->Set_Name(e00_Name);
-
-			Parameters("GRID")->Set_Value(pGrid);
-		}
-	}
-
-	//-----------------------------------------------------
-	if( offset_arc != 0 )
-	{
-		E00GotoLine(offset_arc);
-
-		if( (pShapes = getarcs	(prec_arc, scale, shape_type)) != NULL )
-		{
-			pShapes->Set_Name(e00_Name);
-
-			Parameters("ARCS")->Set_Value(pShapes);
-		}
-	}
-
-	//-----------------------------------------------------
-	if( offset_lab != 0 && shape_type == SHAPE_TYPE_Point )
-	{
-		E00GotoLine(offset_lab);
-
-		if( (pShapes = getsites	(prec_lab, scale)) != NULL )
-		{
-			pShapes->Set_Name(e00_Name);
-
-			Parameters("SITES")->Set_Value(pShapes);
-		}
-	}
-
-	//-----------------------------------------------------
-	if( offset_lab != 0 && shape_type != SHAPE_TYPE_Point )
-	{
-		E00GotoLine(offset_lab);
-
-		if( (pShapes = getlabels(prec_lab, scale)) != NULL )
-		{
-			pShapes->Set_Name(e00_Name);
-
-			Parameters("LABELS")->Set_Value(pShapes);
-		}
-	}
-
-	//-----------------------------------------------------
-	return( true );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//						Grid							 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-CSG_Grid * CESRI_E00_Import::getraster(int prec, double scale)
-{
-	const char	*line;
-
-	int		x, y, ix;
-	long	rows, cols, depth, p[5];
-	float	f[5];
-	double	xres, yres, xmin, ymin, xmax, ymax, nul_val, d[3];
-	CSG_Grid	*pGrid;
-
-	//-----------------------------------------------------
-	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
-		return( NULL );
-//	sscanf(line, "%ld%ld%ld", &cols, &rows, &depth, &nul_val);
-	sscanf(line, "%ld%ld%ld%lf", &cols, &rows, &depth, &nul_val);
-
-	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
-		return( NULL );
-	sscanf(line, "%lf%lf", &xres, &yres);
-
-	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
-		return( NULL );
-	sscanf(line, "%lf%lf", &xmin, &ymin);
-
-	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
-		return( NULL );
-	sscanf(line, "%lf%lf", &xmax, &ymax);
-
-	xmax	= xmax * scale;
-	xmin	= xmin * scale;
-	ymax	= ymax * scale;
-	ymin	= ymin * scale;
-	xres	= xres * scale;
-	yres	= yres * scale;
-
-	if( depth == 2 && prec )
-	{
-		depth	= 3;
-	}
-
-	//-----------------------------------------------------
-	switch( depth )
-	{
-	default:
-		pGrid	= NULL;
-		break;
-
-	//-----------------------------------------------------
-	case 1:
-		pGrid	= SG_Create_Grid(SG_DATATYPE_Int, cols, rows, xres, xmin, ymin);
-		pGrid->Set_NoData_Value(nul_val);
-
-		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
-		{
-			for(x=0; x<cols; x+= 5)
-			{
-				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-				{
-					sscanf(line, "%ld%ld%ld%ld%ld", p, p+1, p+2, p+3, p+4);
-
-					for(ix=0; ix<5 && x+ix<cols; ix++)
-					{
-						pGrid->Set_Value(x + ix, y, p[ix]);
-					}
-				}
-			}
-		}
-		break;
-
-	//-----------------------------------------------------
-	case 2:
-		pGrid	= SG_Create_Grid(SG_DATATYPE_Float, cols, rows, xres, xmin, ymin);
-		pGrid->Set_NoData_Value(nul_val);
-
-		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
-		{
-			for(x=0; x<cols; x+= 5)
-			{
-				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-				{
-					sscanf(line, "%f%f%f%f%f", f, f+1, f+2, f+3, f+4);
-
-					for(ix=0; ix<5 && x+ix<cols; ix++)
-					{
-						pGrid->Set_Value(x + ix, y, f[ix]);
-					}
-				}
-			}
-		}
-		break;
-
-	//-----------------------------------------------------
-	case 3:
-		pGrid	= SG_Create_Grid(SG_DATATYPE_Double, cols, rows, xres, xmin, ymin);
-		pGrid->Set_NoData_Value(nul_val);
-
-		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
-		{
-			for(x=0; x<cols; x+= 3)
-			{
-				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-				{
-					sscanf(line, "%lf%lf%lf", d, d+1, d+2);
-
-					for(ix=0; ix<3 && x+ix<cols; ix++)
-					{
-						pGrid->Set_Value(x + ix, y, d[ix]);
-					}
-				}
-			}
-		}
-		break;
-	}
-
-	//-----------------------------------------------------
-	skip("EOG");
-
-	return( pGrid );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-#define ARC_FNODE	2
-#define ARC_TNODE	3
-#define ARC_LPOL	4
-#define ARC_RPOL	5
-
-//---------------------------------------------------------
-CSG_Shapes * CESRI_E00_Import::getarcs(int prec, double scale, TSG_Shape_Type &shape_type)
-{
-	const char	*line;
-
-	int		covnum, cov_id, fnode, tnode, lpol, rpol, nPoints, iPoint;
-	double	x_buf[2], y_buf[2];
-	CSG_Shape	*pShape;
-	CSG_Shapes	*pShapes;
-
-	//-----------------------------------------------------
-	pShapes	= SG_Create_Shapes(shape_type);
-	pShapes->Add_Field("ID"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("ID#"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("FNODE"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("TNODE"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("LPOL"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("RPOL"	, SG_DATATYPE_Int);
-
-	Set_Progress(0, 100);
-
-	//-----------------------------------------------------
-	do
-	{
-		Process_Set_Text(CSG_String::Format(SG_T("Loaded arcs: %d"), pShapes->Get_Count()));
-
-		if( (line = E00ReadNextLine(hReadPtr)) == NULL )
-		{
-			covnum	= -1;
-		}
-		else
-		{
-			sscanf(line, "%d %d %d %d %d %d %d", &covnum, &cov_id, &fnode, &tnode, &lpol, &rpol, &nPoints);
-		}
-
-		if( covnum != -1 )
-		{
-			pShape	= pShapes->Add_Shape();
-
-			pShape->Set_Value(0			, covnum);
-			pShape->Set_Value(1			, cov_id);
-			pShape->Set_Value(ARC_FNODE	, fnode);
-			pShape->Set_Value(ARC_TNODE	, tnode);
-			pShape->Set_Value(ARC_LPOL	, lpol);
-			pShape->Set_Value(ARC_RPOL	, rpol);
-
-			//---------------------------------------------
-			if( prec )	// double precision : 1 coord pair / line
-			{
-				for(iPoint=0; iPoint<nPoints && line; iPoint++)
-				{
-					if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-					{
-						sscanf(line, "%lf %lf", x_buf, y_buf);
-
-						pShape->Add_Point(x_buf[0] * scale, y_buf[0] * scale);
-					}
-				}
-			}
-
-			//---------------------------------------------
-			else		// single precision : 2 x,y pairs / line
-			{
-				for(iPoint=0; iPoint<nPoints && line; iPoint+=2)
-				{
-					if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-					{
-						sscanf(line, "%lf %lf %lf %lf", x_buf, y_buf, x_buf + 1, y_buf + 1);
-
-						pShape->Add_Point(x_buf[0] * scale, y_buf[0] * scale);
-
-						if( iPoint + 1 < nPoints )
-						{
-							pShape->Add_Point(x_buf[1] * scale, y_buf[1] * scale);
-						}
-					}
-				}
-			}
-		}
-	}
-	while( covnum != -1 && line && Process_Get_Okay(false) );
-
-	//-----------------------------------------------------
-	if( pShapes->Get_Count() == 0 )
-	{
-		delete(pShapes);
-
-		shape_type	= SHAPE_TYPE_Point;
-
-		return( NULL );
-	}
-
-	if( shape_type == SHAPE_TYPE_Polygon )
-	{
-		pShapes	= Arcs2Polygons(pShapes);
-
-		Assign_Attributes(pShapes);
-	}
-
-	return( pShapes );
-}
-
-//---------------------------------------------------------
-CSG_Shapes * CESRI_E00_Import::Arcs2Polygons(CSG_Shapes *pArcs)
-{
-	int			iArc, nArcs, id;
-	CSG_Shapes	*pPolygons;
-
-	//-----------------------------------------------------
-	Process_Set_Text(_TL("Arcs to polygons"));
-
-	pPolygons	= SG_Create_Shapes(SHAPE_TYPE_Polygon);
-	pPolygons->Add_Field("ID", SG_DATATYPE_Int);
-
-	nArcs		= pArcs->Get_Count();
-
-	//-----------------------------------------------------
-	while( (iArc = pArcs->Get_Count() - 1) >= 0 && Set_Progress(nArcs - iArc - 1, nArcs) )
-	{
-		id	= pArcs->Get_Shape(iArc)->asInt(ARC_LPOL);
-
-		if( id == pArcs->Get_Shape(iArc)->asInt(ARC_RPOL) )
-		{
-			pArcs->Del_Shape(iArc);
-		}
-		else if( id > 1 )
-		{
-			Arcs2Polygon(pArcs, pPolygons, id);
-		}
-
-		if( (iArc = pArcs->Get_Count() - 1) >= 0 )
-		{
-			id	= pArcs->Get_Shape(iArc)->asInt(ARC_RPOL);
-
-			if( id > 1 )
-			{
-				Arcs2Polygon(pArcs, pPolygons, id);
-			}
-		}
-	}
-
-	//-----------------------------------------------------
-	delete( pArcs );
-
-	return( pPolygons );
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::Arcs2Polygon(CSG_Shapes *pArcs, CSG_Shapes *pPolygons, int id)
-{
-	int		iShape, iPart, iPoint, iNode;
-	CSG_Shape	*pArc, *pShape;
-	CSG_Shapes	Arcs;
-
-	//-----------------------------------------------------
-	Arcs.Create(SHAPE_TYPE_Line);
-	Arcs.Add_Field("FROM_NODE", SG_DATATYPE_Int);
-	Arcs.Add_Field("TO___NODE", SG_DATATYPE_Int);
-
-	//-----------------------------------------------------
-	for(iShape=pArcs->Get_Count()-1; iShape>=0; iShape--)
-	{
-		pShape	= pArcs->Get_Shape(iShape);
-
-		if( id == pShape->asInt(ARC_LPOL) )
-		{
-			pArc	= Arcs.Add_Shape();
-			pArc->Set_Value(0, pShape->asInt(ARC_FNODE));
-			pArc->Set_Value(1, pShape->asInt(ARC_TNODE));
-
-			for(iPoint=0; iPoint<pShape->Get_Point_Count(0); iPoint++)
-			{
-				pArc->Add_Point(pShape->Get_Point(iPoint, 0), 0);
-			}
-
-			if( pShape->asInt(ARC_RPOL) <= 1 )
-			{
-				pArcs->Del_Shape(iShape);
-			}
-			else
-			{
-				pShape->Set_Value(ARC_LPOL, 1);
-			}
-		}
-		else if( id == pShape->asInt(ARC_RPOL) )
-		{
-			pArc	= Arcs.Add_Shape();
-			pArc->Set_Value(1, pShape->asInt(ARC_FNODE));
-			pArc->Set_Value(0, pShape->asInt(ARC_TNODE));
-
-			for(iPoint=pShape->Get_Point_Count(0)-1; iPoint>=0; iPoint--)
-			{
-				pArc->Add_Point(pShape->Get_Point(iPoint, 0), 0);
-			}
-
-			if( pShape->asInt(ARC_LPOL) <= 1 )
-			{
-				pArcs->Del_Shape(iShape);
-			}
-			else
-			{
-				pShape->Set_Value(ARC_RPOL, 1);
-			}
-		}
-	}
-
-	//-----------------------------------------------------
-	if( Arcs.Get_Count() > 0 )
-	{
-		iPart	= 0;
-		pShape	= pPolygons->Add_Shape();
-		pShape->Set_Value(0, id);
-
-		do
-		{
-			pArc	= Arcs.Get_Shape(0);
-
-			while( pArc )
-			{
-				for(iPoint=0; iPoint<pArc->Get_Point_Count(0); iPoint++)
-				{
-					pShape->Add_Point(pArc->Get_Point(iPoint, 0), iPart);
-				}
-
-				iNode	= pArc->asInt(1);
-				Arcs.Del_Shape(pArc);
-
-				for(iShape=0, pArc=NULL; iShape<Arcs.Get_Count() && !pArc; iShape++)
-				{
-					if( iNode == Arcs.Get_Shape(iShape)->asInt(0) )
-					{
-						pArc	= Arcs.Get_Shape(iShape);
-					}
-				}
-			}
-
-			iPart++;
-		}
-		while( Arcs.Get_Count() > 0 );
-	}
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-CSG_Shapes * CESRI_E00_Import::getlabels(int prec, double scale)	// shape_type: LINE or AREA
-{
-	const char	*line;
-
-	int		num, id;	// coverage-# and coverage-ID
-	double	x, y;
-	CSG_Shapes	*pShapes;
-	CSG_Shape	*pShape;
-
-	pShapes	= SG_Create_Shapes(SHAPE_TYPE_Point);
-
-	pShapes->Add_Field("ID#"	, SG_DATATYPE_Int);
-	pShapes->Add_Field("ID"	, SG_DATATYPE_Int);
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%d %d %lf %lf", &id, &num, &x, &y);
-
-		if( id == -1 )
-		{
-			break;
-		}
-		else
-		{
-			pShape	= pShapes->Add_Shape();
-
-			pShape->Add_Point(x * scale, y * scale);
-
-			pShape->Set_Value(0, num);
-			pShape->Set_Value(1, id);
-
-			//---------------------------------------------
-			E00ReadNextLine(hReadPtr);		// 4 values to skip
-
-			if( prec )
-			{
-				E00ReadNextLine(hReadPtr);	// on 2nd line when double precision
-			}
-		}
-	}
-
-	if( pShapes->Get_Count() <= 0 )
-	{
-		delete( pShapes );
-		pShapes	= NULL;
-	}
-
-	return( pShapes );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-CSG_Shapes * CESRI_E00_Import::getsites(int prec, double scale)
-{
-	const char	*line;
-
-	int		id;
-	double	x, y;
-	CSG_Shape	*pShape;
-	CSG_Shapes	*pShapes;
-
-	pShapes	= SG_Create_Shapes(SHAPE_TYPE_Point);
-	pShapes->Add_Field("ID", SG_DATATYPE_Int);
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%d %*d %lf %lf", &id, &x, &y);
-
-		if( id == -1 )
-		{
-			break;
-		}
-
-		pShape	= pShapes->Add_Shape();
-
-		pShape->Add_Point(x * scale, y * scale);
-		pShape->Set_Value(0, id);
-
-		//-------------------------------------------------
-		E00ReadNextLine(hReadPtr);		// 4 values to skip
-
-		if( prec )
-		{
-			E00ReadNextLine(hReadPtr);	// on 2nd line when double precision
-		}
-	}
-
-	if( pShapes->Get_Count() <= 0 )
-	{
-		delete( pShapes );
-		pShapes	= NULL;
-	}
-	else
-	{
-		Assign_Attributes(pShapes);
-	}
-
-	return( pShapes );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-double CESRI_E00_Import::getproj(void)
-{
-	const char	*line;
-
-	double	scale	= 1.0;
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOP", 3) )
-	{
-		if( !strncmp(line, "Units", 5) )
-		{
-			sscanf(line + 6, "%lf", &scale);
-		}
-	}
-
-	scale	= 1.0 / scale;
-
-	return( scale );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//						info section					 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-struct info_Field
-{
-	char				Name[18];	// name of item
-
-	int					Position,	// position in data line
-						Size,		// size for reading
-						Type;		// type of data
-};
-
-//---------------------------------------------------------
-struct info_Table
-{
-	char				Name[34],
-						AI[4];		// XX if Arc/info file, spaces otherwise
-
-	int					uFields,	// number of usable items in this table
-						nFields,	// number of items in this table
-						ldr;		// length of data record
-
-	long				nRecords,	// number of data records
-						length;		// total length for one data line
-
-	struct info_Field	*Field;		// One per field...
-};
-
-//---------------------------------------------------------
-// [06.06.2006] ESRI E00 Import crash fix, James Flemer
-int CESRI_E00_Import::info_Get_Tables(void)
-{
-	const char *line;
-
-	char				tmp[12], *p;
-	int					i;
-	CSG_String			s;
-	CSG_Table				*pTable;
-	struct info_Table	info;
-
-	//-----------------------------------------------------
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOI", 3) )
-	{
-		strncpy(info.Name, line, 32);
-		info.Name[32]	= 0;
-		p	= strchr(info.Name, ' ');
-		if( p != NULL )
-			*p	= 0;
-		p	= strchr(info.Name, '.');
-		if( p == 0 )
-			p	= info.Name;
-		else
-			p++;
-		s	= p;
-
-		strncpy(info.AI	, line + 32,  2);	info.AI[2]	= 0;
-		strncpy(tmp		, line + 34,  4);	tmp[ 4]		= 0;	info.uFields	= atoi(tmp);
-		strncpy(tmp		, line + 38,  4);	tmp[ 4]		= 0;	info.nFields	= atoi(tmp);
-		strncpy(tmp		, line + 42,  4);	tmp[ 4]		= 0;	info.ldr		= atoi(tmp);
-		strncpy(tmp		, line + 46, 11);	tmp[11]		= 0;	info.nRecords	= atol(tmp);
-
-		info.length	= 0;
-		info.Field	= (struct info_Field *)malloc(info.nFields * sizeof(struct info_Field));
-
-		//---------------------------------------------
-		for(i=0; i<info.nFields; i++)
-		{
-			if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-			{
-				sscanf(line, "%16s", info.Field[i].Name);
-				info.Field[i].Size	= atoi(&line[16]);
-				info.Field[i].Type	= atoi(&line[34]);
-			}
-
-			//---------------------------------------------
-			switch( info.Field[i].Type )
-			{
-			case 60:	// float / double
-				info.Field[i].Size = info.Field[i].Size == 4 ? 14 : 24;
-				break;
-
-			case 50:	// short / long
-				info.Field[i].Size = info.Field[i].Size == 2 ?  6 : 11;
-				break;
-
-			case 40:	// float
-				info.Field[i].Size = 14;
-				break;
-
-			case 10:
-				info.Field[i].Size = 8;
-				break;
-
-			default:	// string
-				break;
-			}
-
-			if( i < info.uFields )
-			{
-				info.length			+= info.Field[i].Size;
-			}
-
-			if( i == 0 )
-			{
-				info.Field[i].Position	= 0;
-			}
-			else
-			{
-				info.Field[i].Position	= info.Field[i-1].Position + info.Field[i-1].Size;
-			}
-		}
-
-		//---------------------------------------------
-		pTable	= NULL;
-
-		if     ( !s.CmpNoCase(SG_T("aat")) && pAAT == NULL )
-		{
-			pTable	= pAAT	= info_Get_Table(info);
-		}
-		else if( !s.CmpNoCase(SG_T("pat")) && pPAT == NULL )
-		{
-			pTable	= pPAT	= info_Get_Table(info);
-		}
-	//	else if( !s.CmpNoCase("vat") )		// value table (grid)
-	//	else if( !s.CmpNoCase("bnd") )		// coverage boundaries
-	//	else if( !s.CmpNoCase("tic") )		// tick marks
-	//	else if( !s.CmpNoCase("sta") )		// stats on grid
-	//	else if( !s.CmpNoCase("lut") )		// look-up table
-	//	else if( !s.CmpNoCase("acode") )	// arc attributes
-	//	else if( !s.CmpNoCase("pcode") )	// polygon attributes
-	//	else								// non graphic tables
-		else	// come on, let's get every table we can get...
-		{
-			pTable	= info_Get_Table(info);
-		}
-
-		//-------------------------------------------------
-		free(info.Field);
-
-		if( pTable )
-		{
-			CSG_Table_Record	*pRecord;
-			CSG_Shape			*pShape;
-			CSG_Shapes			*pBND, *pTIC;
-
-			if     ( !s.CmpNoCase(SG_T("bnd")) )	// coverage boundaries
-			{
-				pBND	= SG_Create_Shapes(SHAPE_TYPE_Polygon, SG_T("Boundary"));
-				pBND->Add_Field("XMIN", SG_DATATYPE_Double);
-				pBND->Add_Field("YMIN", SG_DATATYPE_Double);
-				pBND->Add_Field("XMAX", SG_DATATYPE_Double);
-				pBND->Add_Field("YMAX", SG_DATATYPE_Double);
-				pRecord	= pTable->Get_Record(0);
-				pShape	= pBND->Add_Shape();
-				pShape->Set_Value(0, pRecord->asDouble(0));
-				pShape->Set_Value(1, pRecord->asDouble(1));
-				pShape->Set_Value(2, pRecord->asDouble(2));
-				pShape->Set_Value(3, pRecord->asDouble(3));
-				pShape->Add_Point(pRecord->asDouble(0), pRecord->asDouble(1));
-				pShape->Add_Point(pRecord->asDouble(0), pRecord->asDouble(3));
-				pShape->Add_Point(pRecord->asDouble(2), pRecord->asDouble(3));
-				pShape->Add_Point(pRecord->asDouble(2), pRecord->asDouble(1));
-				Parameters("BND")->Set_Value(pBND);
-				delete(pTable);
-			}
-			else if( !s.CmpNoCase(SG_T("tic")) )	// tick marks
-			{
-				pTIC	= SG_Create_Shapes(SHAPE_TYPE_Point, SG_T("Tick Points"));
-				pTIC->Add_Field("ID", SG_DATATYPE_Int);
-				pTIC->Add_Field("X" , SG_DATATYPE_Double);
-				pTIC->Add_Field("Y" , SG_DATATYPE_Double);
-				for(i=0; i<pTable->Get_Record_Count(); i++)
-				{
-					pRecord	= pTable->Get_Record(i);
-					pShape	= pTIC->Add_Shape();
-					pShape->Set_Value(0, pRecord->asInt   (0));
-					pShape->Set_Value(1, pRecord->asDouble(1));
-					pShape->Set_Value(2, pRecord->asDouble(2));
-					pShape->Add_Point(pRecord->asDouble(1), pRecord->asDouble(2));
-				}
-				Parameters("TIC")->Set_Value(pTIC);
-				delete(pTable);
-			}
-			else
-			{
-				Parameters("TABLE")->Set_Value(pTable);
-			}
-		}
-	}
-
-	//-----------------------------------------------------
-	// 0 if none, 1 if AAT, 2 if PAT, 3 if both
-	return( pPAT ? (pAAT ? 3 : 2) : (pAAT ? 1 : 0) );
-}
-
-//---------------------------------------------------------
-CSG_Table * CESRI_E00_Import::info_Get_Table(struct info_Table info)
-{
-	char			*buffer_record, *buffer_item;
-	int				iRecord, iField;
-	CSG_Table			*pTable;
-	CSG_Table_Record	*pRecord;
-
-	//-----------------------------------------------------
-	Process_Set_Text(CSG_String(info.Name));
-
-	buffer_record	= (char *)malloc(info.length + 3);
-	buffer_item		= (char *)malloc(info.length + 3);
-
-	pTable			= SG_Create_Table();
-	pTable->Set_Name(CSG_String(info.Name));
-
-	//-----------------------------------------------------
-	for(iField=0; iField<info.uFields; iField++)
-	{
-		switch( info.Field[iField].Type )
-		{
-		case 60:	// float / double
-			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Double);
-			break;
-
-		case 50:	// short / long
-			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Int);
-			break;
-
-		case 40:	// float
-			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Double);
-			break;
-
-		case 10:	// short
-			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Int);
-			break;
-
-		default:	// string
-			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_String);
-			break;
-		}
-	}
-
-	//-----------------------------------------------------
-	for(iRecord=0; iRecord<info.nRecords && Set_Progress(iRecord, info.nRecords); iRecord++)
-	{
-		info_Get_Record(buffer_record, info.length);
-
-		pRecord	= pTable->Add_Record();
-
-		for(iField=0; iField<info.uFields; iField++)
-		{
-			strncpy(buffer_item, &buffer_record[info.Field[iField].Position], info.Field[iField].Size);
-			buffer_item[info.Field[iField].Size] = 0;
-
-			switch( pTable->Get_Field_Type(iField) )
-			{
-			default:
-				pRecord->Set_Value(iField, atof(buffer_item));
-				break;
-
-			case SG_DATATYPE_Int:
-				pRecord->Set_Value(iField, atoi(buffer_item));
-				break;
-
-			case SG_DATATYPE_String:
-				pRecord->Set_Value(iField, CSG_String(buffer_item));
-				break;
-			}
-		}
-	}
-
-	//-----------------------------------------------------
-	free(buffer_record);
-	free(buffer_item);
-
-	return( pTable );
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::info_Skip_Table(struct info_Table info)
-{
-	char	*buffer_record;
-	int		iRecord;
-
-	buffer_record	= (char *)malloc(info.length + 3);
-
-	for(iRecord=0; iRecord<info.nRecords; iRecord++)
-	{
-		info_Get_Record(buffer_record, info.length);
-	}
-
-	free(buffer_record);
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::info_Get_Record(char *buffer, int buffer_length)
-{
-	const char *line;
-
-	char	*p;
-	int		l;
-
-	//-----------------------------------------------------
-	p	= buffer;
-	l	= 0;
-
-	//-----------------------------------------------------
-	if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		strncpy(buffer, line, buffer_length < 84 ? buffer_length : 84);
-
-		while( l < buffer_length )
-		{
-			if( *p =='\r' || *p == '\n' || *p == 0 )
-			{
-				while( (l % 80 || p == buffer) && l < buffer_length )
-				{
-					l++;
-					*p++	= ' ';
-				}
-
-				if( l == buffer_length )
-				{
-					break;
-				}
-				else if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-				{
-					strncpy(p, line, buffer_length - l < 84 ? buffer_length - l : 84);
-
-					if( *p =='\r' || *p == '\n' || *p == 0 )	// if empty line
-					{
-						l++;
-						*p++	= ' ';
-						*p		= 0;
-					}
-				}
-			}
-			else
-			{
-				l++;
-				p++;
-			}
-		}
-
-		*p	= 0;
-	}
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//						Skips							 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-bool CESRI_E00_Import::Assign_Attributes(CSG_Shapes *pShapes)
-{
-	int				iShape, iRecord, iField, oField, id;
-	CSG_Table_Record	*pRec;
-	CSG_Shape			*pShape;
-
-	if( pShapes && pShapes->Get_Field_Count() > 0 && pPAT && pPAT->Get_Field_Count() > 2 )
-	{
-		Process_Set_Text(_TL("Assign attributes to shapes..."));
-
-		oField	= pShapes->Get_Field_Count();
-
-		for(iField=0; iField<pPAT->Get_Field_Count(); iField++)
-		{
-			pShapes->Add_Field(pPAT->Get_Field_Name(iField), pPAT->Get_Field_Type(iField));
-		}
-
-		for(iShape=0; iShape<pShapes->Get_Count() && Set_Progress(iShape, pShapes->Get_Count()); iShape++)
-		{
-			pShape	= pShapes->Get_Shape(iShape);
-			id		= pShape->asInt(0);
-
-			for(iRecord=0; iRecord<pPAT->Get_Record_Count(); iRecord++)
-			{
-				pRec	= pPAT->Get_Record(iRecord);
-
-				if( id == pRec->asInt(2) )
-				{
-					for(iField=0; iField<pPAT->Get_Field_Count(); iField++)
-					{
-						switch( pPAT->Get_Field_Type(iField) )
-						{
-						case SG_DATATYPE_String:
-							pShape->Set_Value(oField + iField, pRec->asString(iField));
-							break;
-
-						default:
-							pShape->Set_Value(oField + iField, pRec->asDouble(iField));
-							break;
-						}
-					}
-
-					break;
-				}
-			}
-
-		}
-
-		return( true );
-	}
-
-	return( false );
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//						Skips							 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip(char *end)
-{
-	const char	*line;
-
-	int		l	= strlen(end);
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, end, l) );
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_dat(void)
-{
-	const char	*line;
-
-	int		i	= 0;
-	
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL && i != -1 )
-	{
-		sscanf(line, "%d", &i);
-	}
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_msk(void)
-{
-	const char	*line;
-
-	double	xmin, ymin, xmax, ymax, res, sk;
-	long	xsize, ysize, nskip;
-
-	if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%lf %lf %lf", &xmin, &ymin, &xmax);
-
-		if( (line = E00ReadNextLine(hReadPtr)) != NULL )
-		{
-			sscanf(line, "%lf %lf %ld %ld", &ymax, &res, &xsize, &ysize);
-
-			sk		= ((ymax - ymin) / res) * ((xmax - xmin) / res) / 32.0;
-			nskip	= (long)ceil(sk / 7.0);
-
-			while( nskip-- )
-			{
-				E00ReadNextLine(hReadPtr);
-			}
-		}
-	}
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_arc(int prec)
-{
-	const char	*line;
-
-	int		i, covnum, nPoints;
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%d %*d %*d %*d %*d %*d %d", &covnum, &nPoints);
-
-		if( covnum == -1 )
-			break;
-
-		if( prec == 0 )
-			nPoints	= (nPoints + 1) / 2;	// number of coordinate lines
-
-		for(i=0; i<nPoints; i++)
-		{
-			E00ReadNextLine(hReadPtr);
-		}
-	}
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_lab(int prec)
-{
-	const char	*line;
-
-	long	covid;
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%ld", &covid);
-
-		if( covid == -1 )
-			break;
-
-		E00ReadNextLine(hReadPtr);
-
-		if( prec )	// two lines of coordinates in double precision
-			E00ReadNextLine(hReadPtr);
-	}
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_pal(int prec)
-{
-	const char	*line;
-
-	int		i, narcs;
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf(line, "%d", &narcs);
-
-		if( prec )	// two lines of coordinates in double precision
-			E00ReadNextLine(hReadPtr);
-
-		if( narcs == -1 )
-			break;
-
-		for(i=(narcs+1)/2; i; i--)
-			E00ReadNextLine(hReadPtr);
-	}
-}
-
-//---------------------------------------------------------
-void CESRI_E00_Import::skip_txt(int prec)
-{
-	const char	*line;
-
-	int		i, n, nskip;
-
-	nskip	= prec ? 7 : 5;
-
-	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
-	{
-		sscanf( line, "%d", &n);
-
-		if( n == -1 )
-			break;
-
-		for(i=0; i<nskip; i++)
-			E00ReadNextLine(hReadPtr);
-	}
-}
-
-
-///////////////////////////////////////////////////////////
-//														 //
-//														 //
-//														 //
-///////////////////////////////////////////////////////////
-
-//---------------------------------------------------------
+
+///////////////////////////////////////////////////////////
+//                                                       //
+//                         SAGA                          //
+//                                                       //
+//      System for Automated Geoscientific Analyses      //
+//                                                       //
+//                    Module Library:                    //
+//                        Grid_IO                        //
+//                                                       //
+//-------------------------------------------------------//
+//                                                       //
+//                     ESRI_E00.cpp                      //
+//                                                       //
+//                 Copyright (C) 2003 by                 //
+//                      Olaf Conrad                      //
+//                                                       //
+//-------------------------------------------------------//
+//                                                       //
+// This file is part of 'SAGA - System for Automated     //
+// Geoscientific Analyses'. SAGA is free software; you   //
+// can redistribute it and/or modify it under the terms  //
+// of the GNU General Public License as published by the //
+// Free Software Foundation; version 2 of the License.   //
+//                                                       //
+// SAGA is distributed in the hope that it will be       //
+// useful, but WITHOUT ANY WARRANTY; without even the    //
+// implied warranty of MERCHANTABILITY or FITNESS FOR A  //
+// PARTICULAR PURPOSE. See the GNU General Public        //
+// License for more details.                             //
+//                                                       //
+// You should have received a copy of the GNU General    //
+// Public License along with this program; if not,       //
+// write to the Free Software Foundation, Inc.,          //
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307,   //
+// USA.                                                  //
+//                                                       //
+//-------------------------------------------------------//
+//                                                       //
+//    e-mail:     oconrad at saga-gis.org                   //
+//                                                       //
+//    contact:    Olaf Conrad                            //
+//                Institute of Geography                 //
+//                University of Goettingen               //
+//                Goldschmidtstr. 5                      //
+//                37077 Goettingen                       //
+//                Germany                                //
+//                                                       //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+#include "ESRI_E00_Import.h"
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//						Import							 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+CESRI_E00_Import::CESRI_E00_Import(void)
+{
+	//-----------------------------------------------------
+	// 1. info_Table...
+
+	Set_Name	(_TL("Import ESRI E00 File"));
+
+	Set_Author		(SG_T("(c) 2004 by O.Conrad"));
+
+	Set_Description	(_TW(
+		"Import data sets from ESRI's E00 interchange format.\n\n"
+
+		"This import filter is based on the E00 format analysis of the GRASS GIS module "
+		"\'m.in.e00\' written by Michel J. Wurtz. Go to the "
+		"<a target=\"_blank\" href=\"http://grass.itc.it/\">GRASS GIS Hompage</a> "
+		"for more information.\n"
+
+		"The <a target=\"_blank\" href=\"http://avce00.maptools.org/e00compr/index.html\">\'E00Compr\' library</a> "
+		"written by Daniel Morissette has been used for e00 file access, so that "
+		"compressed e00 files also can be read.\n")
+	);
+
+
+	//-----------------------------------------------------
+	// 2. Parameters...
+
+	Parameters.Add_Grid_Output(
+		NULL	, "GRID"	, _TL("Grid"),
+		_TL("")
+	);
+
+	Parameters.Add_Shapes_Output(
+		NULL	, "ARCS"	, _TL("Arcs"),
+		_TL("")
+	);
+
+	Parameters.Add_Shapes_Output(
+		NULL	, "SITES"	, _TL("Sites"),
+		_TL("")
+	);
+
+	Parameters.Add_Shapes_Output(
+		NULL	, "LABELS"	, _TL("Labels"),
+		_TL("")
+	);
+
+	Parameters.Add_Shapes_Output(
+		NULL	, "BND"		, _TL("Boundary"),
+		_TL("")
+	);
+
+	Parameters.Add_Shapes_Output(
+		NULL	, "TIC"		, _TL("Tick Points"),
+		_TL("")
+	);
+
+	Parameters.Add_Table_Output(
+		NULL	, "TABLE"	, _TL("Table"),
+		_TL("")
+	);
+
+	Parameters.Add_FilePath(
+		NULL	, "FILE"	, _TL("File"),
+		_TL(""),
+		_TL("ESRI E00 Files|*.e00;*.e0*|All Files|*.*")
+	);
+}
+
+//---------------------------------------------------------
+CESRI_E00_Import::~CESRI_E00_Import(void)
+{}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+bool CESRI_E00_Import::On_Execute(void)
+{
+	bool	bResult;
+
+	bResult		= false;
+	hReadPtr	= NULL;
+
+	if( Open(Parameters("FILE")->asString()) )
+	{
+		bResult	= Load();
+	}
+
+	if( hReadPtr )
+	{
+		E00ReadClose(hReadPtr);
+	}
+
+	return( bResult );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+bool CESRI_E00_Import::E00GotoLine(int iLine)
+{
+	if( hReadPtr )
+	{
+		E00ReadRewind(hReadPtr);
+
+		while( E00ReadNextLine(hReadPtr) && hReadPtr->nInputLineNo != iLine );
+
+		return( hReadPtr->nInputLineNo == iLine );
+	}
+
+	return( false );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+bool CESRI_E00_Import::Open(const SG_Char *FileName)
+{
+	const char	*Line;
+
+	//-----------------------------------------------------
+	if( FileName == NULL || (hReadPtr = E00ReadOpen(CSG_String(FileName).b_str())) == NULL )
+	{
+		Error_Set(CSG_String::Format(_TL("%s - not found\n"), FileName));
+
+		return( false );
+	}
+
+	//-----------------------------------------------------
+	if( (Line = E00ReadNextLine(hReadPtr)) == NULL )
+	{
+		Error_Set(CSG_String::Format(_TL("\"%s\" is not an Arc-info_Table Export file !\n"), FileName));
+
+		return( false );
+	}
+
+	//-----------------------------------------------------
+	if( strncmp(Line, "EXP", 3) )
+	{
+		Error_Set(CSG_String::Format(_TL("\"%s\" is not an Arc-info_Table Export file !\n"), FileName));
+
+		return( false );
+	}
+
+	//-----------------------------------------------------
+	e00_Name	= FileName;
+
+	return( true );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+bool CESRI_E00_Import::Load(void)
+{
+	const char	*line;
+
+	int			prec_grd, prec_arc, prec_lab, prec_pal;
+
+	long		current_line,
+				offset_grd	= 0,
+				offset_arc	= 0,
+				offset_lab	= 0,
+				offset_pal	= 0;
+
+	double		scale		= 1.0;
+
+	TSG_Shape_Type	shape_type;
+
+	CSG_Grid		*pGrid;
+
+	CSG_Shapes		*pShapes;
+
+	//-----------------------------------------------------
+	pPAT	= NULL;
+	pAAT	= NULL;
+
+	//-----------------------------------------------------
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOS", 3) )
+	{
+		current_line = hReadPtr->nInputLineNo;
+
+		// GRID SECTION
+		if( !strncmp(line, "GRD  ", 5) )
+		{
+			offset_grd	= current_line;
+			prec_grd	= line[5] - '2';
+			skip("EOG");
+			continue;
+		}
+
+		// ARC SECTION
+		if( !strncmp(line, "ARC  ", 5) )
+		{
+			offset_arc	= current_line;
+			prec_arc	= line[5] - '2';
+			skip_arc(prec_arc);
+			continue;
+		}
+
+		// POLYGON TOPOLOGY
+		if(	!strncmp(line, "PAL  ", 5)
+		||	!strncmp(line, "PFF  ", 5)	)
+		{
+			offset_pal	= current_line;
+			prec_pal	= line[5] - '2';
+			skip_pal(prec_pal);
+			continue;
+		}
+
+		// CENTROID SECTION
+		if( !strncmp(line, "CNT  ", 5) )
+		{
+			skip_dat();
+			continue;
+		}
+
+		// LABEL SECTION
+		if( !strncmp(line, "LAB  ", 5))
+		{
+			offset_lab	= current_line;
+			prec_lab	= line[5] - '2';
+			skip_lab(prec_lab);
+			continue;
+		}
+
+		// INFO SECTION
+		if( !strncmp(line, "IFO  ", 5) )
+		{
+			info_Get_Tables();
+			continue;
+		}
+
+		// PROJECTION INFOS
+		if( !strncmp(line, "PRJ  ", 5) )
+		{
+			scale		= getproj();
+			continue;
+		}
+
+		// Annotations (text). To be imported ? Does anybody have an idea ?
+		if( !strncmp(line, "TXT  ", 5) )
+		{
+			skip_txt(line[5] - '2');
+			continue;
+		}
+
+		// Mask description ? Noting to do with it
+		if( !strncmp(line, "MSK  ", 5) )
+		{
+			skip_msk();
+			continue;
+		}
+
+		// TOLERANCE SECTION. Should we really use it ?
+		if( !strncmp(line, "TOL  ", 5) )
+		{
+			skip_dat();
+			continue;
+		}
+
+		// UNKNOW KEYWORD SECTION. Don't know what to do with. Does anybody have an idea?
+		if( !strncmp(line, "LNK  ", 5) )
+		{
+			skip("END OF LINK DATA");
+			continue;
+		}
+
+		// SPATIAL INDEX SECTION. Noting to do with it
+		if( !strncmp(line, "SIN  ", 5) )
+		{
+			skip("EOX");
+			continue;
+		}
+
+		// Line pattern and palette. Shade pattern and palette end same as e00 archive !
+		if(	!strncmp(line, "CLN  ", 5)
+		||	!strncmp(line, "CSH  ", 5)	)
+		{
+			skip("EOS");
+			continue;
+		}
+
+		// Font description ? Noting to do with it
+		if( !strncmp(line, "FNT  ", 5) )
+		{
+			skip("EOF");
+			continue;
+		}
+
+		// PLOT SECTION. Why should we import it ?
+		if( !strncmp(line, "PLT  ", 5) )
+		{
+			skip("EOP");
+			continue;
+		}
+
+		// LOG SECTION. Nothing to do with it
+		if( !strncmp(line, "LOG  ", 5) )
+		{
+			skip("EOL");
+			continue;
+		}
+
+		if(	!strncmp(line, "RPL  ", 5)		// Specific to regions. Contains PAL formated data for each subclass
+		||	!strncmp(line, "RXP  ", 5)		// Specific to regions. Seems to link regions IDs to PAL polygons IDs
+		||	!strncmp(line, "TX6  ", 5)		// Other kind of annotations not same termination. Other differences ?
+		||	!strncmp(line, "TX7  ", 5)	)	// Very close from TX6. So same questions and same rules...
+		{
+			skip("JABBERWOCKY");
+			continue;
+		}
+	}
+
+	//-----------------------------------------------------
+	switch( pPAT ? (pAAT ? 3 : 2) : (pAAT ? 1 : 0) )
+	{
+	case 0: default:
+		shape_type	= offset_arc != 0 ? SHAPE_TYPE_Line : SHAPE_TYPE_Point;
+		break;
+
+	case 1:	// pAAT
+		shape_type	= SHAPE_TYPE_Line;
+		break;
+
+	case 2:	// pPAT
+		shape_type	= offset_arc != 0 ? SHAPE_TYPE_Polygon : SHAPE_TYPE_Point;
+		break;
+
+	case 3:	// pAAT && pPAT
+		shape_type	= offset_pal != 0 || offset_lab != 0 ? SHAPE_TYPE_Polygon : SHAPE_TYPE_Line;
+		break;
+	}
+
+	//-----------------------------------------------------
+	// Extracting useful information as noted before...
+
+	//-----------------------------------------------------
+	if( offset_grd > 0 )
+	{
+		E00GotoLine(offset_grd);
+
+		if( (pGrid = getraster	(prec_grd, scale)) != NULL )
+		{
+			pGrid->Set_Name(e00_Name);
+
+			Parameters("GRID")->Set_Value(pGrid);
+		}
+	}
+
+	//-----------------------------------------------------
+	if( offset_arc != 0 )
+	{
+		E00GotoLine(offset_arc);
+
+		if( (pShapes = getarcs	(prec_arc, scale, shape_type)) != NULL )
+		{
+			pShapes->Set_Name(e00_Name);
+
+			Parameters("ARCS")->Set_Value(pShapes);
+		}
+	}
+
+	//-----------------------------------------------------
+	if( offset_lab != 0 && shape_type == SHAPE_TYPE_Point )
+	{
+		E00GotoLine(offset_lab);
+
+		if( (pShapes = getsites	(prec_lab, scale)) != NULL )
+		{
+			pShapes->Set_Name(e00_Name);
+
+			Parameters("SITES")->Set_Value(pShapes);
+		}
+	}
+
+	//-----------------------------------------------------
+	if( offset_lab != 0 && shape_type != SHAPE_TYPE_Point )
+	{
+		E00GotoLine(offset_lab);
+
+		if( (pShapes = getlabels(prec_lab, scale)) != NULL )
+		{
+			pShapes->Set_Name(e00_Name);
+
+			Parameters("LABELS")->Set_Value(pShapes);
+		}
+	}
+
+	//-----------------------------------------------------
+	return( true );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//						Grid							 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+CSG_Grid * CESRI_E00_Import::getraster(int prec, double scale)
+{
+	const char	*line;
+
+	int		x, y, ix;
+	long	rows, cols, depth, p[5];
+	float	f[5];
+	double	xres, yres, xmin, ymin, xmax, ymax, nul_val, d[3];
+	CSG_Grid	*pGrid;
+
+	//-----------------------------------------------------
+	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
+		return( NULL );
+//	sscanf(line, "%ld%ld%ld", &cols, &rows, &depth, &nul_val);
+	sscanf(line, "%ld%ld%ld%lf", &cols, &rows, &depth, &nul_val);
+
+	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
+		return( NULL );
+	sscanf(line, "%lf%lf", &xres, &yres);
+
+	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
+		return( NULL );
+	sscanf(line, "%lf%lf", &xmin, &ymin);
+
+	if( (line = E00ReadNextLine(hReadPtr)) == NULL )
+		return( NULL );
+	sscanf(line, "%lf%lf", &xmax, &ymax);
+
+	xmax	= xmax * scale;
+	xmin	= xmin * scale;
+	ymax	= ymax * scale;
+	ymin	= ymin * scale;
+	xres	= xres * scale;
+	yres	= yres * scale;
+
+	xmin	+= xres / 2.0;	// SAGA treats xmin/ymin as "pixel-as-point" and not as "pixel-as-area"
+	ymin	+= yres / 2.0;
+
+	if( depth == 2 && prec )
+	{
+		depth	= 3;
+	}
+
+	//-----------------------------------------------------
+	switch( depth )
+	{
+	default:
+		pGrid	= NULL;
+		break;
+
+	//-----------------------------------------------------
+	case 1:
+		pGrid	= SG_Create_Grid(SG_DATATYPE_Int, cols, rows, xres, xmin, ymin);
+		pGrid->Set_NoData_Value(nul_val);
+
+		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
+		{
+			for(x=0; x<cols; x+= 5)
+			{
+				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+				{
+					sscanf(line, "%ld%ld%ld%ld%ld", p, p+1, p+2, p+3, p+4);
+
+					for(ix=0; ix<5 && x+ix<cols; ix++)
+					{
+						pGrid->Set_Value(x + ix, y, p[ix]);
+					}
+				}
+			}
+		}
+		break;
+
+	//-----------------------------------------------------
+	case 2:
+		pGrid	= SG_Create_Grid(SG_DATATYPE_Float, cols, rows, xres, xmin, ymin);
+		pGrid->Set_NoData_Value(nul_val);
+
+		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
+		{
+			for(x=0; x<cols; x+= 5)
+			{
+				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+				{
+					sscanf(line, "%f%f%f%f%f", f, f+1, f+2, f+3, f+4);
+
+					for(ix=0; ix<5 && x+ix<cols; ix++)
+					{
+						pGrid->Set_Value(x + ix, y, f[ix]);
+					}
+				}
+			}
+		}
+		break;
+
+	//-----------------------------------------------------
+	case 3:
+		pGrid	= SG_Create_Grid(SG_DATATYPE_Double, cols, rows, xres, xmin, ymin);
+		pGrid->Set_NoData_Value(nul_val);
+
+		for(y=0; y<rows && line && Set_Progress(y, rows); y++)
+		{
+			for(x=0; x<cols; x+= 3)
+			{
+				if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+				{
+					sscanf(line, "%lf%lf%lf", d, d+1, d+2);
+
+					for(ix=0; ix<3 && x+ix<cols; ix++)
+					{
+						pGrid->Set_Value(x + ix, y, d[ix]);
+					}
+				}
+			}
+		}
+		break;
+	}
+
+	//-----------------------------------------------------
+	skip("EOG");
+
+	return( pGrid );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+#define ARC_FNODE	2
+#define ARC_TNODE	3
+#define ARC_LPOL	4
+#define ARC_RPOL	5
+
+//---------------------------------------------------------
+CSG_Shapes * CESRI_E00_Import::getarcs(int prec, double scale, TSG_Shape_Type &shape_type)
+{
+	const char	*line;
+
+	int		covnum, cov_id, fnode, tnode, lpol, rpol, nPoints, iPoint;
+	double	x_buf[2], y_buf[2];
+	CSG_Shape	*pShape;
+	CSG_Shapes	*pShapes;
+
+	//-----------------------------------------------------
+	pShapes	= SG_Create_Shapes(shape_type);
+	pShapes->Add_Field("ID"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("ID#"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("FNODE"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("TNODE"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("LPOL"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("RPOL"	, SG_DATATYPE_Int);
+
+	Set_Progress(0, 100);
+
+	//-----------------------------------------------------
+	do
+	{
+		Process_Set_Text(CSG_String::Format(SG_T("Loaded arcs: %d"), pShapes->Get_Count()));
+
+		if( (line = E00ReadNextLine(hReadPtr)) == NULL )
+		{
+			covnum	= -1;
+		}
+		else
+		{
+			sscanf(line, "%d %d %d %d %d %d %d", &covnum, &cov_id, &fnode, &tnode, &lpol, &rpol, &nPoints);
+		}
+
+		if( covnum != -1 )
+		{
+			pShape	= pShapes->Add_Shape();
+
+			pShape->Set_Value(0			, covnum);
+			pShape->Set_Value(1			, cov_id);
+			pShape->Set_Value(ARC_FNODE	, fnode);
+			pShape->Set_Value(ARC_TNODE	, tnode);
+			pShape->Set_Value(ARC_LPOL	, lpol);
+			pShape->Set_Value(ARC_RPOL	, rpol);
+
+			//---------------------------------------------
+			if( prec )	// double precision : 1 coord pair / line
+			{
+				for(iPoint=0; iPoint<nPoints && line; iPoint++)
+				{
+					if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+					{
+						sscanf(line, "%lf %lf", x_buf, y_buf);
+
+						pShape->Add_Point(x_buf[0] * scale, y_buf[0] * scale);
+					}
+				}
+			}
+
+			//---------------------------------------------
+			else		// single precision : 2 x,y pairs / line
+			{
+				for(iPoint=0; iPoint<nPoints && line; iPoint+=2)
+				{
+					if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+					{
+						sscanf(line, "%lf %lf %lf %lf", x_buf, y_buf, x_buf + 1, y_buf + 1);
+
+						pShape->Add_Point(x_buf[0] * scale, y_buf[0] * scale);
+
+						if( iPoint + 1 < nPoints )
+						{
+							pShape->Add_Point(x_buf[1] * scale, y_buf[1] * scale);
+						}
+					}
+				}
+			}
+		}
+	}
+	while( covnum != -1 && line && Process_Get_Okay(false) );
+
+	//-----------------------------------------------------
+	if( pShapes->Get_Count() == 0 )
+	{
+		delete(pShapes);
+
+		shape_type	= SHAPE_TYPE_Point;
+
+		return( NULL );
+	}
+
+	if( shape_type == SHAPE_TYPE_Polygon )
+	{
+		pShapes	= Arcs2Polygons(pShapes);
+
+		Assign_Attributes(pShapes);
+	}
+
+	return( pShapes );
+}
+
+//---------------------------------------------------------
+CSG_Shapes * CESRI_E00_Import::Arcs2Polygons(CSG_Shapes *pArcs)
+{
+	int			iArc, nArcs, id;
+	CSG_Shapes	*pPolygons;
+
+	//-----------------------------------------------------
+	Process_Set_Text(_TL("Arcs to polygons"));
+
+	pPolygons	= SG_Create_Shapes(SHAPE_TYPE_Polygon);
+	pPolygons->Add_Field("ID", SG_DATATYPE_Int);
+
+	nArcs		= pArcs->Get_Count();
+
+	//-----------------------------------------------------
+	while( (iArc = pArcs->Get_Count() - 1) >= 0 && Set_Progress(nArcs - iArc - 1, nArcs) )
+	{
+		id	= pArcs->Get_Shape(iArc)->asInt(ARC_LPOL);
+
+		if( id == pArcs->Get_Shape(iArc)->asInt(ARC_RPOL) )
+		{
+			pArcs->Del_Shape(iArc);
+		}
+		else if( id > 1 )
+		{
+			Arcs2Polygon(pArcs, pPolygons, id);
+		}
+
+		if( (iArc = pArcs->Get_Count() - 1) >= 0 )
+		{
+			id	= pArcs->Get_Shape(iArc)->asInt(ARC_RPOL);
+
+			if( id > 1 )
+			{
+				Arcs2Polygon(pArcs, pPolygons, id);
+			}
+		}
+	}
+
+	//-----------------------------------------------------
+	delete( pArcs );
+
+	return( pPolygons );
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::Arcs2Polygon(CSG_Shapes *pArcs, CSG_Shapes *pPolygons, int id)
+{
+	int		iShape, iPart, iPoint, iNode;
+	CSG_Shape	*pArc, *pShape;
+	CSG_Shapes	Arcs;
+
+	//-----------------------------------------------------
+	Arcs.Create(SHAPE_TYPE_Line);
+	Arcs.Add_Field("FROM_NODE", SG_DATATYPE_Int);
+	Arcs.Add_Field("TO___NODE", SG_DATATYPE_Int);
+
+	//-----------------------------------------------------
+	for(iShape=pArcs->Get_Count()-1; iShape>=0; iShape--)
+	{
+		pShape	= pArcs->Get_Shape(iShape);
+
+		if( id == pShape->asInt(ARC_LPOL) )
+		{
+			pArc	= Arcs.Add_Shape();
+			pArc->Set_Value(0, pShape->asInt(ARC_FNODE));
+			pArc->Set_Value(1, pShape->asInt(ARC_TNODE));
+
+			for(iPoint=0; iPoint<pShape->Get_Point_Count(0); iPoint++)
+			{
+				pArc->Add_Point(pShape->Get_Point(iPoint, 0), 0);
+			}
+
+			if( pShape->asInt(ARC_RPOL) <= 1 )
+			{
+				pArcs->Del_Shape(iShape);
+			}
+			else
+			{
+				pShape->Set_Value(ARC_LPOL, 1);
+			}
+		}
+		else if( id == pShape->asInt(ARC_RPOL) )
+		{
+			pArc	= Arcs.Add_Shape();
+			pArc->Set_Value(1, pShape->asInt(ARC_FNODE));
+			pArc->Set_Value(0, pShape->asInt(ARC_TNODE));
+
+			for(iPoint=pShape->Get_Point_Count(0)-1; iPoint>=0; iPoint--)
+			{
+				pArc->Add_Point(pShape->Get_Point(iPoint, 0), 0);
+			}
+
+			if( pShape->asInt(ARC_LPOL) <= 1 )
+			{
+				pArcs->Del_Shape(iShape);
+			}
+			else
+			{
+				pShape->Set_Value(ARC_RPOL, 1);
+			}
+		}
+	}
+
+	//-----------------------------------------------------
+	if( Arcs.Get_Count() > 0 )
+	{
+		iPart	= 0;
+		pShape	= pPolygons->Add_Shape();
+		pShape->Set_Value(0, id);
+
+		do
+		{
+			pArc	= Arcs.Get_Shape(0);
+
+			while( pArc )
+			{
+				for(iPoint=0; iPoint<pArc->Get_Point_Count(0); iPoint++)
+				{
+					pShape->Add_Point(pArc->Get_Point(iPoint, 0), iPart);
+				}
+
+				iNode	= pArc->asInt(1);
+				Arcs.Del_Shape(pArc);
+
+				for(iShape=0, pArc=NULL; iShape<Arcs.Get_Count() && !pArc; iShape++)
+				{
+					if( iNode == Arcs.Get_Shape(iShape)->asInt(0) )
+					{
+						pArc	= Arcs.Get_Shape(iShape);
+					}
+				}
+			}
+
+			iPart++;
+		}
+		while( Arcs.Get_Count() > 0 );
+	}
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+CSG_Shapes * CESRI_E00_Import::getlabels(int prec, double scale)	// shape_type: LINE or AREA
+{
+	const char	*line;
+
+	int		num, id;	// coverage-# and coverage-ID
+	double	x, y;
+	CSG_Shapes	*pShapes;
+	CSG_Shape	*pShape;
+
+	pShapes	= SG_Create_Shapes(SHAPE_TYPE_Point);
+
+	pShapes->Add_Field("ID#"	, SG_DATATYPE_Int);
+	pShapes->Add_Field("ID"	, SG_DATATYPE_Int);
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%d %d %lf %lf", &id, &num, &x, &y);
+
+		if( id == -1 )
+		{
+			break;
+		}
+		else
+		{
+			pShape	= pShapes->Add_Shape();
+
+			pShape->Add_Point(x * scale, y * scale);
+
+			pShape->Set_Value(0, num);
+			pShape->Set_Value(1, id);
+
+			//---------------------------------------------
+			E00ReadNextLine(hReadPtr);		// 4 values to skip
+
+			if( prec )
+			{
+				E00ReadNextLine(hReadPtr);	// on 2nd line when double precision
+			}
+		}
+	}
+
+	if( pShapes->Get_Count() <= 0 )
+	{
+		delete( pShapes );
+		pShapes	= NULL;
+	}
+
+	return( pShapes );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+CSG_Shapes * CESRI_E00_Import::getsites(int prec, double scale)
+{
+	const char	*line;
+
+	int		id;
+	double	x, y;
+	CSG_Shape	*pShape;
+	CSG_Shapes	*pShapes;
+
+	pShapes	= SG_Create_Shapes(SHAPE_TYPE_Point);
+	pShapes->Add_Field("ID", SG_DATATYPE_Int);
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%d %*d %lf %lf", &id, &x, &y);
+
+		if( id == -1 )
+		{
+			break;
+		}
+
+		pShape	= pShapes->Add_Shape();
+
+		pShape->Add_Point(x * scale, y * scale);
+		pShape->Set_Value(0, id);
+
+		//-------------------------------------------------
+		E00ReadNextLine(hReadPtr);		// 4 values to skip
+
+		if( prec )
+		{
+			E00ReadNextLine(hReadPtr);	// on 2nd line when double precision
+		}
+	}
+
+	if( pShapes->Get_Count() <= 0 )
+	{
+		delete( pShapes );
+		pShapes	= NULL;
+	}
+	else
+	{
+		Assign_Attributes(pShapes);
+	}
+
+	return( pShapes );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+double CESRI_E00_Import::getproj(void)
+{
+	const char	*line;
+
+	double	scale	= 1.0;
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOP", 3) )
+	{
+		if( !strncmp(line, "Units", 5) )
+		{
+			sscanf(line + 6, "%lf", &scale);
+		}
+	}
+
+	scale	= 1.0 / scale;
+
+	return( scale );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//						info section					 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+struct info_Field
+{
+	char				Name[18];	// name of item
+
+	int					Position,	// position in data line
+						Size,		// size for reading
+						Type;		// type of data
+};
+
+//---------------------------------------------------------
+struct info_Table
+{
+	char				Name[34],
+						AI[4];		// XX if Arc/info file, spaces otherwise
+
+	int					uFields,	// number of usable items in this table
+						nFields,	// number of items in this table
+						ldr;		// length of data record
+
+	long				nRecords,	// number of data records
+						length;		// total length for one data line
+
+	struct info_Field	*Field;		// One per field...
+};
+
+//---------------------------------------------------------
+// [06.06.2006] ESRI E00 Import crash fix, James Flemer
+int CESRI_E00_Import::info_Get_Tables(void)
+{
+	const char *line;
+
+	char				tmp[12], *p;
+	int					i;
+	CSG_String			s;
+	CSG_Table				*pTable;
+	struct info_Table	info;
+
+	//-----------------------------------------------------
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, "EOI", 3) )
+	{
+		strncpy(info.Name, line, 32);
+		info.Name[32]	= 0;
+		p	= strchr(info.Name, ' ');
+		if( p != NULL )
+			*p	= 0;
+		p	= strchr(info.Name, '.');
+		if( p == 0 )
+			p	= info.Name;
+		else
+			p++;
+		s	= p;
+
+		strncpy(info.AI	, line + 32,  2);	info.AI[2]	= 0;
+		strncpy(tmp		, line + 34,  4);	tmp[ 4]		= 0;	info.uFields	= atoi(tmp);
+		strncpy(tmp		, line + 38,  4);	tmp[ 4]		= 0;	info.nFields	= atoi(tmp);
+		strncpy(tmp		, line + 42,  4);	tmp[ 4]		= 0;	info.ldr		= atoi(tmp);
+		strncpy(tmp		, line + 46, 11);	tmp[11]		= 0;	info.nRecords	= atol(tmp);
+
+		info.length	= 0;
+		info.Field	= (struct info_Field *)malloc(info.nFields * sizeof(struct info_Field));
+
+		//---------------------------------------------
+		for(i=0; i<info.nFields; i++)
+		{
+			if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+			{
+				sscanf(line, "%16s", info.Field[i].Name);
+				info.Field[i].Size	= atoi(&line[16]);
+				info.Field[i].Type	= atoi(&line[34]);
+			}
+
+			//---------------------------------------------
+			switch( info.Field[i].Type )
+			{
+			case 60:	// float / double
+				info.Field[i].Size = info.Field[i].Size == 4 ? 14 : 24;
+				break;
+
+			case 50:	// short / long
+				info.Field[i].Size = info.Field[i].Size == 2 ?  6 : 11;
+				break;
+
+			case 40:	// float
+				info.Field[i].Size = 14;
+				break;
+
+			case 10:
+				info.Field[i].Size = 8;
+				break;
+
+			default:	// string
+				break;
+			}
+
+			if( i < info.uFields )
+			{
+				info.length			+= info.Field[i].Size;
+			}
+
+			if( i == 0 )
+			{
+				info.Field[i].Position	= 0;
+			}
+			else
+			{
+				info.Field[i].Position	= info.Field[i-1].Position + info.Field[i-1].Size;
+			}
+		}
+
+		//---------------------------------------------
+		pTable	= NULL;
+
+		if     ( !s.CmpNoCase(SG_T("aat")) && pAAT == NULL )
+		{
+			pTable	= pAAT	= info_Get_Table(info);
+		}
+		else if( !s.CmpNoCase(SG_T("pat")) && pPAT == NULL )
+		{
+			pTable	= pPAT	= info_Get_Table(info);
+		}
+	//	else if( !s.CmpNoCase("vat") )		// value table (grid)
+	//	else if( !s.CmpNoCase("bnd") )		// coverage boundaries
+	//	else if( !s.CmpNoCase("tic") )		// tick marks
+	//	else if( !s.CmpNoCase("sta") )		// stats on grid
+	//	else if( !s.CmpNoCase("lut") )		// look-up table
+	//	else if( !s.CmpNoCase("acode") )	// arc attributes
+	//	else if( !s.CmpNoCase("pcode") )	// polygon attributes
+	//	else								// non graphic tables
+		else	// come on, let's get every table we can get...
+		{
+			pTable	= info_Get_Table(info);
+		}
+
+		//-------------------------------------------------
+		free(info.Field);
+
+		if( pTable )
+		{
+			CSG_Table_Record	*pRecord;
+			CSG_Shape			*pShape;
+			CSG_Shapes			*pBND, *pTIC;
+
+			if     ( !s.CmpNoCase(SG_T("bnd")) )	// coverage boundaries
+			{
+				pBND	= SG_Create_Shapes(SHAPE_TYPE_Polygon, SG_T("Boundary"));
+				pBND->Add_Field("XMIN", SG_DATATYPE_Double);
+				pBND->Add_Field("YMIN", SG_DATATYPE_Double);
+				pBND->Add_Field("XMAX", SG_DATATYPE_Double);
+				pBND->Add_Field("YMAX", SG_DATATYPE_Double);
+				pRecord	= pTable->Get_Record(0);
+				pShape	= pBND->Add_Shape();
+				pShape->Set_Value(0, pRecord->asDouble(0));
+				pShape->Set_Value(1, pRecord->asDouble(1));
+				pShape->Set_Value(2, pRecord->asDouble(2));
+				pShape->Set_Value(3, pRecord->asDouble(3));
+				pShape->Add_Point(pRecord->asDouble(0), pRecord->asDouble(1));
+				pShape->Add_Point(pRecord->asDouble(0), pRecord->asDouble(3));
+				pShape->Add_Point(pRecord->asDouble(2), pRecord->asDouble(3));
+				pShape->Add_Point(pRecord->asDouble(2), pRecord->asDouble(1));
+				Parameters("BND")->Set_Value(pBND);
+				delete(pTable);
+			}
+			else if( !s.CmpNoCase(SG_T("tic")) )	// tick marks
+			{
+				pTIC	= SG_Create_Shapes(SHAPE_TYPE_Point, SG_T("Tick Points"));
+				pTIC->Add_Field("ID", SG_DATATYPE_Int);
+				pTIC->Add_Field("X" , SG_DATATYPE_Double);
+				pTIC->Add_Field("Y" , SG_DATATYPE_Double);
+				for(i=0; i<pTable->Get_Record_Count(); i++)
+				{
+					pRecord	= pTable->Get_Record(i);
+					pShape	= pTIC->Add_Shape();
+					pShape->Set_Value(0, pRecord->asInt   (0));
+					pShape->Set_Value(1, pRecord->asDouble(1));
+					pShape->Set_Value(2, pRecord->asDouble(2));
+					pShape->Add_Point(pRecord->asDouble(1), pRecord->asDouble(2));
+				}
+				Parameters("TIC")->Set_Value(pTIC);
+				delete(pTable);
+			}
+			else
+			{
+				Parameters("TABLE")->Set_Value(pTable);
+			}
+		}
+	}
+
+	//-----------------------------------------------------
+	// 0 if none, 1 if AAT, 2 if PAT, 3 if both
+	return( pPAT ? (pAAT ? 3 : 2) : (pAAT ? 1 : 0) );
+}
+
+//---------------------------------------------------------
+CSG_Table * CESRI_E00_Import::info_Get_Table(struct info_Table info)
+{
+	char			*buffer_record, *buffer_item;
+	int				iRecord, iField;
+	CSG_Table			*pTable;
+	CSG_Table_Record	*pRecord;
+
+	//-----------------------------------------------------
+	Process_Set_Text(CSG_String(info.Name));
+
+	buffer_record	= (char *)malloc(info.length + 3);
+	buffer_item		= (char *)malloc(info.length + 3);
+
+	pTable			= SG_Create_Table();
+	pTable->Set_Name(CSG_String(info.Name));
+
+	//-----------------------------------------------------
+	for(iField=0; iField<info.uFields; iField++)
+	{
+		switch( info.Field[iField].Type )
+		{
+		case 60:	// float / double
+			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Double);
+			break;
+
+		case 50:	// short / long
+			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Int);
+			break;
+
+		case 40:	// float
+			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Double);
+			break;
+
+		case 10:	// short
+			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_Int);
+			break;
+
+		default:	// string
+			pTable->Add_Field(info.Field[iField].Name, SG_DATATYPE_String);
+			break;
+		}
+	}
+
+	//-----------------------------------------------------
+	for(iRecord=0; iRecord<info.nRecords && Set_Progress(iRecord, info.nRecords); iRecord++)
+	{
+		info_Get_Record(buffer_record, info.length);
+
+		pRecord	= pTable->Add_Record();
+
+		for(iField=0; iField<info.uFields; iField++)
+		{
+			strncpy(buffer_item, &buffer_record[info.Field[iField].Position], info.Field[iField].Size);
+			buffer_item[info.Field[iField].Size] = 0;
+
+			switch( pTable->Get_Field_Type(iField) )
+			{
+			default:
+				pRecord->Set_Value(iField, atof(buffer_item));
+				break;
+
+			case SG_DATATYPE_Int:
+				pRecord->Set_Value(iField, atoi(buffer_item));
+				break;
+
+			case SG_DATATYPE_String:
+				pRecord->Set_Value(iField, CSG_String(buffer_item));
+				break;
+			}
+		}
+	}
+
+	//-----------------------------------------------------
+	free(buffer_record);
+	free(buffer_item);
+
+	return( pTable );
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::info_Skip_Table(struct info_Table info)
+{
+	char	*buffer_record;
+	int		iRecord;
+
+	buffer_record	= (char *)malloc(info.length + 3);
+
+	for(iRecord=0; iRecord<info.nRecords; iRecord++)
+	{
+		info_Get_Record(buffer_record, info.length);
+	}
+
+	free(buffer_record);
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::info_Get_Record(char *buffer, int buffer_length)
+{
+	const char *line;
+
+	char	*p;
+	int		l;
+
+	//-----------------------------------------------------
+	p	= buffer;
+	l	= 0;
+
+	//-----------------------------------------------------
+	if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		strncpy(buffer, line, buffer_length < 84 ? buffer_length : 84);
+
+		while( l < buffer_length )
+		{
+			if( *p =='\r' || *p == '\n' || *p == 0 )
+			{
+				while( (l % 80 || p == buffer) && l < buffer_length )
+				{
+					l++;
+					*p++	= ' ';
+				}
+
+				if( l == buffer_length )
+				{
+					break;
+				}
+				else if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+				{
+					strncpy(p, line, buffer_length - l < 84 ? buffer_length - l : 84);
+
+					if( *p =='\r' || *p == '\n' || *p == 0 )	// if empty line
+					{
+						l++;
+						*p++	= ' ';
+						*p		= 0;
+					}
+				}
+			}
+			else
+			{
+				l++;
+				p++;
+			}
+		}
+
+		*p	= 0;
+	}
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//						Skips							 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+bool CESRI_E00_Import::Assign_Attributes(CSG_Shapes *pShapes)
+{
+	int				iShape, iRecord, iField, oField, id;
+	CSG_Table_Record	*pRec;
+	CSG_Shape			*pShape;
+
+	if( pShapes && pShapes->Get_Field_Count() > 0 && pPAT && pPAT->Get_Field_Count() > 2 )
+	{
+		Process_Set_Text(_TL("Assign attributes to shapes..."));
+
+		oField	= pShapes->Get_Field_Count();
+
+		for(iField=0; iField<pPAT->Get_Field_Count(); iField++)
+		{
+			pShapes->Add_Field(pPAT->Get_Field_Name(iField), pPAT->Get_Field_Type(iField));
+		}
+
+		for(iShape=0; iShape<pShapes->Get_Count() && Set_Progress(iShape, pShapes->Get_Count()); iShape++)
+		{
+			pShape	= pShapes->Get_Shape(iShape);
+			id		= pShape->asInt(0);
+
+			for(iRecord=0; iRecord<pPAT->Get_Record_Count(); iRecord++)
+			{
+				pRec	= pPAT->Get_Record(iRecord);
+
+				if( id == pRec->asInt(2) )
+				{
+					for(iField=0; iField<pPAT->Get_Field_Count(); iField++)
+					{
+						switch( pPAT->Get_Field_Type(iField) )
+						{
+						case SG_DATATYPE_String:
+							pShape->Set_Value(oField + iField, pRec->asString(iField));
+							break;
+
+						default:
+							pShape->Set_Value(oField + iField, pRec->asDouble(iField));
+							break;
+						}
+					}
+
+					break;
+				}
+			}
+
+		}
+
+		return( true );
+	}
+
+	return( false );
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//						Skips							 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip(char *end)
+{
+	const char	*line;
+
+	int		l	= strlen(end);
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL && strncmp(line, end, l) );
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_dat(void)
+{
+	const char	*line;
+
+	int		i	= 0;
+	
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL && i != -1 )
+	{
+		sscanf(line, "%d", &i);
+	}
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_msk(void)
+{
+	const char	*line;
+
+	double	xmin, ymin, xmax, ymax, res, sk;
+	long	xsize, ysize, nskip;
+
+	if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%lf %lf %lf", &xmin, &ymin, &xmax);
+
+		if( (line = E00ReadNextLine(hReadPtr)) != NULL )
+		{
+			sscanf(line, "%lf %lf %ld %ld", &ymax, &res, &xsize, &ysize);
+
+			sk		= ((ymax - ymin) / res) * ((xmax - xmin) / res) / 32.0;
+			nskip	= (long)ceil(sk / 7.0);
+
+			while( nskip-- )
+			{
+				E00ReadNextLine(hReadPtr);
+			}
+		}
+	}
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_arc(int prec)
+{
+	const char	*line;
+
+	int		i, covnum, nPoints;
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%d %*d %*d %*d %*d %*d %d", &covnum, &nPoints);
+
+		if( covnum == -1 )
+			break;
+
+		if( prec == 0 )
+			nPoints	= (nPoints + 1) / 2;	// number of coordinate lines
+
+		for(i=0; i<nPoints; i++)
+		{
+			E00ReadNextLine(hReadPtr);
+		}
+	}
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_lab(int prec)
+{
+	const char	*line;
+
+	long	covid;
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%ld", &covid);
+
+		if( covid == -1 )
+			break;
+
+		E00ReadNextLine(hReadPtr);
+
+		if( prec )	// two lines of coordinates in double precision
+			E00ReadNextLine(hReadPtr);
+	}
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_pal(int prec)
+{
+	const char	*line;
+
+	int		i, narcs;
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf(line, "%d", &narcs);
+
+		if( prec )	// two lines of coordinates in double precision
+			E00ReadNextLine(hReadPtr);
+
+		if( narcs == -1 )
+			break;
+
+		for(i=(narcs+1)/2; i; i--)
+			E00ReadNextLine(hReadPtr);
+	}
+}
+
+//---------------------------------------------------------
+void CESRI_E00_Import::skip_txt(int prec)
+{
+	const char	*line;
+
+	int		i, n, nskip;
+
+	nskip	= prec ? 7 : 5;
+
+	while( (line = E00ReadNextLine(hReadPtr)) != NULL )
+	{
+		sscanf( line, "%d", &n);
+
+		if( n == -1 )
+			break;
+
+		for(i=0; i<nskip; i++)
+			E00ReadNextLine(hReadPtr);
+	}
+}
+
+
+///////////////////////////////////////////////////////////
+//														 //
+//														 //
+//														 //
+///////////////////////////////////////////////////////////
+
+//---------------------------------------------------------

-- 
Saga GIS



More information about the Pkg-grass-devel mailing list