Ignore:
Timestamp:
2015-11-05T13:43:10+01:00 (9 years ago)
Author:
malcolmh
Message:

[seachart] updates

File:
1 edited

Legend:

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

    r31722 r31731  
    5454                convs.put(S57subf.LFIL, new S57conv(0,0)); convs.put(S57subf.VOLM, new S57conv(0,0)); convs.put(S57subf.IMPL, new S57conv(3,0));
    5555                convs.put(S57subf.SLAT, new S57conv(0,0)); convs.put(S57subf.WLON, new S57conv(0,0)); convs.put(S57subf.NLAT, new S57conv(0,0));
    56                 convs.put(S57subf.ELON, new S57conv(0,0)); convs.put(S57subf.CRCS, new S57conv(0,0)); convs.put(S57subf.NAM1, new S57conv(12,40));
    57                 convs.put(S57subf.NAM2, new S57conv(12,40)); convs.put(S57subf.OORA, new S57conv(1,1)); convs.put(S57subf.OAAC, new S57conv(6,0));
     56                convs.put(S57subf.ELON, new S57conv(0,0)); convs.put(S57subf.CRCS, new S57conv(0,0)); convs.put(S57subf.NAM1, new S57conv(12,5));
     57                convs.put(S57subf.NAM2, new S57conv(12,5)); convs.put(S57subf.OORA, new S57conv(1,1)); convs.put(S57subf.OAAC, new S57conv(6,0));
    5858                convs.put(S57subf.OACO, new S57conv(5,2)); convs.put(S57subf.OALL, new S57conv(0,0)); convs.put(S57subf.OATY, new S57conv(1,1));
    5959                convs.put(S57subf.DEFN, new S57conv(0,0)); convs.put(S57subf.AUTH, new S57conv(2,2)); convs.put(S57subf.RFTP, new S57conv(2,1));
     
    6565                convs.put(S57subf.FIDN, new S57conv(10,4)); convs.put(S57subf.FIDS, new S57conv(5,2)); convs.put(S57subf.ATTL, new S57conv(5,2));
    6666                convs.put(S57subf.ATVL, new S57conv(0,0)); convs.put(S57subf.FFUI, new S57conv(1,1)); convs.put(S57subf.FFIX, new S57conv(0,2));
    67                 convs.put(S57subf.NFPT, new S57conv(0,2)); convs.put(S57subf.LNAM, new S57conv(17,64)); convs.put(S57subf.RIND, new S57conv(0,1));
     67                convs.put(S57subf.NFPT, new S57conv(0,2)); convs.put(S57subf.LNAM, new S57conv(17,8)); convs.put(S57subf.RIND, new S57conv(0,1));
    6868                convs.put(S57subf.FSUI, new S57conv(1,1)); convs.put(S57subf.FSIX, new S57conv(0,2)); convs.put(S57subf.NSPT, new S57conv(0,2));
    69                 convs.put(S57subf.NAME, new S57conv(12,40)); convs.put(S57subf.ORNT, new S57conv(1,1)); convs.put(S57subf.USAG, new S57conv(1,1));
     69                convs.put(S57subf.NAME, new S57conv(12,5)); convs.put(S57subf.ORNT, new S57conv(1,1)); convs.put(S57subf.USAG, new S57conv(1,1));
    7070                convs.put(S57subf.MASK, new S57conv(1,1)); convs.put(S57subf.VPUI, new S57conv(1,1)); convs.put(S57subf.VPIX, new S57conv(0,2));
    7171                convs.put(S57subf.NVPT, new S57conv(0,2)); convs.put(S57subf.TOPI, new S57conv(1,1)); convs.put(S57subf.CCUI, new S57conv(1,1));
     
    138138                fields.put(S57field.ARCC, S57arcc); fields.put(S57field.AR2D, S57ar2d); fields.put(S57field.EL2D, S57el2d); fields.put(S57field.CT2D, S57ct2d);
    139139        }
    140 
    141         public enum S57record { DS, DP, DH, DA, CD, CR, ID, IO, IS, FE, VS, VI, VC, VE }
    142        
    143         private static ArrayList<S57field> S57ds = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DSID, S57field.DSSI ));
    144         private static ArrayList<S57field> S57dp = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DSPM, S57field.DSPR, S57field.DSRC ));
    145         private static ArrayList<S57field> S57dh = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DSHT ));
    146         private static ArrayList<S57field> S57da = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DSAC ));
    147         private static ArrayList<S57field> S57cd = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.CATD ));
    148         private static ArrayList<S57field> S57cr = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.CATX ));
    149         private static ArrayList<S57field> S57id = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DDDF, S57field.DDDR ));
    150         private static ArrayList<S57field> S57io = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DDDI, null, S57field.DDOM, S57field.DDRF, null ));
    151         private static ArrayList<S57field> S57is = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.DDSI, S57field.DDSC ));
    152         private static ArrayList<S57field> S57fe = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.FRID, S57field.FOID, null, S57field.ATTF, null,
    153                         null, S57field.NATF, null, null, S57field.FFPT, null, null, S57field.FSPT, null ));
    154         private static ArrayList<S57field> S57vs = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.VRID, null, S57field.SG3D, null));
    155         private static ArrayList<S57field> S57vi = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.VRID, S57field.SG2D));
    156         private static ArrayList<S57field> S57vc = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.VRID, S57field.SG2D));
    157         private static ArrayList<S57field> S57ve = new ArrayList<S57field>(Arrays.asList(S57field.I8RI, S57field.VRID, null, S57field.VRPT, null, null, S57field.SG3D, null));
    158        
    159         private static final EnumMap<S57record, ArrayList<S57field>> records = new EnumMap<S57record, ArrayList<S57field>>(S57record.class);
    160         static {
    161                 records.put(S57record.DS, S57ds); records.put(S57record.DP, S57dp); records.put(S57record.DH, S57dh); records.put(S57record.DA, S57da); records.put(S57record.CD, S57cd);
    162                 records.put(S57record.CR, S57cr); records.put(S57record.ID, S57id); records.put(S57record.IO, S57io); records.put(S57record.IS, S57is); records.put(S57record.FE, S57fe);
    163                 records.put(S57record.VS, S57vs); records.put(S57record.VI, S57vi); records.put(S57record.VC, S57vc); records.put(S57record.VE, S57ve);
    164         }
    165        
    166         private static final EnumMap<S57record, Integer> rcnms = new EnumMap<S57record, Integer>(S57record.class);
    167         static {
    168                 rcnms.put(S57record.DS, 10); rcnms.put(S57record.DP, 20); rcnms.put(S57record.DH, 30); rcnms.put(S57record.DA, 40); rcnms.put(S57record.CD, 50);
    169                 rcnms.put(S57record.CR, 60); rcnms.put(S57record.ID, 70); rcnms.put(S57record.IO, 80); rcnms.put(S57record.IS, 90); rcnms.put(S57record.FE, 100);
    170                 rcnms.put(S57record.VS, 110); rcnms.put(S57record.VI, 110); rcnms.put(S57record.VC, 120); rcnms.put(S57record.VE, 130);
    171         }
    172140       
    173141        private static byte[] leader = {'0', '0', '0', '0', '0', ' ', 'D', ' ', ' ', ' ', ' ', ' ', '0', '0', '0', '0', '0', ' ', ' ', ' ', '0', '0', '0', '4'};
     
    293261
    294262        public static byte[] encSubf(S57subf subf, Object val) {
    295                 if (val instanceof S57record) val = rcnms.get(val);
    296263                S57conv conv = convs.get(subf);
    297264                if (conv.bin == 0) {
     
    332299                                lval = (long) val;
    333300                        }
    334                         if (f < 8) {
    335                                 buffer = new byte[f];
    336                                 for (int i = 0; i < f; i++) {
    337                                         buffer[i] = (byte) (lval & 0xff);
    338                                         lval >>= 8;
    339                                 }
    340                         } else {
    341                                 f /= 8;
    342                                 buffer = new byte[f];
    343                                 for (int i = f-1; i >= 0; i--) {
    344                                         buffer[i] = (byte) (lval & 0xff);
    345                                         lval >>= 8;
    346                                 }
     301                        buffer = new byte[f];
     302                        for (int i = 0; i < f; i++) {
     303                                buffer[i] = (byte) (lval & 0xff);
     304                                lval >>= 8;
    347305                        }
    348306                }
     
    361319        }
    362320       
    363         public static byte[] encRecord(Object...params) {
     321        public static class Fparams {
     322                public S57field field;
     323                public Object[] params;
     324                public Fparams(S57field f, Object[] p) {
     325                        field = f;
     326                        params = p;
     327                }
     328        };
     329
     330        public static byte[] encRecord(int i8rn, ArrayList<Fparams> fparams) {
    364331                ArrayList<Index> index = new ArrayList<Index>();
    365                 offset = 0;
    366                 int maxlen = 0;
    367                 ArrayList<S57field> record = records.get(params[1]);
    368                 byte[] buf = new byte[0];
    369                 int ip = 0;
    370                 for (S57field field : record) {
    371                         for (S57subf subf : fields.get(field)) {
    372                                 byte[] next = encSubf(subf, params[ip++]);
    373                                 buf = Arrays.copyOf(buf, (buf.length + next.length));
    374                                 System.arraycopy(next, 0, buf, (buf.length - next.length), next.length);
    375                                 if (ip >= params.length)
    376                                         break;
     332                int offset = 3;
     333                int maxlen = 3;
     334                byte[] buf = encSubf(S57subf.I8RN, i8rn);
     335                buf = Arrays.copyOf(buf, 3);
     336                buf[2] = 0x1e;
     337                index.add(new Index("0001".getBytes(), 3, 0));
     338                for (Fparams sfparams : fparams) {
     339                        for (int ip = 0; ip < sfparams.params.length; ) {
     340                                for (S57subf subf : fields.get(sfparams.field)) {
     341                                        byte[] next = encSubf(subf, sfparams.params[ip++]);
     342                                        buf = Arrays.copyOf(buf, (buf.length + next.length));
     343                                        System.arraycopy(next, 0, buf, (buf.length - next.length), next.length);
     344                                }
    377345                        }
    378346                        buf = Arrays.copyOf(buf, (buf.length + 1));
    379347                        buf[buf.length-1] = 0x1e;
    380348                        int flen = buf.length - offset;
    381                         if (field == S57field.I8RI) {
    382                                 index.add(new Index("0001".getBytes(), flen, offset));
    383                         } else {
    384                                 index.add(new Index(field.toString().getBytes(), flen, offset));
    385                         }
     349                        index.add(new Index(sfparams.field.toString().getBytes(), flen, offset));
    386350                        maxlen = (flen > maxlen) ? flen : maxlen;
    387351                        offset += flen;
Note: See TracChangeset for help on using the changeset viewer.