35#include "gdal/cpl_conv.h"
36#include "gdal/cpl_string.h"
46 int nFeatureCountIn,
int nOBJLIn)
53 nFeatureCount = nFeatureCountIn;
55 poFeatureDefn = poDefnIn;
62 if (EQUAL(poDefnIn->GetName(), OGRN_VI))
64 else if (EQUAL(poDefnIn->GetName(), OGRN_VC))
66 else if (EQUAL(poDefnIn->GetName(), OGRN_VE))
68 else if (EQUAL(poDefnIn->GetName(), OGRN_VF))
78OGRS57Layer::~OGRS57Layer()
83 if (poFilterGeom != NULL)
delete poFilterGeom;
90void OGRS57Layer::SetSpatialFilter(OGRGeometry *poGeomIn)
93 if (poFilterGeom != NULL) {
98 if (poGeomIn != NULL) poFilterGeom = poGeomIn->clone();
100 if (nNextFEIndex != 0 || nCurrentModule != -1) ResetReading();
107void OGRS57Layer::ResetReading()
118OGRFeature *OGRS57Layer::GetNextUnfilteredFeature()
121 OGRFeature *poFeature = NULL;
126 if (nCurrentModule >= poDS->GetModuleCount())
return NULL;
132 S57Reader *poReader = poDS->GetModule(nCurrentModule);
134 if (poReader != NULL) {
135 poReader->SetNextFEIndex(nNextFEIndex, nRCNM);
136 poFeature = poReader->ReadNextFeature(poFeatureDefn);
137 nNextFEIndex = poReader->GetNextFEIndex(nRCNM);
143 if (poFeature == NULL) {
145 poReader = poDS->GetModule(nCurrentModule);
147 if (poReader != NULL && poReader->GetModule() == NULL) {
148 if (!poReader->Open(FALSE))
return NULL;
151 return GetNextUnfilteredFeature();
153 if (poFeature->GetGeometryRef() != NULL)
154 poFeature->GetGeometryRef()->assignSpatialReference(GetSpatialRef());
164OGRFeature *OGRS57Layer::GetNextFeature()
167 OGRFeature *poFeature = NULL;
174 poFeature = GetNextUnfilteredFeature();
175 if (poFeature == NULL)
break;
194int OGRS57Layer::TestCapability(
const char *pszCap)
197 if (EQUAL(pszCap, OLCRandomRead))
200 else if (EQUAL(pszCap, OLCSequentialWrite))
203 else if (EQUAL(pszCap, OLCRandomWrite))
206 else if (EQUAL(pszCap, OLCFastFeatureCount))
209 else if (EQUAL(pszCap, OLCFastGetExtent)) {
210 OGREnvelope oEnvelope;
212 return GetExtent(&oEnvelope, FALSE) == OGRERR_NONE;
213 }
else if (EQUAL(pszCap, OLCFastSpatialFilter))
224OGRSpatialReference *OGRS57Layer::GetSpatialRef()
227 return poDS->GetSpatialRef();
234OGRErr OGRS57Layer::GetExtent(OGREnvelope *psExtent,
int bForce)
237 return poDS->GetDSExtent(psExtent, bForce);
243int OGRS57Layer::GetFeatureCount(
int bForce) {
244 if (poFilterGeom != NULL
245 || nFeatureCount == -1)
246 return OGRLayer::GetFeatureCount(bForce);
248 return nFeatureCount;
255OGRFeature *OGRS57Layer::GetFeature(
long nFeatureId)
258 S57Reader *poReader = poDS->GetModule(0);
260 if (poReader != NULL) {
261 OGRFeature *poFeature;
263 poFeature = poReader->ReadFeature(nFeatureId, poFeatureDefn);
264 if (poFeature != NULL && poFeature->GetGeometryRef() != NULL)
265 poFeature->GetGeometryRef()->assignSpatialReference(GetSpatialRef());
275OGRErr OGRS57Layer::CreateFeature(OGRFeature *poFeature)
281 int iRCNMFld = poFeature->GetFieldIndex(
"RCNM");
283 if (iRCNMFld != -1) {
284 if (!poFeature->IsFieldSet(iRCNMFld)) {
285 poFeature->SetField(iRCNMFld, nRCNM);
287 CPLAssert(poFeature->GetFieldAsInteger(iRCNMFld) == nRCNM);
295 int iOBJLFld = poFeature->GetFieldIndex(
"OBJL");
297 if (!poFeature->IsFieldSet(iOBJLFld)) {
298 poFeature->SetField(iOBJLFld, nOBJL);
300 CPLAssert(poFeature->GetFieldAsInteger(iOBJLFld) == nOBJL);
310 return OGRERR_FAILURE;
Declarations for classes binding S57 support onto OGRLayer, OGRDataSource and OGRDriver.