Arun
Arun

Reputation: 3680

Get GPS data from an image Java code

I would like to get the metadata from an image file in my local system using Java code

In the attached image you can see the desired data which i would like to pull from java code.

enter image description here

I wrote the below code and do not seem pull the data mentioned in the "Details" tab. The below code's output is and this is not what I look for.

Started .. 
Format name: javax_imageio_jpeg_image_1.0
Format name: javax_imageio_1.0

Please give me your ideas. Thanks

try {
            ImageInputStream inStream = ImageIO.createImageInputStream(new File("D:\\codeTest\\arun.jpg"));
            Iterator<ImageReader> imgItr = ImageIO.getImageReaders(inStream);

            while (imgItr.hasNext()) {
                ImageReader reader = imgItr.next();
                reader.setInput(inStream, true);
                IIOMetadata  metadata = reader.getImageMetadata(0);

                String[] names = metadata.getMetadataFormatNames();
                int length = names.length;
                for (int i = 0; i < length; i++) {
                    System.out.println( "Format name: " + names[ i ] );
                }  
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

Upvotes: 18

Views: 14102

Answers (3)

ThomasEdwin
ThomasEdwin

Reputation: 2145

Based on @dan-d answer, here is my code (kotlin)

private fun readGps(file: String): Optional<GeoLocation> {
    // Read all metadata from the image

    // Read all metadata from the image
    val metadata: Metadata = ImageMetadataReader.readMetadata(File(file))
    // See whether it has GPS data
    val gpsDirectories = metadata.getDirectoriesOfType(
            GpsDirectory::class.java)
    for (gpsDirectory in gpsDirectories) {
        // Try to read out the location, making sure it's non-zero
        val geoLocation = gpsDirectory.geoLocation
        if (geoLocation != null && !geoLocation.isZero) {
            return Optional.of(geoLocation)
        }
    }
    return Optional.empty()
}

Upvotes: 0

Dan D.
Dan D.

Reputation: 32391

I suggest you read the EXIF header of the image and then parse the tags for finding the GPS information. In Java there is a great library (called metadata-extractor) for extracting and parsing the EXIF header. Please see the getting started for this library here.

Once you do the first 2 steps in the tutorial, look for the tags starting with [GPS] ([GPS] GPS Longitude, [GPS] GPS Latitude, ...).

Upvotes: 10

Jo&#227;o Silva
Jo&#227;o Silva

Reputation: 91309

There's no easy way to do it with the Java Core API. You'd have to parse the image's metadata tree, and interpret the proper EXIF tags. Instead, you can pick up the required code from an existing library with EXIF-parsing capabilities, and use it in yours. For example, I have used the Image class of javaxt, which provides a very useful method to extract GPS metadata from an image. It is as simple as:

javaxt.io.Image image = new javaxt.io.Image("D:\\codeTest\\arun.jpg");
double[] gps = image.getGPSCoordinate();

Plus, javaxt.io.Image has no external dependencies, so you can just use that particular class if you don't want to add a dependency on the entire library.

Upvotes: 19

Related Questions