Bj54坐标转成wgs84坐标后再转回来x、y坐标反了
执行结果:
bj54转换前坐标:3239163.76,1.871810619E7
转换一次后Wgs84坐标:107.24379360003594,29.250406926515744
第二次转换后bj54坐标:1.871816747944366E7,3239170.0082822656
下面为代码
执行方法
```java
package com.chinairi.utils;
import org.osgeo.proj4j.ProjCoordinate;
import com.chinairi.gis.utils.iproj.CRSTransform;
public class test {
public static void main(String[] args) throws Exception {
double x = Double.parseDouble("3239163.760");
double y = Double.parseDouble("18718106.190");
ProjCoordinate p = CRSTransform.bj54ToWgs84(y, x);
ProjCoordinate p2 = BLHCoordinateTransform.wgs84ToBj54(p.x, p.y);
System.out.println("bj54转换前坐标:" + x + "," + y);
System.out.println("转换一次后Wgs84坐标:" + p.x + "," + p.y);
System.out.println("第二次转换后bj54坐标:" + p2.x + "," + p2.y);
}
}
实现方法
package com.chinairi.utils;
import java.text.DecimalFormat;
import org.osgeo.proj4j.CRSFactory;
import org.osgeo.proj4j.CoordinateReferenceSystem;
import org.osgeo.proj4j.CoordinateTransform;
import org.osgeo.proj4j.CoordinateTransformFactory;
import org.osgeo.proj4j.ProjCoordinate;
public class BLHCoordinateTransform {
private static final CRSFactory crsFactory = new CRSFactory();
private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();
/**
* 投影转换方法
* @param x 经度 x值
* @param y 纬度 y值
* @returns result 输出结果,类型为ProjCoordinate类,里面包含 x,y 属性
*/
public static ProjCoordinate wgs84ToBj54(double x, double y) {
return projectionConversionMethod(x,y,"WGS84", 0,"WGS84_TO_Beijing1954_GK", 6);
}
/**
* 投影转换方法
* @param x 经度 x值
* @param y 纬度 y值
* @param firstCoordinateSystem 输入数据的坐标系 取值:BJ54_zone;BJ54_zone
* @param firstProjectedBandWidth 输入数据的投影带宽度 取值: 3 , 6 , 0
* @param secondCoordinateSystem 输出数据的坐标系 取值:BJ54_zone;BJ54_zone
* @param secondProjectedBandWidth 输出数据的投影带宽度 取值: 3 , 6 , 0
* @returns result 输出结果,类型为ProjCoordinate类,里面包含 x,y 属性
*/
public static ProjCoordinate projectionConversionMethod(double x, double y,
String firstCoordinateSystem,int firstProjectedBandWidth,
String secondCoordinateSystem,int secondProjectedBandWidth) {
String firstBandNumber = bandNumberCalculation(x, firstProjectedBandWidth);
String secondBandNumber = bandNumberCalculation(x, secondProjectedBandWidth);
String firstEPSGid = confirmEPSGid(firstCoordinateSystem, firstProjectedBandWidth, firstBandNumber);
String secondEPSGid = confirmEPSGid(secondCoordinateSystem, secondProjectedBandWidth, secondBandNumber);
CoordinateTransform trans = ctFactory.createTransform(createCRS(firstEPSGid), createCRS(secondEPSGid));
ProjCoordinate point = new ProjCoordinate(x, y);
ProjCoordinate pout = new ProjCoordinate();
trans.transform(point, pout);
return pout;
// TODO Auto-generated method stub
}
/**
* 确定数据的EPSGid
* @param coordinateValue 传入 用户定义的 数据的坐标系 的值
* @param bandWidth 传入 用户定义的 投影带宽度 的值
* @param bandNumber 传入 带号
*/
private static String confirmEPSGid(String coordinateValue, int bandWidth, String bandNumber) {
String EPSGid = "";
String key = coordinateValue + "_" + bandWidth + "_" + bandNumber;
switch (coordinateValue) {
case "WGS84": //WGS 84-WGS84-1984年世界大地测量系统,用于GPS
EPSGid = MyEpsgDef.WGS84.get("WGS84");
break;
case "Beijing1954_GK_TO_WGS84":
EPSGid = MyEpsgDef.Beijing1954_GK_TO_WGS84.get(key);
break;
case "WGS84_TO_Beijing1954_GK":
EPSGid = MyEpsgDef.WGS84_TO_Beijing1954_GK.get(key);
break;
}
return EPSGid;
}
/**
* 投影带的带号计算:通过用户输入的经纬度及定义的投影带宽度,得到该经纬度下投影带的带号
* @param long 输入 用户输入的经度
* @param projectedBandWidth 输入 用户定义的投影带宽度
* @returns {number} 返回 经纬度下投影带的带号
*/
private static String bandNumberCalculation(double x, int projectedBandWidth) {
String num;
if (x <= 180) {
DecimalFormat df = new DecimalFormat("#");
if (projectedBandWidth == 6) {
num = df.format(Math.floor(x / projectedBandWidth) + 1);
} else if (projectedBandWidth == 3) {
num = df.format(Math.floor((x - 1.5) / projectedBandWidth) + 1);
} else {
num = "0";
}
} else {
num = extractBandNumber(x);
}
return num;
};
/**
* 从投影坐标的 x 值中提取前2位,作为带号
* @param value 传入投影坐标的 x 值
* @returns {number} 将带号返回
*/
private static String extractBandNumber(double x) {
DecimalFormat df = new DecimalFormat("#");
String zone = df.format(x).substring(0, 2);
return zone;
}
private static CoordinateReferenceSystem createCRS(String crsDef){
CoordinateReferenceSystem crs = null;
if ((crsDef.indexOf("+") >= 0) || (crsDef.indexOf("=") >= 0))
crs = crsFactory.createFromParameters("Anon", crsDef);
else {
crs = crsFactory.createFromName(crsDef);
}
return crs;
}
}
Epsg
```java
package com.chinairi.utils;
import java.util.HashMap;
import java.util.Map;
public class MyEpsgDef {
public static final Map<String, String> WGS84_TO_Beijing1954_GK;
public static final Map<String, String> Beijing1954_GK_TO_WGS84;
public static final Map<String, String> WGS84 = new HashMap<String, String>();
static
{
WGS84.put("WGS84", "+proj=longlat +datum=WGS84 +no_defs");
WGS84_TO_Beijing1954_GK = new HashMap<String, String>();
Beijing1954_GK_TO_WGS84 = new HashMap<String, String>();
int zone = 13;
while (zone <= 23) {
WGS84_TO_Beijing1954_GK.put("WGS84_TO_Beijing1954_GK_6_" + Integer.toString(zone), "+proj=tmerc +lat_0=0 +lon_0=" + (
75 + (zone - 13) * 6) + " +k=1 +x_0=" + zone + "500000 " +
"+y_0=0 +ellps=krass +towgs84=-15.8,+154.4,+82.3,0,0,0,0 +units=m +no_defs");
Beijing1954_GK_TO_WGS84.put("Beijing1954_GK_TO_WGS84_6_" + Integer.toString(zone), "+proj=tmerc +lat_0=0 +lon_0=" + (
75 + (zone - 13) * 6) + " +k=1 +x_0=" + zone + "500000 " +
"+y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs");
zone++;
}
zone = 25;
while (zone <= 45) {
WGS84_TO_Beijing1954_GK.put("WGS84_TO_Beijing1954_GK_3_" + Integer.toString(zone), "+proj=tmerc +lat_0=0 +lon_0=" + (
75 + (zone - 25) * 3) + " +k=1 +x_0=" + zone + "500000 " +
"+y_0=0 +ellps=krass +towgs84=-15.8,+154.4,+82.3,0,0,0,0 +units=m +no_defs");
Beijing1954_GK_TO_WGS84.put("Beijing1954_GK_TO_WGS84_3_" + Integer.toString(zone), "+proj=tmerc +lat_0=0 +lon_0=" + (
75 + (zone - 25) * 3) + " +k=1 +x_0=" + zone + "500000 " +
"+y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs");
zone++;
}
}
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。