Arcgis Server开发技巧系列 动态刷新经纬度坐标

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

      
 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
 2InBlock.gif        /// 获取当前Extent的边界空间坐标信息
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <returns>
 5InBlock.gif        /// double[0]: 该Extent的左上角X坐标
 6InBlock.gif        /// double[1]: 该Extent的右下角X坐标
 7InBlock.gif        /// double[2]: 该Extent的左上角Y坐标
 8InBlock.gif        /// double[3]: 该Extent的右下角Y坐标
 9ExpandedBlockEnd.gif        /// </returns>

10 None.gif          public   double [] GetCurrentGeopraphicCoordinate()
11 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
12InBlock.gif            using (WebObject webObj = new WebObject())
13ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
14InBlock.gif                IServerContext ctx;
15InBlock.gif                ctx = MapManager.CreateServerContext
16InBlock.gif                    (MapManager.stat_cfgBase.MapConfig.MapServer, "MapServer");
17InBlock.gif                if (MapManager.stat_som.GetConfigurationInfo(MapManager.stat_cfgBase.MapConfig.MapServer, "MapServer").IsPooled)
18ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
19InBlock.gif                    webObj.ManageLifetime(ctx);
20ExpandedSubBlockEnd.gif                }

21InBlock.gif                IMapServer map = ctx.ServerObject as IMapServer;
22InBlock.gif                IMapServerInfo mapinfo = map.GetServerInfo(map.DefaultMapName);
23InBlock.gif                IMapDescription md;
24InBlock.gif                md = extenthistory != null && extenthistory.Count != 0
25InBlock.gif                    ? ctx.LoadObject(extenthistory[Convert.ToInt32(extentindex[0].ToString())].ToString()) as IMapDescription
26InBlock.gif                    : mapinfo.DefaultMapDescription;
27InBlock.gif                webObj.ManageLifetime(md);
28InBlock.gif
29ExpandedSubBlockStart.gifContractedSubBlock.gif                double[] coords = new double[]dot.gif{
30InBlock.gif                                                  md.MapArea.Extent.XMin, md.MapArea.Extent.XMax,
31InBlock.gif                                                  md.MapArea.Extent.YMin, md.MapArea.Extent.YMax
32ExpandedSubBlockEnd.gif                                              }
;
33InBlock.gif                return coords;
34ExpandedSubBlockEnd.gif            }

