提取多个图片中的经纬度数据

提取多个图片中的经纬度数据,第1张

不清楚你的实际文件/情况,仅以问题中的说明及猜测为据;以下代码复制粘贴到记事本,另存为xxbat,编码选ANSI,跟要处理的文件放一起双击运行

<# :

cls&echo off&cd /d "%~dp0"

rem 获取当前目录里多个jpg文件的经度、纬度和高度等GPS信息

set #=Any question&set _=WX&set $=Q&set/az=0x53b7e0b4

title %#% +%$%%$%/%_% %z%

set "current=%cd%"

powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"

echo;%#% +%$%%$%/%_% %z%

pause

exit

#>

$outfile="xxxcsv";

Add-Type -AssemblyName 'Systemdrawing';

$current=$env:current;

$result=New-Object -TypeName SystemCollectionsArrayList;

$fs=New-Object SystemIOFileStream($outfile, [SystemIOFileMode]::Create);

$sw=New-Object SystemIOStreamWriter($fs, [TextEncoding]::GetEncoding('GB2312'));

$files=@(dir -literal $current|{(@("jpg") -contains $_Extension) -and ($_ -is [SystemIOFileInfo])});

for($i=0;$i -lt $fileslength;$i++){

    write-host $files[$i]FullNamereplace($current, '');

    $arr=@($files[$i]Name,'','','','','');

    $img=[SystemDrawingImage]::FromFile($files[$i]FullName);

    foreach($it in $imgPropertyItems){

        if($itId -eq 0x0001){

            $arr[1]=[SystemTextEncoding]::ASCIIGetString($itValue[0]);

        }

        if($itId -eq 0x0002){

            if($itValuelength -eq 24){

                $d1=[SystemBitConverter]::ToUInt32($itValue, 0) / [SystemBitConverter]::ToUInt32($itValue, 4);

                $m1=[SystemBitConverter]::ToUInt32($itValue, 8) / [SystemBitConverter]::ToUInt32($itValue, 12);

                $s1=[SystemBitConverter]::ToUInt32($itValue, 16) / [SystemBitConverter]::ToUInt32($itValue, 20);

                $arr[2]=$d1ToString()+';'+$m1ToString()+';'+$s1ToString();

            }

        }

        if($itId -eq 0x0003){

            $arr[3]=[SystemTextEncoding]::ASCIIGetString($itValue[0]);

        }

        if($itId -eq 0x0004){

            if($itValuelength -eq 24){

                $d2=[SystemBitConverter]::ToUInt32($itValue, 0) / [SystemBitConverter]::ToUInt32($itValue, 4);

                $m2=[SystemBitConverter]::ToUInt32($itValue, 8) / [SystemBitConverter]::ToUInt32($itValue, 12);

                $s2=[SystemBitConverter]::ToUInt32($itValue, 16) / [SystemBitConverter]::ToUInt32($itValue, 20);

                $arr[4]=$d2ToString()+';'+$m2ToString()+';'+$s2ToString();

            }

        }

        if($itId -eq 0x0006){

            if($itValuelength -eq 8){

                $alt=[SystemBitConverter]::ToUInt32($itValue, 0) / [SystemBitConverter]::ToUInt32($itValue, 4);

                $arr[5]=$altToString();

            }

        }

    }

    $imgDispose();

    $line='"'+$arr[0]+'",'+$arr[1]+' '+$arr[2]+','+$arr[3]+' '+$arr[4]+','+$arr[5];

    $swWriteLine($line);$swFlush();

}

$swClose();$fsClose();

1、首先在电脑上找到要修改拍摄时间的照片(截图的不行),若是没有,可以发送到电脑上面。

2、然后选中它,鼠标右击,在出现的子菜单中点击“属性”选项。

3、然后在打开的面板中点击‘详细信息’选项。

4、然后在打开页面的 来源 下面,可以看到一个 拍摄日期 ,而在它的后面可以看到,这个就是拍摄的日期了。

5、点击一下它后面的输入框,就可以根据需要输入拍摄的时间了;也可以点击它后面的日期选择器来选中需要的拍摄时间,选好之后,然后点击 确定 按钮,这样就可以修改照片的拍摄时间了。

/// <summary>

/// 获取中的GPS坐标点

/// </summary>

/// <param name="p_路径">路径</param>

/// <returns>返回坐标纬度+经度用"+"分割 取数组中第0和1个位置的值</returns>

public String fnGPS坐标(String p_路径)

