2016-07-29 21 views
5

Niedawno rozpocząłem swój pierwszy program z GeoTools, w którym również korzystałem z JAI- Java Advanced Imaging 1_1_2_01 z JDK 1_7. Wszystko działało, dopóki nie dodałem słoików GeoTiff. Znalazłem następujący błądjava.lang.NoClassDefFoundError: Nie można zainicjować klasy javax.media.jai.JAI

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class javax.media.jai.JAI at org.geotools.gce.geotiff.GeoTiffReader.read(GeoTiffReader.java:607) at com.rgb.PixelExtractor.extract(PixelExtractor.java:55) at com.rgb.RGBSpliter.main(RGBSpliter.java:136)

Kod jest jak poniżej

public void extract(File f, String name, String date) throws Exception { 
ParameterValue<OverviewPolicy> policy = AbstractGridFormat.OVERVIEW_POLICY 
     .createValue(); 
policy.setValue(OverviewPolicy.IGNORE); 

// this will basically read 4 tiles worth of data at once from the disk... 
ParameterValue<String> gridsize = AbstractGridFormat.SUGGESTED_TILE_SIZE.createValue(); 
//gridsize.setValue(512 * 4 + "," + 512); 

// Setting read type: use JAI ImageRead (true) or ImageReaders read methods (false) 
ParameterValue<Boolean> useJaiRead = AbstractGridFormat.USE_JAI_IMAGEREAD.createValue(); 
useJaiRead.setValue(true); 

//reader.read(new GeneralParameterValue[] { policy, gridsize, useJaiRead }); 
// The line that throws error 
GridCoverage2D image 
     = new GeoTiffReader(f).read(new GeneralParameterValue[]{policy, gridsize, useJaiRead}); 
Rectangle2D bounds2D = image.getEnvelope2D().getBounds2D(); 
bounds2D.getCenterX(); 
// calculate zoom level for the image 
GridGeometry2D geometry = image.getGridGeometry(); 



BufferedImage img = ImageIO.read(f); 
// ColorModel colorModel = img.getColorModel(  
WritableRaster raster = img.getRaster(); 

int numBands = raster.getNumBands(); 

int w = img.getWidth(); 
int h = img.getHeight(); 
outer: 
for (int i = 0; i < w; i++) {//width... 

    for (int j = 0; j < h; j++) { 

    double[] latlon = geo(geometry, i, j); 
    double lat = latlon[0]; 
    double lon = latlon[1]; 

    Double s = 0d; 

    String originalBands = ""; 
    for (int k = 0; k < numBands; k++) { 
     double d = raster.getSampleDouble(i, j, k); 
     originalBands += d + ","; 
     s += d; 
    } 

    originalBands = originalBands.substring(0, originalBands.length() - 1); 
    if (s.compareTo(0d) == 0) { 
     continue; 
    } 
    String geoHash = GeohashUtils.encodeLatLon(lat, lon); 
    //here do something with the bands, lat, long, geohash, etc.... 

    } 

    } 

    } 

    private static double[] geo(GridGeometry2D geometry, int x, int y) throws Exception { 

    //int zoomlevel = 1; 
    Envelope2D pixelEnvelop = geometry.gridToWorld(new GridEnvelope2D(x, y, 1, 1)); 

    // pixelEnvelop.getCoordinateReferenceSystem().getName().getCodeSpace(); 
    return new double[]{pixelEnvelop.getCenterY(), pixelEnvelop.getCenterX()}; 

} 

} 

JDK Słoiki

JDK images jar

Inne Jars

Part1

part2

Dodałem też zmiennej CLASSPATH dla GeoTools słoików

classpath

Edit:

Moja Jai ​​pracuje bez Integracji GeoTools, ale kiedy dodać gt-geotiff-14.4.jar spróbuje dodać JAI-core-1.1.3.jar niezgodnego z jai-core.jar w moim JDK 1.7. Usunąłem więc JAI-core-1.1.3.jar i powiązane słoiki, ale nadal daje mi to ten sam błąd.

+0

Czy możesz dodać cały stacktrace, proszę? – Jens

+0

jest on kopiowany powyżej na początku pytania. Ale znalazłem odpowiedź, w której słoiki były sprzeczne. Więc nie potrzeba więcej odpowiedzi. –

Odpowiedz

3

końcu zadziałało gdy usunąłem GeoTiff jai-core-1.1.3.jar, jai-codec-1.1.3.jar i jai-imageio-1.1.jar plików i dodaje nowa klasa dla plików klasy jai-ext z klasy gt-utility. Właśnie skopiowałem z Githuba i dodałem do src mojego projektu. gt-utility było tym, którego brakowało. Słoiki też były w konflikcie.

2

Trzeba dodać jai-core.jar na ścieżce klas

+0

Jest już dodany –

+0

@ParthTrivedi gdzie dodano, pokaż, jak uruchomić program – Jens

+0

Używam eclipse, w którym JDK 1.7 jest dodawany, JAI jest zainstalowany migawka pokazuje jai słoiki bez ograniczeń dostępu i ustawiam opcje pamięci też "- Xms512m -Xmx512m -XX: MaxPermSize = 512m "Teraz daje mi ten błąd. –

0

Proszę śledzić GeoTools setup instructions który powiedzenia na JAI :

Java Advanced Imaging Java Advanced Imaging is an image processing library allowing you to form chains of operations to process rasters in a manner similar to functional programming.

References:

http://java.net/projects/jai-core Download this Version of JAI

Java Advanced Imaging API 1.1.3 At the time of writing Oracle is migrating java projects around - try the following:

http://download.java.net/media/jai/builds/release/1_1_3/ http://download.java.net/media/jai/builds/release/1_1_3/INSTALL.html Download JAI for your JDK by clicking on the link for your platform:

Example: jai-1_1_3-lib-windows-i586-jdk.exe

Use the one click installer to install JAI into your JDK

Download JAI for your JRE by clicking on the link for your platform:

Example: jai-1_1_3-lib-windows-i586-jre.exe

Use the one click installer to install JAI into your JRE

(If you are working on linux you will of course need to choose the appropriate download)

+0

jai-1_1_2-lib-windows-i586-jre.exe i jai-1_1_2-lib-windows-i586-jdk.exe, I ponownie zainstalowane i są poprawnie wyświetlane w moim zaćmieniu, ponieważ słoiki pokazują również błąd związany z ograniczeniem dostępu, teraz tylko ten błąd nadchodzi w celu zainicjowania klasy JAI. –

+0

Wszystkie kroki są pobierane z tej strony, również pełne pozwolenie jest przyznawane całemu folderowi JDK, a także folder JRE nadal występuje błąd. –

+0

GeoTools 14.x jest również dla JDK1.7 i jai-1_1_2-lib jest również dla JDK 1.7. –