株式会社インターワーク

Javaで画像ファイルからGPSデータを取得する方法

画像に埋め込まれたGPS位置情報をJavaで抽出する方法を解説。JDeli、Apache Tika、ImageIOの3つのアプローチをコード例付きで比較します。

(更新:
画像処理JDeliJava
Javaで画像ファイルからGPSデータを取得する方法

スマートフォンで撮影した写真には、撮影場所のGPS座標(緯度・経度)が自動的に埋め込まれていることをご存知でしょうか。この位置情報は、写真管理アプリでの地図表示、不動産物件の位置特定、SNS投稿の位置タグ付けなど、さまざまな用途で活用されています。この記事では、Javaプログラムから画像ファイルに含まれるGPSデータを取り出す方法を、複数のアプローチで解説します。

画像のGPSデータとは?

GPSデータとは、全地球測位システム(Global Positioning System)によって取得された緯度・経度の座標情報のことです。最近のスマートフォンやデジタルカメラには、撮影時に自動的にこの位置情報を画像ファイルに記録する機能(ジオタグ機能)が搭載されています。

記録されるGPS情報には、主に以下のような項目が含まれます。

  • 緯度(Latitude): 北緯・南緯の座標
  • 経度(Longitude): 東経・西経の座標
  • 高度(Altitude): 撮影地点の海抜高度
  • タイムスタンプ: GPS測位時のUTC時刻
  • 測位精度: 位置情報の精度指標

これらの情報は、画像ファイルの「メタデータ」と呼ばれる領域に、EXIF(Exchangeable Image File Format)規格に基づいて格納されています。

GPSデータはどこに格納されているのか

GPS情報はEXIFメタデータの「GPS IFD(Image File Directory)」と呼ばれる領域に保存されます。EXIFデータを含むことができる主な画像フォーマットは以下のとおりです。

フォーマットEXIFサポートGPS情報
JPEG対応取得可能
HEIC対応取得可能
TIFF対応取得可能
PNG対応(拡張)取得可能
WebP対応取得可能
GIF非対応取得不可
BMP非対応取得不可

JDeliのビューア機能を使えば、画像ファイルに含まれるEXIFメタデータ(GPS情報を含む)をGUIで簡単に確認できます。開発前の調査やデバッグに便利です。

Javaでの抽出方法

JavaでGPSデータを抽出するには、いくつかのアプローチがあります。それぞれの特徴とコード例を紹介します。

方法1: JDeliによるGPSデータ抽出(推奨)

JDeliを使えば、シンプルなAPIでEXIFメタデータからGPS座標を簡単に抽出できます。

// 画像ファイルからメタデータを取得
ImageInfo imageInfo = JDeli.getImageInfo(new File("photo.jpg"));
 
// GPS情報を含むEXIFデータにアクセス
// ImageInfoオブジェクトから位置情報を取得可能

バイト配列からの取得も可能です。

byte[] imageData = Files.readAllBytes(Paths.get("photo.jpg"));
ImageInfo imageInfo = JDeli.getImageInfo(imageData);

JDeliのメリットは、JPEG、HEIC、PNG、TIFF、WebPなど14種類以上のフォーマットに対応しており、フォーマットごとにコードを変える必要がない点です。統一されたAPIで、どのフォーマットでも同じ方法でメタデータを取得できます。

方法2: Apache Tikaによる方法

Apache Tikaは、多目的なメタデータ抽出ライブラリです。画像だけでなく、PDF、Office文書など幅広いファイル形式に対応しています。

ImageDetector detector = new ImageDetector();
MediaType type = detector.detect(
    TikaInputStream.get(Paths.get("photo.jpg")), null
);
 
// Tikaのメタデータ抽出APIでGPS情報を取得
Parser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
parser.parse(TikaInputStream.get(Paths.get("photo.jpg")),
    new DefaultHandler(), metadata, new ParseContext());
 
String latitude = metadata.get("geo:lat");
String longitude = metadata.get("geo:long");

Apache Tikaは機能が豊富ですが、依存ライブラリが多く、画像処理だけが目的の場合にはオーバースペックになりがちです。

方法3: ImageIO(Java標準API)による方法

Java SEに標準搭載されているImageIOでも、限定的ながらEXIFデータの取得が可能です。

ImageReader imageReader = ImageIO.getImageReadersByFormatName("jpeg").next();
imageReader.setInput(
    ImageIO.createImageInputStream(new FileInputStream("photo.jpg")), true
);
IIOMetadata metadata = imageReader.getImageMetadata(0);

ただし、ImageIOでのEXIFメタデータ取得にはいくつかの制約があります。

  • 取得したメタデータのパースを自前で実装する必要がある
  • HEICやWebPなどの新しいフォーマットには非対応
  • GPS情報の緯度・経度変換(度分秒から10進数への変換)も手動で行う必要がある

3つの方法の比較

項目JDeliApache TikaImageIO
導入の容易さJARファイル1つ多数の依存ライブラリ追加不要(標準API)
対応フォーマット14種類以上多種多様JPEG, PNG, BMP, GIF等
HEIC/WebP対応対応対応非対応
GPS情報の取得シンプルなAPIメタデータキーで取得手動パースが必要
ライブラリサイズ軽量大きいなし
画像処理との統合読み書き・変換・加工も可能メタデータ取得のみ読み書きのみ

GPS情報を扱う際の注意点

画像のGPS情報を扱う際には、プライバシーに関する配慮も重要です。

  • 個人情報の保護: GPS座標から撮影者の自宅や勤務先が特定される可能性があります。不特定多数に公開する画像からはGPS情報を除去することを検討してください
  • メタデータの除去: 画像をWebに公開する前に、EXIFデータを意図的に除去するワークフローを組み込むことが推奨されます
  • 同意の取得: ユーザーの位置情報を収集・利用する場合は、適切な同意を得る必要があります

JDeliの利点

JDeliは、GPS情報の取得だけでなく、Javaでの画像処理全般を強力にサポートする開発ライブラリ(SDK)です。

  • 14種類以上の画像フォーマットに対応(JPEG、PNG、TIFF、HEIC、WebP、JPEG 2000、JPEG XLなど)
  • 統一されたAPI: フォーマットに関わらず同じコードでメタデータの取得が可能
  • 高速な処理: ImageIOと比較して読み書きのパフォーマンスが向上
  • 安定性: ヒープ関連のJVMクラッシュを防止
  • 画像加工機能: クロップ、リサイズ、回転、フォーマット変換なども統合的に利用可能

無料トライアルが提供されていますので、まずはお手元の環境でGPSデータ取得の動作をお試しください。

JDeli

Java画像ライブラリ。HEIC・WebP・DICOMなど20以上のフォーマットに対応。ImageIOの最大7倍高速。

開発者向けPDF入門ガイド 表紙
無料 eBook / 25p

開発者向けPDF入門ガイド

PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。

ご興味のある製品:

ご入力いただいた情報は、eBookの送付およびインターワークからのご案内にのみ使用いたします。プライバシーポリシー