天天看点

supermap iobjects 组件设置坐标,投影坐标之间的转换

 组件 :supermap iobjects java

功能使用:

1、设置地理坐标

2、投影坐标转投影坐标

3、地理坐标转投影坐标

4、投影坐标转地理坐标

注:注释的根据需要使用

public Result PrjCoordSysTransform(Map<String, Object> parms) {
        String name = MapUtils.getString(parms, "name");
       
        Integer type = MapUtils.getInteger(parms, "type");
        //打开工作空间和数据源(自己封装的)
        Workspace m_workspace = openWorkspaceDatasource();

        Datasource datasource = m_workspace.getDatasources().get(0);
        //获得数据集
        Datasets datasets = datasource.getDatasets();

        DatasetVector dataset_world = (DatasetVector) datasets.get(name);

        //System.out.println("b="+dataset_world.hasPrjCoordSys()+"   engineType="+datasource.getEngineType());

        //投影和投影之间转换  //1-高斯-克吕格投影 ,2- UTM投影 ,3-Lambert(兰伯特投影),4-设置地理坐标
        //方法中都提供了CoordSysTransParameter,和CoordSysTransMethod两个类型的参数,如果原投影和目标投影的地理坐标系不同就需要正确设置这两个参数,否则,无需对两个参数进行设置
        // CoordSysTranslator.convert(dataset_world, commonHandle.getTargetPrjCoordSys(type), commonHandle.getcoordSysTransParameter(), CoordSysTransMethod.MTH_COORDINATE_FRAME);
       
        //dataset_world.setPrjCoordSys(commonHandle.getTargetPrjCoordSys(type));

        // 得到数据集的记录集
         Recordset recordset = dataset_world.getRecordset(false, CursorType.DYNAMIC);

        Point2Ds point2Ds = new Point2Ds();
        for (recordset.moveFirst(); !recordset.isEOF(); recordset.moveNext()) {
                PsPoint psPoint = new PsPoint();
                psPoint.setPsPoint(recordset);
                Point2D point2D= new Point2D();
                point2D.setX(psPoint.getSmx());
                point2D.setY(psPoint.getSmy());
                point2Ds.add(point2D);
        }

        PrjCoordSys ty = new PrjCoordSys();
        //3395 WGS_1984_World_Mercator
        ty.fromEPSGCode(3395);
        boolean forward=false;
        if(type==1){
            // 在同一投影坐标系下,该方法用于将指定的Point2Ds 类的点对象的投影坐标转换到地理坐标。
            forward = CoordSysTranslator.inverse(point2Ds,ty);
            //dataset_world.setPrjCoordSys(ty);
            //       boolean inverse = CoordSysTranslator.inverse(point2Ds,new PrjCoordSys(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE));
        }else if (type==2){
            //在同一地理坐标系下,该方法用于将指定的Point2Ds 类的点对象的地理坐标转换到投影坐标
            forward = CoordSysTranslator.forward(point2Ds, ty);
            // dataset_world.setPrjCoordSys(ty);
            //       boolean forward = CoordSysTranslator.forward(point2Ds, new PrjCoordSys(PrjCoordSysType.PCS_WGS_1984_UTM_10N));
        }
        System.out.println("forward="+forward);
        //覆盖并获取从新创建
        Point2D[] point2DS = point2Ds.toArray();
        // 将记录位置移到第一位
        recordset.moveFirst();
        for (Point2D point :point2DS){
            recordset.edit();
            GeoPoint geoPoint = new GeoPoint(point);
            recordset.setGeometry(geoPoint);
            recordset.update();
            recordset.moveNext();
        }

      //DatasetVector datase = datasets.createAndAppendWithSmid("投影", recordset);




        PrjCoordSys prjCoordSys = dataset_world.getPrjCoordSys();
        GeoCoordSys geoCoordSys = prjCoordSys.getGeoCoordSys();

        System.out.println("投影名称:"+prjCoordSys.getName());
        System.out.println("投影系统坐标单位:"+prjCoordSys.getCoordUnit());
        System.out.println("距离(长度)单位:"+prjCoordSys.getDistanceUnit());
        System.out.println("EPSG代码:"+prjCoordSys.getEPSGCode());
        System.out.println("投影坐标系类型:"+prjCoordSys.getType());

        if(geoCoordSys!=null){
            System.out.println("地理坐标系:"+geoCoordSys.getName());
            System.out.println("地理坐标系的单位:"+geoCoordSys.getCoordUnit());
            System.out.println("空间坐标系类型:"+geoCoordSys.getGeoSpatialRefType());
            System.out.println("地理坐标系类型:"+geoCoordSys.getType());
            System.out.println("大地参照系:"+geoCoordSys.getGeoDatum().getName());
            System.out.println("参考椭球体:"+geoCoordSys.getGeoDatum().getGeoSpheroid().getName());
            System.out.println("椭球长半轴:"+geoCoordSys.getGeoDatum().getGeoSpheroid().getAxis());
            System.out.println("椭球扁率:"+geoCoordSys.getGeoDatum().getGeoSpheroid().getFlatten());
            System.out.println("本初子午线:"+geoCoordSys.getGeoPrimeMeridian().getLongitudeValue());
        }

        Projection projection = prjCoordSys.getProjection();
        if(projection!=null){
            System.out.println("投影方式对象的名称:"+projection.getName());
            System.out.println("投影坐标系统的投影方式的类型:"+projection.getType());
        }


        PrjParameter prjParameter = prjCoordSys.getPrjParameter();
        if(prjParameter!=null){
            System.out.println("中央经线:"+prjParameter.getCentralMeridian());
            System.out.println("原点维度:"+prjParameter.getCentralParallel());
            System.out.println("第一标准纬线:"+prjParameter.getStandardParallel1());
            System.out.println("第二标准纬线:"+prjParameter.getStandardParallel2());
            System.out.println("水平偏移量:"+prjParameter.getFalseEasting());
            System.out.println("垂直偏移量:"+prjParameter.getFalseNorthing());
            System.out.println("比例因子:"+prjParameter.getScaleFactor());
            System.out.println("方位角:"+prjParameter.getAzimuth());
            System.out.println("第一点经线:"+prjParameter.getFirstPointLongitude());
            System.out.println("第二点经线:"+prjParameter.getSecondPointLongitude());
            System.out.println("改良斜正射投影参数中的纠正角,单位为弧度:"+prjParameter.getRectifiedAngle());
        }
        m_workspace.dispose();
        return null;
    }
           
