警告可能在其有效区域外使用“Transverse_Mercator”投影

时间:2016-08-04 07:16:19

标签: java geotiff

我正在尝试对齐tiff图像和shapefile并想要显示它。为此,我正在使用GeoTiff,我被困住了,我的tiff文件现在正在显示。 Shapefile显示正常,但由于某些原因,没有显示只有1个波段和灰度指数的tiff图像。我收到一条警告信息如下。

  

2016-08-04T12:43:06.456 + 0530警告可能在其有效区域外使用“Transverse_Mercator”投影。   纬度180°00.0'S超出范围(±90°)。

如何删除此邮件?

我的代码如下

private void displayLayers() throws Exception {
AbstractGridFormat format = GridFormatFinder.findFormat(this.getBlueMarble());
this.setGridCoverageReader(format.getReader(this.getBlueMarble()));

Style rgbStyle = this.createRGBStyle();

// connect to the shapefile
FileDataStore dataStore =     FileDataStoreFinder.getDataStore(this.getBorderShape());
SimpleFeatureSource shapefileSource = dataStore.getFeatureSource();

Style shpStyle = SLD.createPolygonStyle(Color.BLUE, null, 0.0f);

MapContent map = new MapContent();
map.getViewport().setCoordinateReferenceSystem(
        DefaultGeographicCRS.WGS84);
map.setTitle("Illegal Mining");

Layer rasterLayer = new GridReaderLayer(this.getGridCoverageReader(), rgbStyle);
map.addLayer(rasterLayer);

Layer shpLayer = new FeatureLayer(shapefileSource, shpStyle);
map.addLayer(shpLayer);

System.out.println("Trying to show on map...");
JMapPane mapPane = new JMapPane();
mapPane.setMapContent(map);
mapPane.setDisplayArea(shapefileSource.getBounds());


 //mapPane.setDisplayArea(this.getGridCoverageReader().getOriginalEnvelope());

this.add(mapPane, BorderLayout.CENTER);

}

private Style createRGBStyle() {
GridCoverage2DReader reader = this.getGridCoverageReader();
StyleFactory sf = this.getStyleFactory();
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();
System.out.println("numBands:"+numBands);
if (numBands < 3) {
    System.out.println("Bands are less than 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 };
Boolean greyflag=false;
// 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();
    System.out.println("name :"+name);
    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;
        }else if(name.matches("gray.*")){
            System.out.println("What to do here");
            channelNum[RED] = 1;
            channelNum[GREEN] = 2;
            channelNum[BLUE] = 3;
            greyflag=true;
        }
    }
}
// If we didn't find named bands "red...", "green...", "blue..."
// we fall back to using the first three bands in order
if(greyflag==false){
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(this.ff.literal(1.0),
        ContrastMethod.NORMALIZE);
for (int i = 0; i < numBands; i++) {
    sct[i] = sf.createSelectedChannelType(
            String.valueOf(channelNum[i]), ce);
    System.out.println(String.valueOf(channelNum[i]));
}

RasterSymbolizer sym = sf.getDefaultRasterSymbolizer();
ChannelSelection sel =sf.channelSelection(sct[RED]); 
if(numBands>1){
 sel = sf.channelSelection(sct[RED], sct[GREEN],
        sct[BLUE]);
}
sym.setChannelSelection(sel);

return SLD.wrapSymbolizers(sym);
}

我只传递两个文件,如下面的代码

public MapImagePanel() {
this.setLayout(new BorderLayout(0, 0));
this.setBackground(Color.BLUE);
this.setPreferredSize(new Dimension(720, 360));

this.setBlueMarble(new File("E:/tifffilename.TIFF"));

this.setBorderShape(new File("E:/shapefilename.shp"));

try {
    this.displayLayers();
} catch (Exception e) {
    e.printStackTrace();
}
}

这就是我在主类

中使用这个类的方法
      //see output in main method
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      MapImagePanel panel = new MapImagePanel();
      panel.setPreferredSize(new Dimension(1024,768));

      panel.setVisible(true);
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setVisible(true);
      frame.show();

1 个答案:

答案 0 :(得分:1)

TLDR;将以下行添加到您的程序启动:

System.setProperty("org.geotools.referencing.forceXY", "true");

GeoTools FAQ作为计算机程序员,他们知道坐标将表示为经度,纬度对,因此他们可以通过将它们视为简单的(x,y)对来轻松地使用现有的图形代码。但对于像(x,y)或(y,x)这样的序列,他们会混淆这就是为什么会出现这个错误。