天天看點

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;
    }