Example #1
0
    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]
Example #2
0
    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()