def ReadingDfs2File(filename): # Open the file as a dfs2 file dfs2File = DfsFileFactory.Dfs2FileOpen(filename) dfs2File.Reshape(True) # Spatial axis for this file is a 2D equidistant axis axisEqD2 = dfs2File.SpatialAxis dx = axisEqD2.Dx # 900 dy = axisEqD2.Dy # 900 # Header information is contained in the IDfsFileInfo fileInfo = dfs2File.FileInfo steps = fileInfo.TimeAxis.NumberOfTimeSteps # 13 projectionString = fileInfo.Projection.WKTString # "UTM-33" # Information on each of the dynamic items, here the first one dynamicItemInfo = dfs2File.ItemInfo[0] nameOfFirstDynamicItem = dynamicItemInfo.Name # "H Water Depth m" typeOfFirstDynamicItem = dynamicItemInfo.DataType # Float # Read data of first item, third time step (items start by 1, timesteps by 0), # assuming data is of type float. data2D = dfs2File.ReadItemTimeStep(1, 2) # Get the value at (i,j) = (3,4) of the item and timestep value = data2D.Data[3, 4] # 11.3634329 print("ReadingDfs2File: data2D.Data[3, 4] = {}".format(value)) # This iterates through all the timesteps and items in the file # For performance reasons it is important to iterate over time steps # first and items second. for i in range(steps): for j in range(1, len(dfs2File.ItemInfo)): data2D = dfs2File.ReadItemTimeStep(j, i) value = data2D.Data[3, 4]
def CreateDfs2File(sourceFilename, filename): source = DfsFileFactory.Dfs2FileOpen(sourceFilename) factory = DfsFactory() builder = DfsBuilder.Create( "", r"C:\Program Files\DHI\2010\bin\nmodel.exe", 0) # Set up the header builder.SetDataType(1) builder.SetGeographicalProjection( factory.CreateProjectionGeoOrigin("UTM-33", 12.438741600559766, 55.225707842436385, 326.99999999999955)) builder.SetTemporalAxis( factory.CreateTemporalEqCalendarAxis( eumUnit.eumUsec, datetime.datetime(1993, 12, 2, 0, 0, 0), 0, 86400)) builder.SetSpatialAxis( factory.CreateAxisEqD2(eumUnit.eumUmeter, 71, 0, 900, 91, 0, 900)) builder.DeleteValueFloat = -1e-30 # Add custom block # M21_Misc : {orientation (should match projection), drying depth, -900=has projection, land value, 0, 0, 0} builder.AddCustomBlock( factory.CreateCustomBlock( "M21_Misc", np.array([327, 0.2, -900, 10, 0, 0, 0], np.float32))) # Set up dynamic items builder.AddCreateDynamicItem( "H Water Depth m", eumQuantity.Create(eumItem.eumIWaterLevel, eumUnit.eumUmeter), DfsSimpleType.Float, DataValueType.Instantaneous) builder.AddCreateDynamicItem( "P Flux m^3/s/m", eumQuantity.Create(eumItem.eumIFlowFlux, eumUnit.eumUm3PerSecPerM), DfsSimpleType.Float, DataValueType.Instantaneous) builder.AddCreateDynamicItem( "Q Flux m^3/s/m", eumQuantity.Create(eumItem.eumIFlowFlux, eumUnit.eumUm3PerSecPerM), DfsSimpleType.Float, DataValueType.Instantaneous) # Create file builder.CreateFile(filename) # Add static items containing bathymetri data, use data from source sourceStaticItem = source.ReadStaticItemNext() builder.AddCreateStaticItem("Static item", eumQuantity.UnDefined(), sourceStaticItem.Data) # Get the file file = builder.GetFile() # Loop over all time steps for i in range(source.FileInfo.TimeAxis.NumberOfTimeSteps): # Loop over all items for j in range(len(source.ItemInfo)): # Add data for all item-timesteps, copying data from source file. # Read data from source file sourceData = source.ReadItemTimeStepNext(reshape=True) # Create empty item data, and copy over data from source # The IDfsItemData2D can handle 2D indexing, on the form data2D[k,l]. # An ordinary array, float[], can also be used, though indexing from 2D to 1D must be # handled by user code i.e. using data1D[k + l*xCount] compared to data2D[k,l] itemData2D = file.CreateEmptyItemData(j + 1, reshape=True) for k in range(71): for l in range(91): itemData2D.Data[k, l] = sourceData.Data[k, l] # the itemData2D.Data is a float[], so any float[] of the correct size is valid here. file.WriteItemTimeStep(j + 1, i, sourceData.Time, itemData2D.Data) source.Close() file.Close()