OGRLayer *OGRSOSIDataSource::ICreateLayer( const char *pszNameIn, OGRSpatialReference *poSpatialRef, OGRwkbGeometryType eGType, CPL_UNUSED char **papszOptions ) { /* SOSI does not really support layers - so let's first see that the global settings are consistent */ if (poSRS == NULL) { if (poSpatialRef!=NULL) { poSRS = poSpatialRef; poSRS->Reference(); const char *pszKoosys = poSRS->GetAuthorityCode("PROJCS"); if (pszKoosys == NULL) { OGRErr err = poSRS->AutoIdentifyEPSG(); if (err == OGRERR_UNSUPPORTED_SRS) { CPLError( CE_Failure, CPLE_OpenFailed, "Could not identify EPSG code for spatial reference system"); return NULL; } pszKoosys = poSRS->GetAuthorityCode("PROJCS"); } if (pszKoosys != NULL) { int nKoosys = epsg2sosi(atoi(pszKoosys)); CPLDebug( "[CreateLayer]","Projection set to SOSI %i", nKoosys); LC_PutTrans(nKoosys,0,0,0.01,0.01,0.01); } else { pszKoosys = poSRS->GetAuthorityCode("GEOGCS"); if (pszKoosys != NULL) { int nKoosys = epsg2sosi(atoi(pszKoosys)); LC_PutTrans(nKoosys,0,0,0.01,0.01,0.01); } else { CPLError( CE_Failure, CPLE_OpenFailed, "Could not retrieve EPSG code for spatial reference system"); return NULL; } } } LC_WsGr(poFileadm); /* Writing the header here! */ } else { if (!poSRS->IsSame(poSpatialRef)) { CPLError( CE_Failure, CPLE_AppDefined, "SOSI driver does not support different spatial reference systems in one file."); } } OGRFeatureDefn *poFeatureDefn = new OGRFeatureDefn( pszNameIn ); poFeatureDefn->Reference(); poFeatureDefn->SetGeomType( eGType ); OGRSOSILayer *poLayer = new OGRSOSILayer( this, poFeatureDefn, poFileadm, NULL /*poHeaderDefn*/); /* todo: where do we delete poLayer and poFeatureDefn? */ return poLayer; }
OGRErr OGRSOSILayer::ICreateFeature(OGRFeature *poFeature) { //short nNavn; long nSerial; const char *pszSosi = NULL; switch (poFeatureDefn->GetGeomType()) { case wkbPoint: { pszSosi = ".PUNKT"; break; } case wkbLineString: { pszSosi = ".KURVE"; break; } case wkbPolygon: { pszSosi = ".FLATE"; break; } default: { CPLError( CE_Warning, CPLE_AppDefined, "Unknown geometry type in CreateFeature."); return OGRERR_UNSUPPORTED_GEOMETRY_TYPE; } } /*nNavn = */ LC_NyGr(poFileadm, (char *)pszSosi, &oNextSerial, &nSerial); /* === WIP - Work in progress === */ /* PutGI for all headers */ char pszGi[255]; for (int i=0;i<poFeature->GetFieldCount();i++) { int n = snprintf (pszGi, 255, "%s", poFeature->GetFieldDefnRef(i)->GetNameRef()); if (n<255) { /*int m = */snprintf (pszGi + (n-1), 255-n, "%s", poFeature->GetFieldAsString(i)); /* check overflow */ } LC_PutGi(i+2, pszGi); /* should add headers too */ } // LC_OppdaterEndret(0); /* PutTK for all coords */ /* ... */ /* === /WIP - Work in progress === */ LC_WsGr(poFileadm); /* Writing the header here! */ return OGRERR_NONE; }