0

我的朋友正在使用 Struts (Java),我们正在尝试查找 JPEG 图片的 GeoLocation。

我不知道在哪里阅读或如何为它实现 java 代码。

我想以 jpeg 格式获取图像并将其显示在网站上的谷歌地图上。

你如何将这些信息从 Exif 标签传递到谷歌地图,这样我就可以在地图上看到位置

4

2 回答 2

2

地理位置部分与 Struts 无关。Struts 只涉及数据的呈现。

图像的地理位置有时存储在 JPEG 文件的元数据中。您可以使用这样的库JPEG 图像中提取元数据。

请注意,许多相机不存储地理位置数据。

于 2012-07-11T07:32:20.283 回答
0

您的问题有 2 个部分

  1. 从 Jpeg 图像中提取 gps 信息
  2. 如何将提取的信息提供给谷歌地图。

这里详细讨论第一部分

现在使用apache commons-imaging 库大大简化和简化了读取 Image Meta

/**
 * 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);
}

上面的代码将给出这个输出

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 请参阅此处的库文档
Maven Repo Link此处
注意:此时它是 alpha 版本,但您可以信任 apache:D。

干杯!

于 2021-10-25T03:33:29.923 回答