J'essaye de superposer un fichier shp sur une couche wms en utilisant l'exemple http://docs.geotools.org/latest/userguide/tutorial/raster/image.html.Geotools - Dessiner des fonctions sur WMS et OSM
Je reçois continuellement l'erreur:
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)
lorsque le code essaie de lire l'image WMS.
Mon code ressemble à ceci:
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 < 3) {
return null;
}
// Get the names of the bands
String[] sampleDimensionNames = new String[numBands];
for (int i = 0; i < 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 < 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] < 0 || channelNum[GREEN] < 0 || channelNum[BLUE] < 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 < 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();
}
}
Ma dépendance pom ressemble à ceci:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geotiff</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-image</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-wms</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-coverage</artifactId>
<version>${geotools.version}</version>
</dependency>
Quelque part j'ai lu qu'il pourrait un problème de GDAL. Mais je ne pouvais pas comprendre comment le résoudre. J'utilise eclipse sur 64 JDK 1.6 et Win 7 amd64.
S'il vous plaît aider quelqu'un ..
testé le fichier juste image à l'aide gdalinfo.exe trouvé dans le chemin des bibliothèques natives GDAL. Voici le rapport:
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
MISES À JOUR PLUS
Je viens d'essayer et a changé le format pour WMS à partir d'images/png aux images/geotiff et cela fonctionne maintenant en partie (l'image finale générée par geotools est noir & blanc). Pourquoi cela se passe-t-il? Et pourquoi cela n'a pas fonctionné avec PNG?
Pouvez-vous imprimer l'URL de la requête, puis vérifiez cela fonctionne dans un navigateur essayez d'ouvrir l'image sur le disque en utilisant un navigateur aussi. Il est possible que vous receviez une erreur et non une image. –
Ceci est l'URL et l'image me semble OK [link] (http://184.106.187.247:8080/geoserver/rg/wms?SERVICE=WMS&LAYERS=rg%3Aparcels&ISBASELAYER=false&FORMAT=image%2Fpng&OPACITY=.2&HEIGHT=420&TRANSPARENT = TRUE & REQUEST = GetMap & BBOX = -13019428.542822,3922163.1648461, -13013051.407366,3929863,8567165 & WIDTH = 583 & STYLES = & SRS = EPSG: 900913 & VERSION = 1.1.1) – Qedrix