2016-08-04 1 views
-1

J'essaie de combiner l'image tiff et le fichier de formes et je veux le montrer. Pour cela, j'utilise GeoTiff et je suis coincé que mon fichier tiff est maintenant affiché. Shapefile s'affiche correctement, mais l'image tiff, qui n'a qu'un seul indice de bande et d'échelle de gris, n'est pas affichée pour une raison quelconque. Je reçois un message d'avertissement comme ci-dessous.AVERTISSEMENT Utilisation possible de la projection "Transverse_Mercator" en dehors de sa zone valide

2016-08-04T12: 43: 06.456 + 0530 AVERTISSEMENT Utilisation de la projection "Transverse_Mercator" en dehors de sa zone de validité. Latitude 180 ° 00.0'S est hors limites (± 90 °).

Comment puis-je supprimer ce message?

Mon code est comme ci-dessous

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

Je viens de passer deux fichiers ci-dessous le code

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

Voici comment j'utiliser cette classe dans la classe principale

 //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(); 
+0

Le message d'erreur est assez clair. Qu'est-ce que tu ne comprends pas? – Raedwald

+0

Quelle ligne provoque ce message dans mon code? –

+0

Ce n'est pas seulement un message d'erreur, cela signifie beaucoup de choses dans la zone géologique. Mieux vaut passer par ma réponse. –

Répondre

1

TLDR; ajoutez la ligne suivante à votre démarrage du programme:

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

De GeoTools FAQ comme les programmeurs informatiques, ils savaient que les coordonnées seraient exprimées en longitude, des paires de latitude afin qu'ils puissent utiliser le code graphique existant facilement en les traitant comme un simple (x , y) paire. mais pour une séquence comme (x, y) ou (y, x) ils ont confondu c'est pourquoi cette erreur arrive. En l'utilisant pas en dehors de sa zone valide.