35ExpandedBlockEnd.gif        }



      客户端JS脚本(10进制转换为度分秒):
      
  1 None.gif //  初始化参数
  2 None.gif
  3 None.gif         //  leftX: 左上角X经纬度坐标
  4 None.gif
  5 None.gif         //  rightX: 右下角X经纬度坐标
  6 None.gif
  7 None.gif         //  topY: 左上角Y经纬度坐标
  8 None.gif
  9 None.gif         //  bottomY; 右下角Y经纬度坐标
 10 None.gif
 11 None.gif         //  mapWidth: 地图宽度
 12 None.gif          //  mapHeigth: 地图高度
 13 None.gif          function  InitInfos(leftX, rightX, topY, bottomY, mapWidth, mapHeight)
 14 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 15InBlock.gif            m_leftX = leftX;
 16InBlock.gif            m_rightX = rightX;
 17InBlock.gif            m_topY = topY;
 18InBlock.gif            m_bottomY = bottomY;
 19InBlock.gif            m_mapHeight = mapHeight;
 20InBlock.gif            m_mapWidth = mapWidth;
 21ExpandedBlockEnd.gif        }

 22 None.gif
 23 None.gif         //  将10进制的经纬度坐标转换为度分秒的经纬度坐标
 24 None.gif          //  Coordinate:10进制的经纬度
 25 None.gif          //  eg:
 26 None.gif          //  Coordinate : 104.342050792709
 27 None.gif          //  转换后 : 104°20′32.38″  
 28 None.gif          function  ConvertToGeopraphicCoordinate (Coordinate)
 29 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 30InBlock.gif            var params = Coordinate.toString().split('.');
 31InBlock.gif            var coord = "0." + params[1];
 32InBlock.gif            var degree = (coord * 60).toString();
 33InBlock.gif            var coords = degree.split('.');
 34InBlock.gif            degree = coords[0];
 35InBlock.gif            var second = "0." + coords[1];
 36InBlock.gif            second = (second * 60).toString();
 37InBlock.gif            second = second.substring(05);
 38InBlock.gif            return params[0+ '°' + degree + '′' + second + '″';
 39ExpandedBlockEnd.gif        }

 40 None.gif
 41 None.gif
 42 None.gif         //  计算当前的经纬度坐标,并按照度分秒的方式返回
 43 None.gif          //  currentX: 当前地图屏幕X坐标
 44 None.gif          //  currentY: 当前地图屏幕Y坐标
 45 None.gif          function  ComputeCurrentCoordinate(currentX, currentY)
 46 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 47InBlock.gif            // 获取经纬度10进制的小数部分,用于计算
 48InBlock.gif            var nonhead_rightX = '0.' + m_rightX.split('.')[1];//0.1339024;//
 49InBlock.gif            var nonhead_leftX = '0.' + m_leftX.split('.')[1];//0.0550135;//
 50InBlock.gif            var nonhead_topY = '0.' + m_topY.split('.')[1];
 51InBlock.gif            var nonhead_bottomY = '0.' + m_bottomY.split('.')[1];
 52InBlock.gif            
 53InBlock.gif            // 获取经纬度10进制的整数部分,用于最后的合并
 54InBlock.gif            var head_rightX = m_rightX.split('.')[0];
 55InBlock.gif            var head_leftX = m_leftX.split('.')[0];
 56InBlock.gif            var head_topY = m_topY.split('.')[0];  // YMin
 57InBlock.gif            var head_bottomY = m_bottomY.split('.')[0];  // YMax
 58InBlock.gif            
 59InBlock.gif            // 提高精确度,减小误差
 60InBlock.gif            nonhead_rightX = nonhead_rightX * 10000;
 61InBlock.gif            nonhead_leftX = nonhead_leftX * 10000;
 62InBlock.gif            nonhead_topY = nonhead_topY * 10000;
 63InBlock.gif            nonhead_bottomY = nonhead_bottomY * 10000;
 64InBlock.gif            
 65InBlock.gif            var bRightHead = true;
 66InBlock.gif            var bTopHead = true;
 67InBlock.gif            
 68InBlock.gif            // 计算X轴单位值
 69InBlock.gif
 70InBlock.gif            var offset_X = nonhead_rightX - nonhead_leftX;
 71InBlock.gif                
 72InBlock.gif            if (offset_X < 0
 73ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 74InBlock.gif                offset_X = 1 + offset_X;
 75InBlock.gif                bRightHead = false;
 76ExpandedSubBlockEnd.gif            }

 77InBlock.gif            
 78InBlock.gif            // 计算Y轴单位值
 79InBlock.gif
 80InBlock.gif            var offset_Y = nonhead_bottomY - nonhead_topY;
 81InBlock.gif            if (offset_Y < 0
 82ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 83InBlock.gif                offset_Y = 1 + offset_Y;
 84InBlock.gif                bTopHead = false;
 85ExpandedSubBlockEnd.gif            }
    
 86InBlock.gif
 87InBlock.gif            // 计算当前经纬度10进制坐标
 88InBlock.gif            var GeopraphicX = (offset_X/m_mapWidth) * currentX + (nonhead_leftX - 0);
 89InBlock.gif            var GeopraphicY = (nonhead_bottomY - 0- (offset_Y/m_mapHeight) * (currentY);// + (nonhead_topY - 0);
 90InBlock.gif            
 91InBlock.gif            GeopraphicX = GeopraphicX / 10000;
 92InBlock.gif            GeopraphicY = GeopraphicY / 10000;
 93InBlock.gif            
 94InBlock.gif            if (bRightHead = true
 95ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 96InBlock.gif                GeopraphicX = parseInt(head_rightX) + parseFloat(GeopraphicX);
 97ExpandedSubBlockEnd.gif            }

 98InBlock.gif            else
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
100InBlock.gif                GeopraphicX = parseInt(head_leftX) + parseFloat(GeopraphicX);
101ExpandedSubBlockEnd.gif            }

102InBlock.gif            
103InBlock.gif            if (bTopHead = true
104ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
105InBlock.gif                GeopraphicY = parseInt(head_bottomY) + parseFloat(GeopraphicY);
106ExpandedSubBlockEnd.gif            }

107InBlock.gif            else
108ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
109InBlock.gif                GeopraphicY = parseInt(head_topY) + parseFloat(GeopraphicY);
110ExpandedSubBlockEnd.gif            }

111InBlock.gif            
112InBlock.gif            var ConvertedX = ConvertToGeopraphicCoordinate(GeopraphicX);
113InBlock.gif            var ConvertedY = ConvertToGeopraphicCoordinate(GeopraphicY);
114InBlock.gif            
115InBlock.gif            return ConvertedX + 'E; ' + ConvertedY + 'N';
116ExpandedBlockEnd.gif        }

      当然,如果哪位大侠有更好的方法,欢迎指教,感激不尽..

转载于:https://www.cnblogs.com/tony111082/archive/2006/10/20/534423.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值