气象上常用的坐标投影,包括
Lambert(兰勃特)、
Mercator(麦卡托)、
Stereogram(极射赤面)、
Polar(极坐标)、
Linear经纬线性),均从这个Coordinate.java继承。当设置缩放系数为1.0时,各投影的与Micaps1.0重合。
Coordinate.java
001 /*
002
003 坐标投影抽象类,具体方法由其继承类实现
004
005 PACKAGE: cma.common.projection
006 FILENAME: Coordinate.java
007 LANGUAGE: Java2 v1.4
008 ORIGINAL: none
009 DESCRIPTION:
010 CREATE: 2007-07-08 13:22:39
011 UPDATE:
012 AUTHOR: 刘泽军 (BJ0773@gmail.com)
013 广西气象减灾研究所
014 Guangxi Institude of Meteorology and Disaster-reducing Research(GIMDR)
015 已经开发发继承类有: Lambert.java Mercator.java Stereogram.java Polar.java Linear.java
016 */
017
018 package cma.common.projection;
019
020 import java.io.*;
021 import java.awt.*;
022 import java.awt.geom.*;
023 import java.util.*;
024 import java.lang.Math.*;
025
026 public abstract class Coordinate {
027
028 //投影方式
029 public static int LAMBERT = 1 ;
030 public static int MERCATOR = 2 ;
031 public static int BBQ = 3 ;
032 public static int NBQ = 4 ;
033 public static int LINEAR = 5 ;
034 public static int POLAR = 6 ;
035
036 //静态常量,地球半径,来源:《大气科学常用公式》,P601,附录
037 public static double RADIUS = 6371.004 ; //地球平均半径,单位:公里(Km)。
038 public static double RADIUS_POLAR = 6356.755 ; //地球两极半径,单位:公里(Km)。
039 public static double RADIUS_EQUATOR = 6373.140 ; //地球赤道半径,单位:公里(Km)。
040
041 //标准经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0)
042 protected Point2D.Double standard; //兰勃特、极射赤面投影用到
043
044 //中心经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0),用于定位,不一定是中心
045 protected Point2D.Double center;
046
047 //中心经纬度对应的屏幕坐标
048 protected Point place;
049
050 //偏移
051 protected Point offset;
052
053 //缩放比例(非0正值,经向纬向可以不同)
054 protected Point2D.Double scaleXY;
055 //缩放系数
056 protected double scale;
057 protected double scaleOriginal;
058
059 public int type = - 1 ;
060
061 /**
062 * 功能:
063 * 获得标准经纬度
064 * 参数:
065 * 无
066 * 返回值:
067 * 标准经纬度
068 */
069 public Point2D.Double getStandard () {
070 return ( standard ) ;
071 }
072
073 /**
074 * 功能:
075 * 获得中心经纬度
076 * 参数:
077 * 无
078 * 返回值:
079 * 中心经纬度
080 */
081 public Point2D.Double getCenter () {
082 return ( center ) ;
083 }
084
085 /**
086 * 功能:
087 * 获得中心经纬度对应的屏幕坐标
088 * 参数:
089 * 无
090 * 返回值:
091 * 中心经纬度对应的屏幕坐标
092 */
093 public Point getPlace () {
094 return ( place ) ;
095 }
096
097 /**
098 * 功能:
099 * 获得缩放系数
100 * 参数:
101 * 无
102 * 返回值:
103 * 缩放系数
104 */
105 public double getScale () {
106 return ( scale ) ;
107 }
108
109 /**
110 * 功能:
111 * 获得缩放比例
112 * 参数:
113 * 无
114 * 返回值:
115 * 缩放比例
116 */
117 public Point2D.Double getScaleXY () {
118 return ( scaleXY ) ;
119 }
120
121 /**
122 * 功能:
123 * 放大
124 * 参数:
125 * 无
126 * 返回值:
127 * 无
128 */
129 public void zoomIn () {
130 scale = scale * 2.0 ;
131 }
132
133 /**
134 * 功能:
135 * 缩小
136 * 参数:
137 * 无
138 * 返回值:
139 * 无
140 */
141 public void zoomOut () {
142 scale = scale / 2.0 ;
143 }
144
145 /**
146 * 功能:
147 * 复原
148 * 参数:
149 * 无
150 * 返回值:
151 * 无
152 */
153 public void revert () {
154 scale = scaleOriginal;
155 }
156
157 /*
158 //======================================================================
159 // 以下为抽象方法定义,具体实现由继承类来完成。
160 //======================================================================
161 */
162
163 /**
164 * 功能:
165 * 获得屏幕坐标
166 * 参数:
167 * lon - 经度
168 * lat - 纬度
169 * 返回值:
170 * 屏幕坐标
171 */
172 public abstract Point getPosition ( double lon, double lat ) ;
173
174 /**
175 * 功能:
176 * 获得屏幕坐标对应的经纬度
177 * 参数:
178 * x - 屏幕水平坐标
179 * y - 屏幕垂直坐标
180 * 返回值:
181 * 对应的经纬度
182 */
183 public abstract Point2D.Double getCoordinate ( int x, int y ) ;
184
185 /**
186 * 功能:
187 * 获得角度(不同投影含义不同)
188 * 参数:
189 * lon - 水平坐标
190 * lat - 垂直坐标
191 * 返回值:
192 * 角度值
193 */
194 //Lambert、Stereogram、Polar类需要重载此方法,Linear、Mercator类直接返回0。
195 public double getAngle ( double lon, double lat ) {
196 return ( 0.0 ) ;
197 }
198
199 /**
200 * 功能:
201 * 画经线、纬线
202 * 参数:
203 * g - 图形设备
204 * f - 字体
205 * c - 画线颜色
206 * inc_lon - 经线间隔
207 * inc_lat - 纬线间隔
208 * 返回值:
209 * 无
210 */
211 public abstract void drawGridLine ( Graphics2D g, Font f, Color c, int inc_lon, int inc_lat ) ;
212
213 }
Coordinate.java
001 /*
002
003 坐标投影抽象类,具体方法由其继承类实现
004
005 PACKAGE: cma.common.projection
006 FILENAME: Coordinate.java
007 LANGUAGE: Java2 v1.4
008 ORIGINAL: none
009 DESCRIPTION:
010 CREATE: 2007-07-08 13:22:39
011 UPDATE:
012 AUTHOR: 刘泽军 (BJ0773@gmail.com)
013 广西气象减灾研究所
014 Guangxi Institude of Meteorology and Disaster-reducing Research(GIMDR)
015 已经开发发继承类有: Lambert.java Mercator.java Stereogram.java Polar.java Linear.java
016 */
017
018 package cma.common.projection;
019
020 import java.io.*;
021 import java.awt.*;
022 import java.awt.geom.*;
023 import java.util.*;
024 import java.lang.Math.*;
025
026 public abstract class Coordinate {
027
028 //投影方式
029 public static int LAMBERT = 1 ;
030 public static int MERCATOR = 2 ;
031 public static int BBQ = 3 ;
032 public static int NBQ = 4 ;
033 public static int LINEAR = 5 ;
034 public static int POLAR = 6 ;
035
036 //静态常量,地球半径,来源:《大气科学常用公式》,P601,附录
037 public static double RADIUS = 6371.004 ; //地球平均半径,单位:公里(Km)。
038 public static double RADIUS_POLAR = 6356.755 ; //地球两极半径,单位:公里(Km)。
039 public static double RADIUS_EQUATOR = 6373.140 ; //地球赤道半径,单位:公里(Km)。
040
041 //标准经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0)
042 protected Point2D.Double standard; //兰勃特、极射赤面投影用到
043
044 //中心经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0),用于定位,不一定是中心
045 protected Point2D.Double center;
046
047 //中心经纬度对应的屏幕坐标
048 protected Point place;
049
050 //偏移
051 protected Point offset;
052
053 //缩放比例(非0正值,经向纬向可以不同)
054 protected Point2D.Double scaleXY;
055 //缩放系数
056 protected double scale;
057 protected double scaleOriginal;
058
059 public int type = - 1 ;
060
061 /**
062 * 功能:
063 * 获得标准经纬度
064 * 参数:
065 * 无
066 * 返回值:
067 * 标准经纬度
068 */
069 public Point2D.Double getStandard () {
070 return ( standard ) ;
071 }
072
073 /**
074 * 功能:
075 * 获得中心经纬度
076 * 参数:
077 * 无
078 * 返回值:
079 * 中心经纬度
080 */
081 public Point2D.Double getCenter () {
082 return ( center ) ;
083 }
084
085 /**
086 * 功能:
087 * 获得中心经纬度对应的屏幕坐标
088 * 参数:
089 * 无
090 * 返回值:
091 * 中心经纬度对应的屏幕坐标
092 */
093 public Point getPlace () {
094 return ( place ) ;
095 }
096
097 /**
098 * 功能:
099 * 获得缩放系数
100 * 参数:
101 * 无
102 * 返回值:
103 * 缩放系数
104 */
105 public double getScale () {
106 return ( scale ) ;
107 }
108
109 /**
110 * 功能:
111 * 获得缩放比例
112 * 参数:
113 * 无
114 * 返回值:
115 * 缩放比例
116 */
117 public Point2D.Double getScaleXY () {
118 return ( scaleXY ) ;
119 }
120
121 /**
122 * 功能:
123 * 放大
124 * 参数:
125 * 无
126 * 返回值:
127 * 无
128 */
129 public void zoomIn () {
130 scale = scale * 2.0 ;
131 }
132
133 /**
134 * 功能:
135 * 缩小
136 * 参数:
137 * 无
138 * 返回值:
139 * 无
140 */
141 public void zoomOut () {
142 scale = scale / 2.0 ;
143 }
144
145 /**
146 * 功能:
147 * 复原
148 * 参数:
149 * 无
150 * 返回值:
151 * 无
152 */
153 public void revert () {
154 scale = scaleOriginal;
155 }
156
157 /*
158 //======================================================================
159 // 以下为抽象方法定义,具体实现由继承类来完成。
160 //======================================================================
161 */
162
163 /**
164 * 功能:
165 * 获得屏幕坐标
166 * 参数:
167 * lon - 经度
168 * lat - 纬度
169 * 返回值:
170 * 屏幕坐标
171 */
172 public abstract Point getPosition ( double lon, double lat ) ;
173
174 /**
175 * 功能:
176 * 获得屏幕坐标对应的经纬度
177 * 参数:
178 * x - 屏幕水平坐标
179 * y - 屏幕垂直坐标
180 * 返回值:
181 * 对应的经纬度
182 */
183 public abstract Point2D.Double getCoordinate ( int x, int y ) ;
184
185 /**
186 * 功能:
187 * 获得角度(不同投影含义不同)
188 * 参数:
189 * lon - 水平坐标
190 * lat - 垂直坐标
191 * 返回值:
192 * 角度值
193 */
194 //Lambert、Stereogram、Polar类需要重载此方法,Linear、Mercator类直接返回0。
195 public double getAngle ( double lon, double lat ) {
196 return ( 0.0 ) ;
197 }
198
199 /**
200 * 功能:
201 * 画经线、纬线
202 * 参数:
203 * g - 图形设备
204 * f - 字体
205 * c - 画线颜色
206 * inc_lon - 经线间隔
207 * inc_lat - 纬线间隔
208 * 返回值:
209 * 无
210 */
211 public abstract void drawGridLine ( Graphics2D g, Font f, Color c, int inc_lon, int inc_lat ) ;
212
213 }