------------------------------------------------------------------------------------------------
/**
* 火星地球坐标转化.地图坐标修偏
*
*/
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
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
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;
}
}