转换工具和数据库 1、Demo.java
package cn.zengfansheng.mark;
/**
* 坐标转换
* @author hacket
*
*/
public class Demo {
public static void main(String[] args) throws Exception {
ModifyOffset modifyOffset = ModifyOffset.getInstance(Demo.class
.getClassLoader().getResourceAsStream("axisoffset.dat"));
// 111.599,26.21 经度,纬度
double longtitude = 111.59928293; // 经度
double latitude = 26.2100881;// 纬度
PointDouble pt = new PointDouble(longtitude, latitude);
// 转成真实坐标
PointDouble realPoint = modifyOffset.s2c(pt);//
System.out.println(realPoint);
// x=111.60451544453608, y=26.206613768669037
}
} 2、ModifyOffset.java
package cn.zengfansheng.mark; import java.io.InputStream; import java.io.ObjectInputStream; /** * 火星地球坐标转化.地图坐标修偏 * */ public class ModifyOffset { private static ModifyOffset modifyOffset; static double[] X = new double[660 * 450]; static double[] Y = new double[660 * 450]; private ModifyOffset(InputStream inputStream) throws Exception { init(inputStream); } public synchronized static ModifyOffset getInstance(InputStream is) throws Exception { if (modifyOffset == null) { modifyOffset = new ModifyOffset(is); } return modifyOffset; } public void init(InputStream inputStream) throws Exception { ObjectInputStream in = new ObjectInputStream(inputStream); try { int i = 0; while (in.available() > 0) { if ((i & 1) == 1) { Y[(i - 1) >> 1] = in.readInt() / 100000.0d; ; } else { X[i >> 1] = in.readInt() / 100000.0d; ; } i++; } } finally { if (in != null) in.close(); } } // standard -> china /** * 国际标准的坐标→中国的坐标 * @param pt PointDouble点 * @return */ public PointDouble s2c(PointDouble pt) { int cnt = 10; double x = pt.x, y = pt.y; while (cnt-- > 0) { if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d) return pt; int ix = (int) (10.0d * (x - 72.0d)); int iy = (int) (10.0d * (y - 10.0d)); double dx = (x - 72.0d - 0.1d * ix) * 10.0d; double dy = (y - 10.0d - 0.1d * iy) * 10.0d; x = (x + pt.x + (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] + dx * (1.0d - dy) * X[ix + 660 * iy + 1] + dx * dy * X[ix + 660 * iy + 661] + (1.0d - dx) * dy * X[ix + 660 * iy + 660] - x) / 2.0d; y = (y + pt.y + (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] + dx * (1.0d - dy) * Y[ix + 660 * iy + 1] + dx * dy * Y[ix + 660 * iy + 661] + (1.0d - dx) * dy * Y[ix + 660 * iy + 660] - y) / 2.0d; } return new PointDouble(x, y); } // china -> standard /** * 中国坐标点→国家坐标点 * @param pt * @return */ public PointDouble c2s(PointDouble pt) { int cnt = 10; double x = pt.x, y = pt.y; while (cnt-- > 0) { if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d) return pt; int ix = (int) (10.0d * (x - 72.0d)); int iy = (int) (10.0d * (y - 10.0d)); double dx = (x - 72.0d - 0.1d * ix) * 10.0d; double dy = (y - 10.0d - 0.1d * iy) * 10.0d; x = (x + pt.x - (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] - dx * (1.0d - dy) * X[ix + 660 * iy + 1] - dx * dy * X[ix + 660 * iy + 661] - (1.0d - dx) * dy * X[ix + 660 * iy + 660] + x) / 2.0d; y = (y + pt.y - (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] - dx * (1.0d - dy) * Y[ix + 660 * iy + 1] - dx * dy * Y[ix + 660 * iy + 661] - (1.0d - dx) * dy * Y[ix + 660 * iy + 660] + y) / 2.0d; } return new PointDouble(x, y); } } class PointDouble { double x, y; PointDouble(double x, double y) { this.x = x; this.y = y; } public String toString() { return "x=" + x + ", y=" + y; } }
|