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

WARNING Possible use of "Transverse_Mercator" projection outside its valid area

我正在尝试将 tiff 图像和 shapefile 结合起来并想显示它。为此,我使用的是 GeoTiff,但现在正在显示我的 tiff 文件。 Shapefile 显示正确,但由于某种原因未显示只有 1 个波段和灰度索引的 tiff 图像。我收到如下警告消息。

2016-08-04T12:43:06.456+0530 WARNING Possible use of "Transverse_Mercator" projection outside its valid area. Latitude 180°00.0'S is out of range (±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();
}
}

这就是我在主 class

中使用此 class 的方式
      //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();

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

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

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