Strange_problems

Hallo

I am trying to run a code to use C2RCC in python. The code is:

inFolder=‘F:/seo_dwarf/validation/platforms/HuvudskarOst/images/TOA/’
outFolder=‘F:/seo_dwarf/validation/platforms/HuvudskarOst/images/C2RCC/’
wkt_s2=‘POLYGON ((18.79065927419176 59.05366211591765, 19.41228265954375 59.062765294778245, 19.428031833297695 58.71754730947824, 18.812564217653698 58.708566602732276, 18.79065927419176 59.05366211591765))’
wkt_s3_reproject=‘POLYGON((22.437983 40.776053, 23.603894 40.578657, 23.394009 39.877896, 22.245684999999998 40.073698, 22.437983 40.776053))’
wkt_s3_polygon=‘POLYGON ((22.580090079401838 40.59127050285319, 23.040973831558286 40.58404437062604, 23.032681010654454 40.309447248077305, 22.57366774333196 40.3166040183802, 22.580090079401838 40.59127050285319))’

sal=35.0
temp=15.0
ozo=330.0
pres=1000.0
el=0.0
TSMfakBpart=1.72
TSMfakBwit=3.1
CHLexp=1.04
CHLfak=21.0
thresholdRtosaOOS=0.005
thresholdAcReflecOos=0.1
thresholdCloudTDown865=0.955
outputAsRrs=True
deriveRwFromPathAndTransmittance=False
useEcmwfAuxData=True
outputRtoa=False
outputRtosaGc=False
outputRtosaGcAann=False
outputRpath=False
outputTdown=False
outputTup=False
outputAcReflectance=True
outputRhown=True
outputOos=False
outputKd=False
outputUncertainties=True

for file in os.listdir(inFolder):
path=str(inFolder+file)

if path.find(‘S2’)!=-1:

end=path.find('.SAFE')
start=path.find('S2')
name=path[start:end]
satelite=name[0:2]
date=name[11:19]
print 'Image processed:'+ str(satelite)+','+str(date)

product=ProductIO.readProduct(path+'/MTD_MSIL1C.xml')
print 'Resampling to 60m' 
HashMap = jpy.get_type('java.util.HashMap')
parameters = HashMap()
parameters.put('targetResolution',60)
parameters.put('upsampling','Nearest')
parameters.put('downsampling','First')
parameters.put('resampleOnPyramidLevels',True)
result = GPF.createProduct('Resample', parameters, product)
ProductIO.writeProduct(result,outFolder+date+'_'+satelite+'_'+'resample.dim','BEAM-DIMAP')

print ('Masking with Polygon')
product=ProductIO.readProduct(outFolder+date+'_'+satelite+'_'+'resample.dim')
HashMap = jpy.get_type('java.util.HashMap')
parameters = HashMap()
SubsetOp = snappy.jpy.get_type('org.esa.snap.core.gpf.common.SubsetOp')
WKTReader = snappy.jpy.get_type('com.vividsolutions.jts.io.WKTReader')
geometry = WKTReader().read(wkt_s2)
op = SubsetOp()
op.setSourceProduct(product)
op.setGeoRegion(geometry)
sub_product = op.getTargetProduct()
ProductIO.writeProduct(sub_product,outFolder+date+'_'+satelite+'_'+'mask.dim','BEAM-DIMAP')

product=ProductIO.readProduct(outFolder+date+'_'+satelite+'_'+'mask.dim')
print 'Land masking' 
HashMap = jpy.get_type('java.util.HashMap')
parameters = HashMap()
parameters.put('landMask','True')
parameters.put('useSRTM','True')
parameters.put('invertGeometry','False')
parameters.put('shorelineExtension','0')
result = GPF.createProduct('Land-Sea-Mask', parameters, product)
ProductIO.writeProduct(result,outFolder+date+'_'+satelite+'_'+'masked_sea.dim','BEAM-DIMAP')


product=ProductIO.readProduct(outFolder+date+'_'+satelite+'_'+'masked_sea.dim')
print 'C2RCC' 
HashMap = jpy.get_type('java.util.HashMap')
parameters = HashMap()
parameters.put('validPixelExpression','B8 > 0 && B8 < 0.1')
parameters.put('temperature',temp)
parameters.put('salinity',sal)
parameters.put('ozone',ozo)
parameters.put('press',pres)
parameters.put('elevation',el)
parameters.put('TSMfakBpart',TSMfakBpart)
parameters.put('TSMfakBwit',TSMfakBwit)
parameters.put('CHLexp',CHLexp)
parameters.put('CHLfak',CHLfak)
parameters.put('thresholdRtosaOOS',thresholdRtosaOOS)
parameters.put('thresholdAcReflecOos',thresholdAcReflecOos)
parameters.put('thresholdCloudTDown865',thresholdCloudTDown865)
parameters.put('netSet','C2RCC-Nets')
parameters.put('outputAsRrs',outputAsRrs)
parameters.put('deriveRwFromPathAndTransmittance',deriveRwFromPathAndTransmittance)
parameters.put('useEcmwfAuxData',useEcmwfAuxData)
parameters.put('outputRtoa',outputRtoa)
parameters.put('outputRtosaGc',outputRtosaGc)
parameters.put('outputRtosaGcAann',outputRtosaGcAann)
parameters.put('outputRpath',outputRpath)
parameters.put('outputTdown',outputTdown)
parameters.put('outputTup',outputTup)
parameters.put('outputAcReflectance',outputAcReflectance)
parameters.put('outputRhown',outputRhown)
parameters.put('outputOos',outputOos)
parameters.put('outputKd',outputKd)
parameters.put('outputUncertainties',outputUncertainties)
result = GPF.createProduct('c2rcc.msi', parameters, product)
ProductIO.writeProduct(result,outFolder+date+'_'+satelite+'_'+'C2RCC.dim','BEAM-DIMAP')

When i run the process get the following error

Image processed:S2,20170521
Resampling to 60m

Traceback (most recent call last):
File “F:\seo_dwarf\validation\platforms\HuvudskarOst\C2RCC.py”, line 107, in
ProductIO.writeProduct(result,outFolder+date+’’+satelite+’’+‘resample.dim’,‘BEAM-DIMAP’)
RuntimeError: java.lang.NullPointerException

Yesterday when i tried to run the same code i didn t have any problems.

Any ideas?

As a first hint, you don’t need to write all the product and read them in again. You can directly use the result from one computation as input for the next. Except you want to have the intermediate results.

As an example:

result = GPF.createProduct('Resample', parameters, product)
# not needed
# ProductIO.writeProduct(result,outFolder+date+'_'+satelite+'_'+'resample.dim','BEAM-DIMAP')

print ('Masking with Polygon')
# not needed
# product=ProductIO.readProduct(outFolder+date+'_'+satelite+'_'+'resample.dim')
HashMap = jpy.get_type('java.util.HashMap')
parameters = HashMap()
SubsetOp = snappy.jpy.get_type('org.esa.snap.core.gpf.common.SubsetOp')
WKTReader = snappy.jpy.get_type('com.vividsolutions.jts.io.WKTReader')
geometry = WKTReader().read(wkt_s2)
op = SubsetOp()
op.setSourceProduct(result)

And actually it would be good to replace the direct SubsetOp usage also with a call to GPF.createProduc(…)
Just to harmonise the code.

Another hint. You don’t need to do call HashMap = jpy.get_type('java.util.HashMap') every time. Once at the beginning is enough.

From the error message, it is difficult to see what’s wrong. Maybe you can try to call the resampling directly from the command line. There you should get a more exhaustive error message.