My friend is using Struts (Java) and we are trying to find the GeoLocation of a JPEG picture.
I have no idea where to read or how to implement the java code for it.
I want to get an image in jpeg form and have it shows on google maps on a website.
How do you pass those information from Exif tags to Google Map so i can see the location on the Map
The geolocation part has nothing to do with Struts. Struts is only involved in the presentation of the data.
The geolocation of an image is sometimes stored in the metadata of a JPEG file. You can use a library like this one to extract metadata from a JPEG image.
Be aware that many cameras don't store the geolocation data.
Your question has 2 parts
This elaborately discuss the first part
Reading Image Meta is now much simplified and streamlined with apache commons-imaging library
/**
* Reference : https://github.com/apache/commons-imaging/blob/master/src/test/java/org/apache/commons/imaging/examples/MetadataExample.java
*/
public static void readImageMeta(final File imgFile) throws ImageReadException, IOException {
/** get all metadata stored in EXIF format (ie. from JPEG or TIFF). **/
final ImageMetadata metadata = Imaging.getMetadata(imgFile);
System.out.println(metadata);
System.out.println("--------------------------------------------------------------------------------");
/** Get specific meta data information by drilling down the meta **/
if (metadata instanceof JpegImageMetadata) {
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
// simple interface to GPS data
final TiffImageMetadata exifMetadata = jpegMetadata.getExif();
if (null != exifMetadata) {
final TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
if (null != gpsInfo) {
final String gpsDescription = gpsInfo.toString();
final double longitude = gpsInfo.getLongitudeAsDegreesEast();
final double latitude = gpsInfo.getLatitudeAsDegreesNorth();
System.out.println(" " + "GPS Description: " + gpsDescription);
System.out.println(" " + "GPS Longitude (Degrees East): " + longitude);
System.out.println(" " + "GPS Latitude (Degrees North): " + latitude);
}
}
// more specific example of how to manually access GPS values
final TiffField gpsLatitudeRefField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
final TiffField gpsLatitudeField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE);
final TiffField gpsLongitudeRefField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
final TiffField gpsLongitudeField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
if (gpsLatitudeRefField != null && gpsLatitudeField != null && gpsLongitudeRefField != null && gpsLongitudeField != null) {
// all of these values are strings.
final String gpsLatitudeRef = (String) gpsLatitudeRefField.getValue();
final RationalNumber[] gpsLatitude = (RationalNumber[]) (gpsLatitudeField.getValue());
final String gpsLongitudeRef = (String) gpsLongitudeRefField.getValue();
final RationalNumber[] gpsLongitude = (RationalNumber[]) gpsLongitudeField.getValue();
final RationalNumber gpsLatitudeDegrees = gpsLatitude[0];
final RationalNumber gpsLatitudeMinutes = gpsLatitude[1];
final RationalNumber gpsLatitudeSeconds = gpsLatitude[2];
final RationalNumber gpsLongitudeDegrees = gpsLongitude[0];
final RationalNumber gpsLongitudeMinutes = gpsLongitude[1];
final RationalNumber gpsLongitudeSeconds = gpsLongitude[2];
// This will format the gps info like so:
//
// gpsLatitude: 8 degrees, 40 minutes, 42.2 seconds S
// gpsLongitude: 115 degrees, 26 minutes, 21.8 seconds E
System.out.println(" " + "GPS Latitude: " + gpsLatitudeDegrees.toDisplayString() + " degrees, " + gpsLatitudeMinutes.toDisplayString() + " minutes, " + gpsLatitudeSeconds.toDisplayString() + " seconds " + gpsLatitudeRef);
System.out.println(" " + "GPS Longitude: " + gpsLongitudeDegrees.toDisplayString() + " degrees, " + gpsLongitudeMinutes.toDisplayString() + " minutes, " + gpsLongitudeSeconds.toDisplayString() + " seconds " + gpsLongitudeRef);
}
}
}
private static void printTagValue(final JpegImageMetadata jpegMetadata, TagInfo tagInfo) {
final TiffField field = jpegMetadata.findEXIFValueWithExactMatch(tagInfo);
if (field == null) {
System.out.println(tagInfo.name + ": " + "Not Found.");
} else {
System.out.println(tagInfo.name + ": " + field.getValueDescription());
}
}
public static void main(String[] args) throws IOException, ImageReadException {
File sourceFile = new File("/Users/vivek/myimage.jpg");
readImageMeta(sourceFile);
}
The above code will give this output
Exif metadata:
Root:
ImageWidth: 3024
ImageLength: 4032
BitsPerSample: 8, 8, 8
PhotometricInterpretation: 2
Make: 'Apple'
Model: 'iPhone 6s'
Orientation: 1
SamplesPerPixel: 3
XResolution: 72
YResolution: 72
ResolutionUnit: 2
Software: 'Adobe Photoshop CC 2015 (Macintosh)'
DateTime: '2016:05:17 16:55:55'
YCbCrPositioning: 1
ExifOffset: 300
GPSInfo: 868
Exif:
ExposureTime: 1/100 (0.01)
FNumber: 11/5 (2.2)
ExposureProgram: 2
PhotographicSensitivity: 40
ExifVersion: 48, 50, 50, 49
DateTimeOriginal: '2016:05:08 18:03:57'
DateTimeDigitized: '2016:05:08 18:03:57'
ComponentsConfiguration: 1, 2, 3, 0
ShutterSpeedValue: 35113/5284 (6.645)
ApertureValue: 7983/3509 (2.275)
BrightnessValue: 13026/2395 (5.439)
ExposureCompensation: 0
MeteringMode: 5
Flash: 16
FocalLength: 83/20 (4.15)
SubjectArea: 618, 1555, 310, 311
SubSecTimeOriginal: '523'
SubSecTimeDigitized: '523'
FlashpixVersion: 48, 49, 48, 48
ColorSpace: 1
ExifImageWidth: 3024
ExifImageLength: 4032
SensingMethod: 2
SceneType: 1
CustomRendered: 4
ExposureMode: 0
WhiteBalance: 0
FocalLengthIn35mmFormat: 29
SceneCaptureType: 0
LensSpecification: 83/20 (4.15), 83/20 (4.15), 11/5 (2.2), 11/5 (2.2)
LensMake: 'Apple'
LensModel: 'iPhone 6s back camera 4.15mm f/2.2'
Gps:
GPSLatitudeRef: 'N'
GPSLatitude: 13, 21, 3305/100 (33.05)
GPSLongitudeRef: 'E'
GPSLongitude: 75, 33, 2034/100 (20.34)
GPSAltitudeRef: 0
GPSAltitude: 83651/95 (880.537)
GPSTimeStamp: 12, 33, 57
GPSSpeedRef: 'K'
GPSSpeed: 21/100 (0.21)
GPSImgDirectionRef: 'T'
GPSImgDirection: 1654/31 (53.355)
GPSDestBearingRef: 'T'
GPSDestBearing: 1654/31 (53.355)
GPSDateStamp: '2016:05:08'
Unknown Tag (0x1f): 5
Sub: (jpegImageData)
Compression: 6
XResolution: 72
YResolution: 72
ResolutionUnit: 2
JpgFromRawStart: 1274
JpgFromRawLength: 8211
Photoshop (IPTC) metadata:
Date Created: 20160508
Time Created: 180357+0000
--------------------------------------------------------------------------------
GPSLatitudeRef: 'N'
GPSLatitude: 13, 21, 3305/100 (33.05)
GPSLongitudeRef: 'E'
GPSLongitude: 75, 33, 2034/100 (20.34)
GPS Description: [GPS. Latitude: 13 degrees, 21 minutes, 33.05 seconds N, Longitude: 75 degrees, 33 minutes, 20.34 seconds E]
GPS Longitude (Degrees East): 75.55565
GPS Latitude (Degrees North): 13.359180555555556
GPS Latitude: 13 degrees, 21 minutes, 33.05 seconds N
GPS Longitude: 75 degrees, 33 minutes, 20.34 seconds E
Fore More Refer the library documentation here
Maven Repo Link here .
Note : It's an alpha release at this time but you can trust apache :D.
Cheers!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.