Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: EDIGEO Translator 4 : * Purpose: Implements OGREDIGEOLayer class. 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "ogr_edigeo.h" 14 : #include "cpl_conv.h" 15 : #include "cpl_string.h" 16 : #include "ogr_p.h" 17 : #include "ogr_srs_api.h" 18 : 19 : /************************************************************************/ 20 : /* OGREDIGEOLayer() */ 21 : /************************************************************************/ 22 : 23 0 : OGREDIGEOLayer::OGREDIGEOLayer(OGREDIGEODataSource *poDSIn, const char *pszName, 24 : OGRwkbGeometryType eType, 25 0 : OGRSpatialReference *poSRSIn) 26 0 : : poDS(poDSIn), poFeatureDefn(new OGRFeatureDefn(pszName)), poSRS(poSRSIn), 27 0 : nNextFID(0) 28 : { 29 0 : if (poSRS) 30 0 : poSRS->Reference(); 31 : 32 0 : poFeatureDefn->Reference(); 33 0 : poFeatureDefn->SetGeomType(eType); 34 0 : if (poFeatureDefn->GetGeomFieldCount() != 0) 35 0 : poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(poSRS); 36 0 : SetDescription(poFeatureDefn->GetName()); 37 0 : } 38 : 39 : /************************************************************************/ 40 : /* ~OGREDIGEOLayer() */ 41 : /************************************************************************/ 42 : 43 0 : OGREDIGEOLayer::~OGREDIGEOLayer() 44 : 45 : { 46 0 : for (int i = 0; i < (int)aosFeatures.size(); i++) 47 0 : delete aosFeatures[i]; 48 : 49 0 : poFeatureDefn->Release(); 50 : 51 0 : if (poSRS) 52 0 : poSRS->Release(); 53 0 : } 54 : 55 : /************************************************************************/ 56 : /* ResetReading() */ 57 : /************************************************************************/ 58 : 59 0 : void OGREDIGEOLayer::ResetReading() 60 : 61 : { 62 0 : nNextFID = 0; 63 0 : } 64 : 65 : /************************************************************************/ 66 : /* GetNextRawFeature() */ 67 : /************************************************************************/ 68 : 69 0 : OGRFeature *OGREDIGEOLayer::GetNextRawFeature() 70 : { 71 0 : if (nNextFID < (int)aosFeatures.size()) 72 : { 73 0 : OGRFeature *poFeature = aosFeatures[nNextFID]->Clone(); 74 0 : nNextFID++; 75 0 : return poFeature; 76 : } 77 : else 78 0 : return nullptr; 79 : } 80 : 81 : /************************************************************************/ 82 : /* GetFeature() */ 83 : /************************************************************************/ 84 : 85 0 : OGRFeature *OGREDIGEOLayer::GetFeature(GIntBig nFID) 86 : { 87 0 : if (nFID >= 0 && nFID < (int)aosFeatures.size()) 88 0 : return aosFeatures[(int)nFID]->Clone(); 89 : else 90 0 : return nullptr; 91 : } 92 : 93 : /************************************************************************/ 94 : /* TestCapability() */ 95 : /************************************************************************/ 96 : 97 0 : int OGREDIGEOLayer::TestCapability(const char *pszCap) 98 : 99 : { 100 0 : if (EQUAL(pszCap, OLCFastFeatureCount)) 101 0 : return m_poFilterGeom == nullptr && m_poAttrQuery == nullptr; 102 : 103 0 : else if (EQUAL(pszCap, OLCRandomRead)) 104 0 : return TRUE; 105 : 106 0 : else if (EQUAL(pszCap, OLCStringsAsUTF8)) 107 0 : return poDS->HasUTF8ContentOnly(); 108 : 109 0 : return FALSE; 110 : } 111 : 112 : /************************************************************************/ 113 : /* GetExtent() */ 114 : /************************************************************************/ 115 : 116 0 : OGRErr OGREDIGEOLayer::GetExtent(OGREnvelope *psExtent, int bForce) 117 : { 118 : /*if (poDS->bExtentValid) 119 : { 120 : psExtent->MinX = poDS->dfMinX; 121 : psExtent->MinY = poDS->dfMinY; 122 : psExtent->MaxX = poDS->dfMaxX; 123 : psExtent->MaxY = poDS->dfMaxY; 124 : return OGRERR_NONE; 125 : }*/ 126 : 127 0 : return OGRLayer::GetExtent(psExtent, bForce); 128 : } 129 : 130 : /************************************************************************/ 131 : /* GetFeatureCount() */ 132 : /************************************************************************/ 133 : 134 0 : GIntBig OGREDIGEOLayer::GetFeatureCount(int bForce) 135 : { 136 0 : if (m_poFilterGeom != nullptr || m_poAttrQuery != nullptr) 137 0 : return OGRLayer::GetFeatureCount(bForce); 138 : 139 0 : return (int)aosFeatures.size(); 140 : } 141 : 142 : /************************************************************************/ 143 : /* AddFeature() */ 144 : /************************************************************************/ 145 : 146 0 : void OGREDIGEOLayer::AddFeature(OGRFeature *poFeature) 147 : { 148 0 : poFeature->SetFID(aosFeatures.size()); 149 0 : aosFeatures.push_back(poFeature); 150 0 : } 151 : 152 : /************************************************************************/ 153 : /* GetAttributeIndex() */ 154 : /************************************************************************/ 155 : 156 0 : int OGREDIGEOLayer::GetAttributeIndex(const CPLString &osRID) 157 : { 158 : std::map<CPLString, int>::iterator itAttrIndex = 159 0 : mapAttributeToIndex.find(osRID); 160 0 : if (itAttrIndex != mapAttributeToIndex.end()) 161 0 : return itAttrIndex->second; 162 : else 163 0 : return -1; 164 : } 165 : 166 : /************************************************************************/ 167 : /* AddFieldDefn() */ 168 : /************************************************************************/ 169 : 170 0 : void OGREDIGEOLayer::AddFieldDefn(const CPLString &osName, OGRFieldType eType, 171 : const CPLString &osRID) 172 : { 173 0 : if (!osRID.empty()) 174 0 : mapAttributeToIndex[osRID] = poFeatureDefn->GetFieldCount(); 175 : 176 0 : OGRFieldDefn oFieldDefn(osName, eType); 177 0 : poFeatureDefn->AddFieldDefn(&oFieldDefn); 178 0 : }