{

String s_GPS坐标 = "";

//载入

Image objImage = ImageFromFile(p_路径);

//取得所有的属性(以PropertyId做排序)

var propertyItems = objImagePropertyItemsOrderBy(x => xId);

//暂定纬度N(北纬)

char chrGPSLatitudeRef = 'N';

//暂定经度为E(东经)

char chrGPSLongitudeRef = 'E';

foreach (PropertyItem objItem in propertyItems)

{

//只取Id范围为0x0000到0x001e

if (objItemId >= 0x0000 && objItemId <= 0x001e)

{

objItemId = 0x0002;

switch (objItemId)

{

case 0x0000:

var query = from tmpb in objItemValue select tmpbToString();

string sreVersion = stringJoin("", queryToArray());

break;

case 0x0001:

chrGPSLatitudeRef = BitConverterToChar(objItemValue, 0);

break;

case 0x0002:

if (objItemValueLength == 24)

{

//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)

double d = BitConverterToUInt32(objItemValue, 0) 10d / BitConverterToUInt32(objItemValue, 4);

//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)

double m = BitConverterToUInt32(objItemValue, 8) 10d / BitConverterToUInt32(objItemValue, 12);

//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)

double s = BitConverterToUInt32(objItemValue, 16) 10d / BitConverterToUInt32(objItemValue, 20);

//计算经纬度数值, 如果是南纬, 要乘上(-1)

double dblGPSLatitude = (((s / 60 + m) / 60) + d) (chrGPSLatitudeRefEquals('N') 1 : -1);

string strLatitude = stringFormat("{0:#} deg {1:#}' {2:#00}\" {3}", d

, m, s, chrGPSLatitudeRef);

//纬度+经度

s_GPS坐标 += dblGPSLatitude + "+";

}

break;

case 0x0003:

//透过BitConverter, 将Value转成Char('E' / 'W')

//此值在后续的Longitude计算上会用到

chrGPSLongitudeRef = BitConverterToChar(objItemValue, 0);

break;

case 0x0004:

if (objItemValueLength == 24)

{

//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)

double d = BitConverterToUInt32(objItemValue, 0) 10d / BitConverterToUInt32(objItemValue, 4);

//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)

double m = BitConverterToUInt32(objItemValue, 8) 10d / BitConverterToUInt32(objItemValue, 12);

//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)

double s = BitConverterToUInt32(objItemValue, 16) 10d / BitConverterToUInt32(objItemValue, 20);

//计算精度的数值, 如果是西经, 要乘上(-1)

double dblGPSLongitude = (((s / 60 + m) / 60) + d) (chrGPSLongitudeRefEquals('E') 1 : -1);

}

break;

case 0x0005:

string strAltitude = BitConverterToBoolean(objItemValue, 0) "0" : "1";

break;

case 0x0006:

if (objItemValueLength == 8)

{

//将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint

double dblAltitude = BitConverterToUInt32(objItemValue, 0) 10d / BitConverterToUInt32(objItemValue, 4);

}

break;

}

}

}

return s_GPS坐标;

}

#endregion

很多朋友都不知道照片中可以储存 GPS 全球定位数据,甚至不知道自己的照片中带有这些数据。其实照片中的数据可以很好地记录自己的旅途足迹,并且能够很方便地按照地域来管理照片。下面我就详细说说怎么查看照片中的 GPS 数据,以及如何添加/修改照片中的 GPS 数据。

工具/原料

JPEG格式的照片

magicexif元数据编辑器

查看照片中的GPS信息

运行“MagicEXIF元数据编辑器”软件,点击大眼睛下面的“打开文件”按钮或工具栏的“打开”图标打开一张照片。

以一张iPhone 4拍摄的照片为例,此时切换到“GPS 信息”选项卡,可以看到列表中的GPS数据,但是右侧的地图区域会提示无法连接服务器。

3现在我们需要将地图调出来:在地图区域点击右键→“地图服务供应商”→“百度地图”(如果没有显示出来可以多试几次)。

4现在我们就可以看到这张照片的拍摄地点了,你可以通过鼠标拖拽来浏览地图。

5如果希望放大/缩小地图的比例,可以在地图区域点击右键→“地图级别”中调整,以我的照片为例,缩小后可以很清楚知道照片拍摄于北京市。

修改照片GPS信息

1继续以上面的照片做例子,首先编辑照片的纬度数据,双击列表中的“GPS 纬度”进入编辑模式。

2在d出的窗口中输入新的纬度,注意要按照“度, 分, 秒”的格式输入,比如北纬30度50分则输入“30, 50, 0”,然后点击“确认编辑”来应用。

3同理双击“GPS 经度”可以修改照片的GPS经度数据,完成编辑后可以看到被编辑的项目变成蓝色,而且右侧的地图也被更新了。点击工具栏的“保存”按钮保存对照片的编辑。

为照片添加GPS数据

打开一张没有GPS数据的照片,可以看到地图区域显示“无可用地理数据”,然后点击工具栏上的“增添项”按钮调出对话框。

在“显示”下拉列表中选择“GPS地理信息”,主要勾选下图中的四项数据,其他项目可以酌情添加,点击“确认添加”应用。

可以看到新添加的项目为绿色,按照以上修改GPS信息的方法即可完成对于照片定位数据的修改,修改后地图会自动更新。

注意事项

由于国内存在访问谷歌的限制,所以不能使用谷歌地图的服务,推荐使用百度地图

网络地图服务往往会对数据进行加密处理,所以定位结果可能会有几十米到几公里不等的偏差,属于正常范围

最近想对库里的拍照地点进行批量添加。

定位和获取库照片比较好解决。

但是添加地理位置信息就麻烦多了。

单反拍的照片传输进手机之后,是没有地理位置信息的。

找了网上的教程,获取照片地址信息,发现根本获取不到:

单反拍摄,没有GPS信息的照片返回:

iPhone拍摄,有地理位置信息的照片:

两种都没法获取位置信息。

如果将位置信息写成字典

强行加上,也无济于事。

突然发现该照片的资源PHAsset信息里,有location属性,是可以拿到位置信息的。那么通过对PHAsset的 *** 作是否可以添加GPS信息呢?

照片信息比从UIImage中取得的详细多了。

参考资料:

>

以上就是关于提取多个图片中的经纬度数据全部的内容,包括:提取多个图片中的经纬度数据、用什么软件可以查看照片的拍摄时间、修改时间 用什么软件可以直接查看照片上的GPS数据,并将照片定位到地、C# 如何获取照片中Exif信息里GPS信息与经纬度数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10160085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存