Changeset 31731 in osm for applications/editors/josm/plugins/seachart/src/s57/S57dat.java
- Timestamp:
- 2015-11-05T13:43:10+01:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/seachart/src/s57/S57dat.java
r31722 r31731 54 54 convs.put(S57subf.LFIL, new S57conv(0,0)); convs.put(S57subf.VOLM, new S57conv(0,0)); convs.put(S57subf.IMPL, new S57conv(3,0)); 55 55 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)); 58 58 convs.put(S57subf.OACO, new S57conv(5,2)); convs.put(S57subf.OALL, new S57conv(0,0)); convs.put(S57subf.OATY, new S57conv(1,1)); 59 59 convs.put(S57subf.DEFN, new S57conv(0,0)); convs.put(S57subf.AUTH, new S57conv(2,2)); convs.put(S57subf.RFTP, new S57conv(2,1)); … … 65 65 convs.put(S57subf.FIDN, new S57conv(10,4)); convs.put(S57subf.FIDS, new S57conv(5,2)); convs.put(S57subf.ATTL, new S57conv(5,2)); 66 66 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)); 68 68 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)); 70 70 convs.put(S57subf.MASK, new S57conv(1,1)); convs.put(S57subf.VPUI, new S57conv(1,1)); convs.put(S57subf.VPIX, new S57conv(0,2)); 71 71 convs.put(S57subf.NVPT, new S57conv(0,2)); convs.put(S57subf.TOPI, new S57conv(1,1)); convs.put(S57subf.CCUI, new S57conv(1,1)); … … 138 138 fields.put(S57field.ARCC, S57arcc); fields.put(S57field.AR2D, S57ar2d); fields.put(S57field.EL2D, S57el2d); fields.put(S57field.CT2D, S57ct2d); 139 139 } 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 }172 140 173 141 private static byte[] leader = {'0', '0', '0', '0', '0', ' ', 'D', ' ', ' ', ' ', ' ', ' ', '0', '0', '0', '0', '0', ' ', ' ', ' ', '0', '0', '0', '4'}; … … 293 261 294 262 public static byte[] encSubf(S57subf subf, Object val) { 295 if (val instanceof S57record) val = rcnms.get(val);296 263 S57conv conv = convs.get(subf); 297 264 if (conv.bin == 0) { … … 332 299 lval = (long) val; 333 300 } 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; 347 305 } 348 306 } … … 361 319 } 362 320 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) { 364 331 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 } 377 345 } 378 346 buf = Arrays.copyOf(buf, (buf.length + 1)); 379 347 buf[buf.length-1] = 0x1e; 380 348 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)); 386 350 maxlen = (flen > maxlen) ? flen : maxlen; 387 351 offset += flen;
Note:
See TracChangeset
for help on using the changeset viewer.