首页 / 浏览问题 / 移动GIS / 问题详情
移动端由经纬度投影问题
55EXP 2020年11月12日

您好,想问一个问题,我这边根据某个数据源的 PrjCoordSys 为基础,将得到的 wgs84 经纬度坐标进行投影为xyz的形式,但是forward方法得到的结果一直不对(第三方的软件结果正确),具体代码如下,通过 ConvertGpsToPrj 进行调用

1、形成特定的投影坐标系

public static PrjCoordSys formingPrjCoordSys(JSONObject jsonPro) {
    String geoString = jsonPro.optString( "GPSEllipsoid");
    PrjCoordSys prjCoordSys = new PrjCoordSys();
    GeoCoordSys geoCoordSys = new GeoCoordSys();
    //gps椭球体
    switch (geoString) {
        case "WGS_1984":
            geoCoordSys.setType(GeoCoordSysType.GCS_WGS_1984);
            break;
        case "CHINA_2000":
            geoCoordSys.setType(GeoCoordSysType.GCS_CHINA_2000);
            break;
        case "XiAn_1980":
            geoCoordSys.setType(GeoCoordSysType.GCS_XIAN_1980);
            break;
        case "Beijing_1954":
            geoCoordSys.setType(GeoCoordSysType.GCS_BEIJING_1954);
            break;
        default:
            geoCoordSys.setType(GeoCoordSysType.GCS_WGS_1984);  //默认为wgs_84
            break;
    }
    geoCoordSys.setGeoSpatialRefType(GeoSpatialRefType.SPATIALREF_EARTH_LONGITUDE_LATITUDE);
    prjCoordSys.setGeoCoordSys(geoCoordSys);
    //GPS投影类型设置
    Projection projection = new Projection();
    String proTypeString = jsonPro.optString( "Name");
    switch (proTypeString){
        case "Gauss_Kruger":
            projection.setType(ProjectionType.PRJ_GAUSS_KRUGER);
            break;
        case "UTM":
            projection.setType(ProjectionType.PRJ_TRANSVERSE_MERCATOR);
            break;
        case "平面无参数":
            projection.setType(ProjectionType.PRJ_NONPROJECTION);
            break;
         default:   //默认为高斯克吕格投影
             projection.setType(ProjectionType.PRJ_GAUSS_KRUGER);
             break;
    }
    //设置投影参数
    PrjParameter prjParameter = new PrjParameter();
    prjParameter.setCentralMeridian(Double.valueOf(jsonPro.optString("CentralMeridian")));
    prjParameter.setFalseEasting(Double.valueOf(jsonPro.optString("FalseEasting")));
    prjParameter.setFalseNorthing(Double.valueOf(jsonPro.optString("FalseNorthing")));
    prjParameter.setScaleFactor(0.9996);
    prjParameter.setStandardParallel1(0.);
    prjCoordSys.setPrjParameter(prjParameter);
    prjCoordSys.setProjection(projection);
    return prjCoordSys;
}

2、进行forward调用

public static Point2Ds ConvertGpsToPrj(Context context, Point2Ds point2Ds) {
    if (!new File(path, jason_name).exists()) {
        Toast.makeText(context, "请创建本工程的投影文件", Toast.LENGTH_SHORT).show();
        JsonUtil.creatNewFile(path, jason_name);
        return point2Ds;
    }

    JSONObject jsonObject = JsonUtil.parseJson(path, jason_name);
    JSONObject jsonObjectProjection = null;
    try {
        jsonObjectProjection = jsonObject.getJSONObject( "Projection");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    //首先将gps点转为投影坐标,然后进行两个投影坐标系的转换
    PrjCoordSys gps_prjCoordSys = formingPrjCoordSys(jsonObjectProjection);
    CoordSysTranslator.forward(point2Ds, gps_prjCoordSys);
    Log.e("GPS",point2Ds.getItem(0).getX()+" /投影后的GPS/"+ point2Ds.getItem(0).getY());
    Log.e("GPS",point2Ds.getItem(1).getX()+" /投影后的GPS/"+ point2Ds.getItem(1).getY());
    return point2Ds;
}

1个回答

您好,您那边转换的结果不正确是转换后的位置与第三方软件不一样是吗?请问一下您那边用的第三方软件是啥呢?您那边可以使用

CoordSysTranslator.convert()方法转换看一下结果
9,127EXP 2020年11月12日
1、南方的GPS工具箱,不是位置的问题,是差了几万米。在此工具上,我设置好参数之后,然后直接进行投影,将投影的结果用来计算四参数,最后结果精度较好。

2、我现在使用forward先投影,然后用四参数拟合就会出现各种相差巨大的问题。我后半部分拟合已经确定没问题,就是处在forward投影处。

3、如果我直接使用convert方法,但是前提是我的有转换参数,我现在还得计算四参数,然后才能进行转换。我上面的代码都在,我可以将数据发给您,您方便测试一下吗?我这个用的比较急。
争对这种坐标转换,建议使用CoordSysTranslator.convert()方法,设置好源坐标系和目标坐标系,以及转换参数。这样来转换是没有问题的
您好,按照您上面的意思,那这个转换参数就得自己提前计算对???因为我现在得到的数据点对的形式都是gps与其对应的投影转换之后的数据。

2、forward 方法是精度不够吗?还是我上面的写法有问题? 麻烦您看看,因为需求是这样的。
转换参数都是需要自己计算的,forward方法是将同一理坐标系下的点转为投影坐标系。看你设置的参数肯定是一个地方坐标系,这种坐标系都是有偏移量的。需要通过设置转换参数,转换参数可以在iDesktop软件中计算,需要使用源坐标系和目标坐标系的坐标点来进行转换,可以在桌面帮助文档搜索转换模型参数计算
1、那为什么南方的GPS工具箱转换就没有错误呢?我就只设置了中央经线、椭球体类型、尺度因子,其他都是一样。

2、我们这是工程,但是我确定没有加密,因为此工程不涉密,没有偏移量

3、其实流程就是 --四参数求解。 得到wgs84下的经纬度与其对应的国家2000的xyz坐标,我第一步就是forward将wgs84投影为对应的84的xyz ,目前就是这个forward有问题

4、我们PC端软件也是这个思路,但是其精度就能满足。
因为使用的代码逻辑是不一样的,您那边可以测试一下使用convert方法能不能满足你的需求呢?

1、具体还没试过,这样的话我还需要转换参数

2、我们思路是按照这个博客里卖弄来弄的,小领域内,平面转换就能满足精度的要求了https://blog.csdn.net/qq_42811161/article/details/107809777

如果你不用参数也能满足你的需求,你可以不用参数进行转换,还是可以使用convert方法
1、谢谢您啦,但是我还是觉得forward思路更好

2、我试试convert方法吧,我的精度要求是厘米级,我估计没参数够呛。
...