?? ntf_estlayers.cpp
字號:
/****************************************************************************** * $Id: ntf_estlayers.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project: NTF Translator * Purpose: NTFFileReader methods related to establishing the schemas * of features that could occur in this product and the functions * for actually performing the NTFRecord to OGRFeature conversion. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * 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. ****************************************************************************/#include <stdarg.h>#include "ntf.h"#include "cpl_string.h"CPL_CVSID("$Id: ntf_estlayers.cpp 10646 2007-01-18 02:38:10Z warmerdam $");#define MAX_LINK 5000/************************************************************************//* TranslateCodePoint() *//* *//* Used for code point, and code point plus. *//************************************************************************/static OGRFeature *TranslateCodePoint( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_POINTREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POINT_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1])); // Attributes if( EQUAL(poLayer->GetLayerDefn()->GetName(),"CODE_POINT") ) poReader->ApplyAttributeValues( poFeature, papoGroup, "PC", 1, "PQ", 2, "PR", 3, "TP", 4, "DQ", 5, "RP", 6, "BP", 7, "PD", 8, "MP", 9, "UM", 10, "RV", 11, NULL ); else poReader->ApplyAttributeValues( poFeature, papoGroup, "PC", 1, "PQ", 2, "PR", 3, "TP", 4, "DQ", 5, "RP", 6, "BP", 7, "PD", 8, "MP", 9, "UM", 10, "RV", 11, "RH", 12, "LH", 13, "CC", 14, "DC", 15, "WC", 16, NULL ); return poFeature;}/************************************************************************//* TranslateAddressPoint() *//************************************************************************/static OGRFeature *TranslateAddressPoint( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_POINTREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POINT_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // CHG_TYPE poFeature->SetField( 17, papoGroup[0]->GetField( 22, 22 ) ); // CHG_DATE poFeature->SetField( 18, papoGroup[0]->GetField( 23, 28 ) ); // Geometry poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1])); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "OA", 1, "ON", 2, "DP", 3, "PB", 4, "SB", 5, "BD", 6, "BN", 7, "DR", 8, "TN", 9, "DD", 10, "DL", 11, "PT", 12, "CN", 13, "PC", 14, "SF", 15, "RV", 16, NULL ); return poFeature;}/************************************************************************//* TranslateOscarPoint() *//* *//* Used for OSCAR Traffic and Asset datasets. *//************************************************************************/static OGRFeature *TranslateOscarPoint( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_POINTREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POINT_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "JN", 4, "SN", 5, NULL ); return poFeature;}/************************************************************************//* TranslateOscarLine() *//************************************************************************/static OGRFeature *TranslateOscarLine( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_LINEREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // LINE_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "PN", 4, "LL", 5, "SC", 6, "FW", 7, "RN", 8, "TR", 9, NULL ); return poFeature;}/************************************************************************//* TranslateOscarRoutePoint() *//************************************************************************/static OGRFeature *TranslateOscarRoutePoint( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_POINTREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POINT_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "JN", 4, "SN", 5, "NP", 6, "RT", 8, NULL ); // PARENT_OSODR char **papszTypes, **papszValues; if( poReader->ProcessAttRecGroup( papoGroup, &papszTypes, &papszValues ) ) { char **papszOSODRList = NULL; for( int i = 0; papszTypes != NULL && papszTypes[i] != NULL; i++ ) { if( EQUAL(papszTypes[i],"PO") ) papszOSODRList = CSLAddString(papszOSODRList,papszValues[i]); } poFeature->SetField( 7, papszOSODRList ); CPLAssert( CSLCount(papszOSODRList) == poFeature->GetFieldAsInteger( 6 ) ); CSLDestroy( papszOSODRList ); CSLDestroy( papszTypes ); CSLDestroy( papszValues ); } return poFeature;}/************************************************************************//* TranslateOscarRouteLine() *//************************************************************************/static OGRFeature *TranslateOscarRouteLine( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_LINEREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // LINE_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId ); // Attributes poReader->ApplyAttributeValues( poFeature, papoGroup, "FC", 2, "OD", 3, "PN", 4, "LL", 5, "RN", 6, "TR", 7, "NP", 8, NULL ); // PARENT_OSODR char **papszTypes, **papszValues; if( poReader->ProcessAttRecGroup( papoGroup, &papszTypes, &papszValues ) ) { char **papszOSODRList = NULL; for( int i = 0; papszTypes != NULL && papszTypes[i] != NULL; i++ ) { if( EQUAL(papszTypes[i],"PO") ) papszOSODRList = CSLAddString(papszOSODRList,papszValues[i]); } poFeature->SetField( 9, papszOSODRList ); CPLAssert( CSLCount(papszOSODRList) == poFeature->GetFieldAsInteger( 8 ) ); CSLDestroy( papszOSODRList ); CSLDestroy( papszTypes ); CSLDestroy( papszValues ); } return poFeature;}/************************************************************************//* TranslateOscarComment() *//************************************************************************/static OGRFeature *TranslateOscarComment( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) != 1 || papoGroup[0]->GetType() != NRT_COMMENT ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // RECORD_TYPE poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 4 )) ); // RECORD_ID poFeature->SetField( 1, papoGroup[0]->GetField( 5, 17 ) ); // CHANGE_TYPE poFeature->SetField( 2, papoGroup[0]->GetField( 18, 18 ) ); return poFeature;}/************************************************************************//* TranslateOscarNetworkPoint() *//************************************************************************/static OGRFeature *TranslateOscarNetworkPoint( NTFFileReader *poReader, OGRNTFLayer *poLayer, NTFRecord **papoGroup ){ if( CSLCount((char **) papoGroup) < 2 || papoGroup[0]->GetType() != NRT_POINTREC || papoGroup[1]->GetType() != NRT_GEOMETRY ) return NULL; OGRFeature *poFeature = new OGRFeature( poLayer->GetLayerDefn() ); // POINT_ID poFeature->SetField( 0, atoi(papoGroup[0]->GetField( 3, 8 )) ); // Geometry int nGeomId; poFeature->SetGeometryDirectly(poReader->ProcessGeometry(papoGroup[1], &nGeomId)); poFeature->SetField( 1, nGeomId );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -