Search in sources :

Example 1 with Sector

use of gov.nasa.worldwind.geom.Sector in project hortonmachine by TheHortonMachine.

the class MapsforgeNwwLayer method makeLevels.

private static LevelSet makeLevels(String layerName, OsmTilegenerator osmTilegenerator, Integer tileSize) throws MalformedURLException {
    AVList params = new AVListImpl();
    String cacheRelativePath = "mapsforge/" + layerName + "-tiles";
    if (tileSize == null || tileSize < 256) {
        tileSize = TILESIZE;
    }
    int finalTileSize = tileSize;
    params.setValue(AVKey.URL, cacheRelativePath);
    params.setValue(AVKey.TILE_WIDTH, finalTileSize);
    params.setValue(AVKey.TILE_HEIGHT, finalTileSize);
    params.setValue(AVKey.DATA_CACHE_NAME, cacheRelativePath);
    params.setValue(AVKey.SERVICE, "*");
    params.setValue(AVKey.DATASET_NAME, "*");
    params.setValue(AVKey.FORMAT_SUFFIX, ".png");
    params.setValue(AVKey.NUM_LEVELS, 22);
    params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
    params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
    params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
    File cacheRoot = CacheUtils.getCacheRoot();
    final File cacheFolder = new File(cacheRoot, cacheRelativePath);
    if (!cacheFolder.exists()) {
        cacheFolder.mkdirs();
    }
    params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() {

        public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException {
            int zoom = tile.getLevelNumber() + 3;
            Sector sector = tile.getSector();
            double north = sector.getMaxLatitude().degrees;
            double south = sector.getMinLatitude().degrees;
            double east = sector.getMaxLongitude().degrees;
            double west = sector.getMinLongitude().degrees;
            double centerX = west + (east - west) / 2.0;
            double centerY = south + (north - south) / 2.0;
            int[] tileNumber = NwwUtilities.getTileNumber(centerY, centerX, zoom);
            int x = tileNumber[0];
            int y = tileNumber[1];
            File tileImageFolderFile = new File(cacheFolder, zoom + File.separator + x);
            if (!tileImageFolderFile.exists()) {
                tileImageFolderFile.mkdirs();
            }
            File imgFile = new File(tileImageFolderFile, y + ".png");
            try {
                if (!imgFile.exists()) {
                    BufferedImage bImg = osmTilegenerator.getImage(zoom, x, y);
                    // PrintUtilities.printRenderedImageData(bImg);
                    ImageIO.write(bImg, "png", imgFile);
                }
                return imgFile.toURI().toURL();
            } catch (IOException e) {
                return null;
            }
        }
    });
    return new LevelSet(params);
}
Also used : MalformedURLException(java.net.MalformedURLException) Sector(gov.nasa.worldwind.geom.Sector) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) Tile(gov.nasa.worldwind.util.Tile) IOException(java.io.IOException) URL(java.net.URL) BufferedImage(java.awt.image.BufferedImage) LatLon(gov.nasa.worldwind.geom.LatLon) LevelSet(gov.nasa.worldwind.util.LevelSet) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) AVList(gov.nasa.worldwind.avlist.AVList) MapFile(org.mapsforge.map.reader.MapFile) File(java.io.File) TileUrlBuilder(gov.nasa.worldwind.util.TileUrlBuilder) AVListImpl(gov.nasa.worldwind.avlist.AVListImpl)

Example 2 with Sector

use of gov.nasa.worldwind.geom.Sector in project hortonmachine by TheHortonMachine.

the class RasterizedSpatialiteLasLayer method makeLevels.

private static LevelSet makeLevels(String title, Integer tileSize, boolean transparentBackground, ASpatialDb db, boolean doIntensity) throws Exception {
    String plus = doIntensity ? INTENSITY : ELEVATION;
    String cacheRelativePath = "rasterized_spatialites/" + title + "_" + plus + "-tiles";
    File cacheRoot = CacheUtils.getCacheRoot();
    final File cacheFolder = new File(cacheRoot, cacheRelativePath);
    if (!cacheFolder.exists()) {
        cacheFolder.mkdirs();
    }
    CacheUtils.clearCacheBySourceName(cacheRelativePath);
    AVList params = new AVListImpl();
    if (tileSize == null || tileSize < 256) {
        tileSize = TILESIZE;
    }
    int finalTileSize = tileSize;
    GeometryColumn spatialiteGeometryColumns = db.getGeometryColumnsForTable(LasCellsTable.TABLENAME);
    CoordinateReferenceSystem dataCrs = CRS.decode("EPSG:" + spatialiteGeometryColumns.srid);
    CoordinateReferenceSystem nwwCRS = DefaultGeographicCRS.WGS84;
    List<LasSource> lasSources = LasSourcesTable.getLasSources(db);
    double min = Double.POSITIVE_INFINITY;
    double max = Double.NEGATIVE_INFINITY;
    List<Polygon> polList = new ArrayList<>();
    ColorInterpolator colorInterp;
    int lasLevels = 0;
    if (!doIntensity) {
        for (LasSource lasSource : lasSources) {
            lasLevels = lasSource.levels;
            polList.add(lasSource.polygon);
            min = Math.min(min, lasSource.minElev);
            max = Math.max(max, lasSource.maxElev);
        }
        colorInterp = new ColorInterpolator(EColorTables.elev.name(), min, max, null);
    } else {
        for (LasSource lasSource : lasSources) {
            lasLevels = lasSource.levels;
            polList.add(lasSource.polygon);
            min = Math.min(min, lasSource.minIntens);
            max = Math.max(max, lasSource.maxIntens);
        }
        colorInterp = new ColorInterpolator(EColorTables.rainbow.name(), 0, 255, null);
    }
    final int _lasLevels = lasLevels;
    Geometry sourcesUnionData = CascadedPolygonUnion.union(polList);
    PreparedGeometry preparedCoverage = PreparedGeometryFactory.prepare(sourcesUnionData);
    MathTransform nww2DataTransform = CRS.findMathTransform(nwwCRS, dataCrs);
    MathTransform data2NwwTransform = CRS.findMathTransform(dataCrs, nwwCRS);
    // String urlString = folderFile.toURI().toURL().toExternalForm();
    // params.setValue(AVKey.URL, urlString);
    params.setValue(AVKey.TILE_WIDTH, finalTileSize);
    params.setValue(AVKey.TILE_HEIGHT, finalTileSize);
    params.setValue(AVKey.DATA_CACHE_NAME, cacheRelativePath);
    params.setValue(AVKey.SERVICE, "*");
    params.setValue(AVKey.DATASET_NAME, "*");
    params.setValue(AVKey.FORMAT_SUFFIX, ".png");
    params.setValue(AVKey.NUM_LEVELS, 22);
    params.setValue(AVKey.NUM_EMPTY_LEVELS, 8);
    params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
    params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
    params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() {

        public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException {
            try {
                int zoom = tile.getLevelNumber() + 3;
                Sector sector = tile.getSector();
                double north = sector.getMaxLatitude().degrees;
                double south = sector.getMinLatitude().degrees;
                double east = sector.getMaxLongitude().degrees;
                double west = sector.getMinLongitude().degrees;
                double centerX = west + (east - west) / 2.0;
                double centerY = south + (north - south) / 2.0;
                int[] tileNumber = NwwUtilities.getTileNumber(centerY, centerX, zoom);
                int x = tileNumber[0];
                int y = tileNumber[1];
                Rectangle imageBounds = new Rectangle(0, 0, finalTileSize, finalTileSize);
                ReferencedEnvelope tileEnvNww = new ReferencedEnvelope(west, east, south, north, DefaultGeographicCRS.WGS84);
                AffineTransform worldToPixel = TransformationUtils.getWorldToPixel(tileEnvNww, imageBounds);
                PointTransformation pointTransformation = new PointTransformation() {

                    @Override
                    public void transform(Coordinate src, Point2D dest) {
                        worldToPixel.transform(new Point2D.Double(src.x, src.y), dest);
                    }
                };
                Polygon polygonNww = GeometryUtilities.createPolygonFromEnvelope(tileEnvNww);
                Geometry polygonData = JTS.transform(polygonNww, nww2DataTransform);
                int imgType;
                Color backgroundColor;
                boolean intersects = preparedCoverage.intersects(polygonData);
                if (transparentBackground || !intersects) {
                    imgType = BufferedImage.TYPE_INT_ARGB;
                    backgroundColor = new Color(Color.WHITE.getRed(), Color.WHITE.getGreen(), Color.WHITE.getBlue(), 0);
                } else {
                    imgType = BufferedImage.TYPE_INT_RGB;
                    backgroundColor = Color.WHITE;
                }
                BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, imgType);
                Graphics2D gr = image.createGraphics();
                gr.setPaint(backgroundColor);
                gr.fill(imageBounds);
                if (zoom < 12) {
                    Geometry sourcesUnionNww = JTS.transform(sourcesUnionData, data2NwwTransform);
                    drawSources(db, pointTransformation, sourcesUnionNww, gr, finalTileSize);
                } else if (zoom < 14) {
                    drawLevels(db, colorInterp, pointTransformation, polygonData, gr, _lasLevels, data2NwwTransform, doIntensity, finalTileSize);
                } else if (zoom < 15 && _lasLevels - 1 > 0) {
                    drawLevels(db, colorInterp, pointTransformation, polygonData, gr, _lasLevels - 1, data2NwwTransform, doIntensity, finalTileSize);
                } else if (zoom < 17 && _lasLevels - 2 > 0) {
                    drawLevels(db, colorInterp, pointTransformation, polygonData, gr, _lasLevels - 2, data2NwwTransform, doIntensity, finalTileSize);
                } else if (zoom > 18) {
                    drawPoints(db, colorInterp, pointTransformation, polygonData, gr, data2NwwTransform, doIntensity, finalTileSize);
                } else {
                    drawCells(db, colorInterp, pointTransformation, polygonData, gr, data2NwwTransform, doIntensity, finalTileSize);
                }
                File tileImageFolderFile = new File(cacheFolder, zoom + File.separator + x);
                if (!tileImageFolderFile.exists()) {
                    tileImageFolderFile.mkdirs();
                }
                File imgFile = new File(tileImageFolderFile, y + ".png");
                if (!imgFile.exists()) {
                    ImageIO.write(image, "png", imgFile);
                }
                return imgFile.toURI().toURL();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    });
    return new LevelSet(params);
}
Also used : MalformedURLException(java.net.MalformedURLException) MathTransform(org.opengis.referencing.operation.MathTransform) ArrayList(java.util.ArrayList) Rectangle(java.awt.Rectangle) URL(java.net.URL) BufferedImage(java.awt.image.BufferedImage) ReferencedEnvelope(org.geotools.geometry.jts.ReferencedEnvelope) LevelSet(gov.nasa.worldwind.util.LevelSet) Point2D(java.awt.geom.Point2D) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) GeometryColumn(org.hortonmachine.dbs.compat.GeometryColumn) CoordinateReferenceSystem(org.opengis.referencing.crs.CoordinateReferenceSystem) Polygon(org.locationtech.jts.geom.Polygon) TileUrlBuilder(gov.nasa.worldwind.util.TileUrlBuilder) AVListImpl(gov.nasa.worldwind.avlist.AVListImpl) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) Sector(gov.nasa.worldwind.geom.Sector) Color(java.awt.Color) PointTransformation(org.locationtech.jts.awt.PointTransformation) Tile(gov.nasa.worldwind.util.Tile) ColorInterpolator(org.hortonmachine.gears.utils.colors.ColorInterpolator) MalformedURLException(java.net.MalformedURLException) Graphics2D(java.awt.Graphics2D) PreparedGeometry(org.locationtech.jts.geom.prep.PreparedGeometry) Geometry(org.locationtech.jts.geom.Geometry) LatLon(gov.nasa.worldwind.geom.LatLon) PreparedGeometry(org.locationtech.jts.geom.prep.PreparedGeometry) Coordinate(org.locationtech.jts.geom.Coordinate) AVList(gov.nasa.worldwind.avlist.AVList) AffineTransform(java.awt.geom.AffineTransform) File(java.io.File) LasSource(org.hortonmachine.gears.io.las.databases.LasSource)

