使用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中提取度数或小数值?
答案 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 ;