zoukankan      html  css  js  c++  java
  • 照片提取GPS 转成百度地图坐标

    感谢: 小慧only http://www.cnblogs.com/zhaohuionly/p/3142623.html  GPS转化坐标方法
       大胡子青松 http://www.cnblogs.com/xianyin05/archive/2013/05/10/3071224.html  获取照片中Exif信息里GPS经纬度数

    需求:上传个图片 解释出拍摄地的 GPS 信息,以地图的形式展现出来。GPS 信息的验证,可下载 MagicEXIF 元数据编辑器 查看

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="Code.Test.WebForm2" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <input type="file"  id="file_img"  runat="server"/>
            <asp:Button runat="server"  Text="提取" ID="btn_zh" OnClick="btn_zh_Click"/>
            <asp:Image runat="server" ID="Map" />
        </div>
        </form>
    </body>
    </html>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using System.Data;
    using System.IO;
    using System.Drawing.Imaging;
    using System.Net;
    using Newtonsoft.Json;
    
    namespace Code.Test
    {
        public partial class WebForm2 : System.Web.UI.Page
        {
            Code.SysManage.Commen.CommonTool commonTool = new SysManage.Commen.CommonTool();
            public class MapConvert
            {
                public string error { get; set; }
                public string x { get; set; }
                public string y { get; set; }
            }
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            #region 读取图片中GPS点
    
    
            /// <summary>
            /// 获取图片中的GPS坐标点
            /// </summary>
            /// <param name="p_图片路径">图片路径</param>
            /// <returns>返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值</returns>
            public String fnGPS坐标(String p_图片路径)
            {
                String s_GPS坐标 = "";
                //载入图片   
                System.Drawing.Image objImage = System.Drawing.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)
                    {
                        switch (objItem.Id)
                        {
                            case 0x0000:
                                var query = from tmpb in objItem.Value select tmpb.ToString();
                                string sreVersion = string.Join(".", query.ToArray());
                                break;
                            case 0x0001://北纬 N chrGPSLatitudeRef
                                chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);
                                break;
                            case 0x0002://维度  strLatitude
                                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:#}°{1:#}'{2:#.00}"{3}", d
                                                                        , m, s, chrGPSLatitudeRef);
                                    //纬度
                                    //s_GPS坐标 += "维度:" + dblGPSLatitude + "," + strLatitude + "|";
                                    s_GPS坐标 += (dblGPSLatitude + "|");
                                }
                                break;
                            case 0x0003: //东经 chrGPSLongitudeRef
                                //透过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);
                                    string strLongitude = string.Format("{0:#}°{1:#}'{2:#.00}"{3}", d
                                                                        , m, s, chrGPSLongitudeRef);
    
                                    //s_GPS坐标 += "经度:" + dblGPSLongitude + "," + strLongitude + "|";
                                    s_GPS坐标 += (dblGPSLongitude + "|");
                                }
                                break;
                            case 0x0005://海平面
                                string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? "0" : "1";
                                s_GPS坐标 += "海平面:" + strAltitude + "|";
                                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);
    
                                    s_GPS坐标 += "水平高度:" + dblAltitude + "|";
                                }
                                break;
                        }
                    }
                }
                return s_GPS坐标;
            }
    
            #endregion
    
            protected void btn_zh_Click(object sender, EventArgs e)
            {
           
    
                string picpath = commonTool.SaveImg(file_img, "News");    /*上传图片的方法,可自己重写*/
                picpath = HttpContext.Current.Request.MapPath(picpath);
                string Gpslocation = fnGPS坐标(picpath);/*获得GPS 信心,详细信息参考方法*/
                Response.Write(Gpslocation);
                //获取当前纬度
                string Latitude = Gpslocation.Split('|')[0];/*上传图片的方法,可自己重写*/
    
                //获取当前经度
                string Longitude = Gpslocation.Split('|')[1];
    
                //百度坐标转换API
                string path = "http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=" + Longitude + "&y=" + Latitude + "";/*坐标纠正,生成百度地图的坐标*/
    
                //WebClient请求
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(path);
                StreamReader sr = new StreamReader(stream);
                MapConvert mapConvert = new MapConvert();
                string strResult = sr.ReadToEnd();
                Response.Write(strResult);
                mapConvert = JsonConvert.DeserializeObject<MapConvert>(strResult);
                string lon = mapConvert.x;
                string lat = mapConvert.y;
                //进行Base64解码
                byte[] xBuffer = Convert.FromBase64String(lon);
                string strX = Encoding.UTF8.GetString(xBuffer, 0, xBuffer.Length);
                byte[] yBuffer = Convert.FromBase64String(lat);
                string strY = Encoding.UTF8.GetString(yBuffer, 0, yBuffer.Length);
                Response.Write(strX + ",");
                Response.Write(strY);
                //生成静态图片
                string imgSrc = string.Format("http://api.map.baidu.com/staticimage?center={0},{1}&width=600&height=600&zoom=19&markers={2},{3}&markerStyles=l,A", strX, strY, strX, strY);/*此处生成静态地图,以显示是否正确,可自行修改*/
    
                //显示图片
                Map.ImageUrl = imgSrc;
            }
        }
    
    
    
    }
  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/jkyweb/p/8663396.html
Copyright © 2011-2022 走看看