2012-11-02 2 views
3

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?

+0

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. –

+0

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

Répondre

4

Vérifiez que JAI et ImageIO sont disponibles. Soit via une dépendance maven, soit en les installant en tant qu'extensions Java comme indiqué dans le Quickstart.

Mise à jour:

J'ai pu rattraper son retard sur le canal IRC GeoTools et confirmer est un problème d'environnement. Dans la classe fonctionne pour moi mode J'ai pu me connecter en utilisant l'exemple de tutoriel WMSLab au WMS en question et afficher les résultats.

permet donc de vérifier sur l'environnement "problème" ::

System.out.println (GeoTools.getAboutInfo());

Résultat ::

GeoTools version 9-SNAPSHOT (construit à partir ree5a6830d2c774ee9a4eb9e024d989c2a1bcdfe3) version Java: 1.7.0_09 Système d'exploitation: Windows 7 6.1 Les pots de GeoTools sur classpath:

quelques idées:

  • Vérifiez l'ImageLab pour confirmer que JAI/ImageIO est disponible?

Cela a fonctionné!

  • Enregistrez l'image récupérée à partir du navigateur et essayez de le charger en utilisant directement vers le haut Java

Exemple de WorldImageReader ::

File input = ... 
ImageInputStreamSpi inStreamSPI= ImageIOExt.getImageInputStreamSPI(input); 
if (inStreamSPI == null) throw new IllegalStateException("Unsuppported"); 

Apparemment, cela n'a pas réussi?

  • GeoTools n'est pas encore passé par QA sur Java 7, rétrogradation vers Java 6?

Récemment, une boîte de construction Java 7 a été proposée. Lorsque GeoTools fonctionne dans Java 7, les notes de publication et les didacticiels seront mis à jour.

  • Surtout sur Windows, l'implémentation du support PNG est suspecte.

Le code suivant du projet uDig désactive la mise en œuvre native permettant la mise en œuvre pure Java pour avoir une fissure à elle ::

if (Platform.getOS().equals(Platform.OS_WIN32)) { 
     try { 
      // PNG native support is not very good .. this turns it off 
      ImageUtilities.allowNativeCodec("png", ImageReaderSpi.class, false); //$NON-NLS-1$ 
     } catch (Throwable t) { 
      // we should not die if JAI is missing; we have a warning for that... 
      System.out.println("Difficulty turnning windows native PNG support (which will result in scrambled images from WMS servers)"); //$NON-NLS-1$ 
      t.printStackTrace(); 
     } 
    } 
+0

J'ai essayé d'exécuter le fichier java à nouveau en utilisant JDK 1.6 x86 et également utiliser le code 'if (System. getProperty ("os.arch"). toLowerCase(). est égal à ("x86")) { \t \t \t System.out.println ("---"); \t \t \t ImageUtilities.allowNativeCodec ("png", ImageReaderSpi.class, false); // $ NON-NLS-1 \t \t} 'pour désactiver l'implémentation native. N'a pas fonctionné - même message d'erreur. – Qedrix

+0

J'ai également observé quelques choses. Lorsque j'essaie de lire un fichier jpg qui a un fichier .jgw d'accompagnement dans le même dossier (je les ai pris dans les fichiers d'exemple), mon code fonctionne parfaitement. Lorsque j'essaie d'exécuter le code sans un fichier .jgw, la même erreur est renvoyée. Pourquoi avons-nous besoin de ce fichier .jgw? comment suis-je censé en créer un avec l'image WMS? – Qedrix

+0

@Qedrix Poser des questions dans les commentaires est fortement déconseillé. Veuillez le poster sur une question séparée afin que les autres puissent apprendre de votre expérience aussi. –