zoukankan      html  css  js  c++  java
  • 获取照片中Exif信息里GPS经纬度数

    获取照片中Exif信息里GPS经纬度数

     87人阅读 评论(0) 收藏 举报
    #region 读取图片中GPS点


            /// <summary>
            /// 获取图片中的GPS坐标点
            /// </summary>
            /// <param name="p_图片路径">图片路径</param>
            /// <returns>返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值</returns>
            public String fnGPS坐标(String p_图片路径)
            {
                String s_GPS坐标 = "";
                //载入图片   
                Image objImage = Image.FromFile(p_图片路径);
                //取得所有的属性(以PropertyId做排序)   
                var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);
                //暂定纬度N(北纬)   
                char chrGPSLatitudeRef = 'N';
                //暂定经度为E(东经)   
                char chrGPSLongitudeRef = 'E';
                foreach (PropertyItem objItem in propertyItems)
                {
                    //只取Id范围为0x0000到0x001e
                    if (objItem.Id >= 0x0000 && objItem.Id <= 0x001e)
                    {
                        objItem.Id = 0x0002;
                        switch (objItem.Id)
                        {
                            case 0x0000:
                                var query = from tmpb in objItem.Value select tmpb.ToString();
                                string sreVersion = string.Join(".", query.ToArray());
                                break;
                            case 0x0001:
                                chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);
                                break;
                            case 0x0002:
                                if (objItem.Value.Length == 24)
                                {
                                    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)   
                                    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                    //minutes(將byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)   
                                    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
                                    //seconds(將byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)   
                                    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
                                    //计算经纬度数值, 如果是南纬, 要乘上(-1)   
                                    double dblGPSLatitude = (((s / 60 + m) / 60) + d) * (chrGPSLatitudeRef.Equals('N') ? 1 : -1);
                                    string strLatitude = string.Format("{0:#} deg {1:#}' {2:#.00}\" {3}", d
                                                                        , m, s, chrGPSLatitudeRef);
                                    //纬度+经度
                                    s_GPS坐标 += dblGPSLatitude + "+";
                                }
                                break;
                            case 0x0003:
                                //透过BitConverter, 将Value转成Char('E' / 'W')   
                                //此值在后续的Longitude计算上会用到   
                                chrGPSLongitudeRef = BitConverter.ToChar(objItem.Value, 0);
                                break;
                            case 0x0004:
                                if (objItem.Value.Length == 24)
                                {
                                    //degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)   
                                    double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                    //minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)   
                                    double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);
                                    //seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)   
                                    double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);
                                    //计算精度的数值, 如果是西经, 要乘上(-1)   
                                    double dblGPSLongitude = (((s / 60 + m) / 60) + d) * (chrGPSLongitudeRef.Equals('E') ? 1 : -1);
                                }
                                break;
                            case 0x0005:
                                string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? "0" : "1";
                                break;
                            case 0x0006:
                                if (objItem.Value.Length == 8)
                                {
                                    //将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint   
                                    double dblAltitude = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);
                                }
                                break;
                        }
                    }
                }
                return s_GPS坐标;
            }


            #endregion
  • 相关阅读:
    Spring4 MVC json问题(406 Not Acceptable)
    java 从网络Url中下载文件
    Java基础知识(一) 自增、自减运算符
    java文件读写操作
    java集合运算:求交集,并集,集合差
    httpclient+jsoup实现网页信息抓取
    java web使用gradle配置详情
    关于mysql登录异常处理方法
    windows server 2012 r2 远程桌面连接指南
    Java生成带小图标的二维码-google zxing 工具类
  • 原文地址:https://www.cnblogs.com/xianyin05/p/3071224.html
Copyright © 2011-2022 走看看