[Geoserver-users] Raster Normalize

Hello, I’m trying to add a raster layer to geoserver. currently i can see it in ArcGis with a style definition of “RGB Composite”, all the channels set to the corresponding banc (red, green and blue), and a Stretch of the type “Percent Clip”. This gives me an image of something like this:

ive configured the same Tif file at geoserver and it shows at preview.

now im trying to set the style to something close to the previous one. after digging at the documentation i came up of something like:

<ContrastEnhancement>
  <Normalize>
   <VendorOption name="algorithm">ClipToMinimumMaximum</VendorOption>
   <VendorOption name="minValue">50</VendorOption>
   <VendorOption name="maxValue">100</VendorOption>
  </Normalize>
</ContrastEnhancement>

the problem is this that this is not recognized as a valid sld at the style editor:

"line 24: cvc-complex-type.2.1: Element 'Normalize' must have no character or element information item [children], because the type's content type is empty."

is this the correct way to accomplish this? What am i doing wrong at the style? regards, Filipe


View this message in context: Raster Normalize
Sent from the GeoServer - User mailing list archive at Nabble.com.

It is right but it is technically invalid SLD so the validator rejects it. It will work fine as it is.

Ian

···

On 1 August 2017 at 11:49, Filipe <filipesilva1@anonymised.com> wrote:

Hello, I’m trying to add a raster layer to geoserver. currently i can see it in ArcGis with a style definition of “RGB Composite”, all the channels set to the corresponding banc (red, green and blue), and a Stretch of the type “Percent Clip”. This gives me an image of something like this:

ive configured the same Tif file at geoserver and it shows at preview.

now im trying to set the style to something close to the previous one. after digging at the documentation i came up of something like:

<ContrastEnhancement>
  <Normalize>
   <VendorOption name="algorithm">ClipToMinimumMaximum</VendorOption>
   <VendorOption name="minValue">50</VendorOption>
   <VendorOption name="maxValue">100</VendorOption>
  </Normalize>
</ContrastEnhancement>

the problem is this that this is not recognized as a valid sld at the style editor:

"line 24: cvc-complex-type.2.1: Element 'Normalize' must have no character or element information item [children], because the type's content type is empty."

is this the correct way to accomplish this? What am i doing wrong at the style? regards, Filipe


View this message in context: Raster Normalize
Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Ian Turton

Hi, you are right. Instead of validate i pressed submit and was acepted.

now i have a problem. i can’t figure out the correct values.
whats the closest algorithm to the “Percent Clip”?
Is there another way i could use to achieve the expected result?
Thanks for the reply

Regards


View this message in context: Re: Raster Normalize
Sent from the GeoServer - User mailing list archive at Nabble.com.

From a quick look at the ESRI raster ops page - it looks like you need to calculate the fixed values that correspond to the min/max percentages you were using and use those in ClipToMinMax operation based on the distribution of the values in the image histogram.

Ian

···

On 1 August 2017 at 12:06, Filipe <filipesilva1@anonymised.com> wrote:

Hi, you are right. Instead of validate i pressed submit and was acepted.

now i have a problem. i can’t figure out the correct values.
whats the closest algorithm to the “Percent Clip”?
Is there another way i could use to achieve the expected result?
Thanks for the reply

Regards


View this message in context: Re: Raster Normalize

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Ian Turton

Cant seem to set it correctly. always end up with a black image.

the min and max values on the percent clip stretch are "0.5".

Any thoughts?

Again, Thanks for the reply
Regards

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330055.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

seems theres some kind of error:

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330057.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi Filipe.
You may consider running a gdalinfo -stats on your sampledata and report it back so we can provide you additional assistance.

If datatype is not byte, you should consider using 3 ChannelSelect to select R,G,B and a specific ContrastEnhancement node on each of them.
Then, based on the gdalinfo stats, you can setup a StretchToMinimumMaximum (instead of ClipToMininumMaximum) in each ContrastEnhancement node.

Percentage referred by ESRI are based on histograms analysis, using percentiles.
If you don’t want to compute percentiles based on histograms, you can try with MEAN and STDDEV (reported by gdalinfo -stats) and define your vendor min and max values as:

min = MEAN - nSTDDEV
max = MEAN + n
STDDEV

where n is usually in the range 1 ; 3.
You can try with n = 2.

Please, let us know if that helps.
Regards,
Daniele

···

On Tue, Aug 1, 2017 at 4:01 PM, Filipe <filipesilva1@anonymised.com> wrote:

seems theres some kind of error:


View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330057.html

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,
Daniele Romagnoli

GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information.

Ing. Daniele Romagnoli
Senior Software Engineer

GeoSolutions S.A.S.
Via di Montramito 3/A
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272

http://www.geo-solutions.it
http://twitter.com/geosolutions_it


AVVERTENZE AI SENSI DEL D.Lgs. 196/2003
Le informazioni contenute in questo messaggio di posta elettronica e/o nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il loro utilizzo è consentito esclusivamente al destinatario del messaggio, per le finalità indicate nel messaggio stesso. Qualora riceviate questo messaggio senza esserne il destinatario, Vi preghiamo cortesemente di darcene notizia via e-mail e di procedere alla distruzione del messaggio stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per finalità diverse, costituisce comportamento contrario ai principi dettati dal D.Lgs. 196/2003.

The information in this message and/or attachments, is intended solely for the attention and use of the named addressee(s) and may be confidential or proprietary in nature or covered by the provisions of privacy act (Legislative Decree June, 30 2003, no.196 - Italy’s New Data Protection Code).Any use not in accord with its purpose, any disclosure, reproduction, copying, distribution, or either dissemination, either whole or partial, is strictly forbidden except previous formal approval of the named addressee(s). If you are not the intended recipient, please contact immediately the sender by telephone, fax or e-mail and delete the information in this message that has been received in error. The sender does not give any warranty or accept liability as the content, accuracy or completeness of sent messages and accepts no responsibility for changes made after they were sent or for other risks which arise as a result of e-mail transmission, viruses, etc.

Hello
Thank you for your reply.

I did what you sugested, and we’re getting somewhere!

using the formulas you sugested:

<RasterSymbolizer>
	<ChannelSelection>
	  <RedChannel>
		<SourceChannelName>1</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-55.2689</VendorOption>
		   <VendorOption name="maxValue">214.7722</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </RedChannel>
	  <GreenChannel>
		<SourceChannelName>2</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-41.9121</VendorOption>
		   <VendorOption name="maxValue">163.9293</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </GreenChannel>
	  <BlueChannel>
		<SourceChannelName>3</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-22.1867</VendorOption>
		   <VendorOption name="maxValue">77.2479</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </BlueChannel>
	</ChannelSelection>
</RasterSymbolizer>

my raster info is

C:\DATA\raster>gdalinfo myRaster.tif
Driver: GTiff/GeoTIFF
Files: myRaster.tif
       myRaster.tif.ovr
       myRaster.tif.aux.xml