Example 3 with Sector

use of gov.nasa.worldwind.geom.Sector in project hortonmachine by TheHortonMachine.

the class RasterizedFeatureCollectionLayer method makeLevels.

private static LevelSet makeLevels(String title, GTRenderer renderer, Integer tileSize, boolean transparentBackground) throws MalformedURLException {
    AVList params = new AVListImpl();
    if (tileSize == null || tileSize < 256) {
        tileSize = TILESIZE;
    }
    int finalTileSize = tileSize;
    String cacheRelativePath = "rasterized_featurecollections/" + title + "-tiles";
    // String urlString = folderFile.toURI().toURL().toExternalForm();
    // params.setValue(AVKey.URL, urlString);
    params.setValue(AVKey.TILE_WIDTH, finalTileSize);
    params.setValue(AVKey.TILE_HEIGHT, finalTileSize);
    params.setValue(AVKey.DATA_CACHE_NAME, cacheRelativePath);
    params.setValue(AVKey.SERVICE, "*");
    params.setValue(AVKey.DATASET_NAME, "*");
    params.setValue(AVKey.FORMAT_SUFFIX, ".png");
    params.setValue(AVKey.NUM_LEVELS, 22);
    params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
    params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
    params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
    File cacheRoot = CacheUtils.getCacheRoot();
    final File cacheFolder = new File(cacheRoot, cacheRelativePath);
    if (!cacheFolder.exists()) {
        cacheFolder.mkdirs();
    }
    params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() {

        public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException {
            int zoom = tile.getLevelNumber() + 3;
            Sector sector = tile.getSector();
            double north = sector.getMaxLatitude().degrees;
            double south = sector.getMinLatitude().degrees;
            double east = sector.getMaxLongitude().degrees;
            double west = sector.getMinLongitude().degrees;
            double centerX = west + (east - west) / 2.0;
            double centerY = south + (north - south) / 2.0;
            int[] tileNumber = NwwUtilities.getTileNumber(centerY, centerX, zoom);
            int x = tileNumber[0];
            int y = tileNumber[1];
            Rectangle imageBounds = new Rectangle(0, 0, finalTileSize, finalTileSize);
            int imgType;
            Color backgroundColor;
            if (transparentBackground) {
                imgType = BufferedImage.TYPE_INT_ARGB;
                backgroundColor = new Color(Color.WHITE.getRed(), Color.WHITE.getGreen(), Color.WHITE.getBlue(), 0);
            } else {
                imgType = BufferedImage.TYPE_INT_RGB;
                backgroundColor = Color.WHITE;
            }
            BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, imgType);
            Graphics2D gr = image.createGraphics();
            gr.setPaint(backgroundColor);
            gr.fill(imageBounds);
            gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            try {
                synchronized (renderer) {
                    renderer.paint(gr, imageBounds, new ReferencedEnvelope(west, east, south, north, DefaultGeographicCRS.WGS84));
                    File tileImageFolderFile = new File(cacheFolder, zoom + File.separator + x);
                    if (!tileImageFolderFile.exists()) {
                        tileImageFolderFile.mkdirs();
                    }
                    File imgFile = new File(tileImageFolderFile, y + ".png");
                    if (!imgFile.exists()) {
                        ImageIO.write(image, "png", imgFile);
                    }
                    return imgFile.toURI().toURL();
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    });
    return new LevelSet(params);
}
Also used : MalformedURLException(java.net.MalformedURLException) Sector(gov.nasa.worldwind.geom.Sector) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) Color(java.awt.Color) Rectangle(java.awt.Rectangle) Tile(gov.nasa.worldwind.util.Tile) IOException(java.io.IOException) URL(java.net.URL) BufferedImage(java.awt.image.BufferedImage) Graphics2D(java.awt.Graphics2D) LatLon(gov.nasa.worldwind.geom.LatLon) ReferencedEnvelope(org.geotools.geometry.jts.ReferencedEnvelope) LevelSet(gov.nasa.worldwind.util.LevelSet) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) AVList(gov.nasa.worldwind.avlist.AVList) File(java.io.File) TileUrlBuilder(gov.nasa.worldwind.util.TileUrlBuilder) AVListImpl(gov.nasa.worldwind.avlist.AVListImpl)

Example 4 with Sector

use of gov.nasa.worldwind.geom.Sector in project hortonmachine by TheHortonMachine.

the class RasterizedShapefilesFolderNwwLayer method makeLevels.

private static LevelSet makeLevels(String title, File folderFile, GTRenderer renderer, Integer tileSize, boolean transparentBackground) throws MalformedURLException {
    AVList params = new AVListImpl();
    if (tileSize == null || tileSize < 256) {
        tileSize = TILESIZE;
    }
    int finalTileSize = tileSize;
    String tileFolderName = title == null ? folderFile.getName() : title;
    String cacheRelativePath = "shapefilefolders/" + tileFolderName + "-tiles";
    // String urlString = folderFile.toURI().toURL().toExternalForm();
    // params.setValue(AVKey.URL, urlString);
    params.setValue(AVKey.TILE_WIDTH, finalTileSize);
    params.setValue(AVKey.TILE_HEIGHT, finalTileSize);
    params.setValue(AVKey.DATA_CACHE_NAME, cacheRelativePath);
    params.setValue(AVKey.SERVICE, "*");
    params.setValue(AVKey.DATASET_NAME, "*");
    params.setValue(AVKey.FORMAT_SUFFIX, ".png");
    params.setValue(AVKey.NUM_LEVELS, 22);
    params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
    params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
    params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
    File cacheRoot = CacheUtils.getCacheRoot();
    final File cacheFolder = new File(cacheRoot, cacheRelativePath);
    if (!cacheFolder.exists()) {
        cacheFolder.mkdirs();
    }
    params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() {

        public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException {
            int zoom = tile.getLevelNumber() + 3;
            Sector sector = tile.getSector();
            double north = sector.getMaxLatitude().degrees;
            double south = sector.getMinLatitude().degrees;
            double east = sector.getMaxLongitude().degrees;
            double west = sector.getMinLongitude().degrees;
            double centerX = west + (east - west) / 2.0;
            double centerY = south + (north - south) / 2.0;
            int[] tileNumber = NwwUtilities.getTileNumber(centerY, centerX, zoom);
            int x = tileNumber[0];
            int y = tileNumber[1];
            Rectangle imageBounds = new Rectangle(0, 0, finalTileSize, finalTileSize);
            int imgType;
            Color backgroundColor;
            if (transparentBackground) {
                imgType = BufferedImage.TYPE_INT_ARGB;
                backgroundColor = new Color(Color.WHITE.getRed(), Color.WHITE.getGreen(), Color.WHITE.getBlue(), 0);
            } else {
                imgType = BufferedImage.TYPE_INT_RGB;
                backgroundColor = Color.WHITE;
            }
            BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, imgType);
            Graphics2D gr = image.createGraphics();
            gr.setPaint(backgroundColor);
            gr.fill(imageBounds);
            gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            try {
                synchronized (renderer) {
                    renderer.paint(gr, imageBounds, new ReferencedEnvelope(west, east, south, north, DefaultGeographicCRS.WGS84));
                    File tileImageFolderFile = new File(cacheFolder, zoom + File.separator + x);
                    if (!tileImageFolderFile.exists()) {
                        tileImageFolderFile.mkdirs();
                    }
                    File imgFile = new File(tileImageFolderFile, y + ".png");
                    if (!imgFile.exists()) {
                        ImageIO.write(image, "png", imgFile);
                    }
                    return imgFile.toURI().toURL();
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    });
    return new LevelSet(params);
}
Also used : MalformedURLException(java.net.MalformedURLException) Sector(gov.nasa.worldwind.geom.Sector) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) Color(java.awt.Color) Rectangle(java.awt.Rectangle) Tile(gov.nasa.worldwind.util.Tile) IOException(java.io.IOException) URL(java.net.URL) BufferedImage(java.awt.image.BufferedImage) Graphics2D(java.awt.Graphics2D) LatLon(gov.nasa.worldwind.geom.LatLon) ReferencedEnvelope(org.geotools.geometry.jts.ReferencedEnvelope) LevelSet(gov.nasa.worldwind.util.LevelSet) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) AVList(gov.nasa.worldwind.avlist.AVList) File(java.io.File) TileUrlBuilder(gov.nasa.worldwind.util.TileUrlBuilder) AVListImpl(gov.nasa.worldwind.avlist.AVListImpl)

Example 5 with Sector

use of gov.nasa.worldwind.geom.Sector in project hortonmachine by TheHortonMachine.

the class GeopackageTilesNwwLayer method makeLevels.

private static LevelSet makeLevels(File gpkgFile, GeopackageCommonDb gpkgDb, String tableName) throws Exception {
    AVList params = new AVListImpl();
    SqlName tName = SqlName.m(tableName);
    String cacheRelativePath = "gpkg/" + gpkgFile.getName() + "-" + tName.name + "-tiles";
    TileEntry tile = gpkgDb.tile(tName);
    int tileSize = tile.getTileMatricies().get(0).getTileWidth();
    String urlString = gpkgFile.toURI().toURL().toExternalForm();
    params.setValue(AVKey.URL, urlString);
    params.setValue(AVKey.TILE_WIDTH, tileSize);
    params.setValue(AVKey.TILE_HEIGHT, tileSize);
    params.setValue(AVKey.DATA_CACHE_NAME, cacheRelativePath);
    params.setValue(AVKey.SERVICE, "*");
    params.setValue(AVKey.DATASET_NAME, "*");
    final String _imageFormat = "png";
    params.setValue(AVKey.FORMAT_SUFFIX, "." + _imageFormat);
    params.setValue(AVKey.NUM_LEVELS, 22);
    params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
    params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
    params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
    File cacheRoot = CacheUtils.getCacheRoot();
    final File cacheFolder = new File(cacheRoot, cacheRelativePath);
    if (!cacheFolder.exists()) {
        cacheFolder.mkdirs();
    }
    List<Integer> tileZoomLevelsWithData = gpkgDb.getTileZoomLevelsWithData(tName);
    params.setValue(AVKey.TILE_URL_BUILDER, new TileUrlBuilder() {

        public URL getURL(Tile tile, String altImageFormat) throws MalformedURLException {
            int zoom = tile.getLevelNumber() + 3;
            // int x = tile.getColumn();
            // int y = tile.getRow();
            Sector sector = tile.getSector();
            double north = sector.getMaxLatitude().degrees;
            double south = sector.getMinLatitude().degrees;
            double east = sector.getMaxLongitude().degrees;
            double west = sector.getMinLongitude().degrees;
            double centerX = west + (east - west) / 2.0;
            double centerY = south + (north - south) / 2.0;
            int[] zxy = MercatorUtils.getTileNumber(centerY, centerX, zoom);
            int x = zxy[1];
            int y = zxy[2];
            try {
                StringBuilder sb = new StringBuilder();
                sb.append(zoom);
                sb.append(File.separator);
                sb.append(x);
                File tileImageFolderFile = new File(cacheFolder, sb.toString());
                if (!tileImageFolderFile.exists()) {
                    tileImageFolderFile.mkdirs();
                }
                sb = new StringBuilder();
                sb.append(y);
                sb.append(".");
                sb.append(_imageFormat);
                File imgFile = new File(tileImageFolderFile, sb.toString());
                if (!imgFile.exists()) {
                    BufferedImage bImg = null;
                    byte[] bytes = gpkgDb.getTile(tName, x, y, zoom);
                    if (bytes != null) {
                        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
                        bImg = ImageIO.read(bais);
                    } else {
                        // try downscaling from higher resolutions
                        // look in the other levels
                        int from = zoom + 1;
                        int to = Math.min(zoom + 5, 19);
                        for (int higherZoom = from; higherZoom < to; higherZoom++) {
                            if (!tileZoomLevelsWithData.contains(higherZoom)) {
                                continue;
                            }
                            BufferedImage img = TileUtilities.getTileFromDifferentZoomlevel(gpkgDb, tName.name, x, y, zoom, tileSize, higherZoom);
                            if (img != null) {
                                bImg = img;
                                break;
                            }
                        }
                        if (bImg == null) {
                            // then try upscaling from lower resolution
                            from = zoom - 1;
                            int zoomLevelTotry = 5;
                            to = Math.max(zoom - zoomLevelTotry, 1);
                            for (int lowerZoom = from; lowerZoom > to; lowerZoom--) {
                                if (!tileZoomLevelsWithData.contains(lowerZoom)) {
                                    continue;
                                }
                                BufferedImage img = TileUtilities.getTileFromDifferentZoomlevel(gpkgDb, tName.name, x, y, zoom, tileSize, lowerZoom);
                                if (img != null) {
                                    bImg = img;
                                    break;
                                }
                            }
                        }
                    }
                    if (DEBUG) {
                        if (bImg == null && DEBUG_ALSO_WITHOUT_IMAGE) {
                            bImg = new BufferedImage(tileSize, tileSize, BufferedImage.TYPE_INT_ARGB);
                        }
                        if (bImg != null) {
                            Graphics2D g2d = (Graphics2D) bImg.getGraphics();
                            g2d.setColor(Color.black);
                            g2d.drawRect(0, 0, TILESIZE, TILESIZE);
                            g2d.drawString(zoom + "/" + x + "/" + y, 3, TILESIZE / 2);
                            g2d.dispose();
                        }
                    }
                    if (bImg != null) {
                        ImageIO.write(bImg, _imageFormat, imgFile);
                    } else {
                        return null;
                    }
                }
                return imgFile.toURI().toURL();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    });
    return new LevelSet(params);
}
Also used : MalformedURLException(java.net.MalformedURLException) Sector(gov.nasa.worldwind.geom.Sector) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) Tile(gov.nasa.worldwind.util.Tile) TileEntry(org.hortonmachine.dbs.geopackage.TileEntry) URL(java.net.URL) BufferedImage(java.awt.image.BufferedImage) MalformedURLException(java.net.MalformedURLException) Graphics2D(java.awt.Graphics2D) LatLon(gov.nasa.worldwind.geom.LatLon) LevelSet(gov.nasa.worldwind.util.LevelSet) ByteArrayInputStream(java.io.ByteArrayInputStream) SqlName(org.hortonmachine.dbs.utils.SqlName) MercatorSector(gov.nasa.worldwind.layers.mercator.MercatorSector) AVList(gov.nasa.worldwind.avlist.AVList) File(java.io.File) TileUrlBuilder(gov.nasa.worldwind.util.TileUrlBuilder) AVListImpl(gov.nasa.worldwind.avlist.AVListImpl)

Aggregations

Sector (gov.nasa.worldwind.geom.Sector)14 File (java.io.File)10 AVList (gov.nasa.worldwind.avlist.AVList)9 AVListImpl (gov.nasa.worldwind.avlist.AVListImpl)9 LatLon (gov.nasa.worldwind.geom.LatLon)9 MercatorSector (gov.nasa.worldwind.layers.mercator.MercatorSector)9 LevelSet (gov.nasa.worldwind.util.LevelSet)9 Tile (gov.nasa.worldwind.util.Tile)9 TileUrlBuilder (gov.nasa.worldwind.util.TileUrlBuilder)9 BufferedImage (java.awt.image.BufferedImage)9 MalformedURLException (java.net.MalformedURLException)9 URL (java.net.URL)9 ReferencedEnvelope (org.geotools.geometry.jts.ReferencedEnvelope)9 Graphics2D (java.awt.Graphics2D)7 Rectangle (java.awt.Rectangle)6 IOException (java.io.IOException)6 Color (java.awt.Color)5 Envelope (org.locationtech.jts.geom.Envelope)4 Position (gov.nasa.worldwind.geom.Position)3 Coordinate (org.locationtech.jts.geom.Coordinate)3