?? ogrogdilayer.cpp
字號:
/****************************************************************************** * $Id: ogrogdilayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: OGDI Bridge * Purpose: Implements OGROGDILayer class. * Author: Daniel Morissette, danmo@videotron.ca * (Based on some code contributed by Frank Warmerdam :) * ****************************************************************************** * Copyright (c) 2000, Daniel Morissette * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * http://bugzilla.remotesensing.org/show_bug.cgi?id=372 * * Revision 1.6 2003/05/21 03:58:49 warmerda * expand tabs * * Revision 1.5 2001/07/18 04:55:16 warmerda * added CPL_CSVID * * Revision 1.4 2001/06/19 15:50:23 warmerda * added feature attribute query support * * Revision 1.3 2001/04/17 21:41:02 warmerda * Added use of cln_GetLayerCapabilities() to query list of available layers. * Restructured OGROGDIDataSource and OGROGDILayer classes somewhat to * avoid passing so much information in the layer creation call. Added support * for preserving text on OGDI text features. * * Revision 1.2 2000/08/30 01:36:57 danmo * Added GetSpatialRef() support * * Revision 1.1 2000/08/24 04:16:19 danmo * Initial revision * */#include "ogrogdi.h"#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrogdilayer.cpp 10646 2007-01-18 02:38:10Z warmerdam $");/************************************************************************//* OGROGDILayer() *//************************************************************************/OGROGDILayer::OGROGDILayer( OGROGDIDataSource *poODS, const char * pszName, ecs_Family eFamily ){ m_poODS = poODS; m_nClientID = m_poODS->GetClientID(); m_eFamily = eFamily; m_pszOGDILayerName = CPLStrdup(pszName); m_sFilterBounds = *(m_poODS->GetGlobalBounds()); m_iNextShapeId = 0; m_nTotalShapeCount = -1; m_poFeatureDefn = NULL; // Keep a reference on the SpatialRef (owned by the dataset). m_poSpatialRef = m_poODS->GetSpatialRef(); // Select layer and feature family. ResetReading(); BuildFeatureDefn();}/************************************************************************//* ~OGROGDILayer() *//************************************************************************/OGROGDILayer::~OGROGDILayer(){ if( m_nFeaturesRead > 0 && m_poFeatureDefn != NULL ) { CPLDebug( "OGDI", "%d features read on layer '%s'.", (int) m_nFeaturesRead, m_poFeatureDefn->GetName() ); } if (m_poFeatureDefn) m_poFeatureDefn->Release(); CPLFree(m_pszOGDILayerName); // Note: we do not delete m_poSpatialRef since it is owned by the dataset}/************************************************************************//* SetSpatialFilter() *//************************************************************************/void OGROGDILayer::SetSpatialFilter( OGRGeometry * poGeomIn ){ if( !InstallFilter( poGeomIn ) ) return; if( m_poFilterGeom != NULL ) { OGREnvelope oEnv; ecs_Result *psResult; m_poFilterGeom->getEnvelope(&oEnv); m_sFilterBounds.north = oEnv.MaxY; m_sFilterBounds.south = oEnv.MinY; m_sFilterBounds.east = oEnv.MinX; m_sFilterBounds.west = oEnv.MaxX; psResult = cln_SelectRegion( m_nClientID, &m_sFilterBounds); if( ECSERROR(psResult) ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", psResult->message ); return; } } m_iNextShapeId = 0; m_nTotalShapeCount = -1;}/************************************************************************//* ResetReading() *//************************************************************************/void OGROGDILayer::ResetReading(){ ecs_Result *psResult; ecs_LayerSelection sSelectionLayer; sSelectionLayer.Select = m_pszOGDILayerName; sSelectionLayer.F = m_eFamily; psResult = cln_SelectLayer(m_nClientID, &sSelectionLayer); if( ECSERROR( psResult ) ) { CPLError( CE_Failure, CPLE_AppDefined, "Access to layer '%s' Failed: \n", m_pszOGDILayerName, psResult->message ); return; } m_iNextShapeId = 0;}/************************************************************************//* GetNextFeature() *//************************************************************************/OGRFeature *OGROGDILayer::GetNextFeature(){ OGRFeature *poFeature=NULL; ecs_Result *psResult; int i;/* -------------------------------------------------------------------- *//* Retrieve object from OGDI server and create new feature *//* -------------------------------------------------------------------- */ TryAgain: psResult = cln_GetNextObject(m_nClientID); if (! ECSSUCCESS(psResult)) { // We probably reached EOF... keep track of shape count. m_nTotalShapeCount = m_iNextShapeId; return NULL; } poFeature = new OGRFeature(m_poFeatureDefn); poFeature->SetFID( m_iNextShapeId++ ); m_nFeaturesRead++;/* -------------------------------------------------------------------- *//* Process geometry *//* -------------------------------------------------------------------- */ if (m_eFamily == Point) { ecs_Point *psPoint = &(ECSGEOM(psResult).point); OGRPoint *poOGRPoint = new OGRPoint(psPoint->c.x, psPoint->c.y); poFeature->SetGeometryDirectly(poOGRPoint); } else if (m_eFamily == Line) { ecs_Line *psLine = &(ECSGEOM(psResult).line); OGRLineString *poOGRLine = new OGRLineString(); poOGRLine->setNumPoints( psLine->c.c_len ); for( i=0; i < (int) psLine->c.c_len; i++ ) { poOGRLine->setPoint(i, psLine->c.c_val[i].x, psLine->c.c_val[i].y); } poFeature->SetGeometryDirectly(poOGRLine); } else if (m_eFamily == Area) { ecs_Area *psArea = &(ECSGEOM(psResult).area); OGRPolygon *poOGRPolygon = new OGRPolygon(); for(int iRing=0; iRing < (int) psArea->ring.ring_len; iRing++) { ecs_FeatureRing *psRing = &(psArea->ring.ring_val[iRing]); OGRLinearRing *poOGRRing = new OGRLinearRing(); poOGRRing->setNumPoints( psRing->c.c_len ); for( i=0; i < (int) psRing->c.c_len; i++ ) { poOGRRing->setPoint(i, psRing->c.c_val[i].x, psRing->c.c_val[i].y); } poOGRPolygon->addRingDirectly(poOGRRing); } // __TODO__ // When OGR supports polygon centroids then we should carry them here poFeature->SetGeometryDirectly(poOGRPolygon); } else if (m_eFamily == Text) { // __TODO__ // For now text is treated as a point and string is lost // ecs_Text *psText = &(ECSGEOM(psResult).text); OGRPoint *poOGRPoint = new OGRPoint(psText->c.x, psText->c.y); poFeature->SetGeometryDirectly(poOGRPoint); } else { CPLAssert(FALSE); }/* -------------------------------------------------------------------- *//* Set attributes *//* -------------------------------------------------------------------- */ char *pszAttrList = ECSOBJECTATTR(psResult); for( int iField = 0; iField < m_poFeatureDefn->GetFieldCount(); iField++ ) { char *pszFieldStart;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -