Ignore:
Timestamp:
2015-10-26T16:40:54+01:00 (9 years ago)
Author:
malcolmh
Message:

add josmtos57

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/seachart/src/s57/S57dec.java

    r31660 r31704  
    1818public class S57dec { // S57 ENC file input & map conversion
    1919
    20         public static MapBounds decodeFile(FileInputStream in, S57map map) throws IOException {
     20        public static void decodeChart(FileInputStream in, S57map map) throws IOException {
    2121                S57dat.rnum = 0;
    2222                byte[] leader = new byte[24];
     
    3636                S57map.Pflag pflag = S57map.Pflag.NOSP;
    3737                long objl = 0;
    38                 MapBounds bounds = map.new MapBounds();
    3938               
    4039                while (in.read(leader) == 24) {
     
    5958                                pos = Integer.parseInt(new String(record, idx+mapts+mapfl, mapfp));
    6059                                if (!ddr) {
    61                                         switch (S57dat.enumField(tag)) {
    62                                         case I8RI:
    63                                                 int i8rn = ((Long) S57dat.getSubf(record, fields + pos, S57field.I8RI, S57subf.I8RN)).intValue();
     60                                        switch (tag.toString()) {
     61                                        case "0001":
     62                                                int i8rn = ((Long) S57dat.decSubf(record, fields + pos, S57field.I8RI, S57subf.I8RN)).intValue();
    6463                                                if (i8rn != ++S57dat.rnum) {
    6564                                                        System.err.println("Out of order record ID");
     
    6867                                                }
    6968                                                break;
    70                                         case DSSI:
    71                                                 S57dat.getSubf(record, fields + pos, S57field.DSSI, S57subf.AALL);
    72                                                 S57dat.getSubf(S57subf.NALL);
    73                                                 break;
    74                                         case DSPM:
    75                                                 comf = (double) (Long) S57dat.getSubf(record, fields + pos, S57field.DSPM, S57subf.COMF);
    76                                                 somf = (double) (Long) S57dat.getSubf(S57subf.SOMF);
    77                                                 break;
    78                                         case FRID:
     69                                        case "DSSI":
     70                                                S57dat.decSubf(record, fields + pos, S57field.DSSI, S57subf.AALL);
     71                                                S57dat.decSubf(S57subf.NALL);
     72                                                break;
     73                                        case "DSPM":
     74                                                comf = (double) (Long) S57dat.decSubf(record, fields + pos, S57field.DSPM, S57subf.COMF);
     75                                                somf = (double) (Long) S57dat.decSubf(S57subf.SOMF);
     76                                                break;
     77                                        case "FRID":
    7978                                                inFeature = true;
    80                                                 switch (((Long)S57dat.getSubf(record, fields + pos, S57field.FRID, S57subf.PRIM)).intValue()) {
     79                                                switch (((Long)S57dat.decSubf(record, fields + pos, S57field.FRID, S57subf.PRIM)).intValue()) {
    8180                                                case 1:
    8281                                                        pflag = S57map.Pflag.POINT;
     
    9190                                                        pflag = S57map.Pflag.NOSP;
    9291                                                }
    93                                                 objl = (Long)S57dat.getSubf(S57subf.OBJL);
    94                                                 break;
    95                                         case FOID:
    96                                                 name = (Long) S57dat.getSubf(record, fields + pos, S57field.FOID, S57subf.LNAM);
     92                                                objl = (Long)S57dat.decSubf(S57subf.OBJL);
     93                                                break;
     94                                        case "FOID":
     95                                                name = (Long) S57dat.decSubf(record, fields + pos, S57field.FOID, S57subf.LNAM);
    9796                                                map.newFeature(name, pflag, objl);
    9897                                                break;
    99                                         case ATTF:
     98                                        case "ATTF":
    10099                                                S57dat.setField(record, fields + pos, S57field.ATTF, len);
    101100                                                do {
    102                                                         long attl = (Long) S57dat.getSubf(S57subf.ATTL);
    103                                                         String atvl = ((String) S57dat.getSubf(S57subf.ATVL)).trim();
     101                                                        long attl = (Long) S57dat.decSubf(S57subf.ATTL);
     102                                                        String atvl = ((String) S57dat.decSubf(S57subf.ATVL)).trim();
    104103                                                        if (!atvl.isEmpty()) {
    105104                                                                map.newAtt(attl, atvl);
     
    107106                                                } while (S57dat.more());
    108107                                                break;
    109                                         case FFPT:
     108                                        case "FFPT":
    110109                                                S57dat.setField(record, fields + pos, S57field.FFPT, len);
    111110                                                do {
    112                                                         name = (Long) S57dat.getSubf(S57subf.LNAM);
    113                                                         int rind = ((Long) S57dat.getSubf(S57subf.RIND)).intValue();
    114                                                         S57dat.getSubf(S57subf.COMT);
     111                                                        name = (Long) S57dat.decSubf(S57subf.LNAM);
     112                                                        int rind = ((Long) S57dat.decSubf(S57subf.RIND)).intValue();
     113                                                        S57dat.decSubf(S57subf.COMT);
    115114                                                        map.newObj(name, rind);
    116115                                                } while (S57dat.more());
    117116                                                break;
    118                                         case FSPT:
     117                                        case "FSPT":
    119118                                                S57dat.setField(record, fields + pos, S57field.FSPT, len);
    120119                                                do {
    121                                                         name = (Long) S57dat.getSubf(S57subf.NAME) << 16;
    122                                                         map.newPrim(name, (Long) S57dat.getSubf(S57subf.ORNT), (Long) S57dat.getSubf(S57subf.USAG));
    123                                                         S57dat.getSubf(S57subf.MASK);
    124                                                 } while (S57dat.more());
    125                                                 break;
    126                                         case VRID:
     120                                                        name = (Long) S57dat.decSubf(S57subf.NAME) << 16;
     121                                                        map.newPrim(name, (Long) S57dat.decSubf(S57subf.ORNT), (Long) S57dat.decSubf(S57subf.USAG));
     122                                                        S57dat.decSubf(S57subf.MASK);
     123                                                } while (S57dat.more());
     124                                                break;
     125                                        case "VRID":
    127126                                                inFeature = false;
    128                                                 name = (long) (Long)S57dat.getSubf(record, fields + pos, S57field.VRID, S57subf.RCNM);
     127                                                name = (long) (Long)S57dat.decSubf(record, fields + pos, S57field.VRID, S57subf.RCNM);
    129128                                                switch ((int) name) {
    130129                                                case 110:
     
    139138                                                }
    140139                                                name <<= 32;
    141                                                 name += (Long) S57dat.getSubf(S57subf.RCID);
     140                                                name += (Long) S57dat.decSubf(S57subf.RCID);
    142141                                                name <<= 16;
    143142                                                if (nflag == Nflag.ANON) {
     
    145144                                                }
    146145                                                break;
    147                                         case VRPT:
     146                                        case "VRPT":
    148147                                                S57dat.setField(record, fields + pos, S57field.VRPT, len);
    149148                                                do {
    150                                                         long conn = (Long) S57dat.getSubf(S57subf.NAME) << 16;
    151                                                         int topi = ((Long) S57dat.getSubf(S57subf.TOPI)).intValue();
     149                                                        long conn = (Long) S57dat.decSubf(S57subf.NAME) << 16;
     150                                                        int topi = ((Long) S57dat.decSubf(S57subf.TOPI)).intValue();
    152151                                                        map.addConn(conn, topi);
    153                                                         S57dat.getSubf(S57subf.MASK);
    154                                                 } while (S57dat.more());
    155                                                 break;
    156                                         case SG2D:
     152                                                        S57dat.decSubf(S57subf.MASK);
     153                                                } while (S57dat.more());
     154                                                break;
     155                                        case "SG2D":
    157156                                                S57dat.setField(record, fields + pos, S57field.SG2D, len);
    158157                                                do {
    159                                                         double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
    160                                                         double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
     158                                                        double lat = (double) ((Long) S57dat.decSubf(S57subf.YCOO)) / comf;
     159                                                        double lon = (double) ((Long) S57dat.decSubf(S57subf.XCOO)) / comf;
    161160                                                        if (nflag == Nflag.ANON) {
    162161                                                                map.newNode(++name, lat, lon, nflag);
     
    164163                                                                map.newNode(name, lat, lon, nflag);
    165164                                                        }
    166                                                         if (lat < bounds.minlat)
    167                                                                 bounds.minlat = lat;
    168                                                         if (lat > bounds.maxlat)
    169                                                                 bounds.maxlat = lat;
    170                                                         if (lon < bounds.minlon)
    171                                                                 bounds.minlon = lon;
    172                                                         if (lon > bounds.maxlon)
    173                                                                 bounds.maxlon = lon;
    174                                                 } while (S57dat.more());
    175                                                 break;
    176                                         case SG3D:
     165                                                        lat = Math.toRadians(lat);
     166                                                        lon = Math.toRadians(lon);
     167                                                        if (lat < map.bounds.minlat)
     168                                                                map.bounds.minlat = lat;
     169                                                        if (lat > map.bounds.maxlat)
     170                                                                map.bounds.maxlat = lat;
     171                                                        if (lon < map.bounds.minlon)
     172                                                                map.bounds.minlon = lon;
     173                                                        if (lon > map.bounds.maxlon)
     174                                                                map.bounds.maxlon = lon;
     175                                                } while (S57dat.more());
     176                                                break;
     177                                        case "SG3D":
    177178                                                S57dat.setField(record, fields + pos, S57field.SG3D, len);
    178179                                                do {
    179                                                         double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
    180                                                         double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
    181                                                         double depth = (double) ((Long) S57dat.getSubf(S57subf.VE3D)) / somf;
     180                                                        double lat = (double) ((Long) S57dat.decSubf(S57subf.YCOO)) / comf;
     181                                                        double lon = (double) ((Long) S57dat.decSubf(S57subf.XCOO)) / comf;
     182                                                        double depth = (double) ((Long) S57dat.decSubf(S57subf.VE3D)) / somf;
    182183                                                        map.newNode(name++, lat, lon, depth);
    183                                                         if (lat < bounds.minlat)
    184                                                                 bounds.minlat = lat;
    185                                                         if (lat > bounds.maxlat)
    186                                                                 bounds.maxlat = lat;
    187                                                         if (lon < bounds.minlon)
    188                                                                 bounds.minlon = lon;
    189                                                         if (lon > bounds.maxlon)
    190                                                                 bounds.maxlon = lon;
     184                                                        lat = Math.toRadians(lat);
     185                                                        lon = Math.toRadians(lon);
     186                                                        if (lat < map.bounds.minlat)
     187                                                                map.bounds.minlat = lat;
     188                                                        if (lat > map.bounds.maxlat)
     189                                                                map.bounds.maxlat = lat;
     190                                                        if (lon < map.bounds.minlon)
     191                                                                map.bounds.minlon = lon;
     192                                                        if (lon > map.bounds.maxlon)
     193                                                                map.bounds.maxlon = lon;
    191194                                                } while (S57dat.more());
    192195                                                break;
     
    204207                in.close();
    205208               
    206                 return bounds;
     209                return;
    207210        }
    208211       
Note: See TracChangeset for help on using the changeset viewer.