Size is 23861, 16880
Coordinate System is:
PROJCS["WGS 84 / UTM zone 29N",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-9],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32629"]]
Origin = (625033.424520000000484,4248219.836620000191033)
Pixel Size = (0.103860000000000,-0.103860000000000)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  625033.425, 4248219.837) (  7d34' 7.07"W, 38d22'24.38"N)
Lower Left  (  625033.425, 4246466.680) (  7d34' 8.19"W, 38d21'27.52"N)
Upper Right (  627511.628, 4248219.837) (  7d32'24.97"W, 38d22'23.12"N)
Lower Right (  627511.628, 4246466.680) (  7d32'26.11"W, 38d21'26.26"N)
Center      (  626272.526, 4247343.258) (  7d33'16.59"W, 38d21'55.32"N)
Band 1 Block=23861x1 Type=Byte, ColorInterp=Red
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=79.752, StdDev=67.510
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=4557.639431244172,3461.157875865516,1616.247181916951,8018.146929498016
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=79.751677803277
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=67.510291214959
Band 2 Block=23861x1 Type=Byte, ColorInterp=Green
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=61.009, StdDev=51.460
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=3461.157875865516,2648.170496677781,1243.180669732085,6133.734519685802
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=61.008562632494
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=51.460377929799
Band 3 Block=23861x1 Type=Byte, ColorInterp=Blue
  Min=0.000 Max=226.000
  Minimum=0.000, Maximum=226.000, Mean=27.531, StdDev=24.859
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=1616.247181916951,1243.180669732085,617.954007884253,2767.896495658875
    STATISTICS_MAXIMUM=226
    STATISTICS_MEAN=27.530599208965
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=24.858680734992
Band 4 Block=23861x1 Type=Byte, ColorInterp=Alpha
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=154.461, StdDev=124.617
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=8018.146929498016,6133.734519685802,2767.896495658875,15529.34978118977
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=154.46108783722
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=124.61681179195

Now what can i do to come closer to the original one? (to get that “blueish” on the water)
You mentioned “computing percentiles based on histograms”. how can i do that?
Regards


View this message in context: Re: Raster Normalize
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi Filipe,
so your data is byte at the end.

note that when applying MEAN (+/-)n* STDDEV you should not exceed the input range (0, 255 on bytes).
You can try using n=1 or just set 0 instead of negative value.

In reference to the histogram percentile computations, you may need to do some math or compute them with QGIS.
You may want to look at this piece of code to better understand how percentiles can be computed.
https://github.com/qgis/QGIS/blob/master/src/core/raster/qgsrasterinterface.cpp#L533-L560

Long story short, you have to run gdalinfo -hist and take note of number of buckets as well as “from” and “to” range.
Then start summing bucket count until you get the desired percentage (as an instance you will get a 2% once the cumulative sum is 2% with respect to the total number of pixels composing your image, usually Width*Height).
The number of bucket used to reach the 2% allows you to compute the related MIN value. (something like: “from” + numBuckets * (range/totalNumBuckets)).
The same for the 98% to compute the MAX.

You may want to check some histogram and percentiles topic around on internet to better understand this concepts.

Hope this helps.
Cheers,
Daniele

···

On Tue, Aug 1, 2017 at 5:14 PM, Filipe <filipesilva1@anonymised.com> wrote:

Hello
Thank you for your reply.

I did what you sugested, and we’re getting somewhere!

using the formulas you sugested:

<RasterSymbolizer>
	<ChannelSelection>
	  <RedChannel>
		<SourceChannelName>1</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-55.2689</VendorOption>
		   <VendorOption name="maxValue">214.7722</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </RedChannel>
	  <GreenChannel>
		<SourceChannelName>2</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-41.9121</VendorOption>
		   <VendorOption name="maxValue">163.9293</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </GreenChannel>
	  <BlueChannel>
		<SourceChannelName>3</SourceChannelName>
		<ContrastEnhancement>
		  <Normalize>
		   <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
		   <VendorOption name="minValue">-22.1867</VendorOption>
		   <VendorOption name="maxValue">77.2479</VendorOption>
		  </Normalize>
		</ContrastEnhancement>
	  </BlueChannel>
	</ChannelSelection>
</RasterSymbolizer>

my raster info is

C:\DATA\raster>gdalinfo myRaster.tif
Driver: GTiff/GeoTIFF
Files: myRaster.tif
       myRaster.tif.ovr
       myRaster.tif.aux.xml
Size is 23861, 16880
Coordinate System is:
PROJCS["WGS 84 / UTM zone 29N",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-9],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32629"]]
Origin = (625033.424520000000484,4248219.836620000191033)
Pixel Size = (0.103860000000000,-0.103860000000000)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  625033.425, 4248219.837) (  7d34' 7.07"W, 38d22'24.38"N)
Lower Left  (  625033.425, 4246466.680) (  7d34' 8.19"W, 38d21'27.52"N)
Upper Right (  627511.628, 4248219.837) (  7d32'24.97"W, 38d22'23.12"N)
Lower Right (  627511.628, 4246466.680) (  7d32'26.11"W, 38d21'26.26"N)
Center      (  626272.526, 4247343.258) (  7d33'16.59"W, 38d21'55.32"N)
Band 1 Block=23861x1 Type=Byte, ColorInterp=Red
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=79.752, StdDev=67.510
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=4557.639431244172,3461.157875865516,1616.247181916951,8018.146929498016
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=79.751677803277
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=67.510291214959
Band 2 Block=23861x1 Type=Byte, ColorInterp=Green
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=61.009, StdDev=51.460
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=3461.157875865516,2648.170496677781,1243.180669732085,6133.734519685802
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=61.008562632494
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=51.460377929799
Band 3 Block=23861x1 Type=Byte, ColorInterp=Blue
  Min=0.000 Max=226.000
  Minimum=0.000, Maximum=226.000, Mean=27.531, StdDev=24.859
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=1616.247181916951,1243.180669732085,617.954007884253,2767.896495658875
    STATISTICS_MAXIMUM=226
    STATISTICS_MEAN=27.530599208965
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=24.858680734992
Band 4 Block=23861x1 Type=Byte, ColorInterp=Alpha
  Min=0.000 Max=255.000
  Minimum=0.000, Maximum=255.000, Mean=154.461, StdDev=124.617
  NoData Value=-10000
  Overviews: 11931x8440, 5966x4220, 2983x2110, 1492x1055, 746x528, 373x264, 187x132
  Metadata:
    STATISTICS_COVARIANCES=8018.146929498016,6133.734519685802,2767.896495658875,15529.34978118977
    STATISTICS_MAXIMUM=255
    STATISTICS_MEAN=154.46108783722
    STATISTICS_MINIMUM=0
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=124.61681179195

Now what can i do to come closer to the original one? (to get that “blueish” on the water)
You mentioned “computing percentiles based on histograms”. how can i do that?
Regards


View this message in context: Re: Raster Normalize

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,
Daniele Romagnoli

GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information.

Ing. Daniele Romagnoli
Senior Software Engineer

GeoSolutions S.A.S.
Via di Montramito 3/A
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272

http://www.geo-solutions.it
http://twitter.com/geosolutions_it


AVVERTENZE AI SENSI DEL D.Lgs. 196/2003
Le informazioni contenute in questo messaggio di posta elettronica e/o nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il loro utilizzo è consentito esclusivamente al destinatario del messaggio, per le finalità indicate nel messaggio stesso. Qualora riceviate questo messaggio senza esserne il destinatario, Vi preghiamo cortesemente di darcene notizia via e-mail e di procedere alla distruzione del messaggio stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per finalità diverse, costituisce comportamento contrario ai principi dettati dal D.Lgs. 196/2003.

The information in this message and/or attachments, is intended solely for the attention and use of the named addressee(s) and may be confidential or proprietary in nature or covered by the provisions of privacy act (Legislative Decree June, 30 2003, no.196 - Italy’s New Data Protection Code).Any use not in accord with its purpose, any disclosure, reproduction, copying, distribution, or either dissemination, either whole or partial, is strictly forbidden except previous formal approval of the named addressee(s). If you are not the intended recipient, please contact immediately the sender by telephone, fax or e-mail and delete the information in this message that has been received in error. The sender does not give any warranty or accept liability as the content, accuracy or completeness of sent messages and accepts no responsibility for changes made after they were sent or for other risks which arise as a result of e-mail transmission, viruses, etc.

Hello.

well, n=1 just gives me a blank image
and on the logs a bunch of errors

used gdal to calculate the percentile

and obtained:

(the same for the other bands)

with this values, im getting an image close to the one with no
ContrastEnhancement.

Any ideas?

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330178.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi Felipe,
could you report the outcome of gdalinfo -hist as well as the min and max which you have used in your contrastEnhancement sections based on the percentile computations you made?

please, let us know.
Best Regards,
Daniele

···

On Wed, Aug 2, 2017 at 12:35 PM, Filipe <filipesilva1@anonymised.com> wrote:

Hello.

well, n=1 just gives me a blank image
and on the logs a bunch of errors

used gdal to calculate the percentile

and obtained:

(the same for the other bands)

with this values, im getting an image close to the one with no
ContrastEnhancement.

Any ideas?


View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330178.html

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,
Daniele Romagnoli

GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information.

Ing. Daniele Romagnoli
Senior Software Engineer

GeoSolutions S.A.S.
Via di Montramito 3/A
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272

http://www.geo-solutions.it
http://twitter.com/geosolutions_it


AVVERTENZE AI SENSI DEL D.Lgs. 196/2003
Le informazioni contenute in questo messaggio di posta elettronica e/o nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il loro utilizzo è consentito esclusivamente al destinatario del messaggio, per le finalità indicate nel messaggio stesso. Qualora riceviate questo messaggio senza esserne il destinatario, Vi preghiamo cortesemente di darcene notizia via e-mail e di procedere alla distruzione del messaggio stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per finalità diverse, costituisce comportamento contrario ai principi dettati dal D.Lgs. 196/2003.

The information in this message and/or attachments, is intended solely for the attention and use of the named addressee(s) and may be confidential or proprietary in nature or covered by the provisions of privacy act (Legislative Decree June, 30 2003, no.196 - Italy’s New Data Protection Code).Any use not in accord with its purpose, any disclosure, reproduction, copying, distribution, or either dissemination, either whole or partial, is strictly forbidden except previous formal approval of the named addressee(s). If you are not the intended recipient, please contact immediately the sender by telephone, fax or e-mail and delete the information in this message that has been received in error. The sender does not give any warranty or accept liability as the content, accuracy or completeness of sent messages and accepts no responsibility for changes made after they were sent or for other risks which arise as a result of e-mail transmission, viruses, etc.

gdalinfo -hist

and the percentile values i obtaind with my script:

for p3 max, i used the byte max value 255

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330189.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi Felipe,
based on your outcome, I think you have lot of black pixels (158809545) around your valid image.
Moreover, gdalinfo is reporting nodata = -10000. However in byte type that value can’t exist so I assume that this data comes from some processing where 16bit data has been converted to byte.
Based on your huge count on the first bucket (the zero range), you should reassign nodata to zero and recompute your stats (you can remove the .aux.xml file being created beside that file before doing this to make sure it isn’t re-used):

gdal_translate -OF VRT -a_nodata 0 raster.tif raster.vrt

gdalinfo -stats -hist raster.vrt and see the new info.

Let us know.
Regards,
Daniele

···

On Wed, Aug 2, 2017 at 1:29 PM, Filipe <filipesilva1@anonymised.com> wrote:

gdalinfo -hist

and the percentile values i obtaind with my script:

for p3 max, i used the byte max value 255


View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330189.html

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,
Daniele Romagnoli

GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information.

Ing. Daniele Romagnoli
Senior Software Engineer

GeoSolutions S.A.S.
Via di Montramito 3/A
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272

http://www.geo-solutions.it
http://twitter.com/geosolutions_it


AVVERTENZE AI SENSI DEL D.Lgs. 196/2003
Le informazioni contenute in questo messaggio di posta elettronica e/o nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il loro utilizzo è consentito esclusivamente al destinatario del messaggio, per le finalità indicate nel messaggio stesso. Qualora riceviate questo messaggio senza esserne il destinatario, Vi preghiamo cortesemente di darcene notizia via e-mail e di procedere alla distruzione del messaggio stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per finalità diverse, costituisce comportamento contrario ai principi dettati dal D.Lgs. 196/2003.

The information in this message and/or attachments, is intended solely for the attention and use of the named addressee(s) and may be confidential or proprietary in nature or covered by the provisions of privacy act (Legislative Decree June, 30 2003, no.196 - Italy’s New Data Protection Code).Any use not in accord with its purpose, any disclosure, reproduction, copying, distribution, or either dissemination, either whole or partial, is strictly forbidden except previous formal approval of the named addressee(s). If you are not the intended recipient, please contact immediately the sender by telephone, fax or e-mail and delete the information in this message that has been received in error. The sender does not give any warranty or accept liability as the content, accuracy or completeness of sent messages and accepts no responsibility for changes made after they were sent or for other risks which arise as a result of e-mail transmission, viruses, etc.

hello.

First of all, thank you for your patience. Its much apreciated!

followed what you sugested... but must gave done something wrong.

the current hist on the tif

the mean and stddev values are the same as before

now the percentiles are:

on the viewer, the same results. both on geoserver and qgis

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330218.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi Filipe,
Note that you have computed the stats on the tif file whilst you should have computed them on the VRT which has been setup to modify the nodata.

  1. remove the auxiliary file
    rm raster.tif.aux.xml

  2. create a vrt (so no need to rewrite a new tif file), by replacing the nodata.
    gdal_translate -OF VRT -a_nodata 0 raster.tif raster.vrt

  3. compute stats and histogram on VRT … not on TIF.
    gdalinfo -hist -stats raster.vrt

Please, let me know if you get a different result with these steps.
(it should exclude pixels with value = 0 so you will get different bin distributions and therefore, different stats and hist).

Cheers,
Daniele

···

On Wed, Aug 2, 2017 at 4:21 PM, Filipe <filipesilva1@anonymised.com> wrote:

hello.

First of all, thank you for your patience. Its much apreciated!

followed what you sugested… but must gave done something wrong.

the current hist on the tif

the mean and stddev values are the same as before

now the percentiles are:

on the viewer, the same results. both on geoserver and qgis


View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330218.html

Sent from the GeoServer - User mailing list archive at Nabble.com.


Check out the vibrant tech community on one of the world’s most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

Geoserver-users@anonymised.com.382…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users

Regards,
Daniele Romagnoli

GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information.

Ing. Daniele Romagnoli
Senior Software Engineer

GeoSolutions S.A.S.
Via di Montramito 3/A
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 1660272

http://www.geo-solutions.it
http://twitter.com/geosolutions_it


AVVERTENZE AI SENSI DEL D.Lgs. 196/2003
Le informazioni contenute in questo messaggio di posta elettronica e/o nel/i file/s allegato/i sono da considerarsi strettamente riservate. Il loro utilizzo è consentito esclusivamente al destinatario del messaggio, per le finalità indicate nel messaggio stesso. Qualora riceviate questo messaggio senza esserne il destinatario, Vi preghiamo cortesemente di darcene notizia via e-mail e di procedere alla distruzione del messaggio stesso, cancellandolo dal Vostro sistema. Conservare il messaggio stesso, divulgarlo anche in parte, distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per finalità diverse, costituisce comportamento contrario ai principi dettati dal D.Lgs. 196/2003.

The information in this message and/or attachments, is intended solely for the attention and use of the named addressee(s) and may be confidential or proprietary in nature or covered by the provisions of privacy act (Legislative Decree June, 30 2003, no.196 - Italy’s New Data Protection Code).Any use not in accord with its purpose, any disclosure, reproduction, copying, distribution, or either dissemination, either whole or partial, is strictly forbidden except previous formal approval of the named addressee(s). If you are not the intended recipient, please contact immediately the sender by telephone, fax or e-mail and delete the information in this message that has been received in error. The sender does not give any warranty or accept liability as the content, accuracy or completeness of sent messages and accepts no responsibility for changes made after they were sent or for other risks which arise as a result of e-mail transmission, viruses, etc.

ok, i think we're getting somewhere!
i did those steps but sent the stats on the tif, my bad.

using the stats on the vrt, i calculated min and max with your previous
formula.
the percentiles are a bit odd:

nevertheless, i used the values of the formula and get the following
results:
<http://osgeo-org.1560.x6.nabble.com/file/n5330299/t1.jpg&gt;

and im looking for something like:
<http://osgeo-org.1560.x6.nabble.com/file/n5330299/t3.jpg&gt;

is there a way to correct the brightness down?

also, to apply "gamma stretch" (as in arcgis) we need to use the
"<GammaValue> ", correct?

Again, thank you so much.
Regards

--
View this message in context: http://osgeo-org.1560.x6.nabble.com/Raster-Normalize-tp5330021p5330299.html
Sent from the GeoServer - User mailing list archive at Nabble.com.

Hi, Maybe I found a bug trying MapStore with Geoserver.

The layer is using a Geopackage datastore. MapStore is using this WFS Query to show a widget:

<wfs:GetFeature service="WFS" version="1.1.0" xmlns:gml="http://www.opengis.net/gml&quot; xmlns:wfs="http://www.opengis.net/wfs&quot; xmlns:ogc="http://www.opengis.net/ogc&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd&quot; startIndex="0" maxFeatures="40"><wfs:Query typeName="buildings" srsName="EPSG:4326"><ogc:PropertyName>currentUse</ogc:PropertyName><ogc:PropertyName>value</ogc:PropertyName><ogc:PropertyName>gml_id</ogc:PropertyName><ogc:Filter><ogc:And><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:Polygon srsName="EPSG:3857"><gml:exterior><gml:LinearRing><gml:posList>-404523.862942224 4593261.069684201 -404523.862942224 4594677.543364611 -403334.31168953597 4594677.543364611 -403334.31168953597 4593261.069684201 -404523.862942224 4593261.069684201</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:And></ogc:Filter></wfs:Query></wfs:GetFeature>

Then the result is this one:

{"type":"FeatureCollection","features":[{"type":"Feature","id":"buildings.5904","geometry":null,"properties":{"gml_id":"ES.SDGC.BU.4475910VH4147N","currentUse":"1_residential","value":112}},{"type":"Feature","id":"buildings.5905","geometry":null,"properties":{"gml_id":"ES.SDGC.BU.4475911VH4147N","currentUse":"1_residential","value":109}}],"totalFeatures":0,"numberMatched":0,"numberReturned":2,"timeStamp":"2019-07-18T17:04:12.487Z","crs":null}

AS you can see and the end of the response: the the number of matched features is 0 but the returned features are 2 which does not make sense. The same layer with a shape datastore is working properly.

could be related with the name of the geometry column (geom in geopackage and the_geom is shapefile).

IF I change the query to show the geom field then is working (totalFeatures":840,"numberMatched":840,"numberReturned":2)

<wfs:GetFeature service="WFS" version="1.1.0" xmlns:gml="http://www.opengis.net/gml&quot; xmlns:wfs="http://www.opengis.net/wfs&quot; xmlns:ogc="http://www.opengis.net/ogc&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd&quot; startIndex="0" maxFeatures="2"><wfs:Query typeName="buildings" srsName="EPSG:4326"><ogc:PropertyName>currentUse</ogc:PropertyName><ogc:PropertyName>value</ogc:PropertyName><ogc:PropertyName>gml_id</ogc:PropertyName><ogc:PropertyName>geom</ogc:PropertyName><ogc:Filter><ogc:And><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:Polygon srsName="EPSG:3857"><gml:exterior><gml:LinearRing><gml:posList>-404523.862942224 4593261.069684201 -404523.862942224 4594677.543364611 -403334.31168953597 4594677.543364611 -403334.31168953597 4593261.069684201 -404523.862942224 4593261.069684201</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:And></ogc:Filter></wfs:Query></wfs:GetFeature>

{"type":"FeatureCollection","features":[{"type":"Feature","id":"buildings.5904","geometry":{"type":"Polygon","coordinates":[[[-3.63393641,38.10173674],[-3.63389626,38.10176129],[-3.63385407,38.10171789],[-3.63385396,38.1017178],[-3.63385897,38.10171535],[-3.63386869,38.10171041],[-3.63389273,38.10169517],[-3.63392517,38.10167462],[-3.63392677,38.10168089],[-3.63396561,38.10171744],[-3.63396572,38.10171754],[-3.63396664,38.10171825],[-3.63393641,38.10173674]]]},"geometry_name":"geom","properties":{"gml_id":"ES.SDGC.BU.4475910VH4147N","currentUse":"1_residential","value":112}},{"type":"Feature","id":"buildings.5905","geometry":{"type":"Polygon","coordinates":[[[-3.63389006,38.10169687],[-3.63386869,38.10171041],[-3.63385897,38.10171535],[-3.63384522,38.10169769],[-3.63383084,38.10167921],[-3.6338741,38.10166474],[-3.6338442,38.10161563],[-3.63389646,38.10159708],[-3.63391303,38.10162686],[-3.63392517,38.10167462],[-3.63389006,38.10169687]]]},"geometry_name":"geom","properties":{"gml_id":"ES.SDGC.BU.4475911VH4147N","currentUse":"1_residential","value":109}}],"totalFeatures":840,"numberMatched":840,"numberReturned":2,"timeStamp":"2019-07-18T17:05:50.507Z","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}}}

Cheers,

Jose

--
------------------------------
José Carlos Martínez Llario
http://www.upv.es/ficha-personal/jomarlla
https://cartosig.webs.upv.es

Producción Cartográfica y SIG.
Dpto. Ingeniería Cartográfica.
Univ. Politécnica de Valencia.
------------------------------

Fogot to say that I am using Geoserver 2.14.4

El 18/07/2019 a las 19:14, José Carlos Martínez Llario escribió:

Hi, Maybe I found a bug trying MapStore with Geoserver.

The layer is using a Geopackage datastore. MapStore is using this WFS Query to show a widget:

<wfs:GetFeature service="WFS" version="1.1.0" xmlns:gml="http://www.opengis.net/gml&quot; xmlns:wfs="http://www.opengis.net/wfs&quot; xmlns:ogc="http://www.opengis.net/ogc&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd&quot; startIndex="0" maxFeatures="40"><wfs:Query typeName="buildings" srsName="EPSG:4326"><ogc:PropertyName>currentUse</ogc:PropertyName><ogc:PropertyName>value</ogc:PropertyName><ogc:PropertyName>gml_id</ogc:PropertyName><ogc:Filter><ogc:And><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:Polygon srsName="EPSG:3857"><gml:exterior><gml:LinearRing><gml:posList>-404523.862942224 4593261.069684201 -404523.862942224 4594677.543364611 -403334.31168953597 4594677.543364611 -403334.31168953597 4593261.069684201 -404523.862942224 4593261.069684201</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:And></ogc:Filter></wfs:Query></wfs:GetFeature>

Then the result is this one:

{"type":"FeatureCollection","features":[{"type":"Feature","id":"buildings.5904","geometry":null,"properties":{"gml_id":"ES.SDGC.BU.4475910VH4147N","currentUse":"1_residential","value":112}},{"type":"Feature","id":"buildings.5905","geometry":null,"properties":{"gml_id":"ES.SDGC.BU.4475911VH4147N","currentUse":"1_residential","value":109}}],"totalFeatures":0,"numberMatched":0,"numberReturned":2,"timeStamp":"2019-07-18T17:04:12.487Z","crs":null}

AS you can see and the end of the response: the the number of matched features is 0 but the returned features are 2 which does not make sense. The same layer with a shape datastore is working properly.

could be related with the name of the geometry column (geom in geopackage and the_geom is shapefile).

IF I change the query to show the geom field then is working (totalFeatures":840,"numberMatched":840,"numberReturned":2)

<wfs:GetFeature service="WFS" version="1.1.0" xmlns:gml="http://www.opengis.net/gml&quot; xmlns:wfs="http://www.opengis.net/wfs&quot; xmlns:ogc="http://www.opengis.net/ogc&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd&quot; startIndex="0" maxFeatures="2"><wfs:Query typeName="buildings" srsName="EPSG:4326"><ogc:PropertyName>currentUse</ogc:PropertyName><ogc:PropertyName>value</ogc:PropertyName><ogc:PropertyName>gml_id</ogc:PropertyName><ogc:PropertyName>geom</ogc:PropertyName><ogc:Filter><ogc:And><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:Polygon srsName="EPSG:3857"><gml:exterior><gml:LinearRing><gml:posList>-404523.862942224 4593261.069684201 -404523.862942224 4594677.543364611 -403334.31168953597 4594677.543364611 -403334.31168953597 4593261.069684201 -404523.862942224 4593261.069684201</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:And></ogc:Filter></wfs:Query></wfs:GetFeature>

{"type":"FeatureCollection","features":[{"type":"Feature","id":"buildings.5904","geometry":{"type":"Polygon","coordinates":[[[-3.63393641,38.10173674],[-3.63389626,38.10176129],[-3.63385407,38.10171789],[-3.63385396,38.1017178],[-3.63385897,38.10171535],[-3.63386869,38.10171041],[-3.63389273,38.10169517],[-3.63392517,38.10167462],[-3.63392677,38.10168089],[-3.63396561,38.10171744],[-3.63396572,38.10171754],[-3.63396664,38.10171825],[-3.63393641,38.10173674]]]},"geometry_name":"geom","properties":{"gml_id":"ES.SDGC.BU.4475910VH4147N","currentUse":"1_residential","value":112}},{"type":"Feature","id":"buildings.5905","geometry":{"type":"Polygon","coordinates":[[[-3.63389006,38.10169687],[-3.63386869,38.10171041],[-3.63385897,38.10171535],[-3.63384522,38.10169769],[-3.63383084,38.10167921],[-3.6338741,38.10166474],[-3.6338442,38.10161563],[-3.63389646,38.10159708],[-3.63391303,38.10162686],[-3.63392517,38.10167462],[-3.63389006,38.10169687]]]},"geometry_name":"geom","properties":{"gml_id":"ES.SDGC.BU.4475911VH4147N","currentUse":"1_residential","value":109}}],"totalFeatures":840,"numberMatched":840,"numberReturned":2,"timeStamp":"2019-07-18T17:05:50.507Z","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}}}

Cheers,

Jose

--
------------------------------
José Carlos Martínez Llario
http://www.upv.es/ficha-personal/jomarlla
https://cartosig.webs.upv.es

Producción Cartográfica y SIG.
Dpto. Ingeniería Cartográfica.
Univ. Politécnica de Valencia.
------------------------------

Sounds like an issue indeed, possibly in the machinery that’s running count queries…
are you using a recent version of GeoServer (something released in the last few months)?
If so, please open a report at http://osgeo-org.atlassian.net/projects/GEOS with a sample

dataset and a sample request that will show the problem.
If not, please try a newer version of GeoServer, and report only if the issue is still there

Cheers
Andrea

···

Regards, Andrea Aime == GeoServer Professional Services from the experts! Visit http://goo.gl/it488V for more information. == Ing. Andrea Aime @geowolf Technical Lead GeoSolutions S.A.S. Via di Montramito 3/A 55054 Massarosa (LU) phone: +39 0584 962313 fax: +39 0584 1660272 mob: +39 339 8844549 http://www.geo-solutions.it http://twitter.com/geosolutions_it ------------------------------------------------------- Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia. This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail.

It could well be related to the one I stumbled over looking at https://osgeo-org.atlassian.net/browse/GEOT-6310 - where some of the filters are applied before and some after the counting.

I thought I opened a ticket against ContentDataStore but I can’t find it now

Ian

···

Ian Turton