protected void preCache(List<Position> grid, Position centerPosition) throws InterruptedException { // Pre-cache the tiles that will be needed for the intersection calculations. double n = 0; final long start = System.currentTimeMillis(); for (Position gridPos : grid) // for each grid point. { final double progress = 100 * (n++ / grid.size()); terrain.cacheIntersectingTiles(centerPosition, gridPos); SwingUtilities.invokeLater( new Runnable() { public void run() { progressBar.setValue((int) progress); progressBar.setString(null); } }); } SwingUtilities.invokeLater( new Runnable() { public void run() { progressBar.setValue(100); } }); long end = System.currentTimeMillis(); System.out.printf( "Pre-caching time %d milliseconds, cache usage %f, tiles %d\n", end - start, terrain.getCacheUsage(), terrain.getNumCacheEntries()); }
protected void computeAndShowIntersections(final Position curPos) { this.previousCurrentPosition = curPos; SwingUtilities.invokeLater( new Runnable() { public void run() { setCursor(WaitCursor); } }); // Dispatch the calculation threads in a separate thread to avoid locking up the user // interface. this.calculationDispatchThread = new Thread( new Runnable() { public void run() { try { performIntersectionTests(curPos); } catch (InterruptedException e) { System.out.println("Operation was interrupted"); } } }); this.calculationDispatchThread.start(); }
public void showCommunicationErrorDialogLater( final Exception e, final String message, final Object... args) { SwingUtilities.invokeLater( new Runnable() { public void run() { showCommunicationErrorDialog(e, message, args); } }); }
protected void performIntersectionTests(final Position curPos) throws InterruptedException { // Clear the results lists when the user selects a new location. this.firstIntersectionPositions.clear(); this.sightLines.clear(); // Raise the selected location and the grid points a little above ground just to show we can. final double height = 5; // meters // Form the grid. double gridRadius = GRID_RADIUS.degrees; Sector sector = Sector.fromDegrees( curPos.getLatitude().degrees - gridRadius, curPos.getLatitude().degrees + gridRadius, curPos.getLongitude().degrees - gridRadius, curPos.getLongitude().degrees + gridRadius); this.grid = buildGrid(sector, height, GRID_DIMENSION, GRID_DIMENSION); this.numGridPoints = grid.size(); // Compute the position of the selected location (incorporate its height). this.referencePosition = new Position(curPos.getLatitude(), curPos.getLongitude(), height); this.referencePoint = terrain.getSurfacePoint(curPos.getLatitude(), curPos.getLongitude(), height); // // Pre-caching is unnecessary and is useful only when it occurs before the // intersection // // calculations. It will incur extra overhead otherwise. The normal intersection // calculations // // cause the same caching, making subsequent calculations on the same area // faster. // this.preCache(grid, this.referencePosition); // On the EDT, show the grid. SwingUtilities.invokeLater( new Runnable() { public void run() { progressBar.setValue(0); progressBar.setString(null); clearLayers(); showGrid(grid, referencePosition); getWwd().redraw(); } }); // Perform the intersection calculations. this.startTime = System.currentTimeMillis(); for (Position gridPos : this.grid) // for each grid point. { //noinspection ConstantConditions if (NUM_THREADS > 0) this.threadPool.execute(new Intersector(gridPos)); else performIntersection(gridPos); } }
public void start(String appConfigurationLocation, Dimension appSize) throws Exception { this.appTitle = Configuration.getStringValue(Constants.APPLICATION_DISPLAY_NAME); this.appSize = appSize; this.unitsFormat = new WWOUnitsFormat(); this.unitsFormat.setShowUTM(true); this.unitsFormat.setShowWGS84(true); this.appConfigurationLocation = appConfigurationLocation; final AppConfiguration appConfig = new AppConfiguration(); appConfig.initialize(this); appConfig.configure(this.appConfigurationLocation); SwingUtilities.invokeLater( new Runnable() { public void run() { redraw(); } }); }
/** Keeps the progress meter current. When calculations are complete, displays the results. */ protected synchronized void updateProgress() { // Update the progress bar only once every 250 milliseconds to avoid stealing time from // calculations. if (this.sightLines.size() >= this.numGridPoints) endTime = System.currentTimeMillis(); else if (System.currentTimeMillis() < this.lastTime + 250) return; this.lastTime = System.currentTimeMillis(); // On the EDT, update the progress bar and if calculations are complete, update the World // Window. SwingUtilities.invokeLater( new Runnable() { public void run() { int progress = (int) (100d * getSightlinesSize() / (double) numGridPoints); progressBar.setValue(progress); if (progress >= 100) { setCursor(Cursor.getDefaultCursor()); progressBar.setString((endTime - startTime) + " ms"); showResults(); System.out.printf("Calculation time %d milliseconds\n", endTime - startTime); } } }); }
protected void importImagery() { try { // Read the data and save it in a temp file. File sourceFile = ExampleUtil.saveResourceToTempFile(IMAGE_PATH, ".tif"); // Create a raster reader to read this type of file. The reader is created from the // currently // configured factory. The factory class is specified in the Configuration, and a different // one can be // specified there. DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME); DataRasterReader reader = readerFactory.findReaderFor(sourceFile, null); // Before reading the raster, verify that the file contains imagery. AVList metadata = reader.readMetadata(sourceFile, null); if (metadata == null || !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT))) throw new Exception("Not an image file."); // Read the file into the raster. read() returns potentially several rasters if there are // multiple // files, but in this case there is only one so just use the first element of the returned // array. DataRaster[] rasters = reader.read(sourceFile, null); if (rasters == null || rasters.length == 0) throw new Exception("Can't read the image file."); DataRaster raster = rasters[0]; // Determine the sector covered by the image. This information is in the GeoTIFF file or // auxiliary // files associated with the image file. final Sector sector = (Sector) raster.getValue(AVKey.SECTOR); if (sector == null) throw new Exception("No location specified with image."); // Request a sub-raster that contains the whole image. This step is necessary because only // sub-rasters // are reprojected (if necessary); primary rasters are not. int width = raster.getWidth(); int height = raster.getHeight(); // getSubRaster() returns a sub-raster of the size specified by width and height for the // area indicated // by a sector. The width, height and sector need not be the full width, height and sector // of the data, // but we use the full values of those here because we know the full size isn't huge. If it // were huge // it would be best to get only sub-regions as needed or install it as a tiled image layer // rather than // merely import it. DataRaster subRaster = raster.getSubRaster(width, height, sector, null); // Tne primary raster can be disposed now that we have a sub-raster. Disposal won't affect // the // sub-raster. raster.dispose(); // Verify that the sub-raster can create a BufferedImage, then create one. if (!(subRaster instanceof BufferedImageRaster)) throw new Exception("Cannot get BufferedImage."); BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage(); // The sub-raster can now be disposed. Disposal won't affect the BufferedImage. subRaster.dispose(); // Create a SurfaceImage to display the image over the specified sector. final SurfaceImage si1 = new SurfaceImage(image, sector); // On the event-dispatch thread, add the imported data as an SurfaceImageLayer. SwingUtilities.invokeLater( new Runnable() { public void run() { // Add the SurfaceImage to a layer. SurfaceImageLayer layer = new SurfaceImageLayer(); layer.setName("Imported Surface Image"); layer.setPickEnabled(false); layer.addRenderable(si1); // Add the layer to the model and update the application's layer panel. insertBeforeCompass(AppFrame.this.getWwd(), layer); AppFrame.this.getLayerPanel().update(AppFrame.this.getWwd()); // Set the view to look at the imported image. ExampleUtil.goTo(getWwd(), sector); } }); } catch (Exception e) { e.printStackTrace(); } }