地图坐标转换WGS84转bj54

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天,您在需要使用的时候【私信】联系我,我会为您补发。