3

http://docs.geotools.org/latest/userguide/tutorial/raster/image.htmlの例を使用して、shpファイルをwmsレイヤーにオーバーレイしようとしています。

継続的にエラーが発生します:

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)

コードがWMSイメージを読み取ろうとしたとき。

私のコードは次のようになります:

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();
}

}

私のpom依存関係は次のようになります:

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

どこかで、GDALの問題になる可能性があると読みました。しかし、私はそれを解決する方法を理解できませんでした。私は64JDK1.6とWin7amd64でEclipseを使用しています。

助けてください、誰か。

GDALネイティブライブラリパスにあるgdalinfo.exeを使用してイメージファイルをテストしました。レポートは次のとおりです。

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

さらなるアップデート

WMSの出力形式をimages/pngからimages/geotiffに変更しようとしましたが、これは部分的に機能するようになりました(geotoolsによって生成される最終的な画像は白黒です)。なぜこれが起こっているのですか?そして、なぜそれがPNGで機能しなかったのですか?

4

1 に答える 1

4

JAI と ImageIO が利用可能であることを確認します。Maven の依存関係を介して、またはクイックスタートで概説されているように Java 拡張機能としてインストールします。

アップデート:

GeoTools IRC チャンネルに追いつき、これが環境の問題であることを確認できました。授業では、WMSLab チュートリアルの例を使用して問題の WMS に接続し、結果を表示することができました。

それでは、「問題のある」環境をチェックしてみましょう::

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

結果::

GeoTools バージョン 9-SNAPSHOT (ree5a6830d2c774ee9a4eb9e024d989c2a1bcdfe3 からビルド) Java バージョン: 1.7.0_09 オペレーティング システム: Windows 7 6.1 クラスパス上の GeoTools jar:

いくつかのアイデア:

  • ImageLab をチェックして、JAI / ImageIO が利用可能であることを確認しますか?

これはうまくいきました!

  • ブラウザから取得した画像を保存し、そのまま Java を使用してロードしてみてください

WorldImageReader の例::

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

どうやらこれはうまくいかなかったのでしょうか?

  • GeoTools はまだ Java 7 の QA を通過していません。Java 6 にダウングレードしますか?

最近、Java 7 ビルド ボックスがボランティアで提供されました。GeoTools が Java 7 で動作するようになると、リリース ノートとチュートリアルが更新されます。

  • 特に Windows では、PNG サポートの実装が疑わしいです。

uDig プロジェクトの次のコードは、ネイティブ実装を無効にして、純粋な Java 実装にクラックを持たせることができます::

 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();
        }
    }
于 2012-11-04T04:31:37.683 に答える