zoukankan      html  css  js  c++  java
  • Arcgis Server开发技巧系列 动态刷新经纬度坐标

    在这次的开发项目中遇到了一个新的需求,需要动态在页面上的状态栏显示经纬度坐标,并且要度分秒格式的坐标.真是BT啊.....
          好了,言归正传.大家都知道,要在服务器端计算经纬度,然后传回客户端显示,这个方法是不可取的.那么,最好的办法就是在客户端计算经纬度.那么计算经纬度首先应该获取一些基本的信息.就是当前客户端地图两边的经纬度.
          比如,客户端地图的大小是800*600.我们首先计算0,0这个点的经纬度,然后计算800,600这个点的经纬度.最后,经过一些运算,就可以获得x,y这个点的经纬度了.
          当然,这里还有一些需要注意的地方:
          一:由于从Arcgis Server中获取的经纬度是10进制的,所以我们还需要经过一些换算才能得到度分秒式的经纬度.
          二:我们取经纬度的时候,一定要取MapDesription.Extent的XMIN等信息,而不能直接取屏幕坐标为0,0的信息,不然数据会不正确.具体为什么,我现在还没有弄清楚.
          三:每次改变地图的比例尺的时候,一定要重新获取经纬度信息.

            1/**//// <summary>
     2        /// 获取当前Extent的边界空间坐标信息
     3        /// </summary>
     4        /// <returns>
     5        /// double[0]: 该Extent的左上角X坐标
     6        /// double[1]: 该Extent的右下角X坐标
     7        /// double[2]: 该Extent的左上角Y坐标
     8        /// double[3]: 该Extent的右下角Y坐标
     9        /// </returns>
    10        public double[] GetCurrentGeopraphicCoordinate()
    11        {
    12            using (WebObject webObj = new WebObject())
    13            {
    14                IServerContext ctx;
    15                ctx = MapManager.CreateServerContext
    16                    (MapManager.stat_cfgBase.MapConfig.MapServer, "MapServer");
    17                if (MapManager.stat_som.GetConfigurationInfo(MapManager.stat_cfgBase.MapConfig.MapServer, "MapServer").IsPooled)
    18                {
    19                    webObj.ManageLifetime(ctx);
    20                }
    21                IMapServer map = ctx.ServerObject as IMapServer;
    22                IMapServerInfo mapinfo = map.GetServerInfo(map.DefaultMapName);
    23                IMapDescription md;
    24                md = extenthistory != null && extenthistory.Count != 0
    25                    ? ctx.LoadObject(extenthistory[Convert.ToInt32(extentindex[0].ToString())].ToString()) as IMapDescription
    26                    : mapinfo.DefaultMapDescription;
    27                webObj.ManageLifetime(md);
    28
    29                double[] coords = new double[]{
    30                                                  md.MapArea.Extent.XMin, md.MapArea.Extent.XMax,
    31                                                  md.MapArea.Extent.YMin, md.MapArea.Extent.YMax
    32                                              };
    33                return coords;
    34            }
    35        }


          客户端JS脚本(10进制转换为度分秒):
             1// 初始化参数
      2
      3        // leftX: 左上角X经纬度坐标
      4
      5        // rightX: 右下角X经纬度坐标
      6
      7        // topY: 左上角Y经纬度坐标
      8
      9        // bottomY; 右下角Y经纬度坐标
     10
     11        // mapWidth: 地图宽度
     12        // mapHeigth: 地图高度
     13        function InitInfos(leftX, rightX, topY, bottomY, mapWidth, mapHeight)
     14        {
     15            m_leftX = leftX;
     16            m_rightX = rightX;
     17            m_topY = topY;
     18            m_bottomY = bottomY;
     19            m_mapHeight = mapHeight;
     20            m_mapWidth = mapWidth;
     21        }
     22
     23        // 将10进制的经纬度坐标转换为度分秒的经纬度坐标
     24        // Coordinate:10进制的经纬度
     25        // eg:
     26        // Coordinate : 104.342050792709
     27        // 转换后 : 104°20′32.38″ 
     28        function ConvertToGeopraphicCoordinate (Coordinate)
     29        {
     30            var params = Coordinate.toString().split('.');
     31            var coord = "0." + params[1];
     32            var degree = (coord * 60).toString();
     33            var coords = degree.split('.');
     34            degree = coords[0];
     35            var second = "0." + coords[1];
     36            second = (second * 60).toString();
     37            second = second.substring(0, 5);
     38            return params[0] + '°' + degree + '′' + second + '″';
     39        }
     40
     41
     42        // 计算当前的经纬度坐标,并按照度分秒的方式返回
     43        // currentX: 当前地图屏幕X坐标
     44        // currentY: 当前地图屏幕Y坐标
     45        function ComputeCurrentCoordinate(currentX, currentY)
     46        {
     47            // 获取经纬度10进制的小数部分,用于计算
     48            var nonhead_rightX = '0.' + m_rightX.split('.')[1];//0.1339024;//
     49            var nonhead_leftX = '0.' + m_leftX.split('.')[1];//0.0550135;//
     50            var nonhead_topY = '0.' + m_topY.split('.')[1];
     51            var nonhead_bottomY = '0.' + m_bottomY.split('.')[1];
     52           
     53            // 获取经纬度10进制的整数部分,用于最后的合并
     54            var head_rightX = m_rightX.split('.')[0];
     55            var head_leftX = m_leftX.split('.')[0];
     56            var head_topY = m_topY.split('.')[0];  // YMin
     57            var head_bottomY = m_bottomY.split('.')[0];  // YMax
     58           
     59            // 提高精确度,减小误差
     60            nonhead_rightX = nonhead_rightX * 10000;
     61            nonhead_leftX = nonhead_leftX * 10000;
     62            nonhead_topY = nonhead_topY * 10000;
     63            nonhead_bottomY = nonhead_bottomY * 10000;
     64           
     65            var bRightHead = true;
     66            var bTopHead = true;
     67           
     68            // 计算X轴单位值
     69
     70            var offset_X = nonhead_rightX - nonhead_leftX;
     71               
     72            if (offset_X < 0)
     73            {
     74                offset_X = 1 + offset_X;
     75                bRightHead = false;
     76            }
     77           
     78            // 计算Y轴单位值
     79
     80            var offset_Y = nonhead_bottomY - nonhead_topY;
     81            if (offset_Y < 0)
     82            {
     83                offset_Y = 1 + offset_Y;
     84                bTopHead = false;
     85            }   
     86
     87            // 计算当前经纬度10进制坐标
     88            var GeopraphicX = (offset_X/m_mapWidth) * currentX + (nonhead_leftX - 0);
     89            var GeopraphicY = (nonhead_bottomY - 0) - (offset_Y/m_mapHeight) * (currentY);// + (nonhead_topY - 0);
     90           
     91            GeopraphicX = GeopraphicX / 10000;
     92            GeopraphicY = GeopraphicY / 10000;
     93           
     94            if (bRightHead = true)
     95            {
     96                GeopraphicX = parseInt(head_rightX) + parseFloat(GeopraphicX);
     97            }
     98            else
     99            {
    100                GeopraphicX = parseInt(head_leftX) + parseFloat(GeopraphicX);
    101            }
    102           
    103            if (bTopHead = true)
    104            {
    105                GeopraphicY = parseInt(head_bottomY) + parseFloat(GeopraphicY);
    106            }
    107            else
    108            {
    109                GeopraphicY = parseInt(head_topY) + parseFloat(GeopraphicY);
    110            }
    111           
    112            var ConvertedX = ConvertToGeopraphicCoordinate(GeopraphicX);
    113            var ConvertedY = ConvertToGeopraphicCoordinate(GeopraphicY);
    114           
    115            return ConvertedX + 'E; ' + ConvertedY + 'N';
    116        }
          当然,如果哪位大侠有更好的方法,欢迎指教,感激不尽..

  • 相关阅读:
    Java实现最大流量问题
    Java实现最大流量问题
    Java实现最大流量问题
    Java实现最大流量问题
    Java实现行列递增矩阵的查找
    Java实现行列递增矩阵的查找
    Java实现行列递增矩阵的查找
    Java实现行列递增矩阵的查找
    Java实现行列递增矩阵的查找
    通过QML Profiler分析程序性能问题
  • 原文地址:https://www.cnblogs.com/googlegis/p/2979040.html
Copyright © 2011-2022 走看看