Note that there are some explanatory texts on larger screens.

plurals
  1. POGeotools - Draw Features on WMS and OSM
    text
    copied!<p>I am trying to overlay a shp file on wms layer using the example <a href="http://docs.geotools.org/latest/userguide/tutorial/raster/image.html" rel="nofollow">http://docs.geotools.org/latest/userguide/tutorial/raster/image.html</a>.</p> <p>I am continuously getting the error:</p> <pre><code>Exception in thread "main" java.lang.UnsupportedOperationException: Trying to get a reader from an unknown format. at org.geotools.coverage.grid.io.UnknownFormat.getReader(UnknownFormat.java:62) at com.qedrix.map.maplotr.Demo1.displayLayers(Demo1.java:121) at com.qedrix.map.maplotr.Demo1.main(Demo1.java:229) </code></pre> <p>when the code tries to read the WMS image.</p> <p>My code looks like this:</p> <pre><code>public class Demo1 { private AbstractGridCoverage2DReader reader = null; private StyleFactory sf = CommonFactoryFinder.getStyleFactory(); private FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(); /** * This method examines the names of the sample dimensions in the provided * coverage looking for "red...", "green..." and "blue..." (case insensitive * match). If these names are not found it uses bands 1, 2, and 3 for the * red, green and blue channels. It then sets up a raster symbolizer and * returns this wrapped in a Style. * * @return a new Style object containing a raster symbolizer set up for RGB * image */ private Style createRGBStyle() { GridCoverage2D cov = null; try { cov = reader.read(null); } catch (IOException giveUp) { throw new RuntimeException(giveUp); } // We need at least three bands to create an RGB style int numBands = cov.getNumSampleDimensions(); if (numBands &lt; 3) { return null; } // Get the names of the bands String[] sampleDimensionNames = new String[numBands]; for (int i = 0; i &lt; numBands; i++) { GridSampleDimension dim = cov.getSampleDimension(i); sampleDimensionNames[i] = dim.getDescription().toString(); } final int RED = 0, GREEN = 1, BLUE = 2; int[] channelNum = { -1, -1, -1 }; // We examine the band names looking for "red...", "green...", // "blue...". // Note that the channel numbers we record are indexed from 1, not 0. for (int i = 0; i &lt; numBands; i++) { String name = sampleDimensionNames[i].toLowerCase(); if (name != null) { if (name.matches("red.*")) { channelNum[RED] = i + 1; } else if (name.matches("green.*")) { channelNum[GREEN] = i + 1; } else if (name.matches("blue.*")) { channelNum[BLUE] = i + 1; } } } // If we didn't find named bands "red...", "green...", "blue..." // we fall back to using the first three bands in order if (channelNum[RED] &lt; 0 || channelNum[GREEN] &lt; 0 || channelNum[BLUE] &lt; 0) { channelNum[RED] = 1; channelNum[GREEN] = 2; channelNum[BLUE] = 3; } // Now we create a RasterSymbolizer using the selected channels SelectedChannelType[] sct = new SelectedChannelType[cov.getNumSampleDimensions()]; ContrastEnhancement ce = sf.contrastEnhancement(ff.literal(1.0), ContrastMethod.NORMALIZE); for (int i = 0; i &lt; 3; i++) { sct[i] = sf.createSelectedChannelType(String.valueOf(channelNum[i]), ce); } RasterSymbolizer sym = sf.getDefaultRasterSymbolizer(); ChannelSelection sel = sf.channelSelection(sct[RED], sct[GREEN], sct[BLUE]); sym.setChannelSelection(sel); return SLD.wrapSymbolizers(sym); } public void displayLayers() { File rasterFile = fetchWmsImage(); AbstractGridFormat format = GridFormatFinder.findFormat(rasterFile); this.reader = format.getReader(rasterFile); // Initially display the raster in greyscale using the // data from the first image band Style rasterStyle = createRGBStyle(); // Create a basic style with yellow lines and no fill Style shpStyle = SLD.createPointStyle("point", Color.YELLOW, Color.GRAY, 0.0f, 1.5f); MapContent map = new MapContent(); map.setTitle("ImageLab"); MapViewport vp = new MapViewport(); org.geotools.map.Layer rasterLayer = new GridReaderLayer(reader, rasterStyle); map.addLayer(rasterLayer); saveImage(map, "final.jpeg", 583); } public File fetchWmsImage() { URL url = null; try { url = new URL("http://184.106.187.247:8080/geoserver/rg/wms?version=1.1.0"); } catch (MalformedURLException e) { // will not happen } WebMapServer wms = null; try { wms = new WebMapServer(url); WMSCapabilities capabilities = wms.getCapabilities(); Layer[] layers = WMSUtils.getNamedLayers(capabilities); GetMapRequest request = wms.createGetMapRequest(); request.setFormat("image/png"); request.setDimensions("583", "420"); request.setTransparent(true); request.setSRS("EPSG:900913"); request.setBBox("-13019428.542822,3922163.1648461,-13013051.407366,3929863.8567165"); request.setProperty("isBaseLayer", "false"); request.setProperty("opacity", ".2"); for (Layer layer : WMSUtils.getNamedLayers(capabilities)) { if (layer.getName().equals("rg:parcels")) request.addLayer(layer); } GetMapResponse response = (GetMapResponse) wms.issueRequest(request); BufferedImage image = ImageIO.read(response.getInputStream()); File rasterFile = new File("C:\\Users\\samabhik\\Workspace\\MAP\\data\\out.png"); ImageIO.write(image, "png", rasterFile); return rasterFile; } catch (ServiceException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { } return null; } public void saveImage(final MapContent map, final String file, final int imageWidth) { GTRenderer renderer = new StreamingRenderer(); renderer.setMapContent(map); Rectangle imageBounds = null; ReferencedEnvelope mapBounds = null; try { mapBounds = map.getMaxBounds(); double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0); imageBounds = new Rectangle(0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth)); } catch (Exception e) { // failed to access map layers throw new RuntimeException(e); } BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB); Graphics2D gr = image.createGraphics(); gr.setPaint(Color.WHITE); gr.fill(imageBounds); try { renderer.paint(gr, imageBounds, mapBounds); File fileToSave = new File(file); ImageIO.write(image, "jpeg", fileToSave); } catch (IOException e) { throw new RuntimeException(e); } } public static void main(String[] args) { Demo1 demo = new Demo1(); demo.displayLayers(); } </code></pre> <p>}</p> <p>My pom dependency looks like this:</p> <pre><code>&lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-shapefile&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-swing&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-epsg-hsql&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-geotiff&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-image&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-wms&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.geotools&lt;/groupId&gt; &lt;artifactId&gt;gt-coverage&lt;/artifactId&gt; &lt;version&gt;${geotools.version}&lt;/version&gt; &lt;/dependency&gt; </code></pre> <p>Somewhere I read that it could a GDAL issue. But I couldn't figure out how to resolve it. I am using eclipse on 64 JDK 1.6 and Win 7 amd64.</p> <p>Please help, someone..</p> <p>Just tested the image file using gdalinfo.exe found in the GDAL native libraries path. Here's the report:</p> <pre><code>Driver: PNG/Portable Network Graphics Files: ..\..\Workspace\MAP\data\out2.png Size is 583, 420 Coordinate System is `' Image Structure Metadata: INTERLEAVE=PIXEL Corner Coordinates: Upper Left ( 0.0, 0.0) Lower Left ( 0.0, 420.0) Upper Right ( 583.0, 0.0) Lower Right ( 583.0, 420.0) Center ( 291.5, 210.0) Band 1 Block=583x1 Type=Byte, ColorInterp=Red Mask Flags: PER_DATASET ALPHA Band 2 Block=583x1 Type=Byte, ColorInterp=Green Mask Flags: PER_DATASET ALPHA Band 3 Block=583x1 Type=Byte, ColorInterp=Blue Mask Flags: PER_DATASET ALPHA Band 4 Block=583x1 Type=Byte, ColorInterp=Alpha </code></pre> <p><em>FURTHER UPDATES</em></p> <p>I just tried and changed the out format for WMS from images/png to images/geotiff and this now works partially ( the final image that is generated by geotools is Black &amp; White). Why this is happening? And why it didn't work with PNG? </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload