All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.jeo.gdal.GDAL Maven / Gradle / Ivy

The newest version!
/* Copyright 2014 The jeo project. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.jeo.gdal;

import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import io.jeo.data.FileDriver;
import io.jeo.raster.RasterDriver;
import io.jeo.util.Messages;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static io.jeo.util.Util.set;

/**
 * Justin Deoliveira, Boundless
 */
public class GDAL extends FileDriver implements RasterDriver {

    static final Logger LOG = LoggerFactory.getLogger(GDAL.class);

    public static void init() throws Throwable {
        if (gdal.GetDriverCount() == 0) {
            gdal.AllRegister();
        }
    }

    static boolean INITIALIZED = false;
    static {
        try {
            init();
        }
        catch(Throwable e) {
            LOG.debug("gdal initialization failed", e);
        }
    }

    public static GDALDataset open(File file) throws IOException {
        return new GDAL().open(file, null);
    }

    Driver gdalDrv;

    public GDAL() {
        if (INITIALIZED) {
            String drvName = getGDALDriverName();
            if (drvName != null) {
                gdalDrv = gdal.GetDriverByName(drvName);
            }
        }
    }

    @Override
    public boolean isEnabled(Messages messages) {
        try {
            init();
            return true;
        } catch (Throwable t) {
            Messages.of(messages).report(t);
            return false;
        }
    }

    public String getGDALDriverName() {
        return null;
    }

    @Override
    public String name() {
        return gdalDrv != null ? gdalDrv.getShortName() : "GDAL";
    }

    @Override
    public List aliases() {
        return gdalDrv != null ? Arrays.asList(gdalDrv.getShortName()) : (List) Collections.emptyList();
    }

    @Override
    public Class type() {
        return GDALDataset.class;
    }

    @Override
    public String family() {
        return "gdal";
    }

    @Override
    public boolean canOpen(Map opts, Messages msgs) {
        try {
            init();
        }
        catch(Throwable t) {
            Messages.of(msgs).report(t);
            return false;
        }

        return super.canOpen(opts, msgs);
    }

    @Override
    protected boolean canOpen(File file, Map opts, Messages msgs) {
        Driver drv = gdalDrv != null ? gdalDrv : gdal.IdentifyDriver(file.getAbsolutePath());
        if (drv == null) {
            String msg = "Unable to locate driver";
            String lastErrMsg = gdal.GetLastErrorMsg();
            if (lastErrMsg != null) {
                msg += ": " + lastErrMsg;
            }

            Messages.of(msgs).report(msg);
            return false;
        }
        return super.canOpen(file, opts, msgs);
    }

    @Override
    protected GDALDataset open(File file, Map opts) throws IOException {
        Dataset ds = gdal.OpenShared(file.getAbsolutePath());
        if (ds == null) {
            String lastErrMsg = gdal.GetLastErrorMsg();
            String msg = "Unable to open file: " + file;
            if (lastErrMsg != null) {
                msg += ", " + lastErrMsg;
            }
            throw new IOException(msg);
        }

        return new GDALDataset(file, ds, this);
    }

    static final Set CAPABILITIES = set(REPROJECT, RESAMPLE);

    @Override
    public Set capabilities() {
        return CAPABILITIES;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy