日韩a天堂2020在线手机

当前位置:美女AV > IT相关 > 地图开发 > 正文  |  快速导航:行业资讯 软件测试 风云人物 计算机英语 游戏开发 移动应用 地图开发 算法 程序员
  • ASP.NET获取图片GPS坐标(经度、纬度)

  • 字号:[ ]2013-9-26 14:00:41  阅读:291次  来源:乐猪网  编辑:银河精灵  收藏
  • 摘要:想不到自己从事ASP.NET软件开发有三年时间了,做地图开发也有两年时间了,却一直不知道图片是可以存放GPS坐标信息的,说到底还是自己见识少呀!有空得多看书才行,不然真成了猿始人了!
  •     昨天,项目经理叫我做一个平板电脑 WebService 接口功能。平板电脑通过调用 ASP.NET日韩a天堂2020在线手机 系统的接口上传图片,系统中获取图片的 GPS 坐标信息在地图上进行定位。

    日韩a天堂2020在线手机    有一个很奇怪的问题,我在 Windows Server 2003 操作系统中,查看图片的属性是看不到 GPS 坐标信息,可是在笔记本中 Windows 7 下是可以看得到的,这是需要注意的,刚开始一直以为没有生成,原来是自己的电脑上看不到而已。

    ASP.NET 获取图片 GPS 方法代码:

    #region 读取图片中GPS点   
    /// <summary>   
    /// 获取图片中的GPS坐标点   
    /// </summary>   
    /// <param name="p_图片路径">图片路径</param>   
    /// <returns>返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值</returns>   
    public static string GetImgGPS(String path)   
    {   
        String s_GPS = "";   
        //载入图片      
        System.Drawing.Image objImage = System.Drawing.Image.FromFile(path);   
        //取得所有的属性(以PropertyId做排序)      
        var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);   
        //暂定纬度N(北纬)      
        char chrGPSLatitudeRef = 'N';   
        //暂定经度为E(东经)      
        char chrGPSLongitudeRef = 'E';   
        foreach (System.Drawing.Imaging.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

    调用返回值代码:

    string X = ""; //经度   
    string Y = ""; //纬度   
    string strImgGPS = CommonMethod.GetImgGPS(strFilePath);   
    if (strImgGPS != "")   
    {   
        string[] arrImgGPS = strImgGPS.Split('+');   
        if (arrImgGPS[0] != null && arrImgGPS[0].ToString() != "")   
        {   
            Y = arrImgGPS[0].ToString();   
        }   
        if (arrImgGPS[1] != null && arrImgGPS[1].ToString() != "")   
        {   
            X = arrImgGPS[1].ToString();   
        }   
    }

        还有一个问题需要注意的,在上面的方法中返回来的 GPS 信息包括三样东西,经度、纬度和高度,它们是使用 + 号隔开的,取值时通过 + 号进行分隔获取数组下标 0 和 1 位置就是续度和经度。

  • 顶一下
    (0)
    0%
    踩一下
    (0)
    0%
乐猪网 版权所有 Copyright © 2012-2015 msox106.cn All rights reserved.
本站用于学习交流,部分文章来源于网络,如果不慎侵犯了您的权益,请AV视频 我们删除!
粤ICP备12000837号

日韩a天堂2020在线手机