如何在Delphi中使用CCR.EXIF从JPG EXIF读取GPS坐标?

时间:2016-04-03 09:57:40

标签: delphi gps

使用GPSLatitude和GPSLatitude属性分配方法设置GPS坐标非常容易,但读取坐标让我很难过。我试图访问TGPSLongitude类,但没有任何属性或方法会使我成为坐标的真实/浮点甚至DMS。

示例图片:http://www.cde.co.za/share/IMG_5889.JPG

我目前没有编译的代码:

imgJpg: TJpegImageEx;
GPS_D: Real;

try
  imgJpg.LoadFromFile(FolderName+'\'+SR.Name);
  GPS_D:= imgJpg.ExifData.GPSLatitude.Degrees;
except
  GPS_D:= 0;
end;

编译器在我尝试分配GPS_D时停止,错误为“[DCC错误] Main.pas(205):E2010不兼容的类型:'Real'和'TTiffLongWordFraction'”这显然是因为我无法分配度假属性真实。问题是如何从TGPSLongitude中提取度数或小数值?

3 个答案:

答案 0 :(得分:2)

来自CCRExif 1.5.1中的文档 -

  

GPS

     

Exif标准允许设置GPS(即定位)数据,   它存储在自己的section / sub-IFD中。使用TExifData,您可以   读取和写入这一点,标准的GPS标签集被暴露   作为该类的属性。然而,重要的是要注意的是   GPS坐标可以用两种不同的方式表示,也可以   单个十进制值或度,分和秒。   Exif使用第二种形式,所以如果你想分配GPS坐标   一个图像,你所拥有的是所需的值表示为   小数,您需要先转换为其他形式。 (对于'一个   关闭'转换,您可以使用以下网站:   http://www.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html。)一旦你   有所需形式的坐标,然后将它们分配给   图像如此:

with TExifData.Create do 
try
  LoadFromGraphic(ImageFile); 
  GPSLatitude.Assign(51, 25, 32.1, ltNorth);
  GPSLongitude.Assign(0, 12, 29.2, lnEast); 
  SaveToGraphic(ImageFile);
finally 
 Free; 
end;

查看源代码内部精简:

TGPSLatitude = class(TGPSCoordinate)

并且 TGPSCoordinate 类的声明已在公共部分

property Degrees: TExifFraction index 0 read GetValue;
property Minutes: TExifFraction index 1 read GetValue;
property Seconds: TExifFraction index 2 read GetValue;
property Direction: AnsiChar read GetDirectionChar write SetDirectionChar;

此外,zip文件中还有几个演示应用程序。

LE:在阅读完评论之后,我再次看了一下演示,并在 ExifList 演示中使用了 ExifListFrame.pas 以下代码:

 procedure AddValue(const Name: string; Coord: TGPSCoordinate); overload;
  var
    DirectionStr: string;
  {$IFDEF BUGGYCOMPILER}
    Degrees, Minutes, Seconds: TExifFraction; //work around D2006 compiler bug with intermediate vars
  {$ENDIF}
  begin
    if Coord.MissingOrInvalid then Exit;
    case Coord.Direction of
      'N': DirectionStr := 'north';
      'S': DirectionStr := 'south';
      'W': DirectionStr := 'west';
      'E': DirectionStr := 'east';
    else DirectionStr := '';
    end;
  {$IFDEF BUGGYCOMPILER}
    Degrees := Coord.Degrees;
    Minutes := Coord.Minutes;
    Seconds := Coord.Seconds;
    AddValue(Name, '%g°, %g minutes and %g seconds %s', [Degrees.Quotient,
      Minutes.Quotient, Seconds.Quotient, DirectionStr]);
  {$ELSE}
    AddValue(Name, '%g°, %g minutes and %g seconds %s', [Coord.Degrees.Quotient,
      Coord.Minutes.Quotient, Coord.Seconds.Quotient, DirectionStr]);
  {$ENDIF}
  end;

答案 1 :(得分:2)

深入了解消息来源,似乎可以使用"商数"属性。开发人员选择存储组件Numerator,Denominator和Quotient,而不是存储十进制浮点数。

我不会想到它的使用方式,但是它有效!谢谢大家的时间。

因此,要使用CCR.EXIF从JPG文件中读取GPS坐标,我会执行以下操作:

var
    imgJpg: TJpegImageEx;
    d,m,s,lat: real;

imgJpg.LoadFromFile(FolderName+'\'+SR.Name); {Load the particular JPG File }
d:= imgJpg.ExifData.GPSLatitude.Degrees.Quotient; {Degrees}
m:= imgJpg.ExifData.GPSLatitude.Minutes.Quotient; {Minutes}
s:= imgJpg.ExifData.GPSLatitude.Seconds.Quotient; {Seconds}

{Now determine the sign}
if imgJpg.ExifData.GPSLatitude.Direction=ltNorth then
  ref:= 1
else
  ref:= -1;

{Convert to decimal}
lat:= ref*(d+(m/60)+(s/60/60));

lat现在包含纬度。同样可以做多久。

答案 2 :(得分:1)

将GPS信息提取为string的简便方法:

var myLat, myLong : string;
...
myLat := myJpeg.ExifData.GPSLatitude.AsString ; 
myLong := myJpeg.ExifData.GPSLongitude.AsString ;