天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块
config.xml文件的配置例如以下:
1
2
|
<widget "3" bottom= "3" config= "widgets/Coordinate/CoordinateWidget.xml" url= "widgets/Coordinate/CoordinateWidget.swf" /> |
源码文件夹例如以下:
地图坐标系模块的源码原理解析,具体的代码在下载的开源flexviewer自带的:
(1)CoordinateWidget.xml
1 <? xml version="1.0" ?>
2 <configuration label="Coordinates (default)">
3 <!-- geo, dms, mercator 主要是坐标输出单位。默认的是经纬度 -->
4 <outputunit>geo</outputunit>
5 </configuration>
(2)CoordinateWidget.mxml
1 <?xml version="1.0" encoding="utf-8"?>
19 <viewer:BaseWidget xmlns:fx="http://ns.adobe.com/mxml/2009"
20 xmlns:s="library://ns.adobe.com/flex/spark"
21 xmlns:mx="library://ns.adobe.com/flex/mx"
22 xmlns:viewer="com.esri.viewer.*"
23 layout="horizontal"
24 widgetConfigLoaded="basewidget_widgetConfigLoadedHandler(event)">
25 <fx:Script>
26 <![CDATA[
27 import com.esri.ags.events.MapEvent;
28 import com.esri.ags.geometry.MapPoint;
29 import com.esri.ags.utils.WebMercatorUtil;
30
31 import mx.formatters.NumberBaseRoundType;
32 import mx.utils.StringUtil;
33
34 private var m_template:String;
35 private var m_func:Function = substitute;
36
37 protected function basewidget_widgetConfigLoadedHandler(event:Event):void
38 {
39 if (configXML)
40 {
//以下是读取CoordinateWidget.xml配置文件的资源。要是配置了的话
41 const decimalSeparator:String = configXML.numberformatter.@decimalseparator;
42 numberFormatter.decimalSeparatorTo = decimalSeparator ? decimalSeparator : ".";
43 const thousandsSeparator:String = configXML.numberformatter.@thousandsseparator;
44 numberFormatter.thousandsSeparatorTo = thousandsSeparator ? thousandsSeparator : ",";
45 numberFormatter.useThousandsSeparator = configXML.numberformatter.@usethousandsseparator == "true";
46 numberFormatter.precision = parseFloat(configXML.numberformatter.@precision || "-1");
47 const rounding:String = configXML.numberformatter.@rounding;
48 numberFormatter.rounding = rounding ? rounding : NumberBaseRoundType.NONE;
49 //获取设置坐标显示的字体和颜色样式等
50 const color:String = configXML.labelstyle.@color[0] || configXML.label.@color[0];
51 coords.setStyle("color", toNumber(color ? color : "0x000000"));
52 const fontFamily:String = configXML.labelstyle.@fontfamily[0] || configXML.label.@fontfamily[0];
53 coords.setStyle("fontFamily", fontFamily ? fontFamily : "Verdana");
54 const fontSize:String = configXML.labelstyle.@fontsize[0] || configXML.label.@fontsize[0];
55 coords.setStyle("fontSize", parseInt(fontSize ? fontSize : "9"));
56 const fontWeight:String = configXML.labelstyle.@fontweight[0] || configXML.label.@fontweight[0];
57 coords.setStyle("fontWeight", fontWeight ? fontWeight : "bold");
58
59 // If no template specified, show them with a space in between (except for special case below)
60 m_template = configXML.labels.template[0] || configXML.label.@template[0] || "{0} {1}";
61
62 if (map.loaded)
63 {
64 map_loadHandler(null);
65 }
66 else
67 {
68 map.addEventListener(MapEvent.LOAD, map_loadHandler);//载入地图
69 }
70 }
71
72 function map_loadHandler(event:MapEvent):void
73 {
74 map.removeEventListener(MapEvent.LOAD, map_loadHandler);
75 const wkid:int = map.spatialReference.wkid; //获取地图的空间坐标參考系
76 m_func = substitute;
77 const outputUnit:String = configXML.outputunit;//获取地图的坐标显示单位,从配置文件获取
78 if (outputUnit === "mercator")//推断地图的坐标体系。墨卡托情况下运行
79 {
80 if (wkid === 4326 || wkid === 4269 || wkid === 4267)
81 {
82 m_func = geographicToMercator;//调用地理坐标系转换墨卡托坐标系
83 }
84 }
85 else if (outputUnit === "geo")//地理坐标系情况下运行
86 {
87 if (wkid === 102100 || wkid === 102113 || wkid === 3857)
88 {
89 m_func = mercatorToGeographic;//调用墨卡托坐标系转换地理坐标系
90 // special default for geographic outputs
91 m_template = configXML.labels.template[0] || configXML.label.@template[0] || getDefaultString("latitudeLabel") + ":{1} " + getDefaultString("longitudeLabel") + ":{0}";//设置坐标显示的文字,比方经度,纬度
92 numberFormatter.precision = parseFloat(configXML.numberformatter.@precision || "6");//设置坐标显示的位数
93 }
94 else if (wkid === 4326 || wkid === 4269 || wkid === 4267)
95 {
96 // special default for geographic outputs
97 m_template = configXML.labels.template[0] || configXML.label.@template[0] || getDefaultString("latitudeLabel") + ":{1} " + getDefaultString("longitudeLabel") + ":{0}";
98 numberFormatter.precision = parseFloat(configXML.numberformatter.@precision || "6");
99 }
100 }
101 else if (outputUnit === "dms")//经纬度显示单位为度分秒形式情况下运行
102 {
103 if (wkid === 102100 || wkid === 102113 || wkid === 3857)
104 {
105 m_func = mercatorToDMS;
106 }
107 else if (wkid === 4326 || wkid === 4269 || wkid === 4267)
108 {
109 m_func = geographicToDMS;
110 }
111 }
112 map.addEventListener(MouseEvent.MOUSE_MOVE, map_mouseMoveHandler);//监听地图鼠标移动事件,用来获取地图经纬度的
113 }
114 }
115
116 private function toNumber(value:String):int//转换单位计算
117 {
118 if (value.substr(0, 2) == "0x")
119 {
120 return parseInt(value, 16);
121 }
122 return parseInt(value, 10);
123 }
124
125 private function mercatorToGeographic(web:MapPoint):String//墨卡托转换地理坐标系的函数
126 {
127 const geo:MapPoint = WebMercatorUtil.webMercatorToGeographic(web) as MapPoint;//arcgis api封装好的转换函数
128 return StringUtil.substitute(m_template,
129 numberFormatter.format(geo.x),
130 numberFormatter.format(geo.y));
131 }
132
133 private function mercatorToDMS(web:MapPoint):String//墨卡托转换经纬度度分秒形式的函数
134 {
135 const geo:MapPoint = WebMercatorUtil.webMercatorToGeographic(web) as MapPoint;
136 return StringUtil.substitute(m_template, DegToDMS.format(geo.x, DegToDMS.LON), DegToDMS.format(geo.y, DegToDMS.LAT));
137 }
138
139 private function geographicToMercator(geo:MapPoint):String//地理坐标系转换墨卡托的函数
140 {
141 const web:MapPoint = WebMercatorUtil.geographicToWebMercator(geo) as MapPoint;
142 return StringUtil.substitute(m_template,
143 numberFormatter.format(web.x),
144 numberFormatter.format(web.y));
145 }
146
147 private function substitute(mapPoint:MapPoint):String
148 {
149 return StringUtil.substitute(m_template,
150 numberFormatter.format(mapPoint.x),
151 numberFormatter.format(mapPoint.y));
152 }
153
154 private function geographicToDMS(mapPoint:MapPoint):String
155 {
156 const x:String = DegToDMS.format(mapPoint.x, DegToDMS.LON);
157 const y:String = DegToDMS.format(mapPoint.y, DegToDMS.LAT);
158 return StringUtil.substitute(m_template, x, y);
159 }
160
161 private function map_mouseMoveHandler(event:MouseEvent):void
162 {
163 const mapPoint:MapPoint = map.toMapFromStage(event.stageX, event.stageY);//获取鼠标移动的地图经纬度
164 coords.text = m_func(mapPoint);
165 }
166 ]]>
167 </fx:Script>
168
169 <fx:Declarations>
170 <mx:NumberFormatter id="numberFormatter"/>
171 </fx:Declarations>
172 <viewer:filters>
173 <mx:GlowFilter alpha="1"
174 blurX="3"
175 blurY="3"
176 color="0xFFFFFF"
177 strength="7"/>
178 </viewer:filters>
179 <s:Label id="coords" color="0x000000"/>//显示经纬度的位置。显示label
180 </viewer:BaseWidget>
(3)DegToDMS.as
1 package widgets.Coordinate
2 {
3
4 /**
5 * Utility class to pretty print decimal degree numbers.
6 * @private
7 */
8 public final class DegToDMS
9 {
10 // Constants to define the format.
11 public static const LAT:String = "lat";
12
13 public static const LON:String = "lon";
14
15 /**
16 * Utility function to format a decimal degree number into a pretty string with degrees, minutes and seconds.
17 * @param decDeg the decimal degree number.
18 * @param decDir "lat" for a latitude number, "lon" for a longitude value.
19 * @return A pretty print string with degrees, minutes and seconds.
20 */
21 public static function format(decDeg:Number, decDir:String):String//这个函数主要是用来把经纬度转换度分秒的形式来展示经纬度,比方113度23分23秒等等
22 {
23 var d:Number = Math.abs(decDeg);
24 var deg:Number = Math.floor(d);
25 d = d - deg;
26 var min:Number = Math.floor(d * 60);
27 var av:Number = d - min / 60;
28 var sec:Number = Math.floor(av * 60 * 60);
29 if (sec == 60)
30 {
31 min++;
32 sec = 0;
33 }
34 if (min == 60)
35 {
36 deg++;
37 min = 0;
38 }
39 var smin:String = min < 10 ? "0" + min + "' " : min + "' ";
40 var ssec:String = sec < 10 ? "0" + sec + "\" " : sec + "\" ";
41 var sdir:String = (decDir == LAT) ? (decDeg < 0 ? "S" : "N") : (decDeg < 0 ? "W" : "E");
42 return deg + "\xB0 " + smin + ssec + sdir;
43 }
44 }
45
46 }
备注:
GIS作品:百度搜索:GIS之家(https://shop116521643.taobao.com/shop/view_shop.htm);
QQ兴趣部落GIS技术交流:gis之家(http://buluo.qq.com/p/barindex.html?bid=327395);
GIS毕业设计&项目承接群:238339408;
GIS技术交流群:432512093
天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块的更多相关文章
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架
系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块
config.xml文件的配置如下: <widget label="态势标绘" icon="assets/images/impact_area_over.png&q ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(三)显示地图坐标系模块
config.xml文件的配置如下: <widget left="3" bottom="3" config="widgets/Coordinat ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(八)资源搜索模块
config.xml文件的配置如下: <widget label="资源搜索" icon="assets/images/public_impact_over.png ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(二)鹰眼模块
讲解GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块
解说GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块
config.xml文件的配置如下: <widget label="台风" icon="assets/images/typhoon.png" config ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十一)路径导航模块
config.xml文件的配置如下: <widget label="路径导航" icon="assets/images/lujingdaohang.png" ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(六)地图搜索模块
config.xml文件的配置如下: <widget label="地图搜索" icon="assets/images/emergency_resource_ove ...
随机推荐
- Python通过跳板机链接MySQL的一种方法
- Spring AOP高级——源码实现(1)动态代理技术
在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理. 动态代理实际上也是一种结构型的设计模式,JDK中已经为我们准备好了这种设计模式,不过这种JDK ...
- selenium+testN自动化测试框架搭建
自动化测试框架搭建 1 Java环境的搭建 1.1访问oracle的官网下载最新版本的jdk http://www.oracle.com/technetwork/java/javase/downloa ...
- mysql将字符串转化为数字
我的字段为内容为数字,但是类型为字符串,需要使用CASE转换即可 SELECT MAX(CAST(C_id AS UNSIGNED)) INTO id 即查询出来最大的C_id,否则会按照字符串查询最 ...
- selenium 之 ActionChains (二)
今天,小编为大家介绍的是标题中的三个新方法,以及一个老方法 以下方法都需要操作一个名为Keys的包,先来简单认识下 ALT = u'\ue00a' CONTROL = u'\ue009' ENTER ...
- 图片验证码的JAVA工具类
我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字.字母.甚至可能有汉字.下面我给出一个简单的工具类. package com..ankang.tony.util; import java ...
- Vue.js优雅的实现列表清单
一.Vue.js简要说明 Vue.js (读音 /vjuː/) 是一套构建用户界面的渐进式框架.与前端框架Angular一样, Vue.js在设计上采用MVVM模式,当View视图层发生变化时 ...
- ServerSocket(TCP/IP协议)__Java
服务器端 //参数为端口号,可以自定义 ServerSocket ss=new ServerSocket(11111); System.out.println("开启监听..." ...
- [转载] Java NIO教程
转载自并发编程网 – ifeve.com http://ifeve.com/java-nio-all/ 关于通道(Channels).缓冲区(Buffers).选择器(Selectors)的故事. 从 ...
- tmux frequently asked questions
tmux frequently asked questions How is tmux different from GNU screen? tmux and GNU screen have ...