/**
     * 按照不同的投影类型,初始化投影坐标系
     * 1-高斯-克吕格投影 ,2- UTM投影 ,3-Lambert(兰伯特投影),4-WGS_1984地理坐标
     */
    public PrjCoordSys getTargetPrjCoordSys(int type){
        PrjParameter parameter;
        Projection projection;
        PrjCoordSys m_targetPrjCoordSys = null;
        switch(type){
            case 1:
                m_targetPrjCoordSys = new PrjCoordSys(PrjCoordSysType.PCS_USER_DEFINED);
                projection = new Projection(ProjectionType.PRJ_GAUSS_KRUGER);
                m_targetPrjCoordSys.setProjection(projection);
                parameter = new PrjParameter();
                parameter.setCentralMeridian(110);
                parameter.setStandardParallel1(20);
                parameter.setStandardParallel2(40);
                m_targetPrjCoordSys.setPrjParameter(parameter);
                break;

            case 2:
                m_targetPrjCoordSys = new PrjCoordSys(PrjCoordSysType.PCS_USER_DEFINED);
                projection = new Projection(ProjectionType.PRJ_TRANSVERSE_MERCATOR);
                m_targetPrjCoordSys.setProjection(projection);
                parameter = new PrjParameter();
                parameter.setCentralMeridian(110);
                parameter.setStandardParallel1(0);
                m_targetPrjCoordSys.setPrjParameter(parameter);
                break;

            case 3:
                m_targetPrjCoordSys = new PrjCoordSys(PrjCoordSysType.PCS_USER_DEFINED);
                projection = new Projection(ProjectionType.PRJ_LAMBERT_CONFORMAL_CONIC);
                m_targetPrjCoordSys.setProjection(projection);
                parameter = new PrjParameter();
                parameter.setCentralMeridian(110);
                parameter.setStandardParallel1(30);
                m_targetPrjCoordSys.setPrjParameter(parameter);
                break;
            case 4:
//                m_targetPrjCoordSys = new PrjCoordSys(PrjCoordSysType.PCS_EARTH_LONGITUDE_LATITUDE);
                PrjCoordSys dl = new PrjCoordSys();
                dl.fromEPSGCode(4326);//4326为GCS_WGS_1984
                m_targetPrjCoordSys = dl;
//                GeoCoordSys geoCoordSys = new GeoCoordSys();
//                //下面这两个如果不是自定义类型,不可以设置该属性
//                geoCoordSys.setGeoDatum(new GeoDatum(GeoDatumType.DATUM_WGS_1984));// 设置大地参照系对象
//                geoCoordSys.setGeoPrimeMeridian(new GeoPrimeMeridian(GeoPrimeMeridianType.PRIMEMERIDIAN_GREENWICH));//设置中央子午线,格林威治本初子午线,即0°经线。
//                geoCoordSys.setName("WGS_1984");//设置名称
//                geoCoordSys.setCoordUnit(Unit.DEGREE);// 设置地理坐标系的单位
//                geoCoordSys.setGeoSpatialRefType(GeoSpatialRefType.SPATIALREF_EARTH_LONGITUDE_LATITUDE);//设置空间坐标系类型(地理坐标系)
//                geoCoordSys.setType(GeoCoordSysType.GCS_WGS_1984);// 设置地理坐标系类型
                //m_targetPrjCoordSys.setGeoCoordSys(geoCoordSys);//设置地理坐标系
//                m_targetPrjCoordSys.setType( PrjCoordSysType.PCS_SPHERE_MERCATOR);
//                m_targetPrjCoordSys.setCoordUnit( Unit.METER );
            default:
                break;
        }
        return m_targetPrjCoordSys;
    }