Changeset 31735 in osm for applications/editors/josm/plugins/seachart/src/s57/S57enc.java
- Timestamp:
- 2015-11-08T09:49:14+01:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/seachart/src/s57/S57enc.java
r31731 r31735 30 30 31 31 private static final byte[] header = { 32 32 33 '0', '1', '5', '7', '6', '3', 'L', 'E', '1', ' ', '0', '9', '0', '0', '2', '0', '1', ' ', '!', ' ', '3', '4', '0', '4', // Leader 33 34 '0', '0', '0', '0', '1', '2', '3', '0', '0', '0', '0', '0', '0', '0', '1', '0', '4', '7', '0', '1', '2', '3', … … 126 127 127 128 public static int encodeChart(S57map map, HashMap<String, String> meta, byte[] buf) throws IndexOutOfBoundsException, UnsupportedEncodingException { 129 130 //M_COVR & MNSYS in BB if not in map 131 if (!map.features.containsKey(Obj.M_COVR)) { 132 S57osm.OSMmeta(map); 133 } 128 134 129 135 byte[] record; … … 132 138 String date = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime()); 133 139 ArrayList<Fparams> ds = new ArrayList<Fparams>(); 134 ds.add(new Fparams(S57field.DSID, new Object[]{ 10, 1, 1, 4, "0S000000.000", 1, 0, date, date, "03.1", 1, "ENC", "", 1, agen, "Generated by OpenSeaMap.org" })); 135 ds.add(new Fparams(S57field.DSSI, new Object[]{ 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 })); 140 ds.add(new Fparams(S57field.DSID, new Object[] { 10, 1, 1, 4, "0S000000.000", 1, 0, date, date, "03.1", 1, "ENC", "", 1, agen, "Generated by OpenSeaMap.org" })); 141 ds.add(new Fparams(S57field.DSSI, new Object[] { 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 })); 136 142 ArrayList<Fparams> dp = new ArrayList<Fparams>(); 137 dp.add(new Fparams(S57field.DSPM, new Object[]{ 20, 2, 2, 23, 23, cscl, 1, 1, 1, 1, 10000000, 10, "" })); 138 143 dp.add(new Fparams(S57field.DSPM, new Object[] { 20, 2, 2, 23, 23, cscl, 1, 1, 1, 1, 10000000, 10, "" })); 144 139 145 isols = conns = metas = geos = edges = 0; 140 146 System.arraycopy(header, 0, buf, 0, header.length); … … 147 153 idx += record.length; 148 154 recs = 3; 149 155 150 156 // Depths 151 157 Object[] depths = new Object[0]; … … 153 159 S57map.Snode node = entry.getValue(); 154 160 if (node.flg == Nflag.DPTH) { 155 Object[] dval = new Object[]{ (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF), (node.val * SOMF) }; 161 Object[] dval = new Object[] { (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF), (node.val * SOMF) }; 156 162 depths = Arrays.copyOf(depths, (depths.length + dval.length)); 157 163 System.arraycopy(dval, 0, depths, (depths.length - dval.length), dval.length); … … 160 166 if (depths.length > 0) { 161 167 fields = new ArrayList<Fparams>(); 162 fields.add(new Fparams(S57field.VRID, new Object[]{ 110, -2, 1, 1 })); 168 fields.add(new Fparams(S57field.VRID, new Object[] { 110, -2, 1, 1 })); 163 169 fields.add(new Fparams(S57field.SG3D, depths)); 164 170 record = S57dat.encRecord(recs++, fields); … … 173 179 if (node.flg == Nflag.ISOL) { 174 180 fields = new ArrayList<Fparams>(); 175 fields.add(new Fparams(S57field.VRID, new Object[]{ 110, hash(entry.getKey()), 1, 1 })); 176 fields.add(new Fparams(S57field.SG2D, new Object[]{ (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF) })); 181 fields.add(new Fparams(S57field.VRID, new Object[] { 110, hash(entry.getKey()), 1, 1 })); 182 fields.add(new Fparams(S57field.SG2D, new Object[] { (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF) })); 177 183 record = S57dat.encRecord(recs++, fields); 178 184 System.arraycopy(record, 0, buf, idx, record.length); … … 181 187 } 182 188 } 183 189 184 190 // Connected nodes 185 191 for (Map.Entry<Long, S57map.Snode> entry : map.nodes.entrySet()) { … … 187 193 if (node.flg == Nflag.CONN) { 188 194 fields = new ArrayList<Fparams>(); 189 fields.add(new Fparams(S57field.VRID, new Object[]{ 120, hash(entry.getKey()), 1, 1 })); 190 fields.add(new Fparams(S57field.SG2D, new Object[]{ (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF) })); 195 fields.add(new Fparams(S57field.VRID, new Object[] { 120, hash(entry.getKey()), 1, 1 })); 196 fields.add(new Fparams(S57field.SG2D, new Object[] { (Math.toDegrees(node.lat) * COMF), (Math.toDegrees(node.lon) * COMF) })); 191 197 record = S57dat.encRecord(recs++, fields); 192 198 System.arraycopy(record, 0, buf, idx, record.length); … … 195 201 } 196 202 } 197 203 198 204 // Edges 199 205 for (Map.Entry<Long, S57map.Edge> entry : map.edges.entrySet()) { 200 206 S57map.Edge edge = entry.getValue(); 201 207 fields = new ArrayList<Fparams>(); 202 fields.add(new Fparams(S57field.VRID, new Object[]{ 130, hash(entry.getKey()), 1, 1 })); 203 fields.add(new Fparams(S57field.VRPT, new Object[]{ (((hash(edge.first) & 0xffffffff) << 8) + 120l), 255, 255, 1, 255, (((hash(edge.last) & 0xffffffff) << 8) + 120l), 255, 255, 2, 255 })); 208 fields.add(new Fparams(S57field.VRID, new Object[] { 130, hash(entry.getKey()), 1, 1 })); 209 fields.add(new Fparams(S57field.VRPT, new Object[] { (((hash(edge.first) & 0xffffffff) << 8) + 120l), 255, 255, 1, 255, (((hash(edge.last) & 0xffffffff) << 8) + 120l), 255, 255, 2, 255 })); 204 210 Object[] nodes = new Object[0]; 205 211 for (long ref : edge.nodes) { 206 Object[] nval = new Object[]{ (Math.toDegrees(map.nodes.get(ref).lat) * COMF), (Math.toDegrees(map.nodes.get(ref).lon) * COMF) }; 212 Object[] nval = new Object[] { (Math.toDegrees(map.nodes.get(ref).lat) * COMF), (Math.toDegrees(map.nodes.get(ref).lon) * COMF) }; 207 213 nodes = Arrays.copyOf(nodes, (nodes.length + nval.length)); 208 214 System.arraycopy(nval, 0, nodes, (nodes.length - nval.length), nval.length); … … 216 222 edges++; 217 223 } 218 224 219 225 // Meta & Geo objects 226 boolean soundings = false; 220 227 for (Entry<Obj, ArrayList<Feature>> entry : map.features.entrySet()) { 221 228 Obj obj = entry.getKey(); 222 229 for (Feature feature : entry.getValue()) { 230 if (obj == Obj.SOUNDG) { 231 if (soundings) { 232 continue; 233 } else { 234 soundings = true; 235 } 236 } 223 237 int prim = feature.geom.prim.ordinal(); 224 238 prim = (prim == 0) ? 255 : prim; 225 239 int grup = ((obj == Obj.DEPARE) || (obj == Obj.DRGARE) || (obj == Obj.FLODOC) || (obj == Obj.HULKES) || (obj == Obj.LNDARE) || (obj == Obj.PONTON) || (obj == Obj.UNSARE)) ? 1 : 2; 226 240 227 241 ArrayList<Fparams> geom = new ArrayList<Fparams>(); 228 int outers = feature.geom. outers;242 int outers = (feature.geom.prim == Pflag.POINT) ? 1 : feature.geom.comps.get(0).size; 229 243 for (Prim elem : feature.geom.elems) { 230 244 if (feature.geom.prim == Pflag.POINT) { 231 geom.add(new Fparams(S57field.FSPT, new Object[] { ((hash(elem.id) << 8) + ((map.nodes.get(elem.id).flg == Nflag.CONN) ? 120l : 110l)), 255, 255, 255 })); 245 if (obj == Obj.SOUNDG) { 246 geom.add(new Fparams(S57field.FSPT, new Object[] { ((-2 << 8) + 110l), 255, 255, 255 })); 247 } else { 248 geom.add(new Fparams(S57field.FSPT, new Object[] { ((hash(elem.id) << 8) + ((map.nodes.get(elem.id).flg == Nflag.CONN) ? 120l : 110l)), 255, 255, 255 })); 249 } 232 250 } else { 233 251 geom.add(new Fparams(S57field.FSPT, new Object[] { ((hash(elem.id) << 8) + 130l), (elem.forward ? 1 : 2), ((outers-- > 0) ? 1 : 2), 2 })); … … 240 258 for (Entry<Obj, ObjTab> objs : feature.objs.entrySet()) { 241 259 Obj objobj = objs.getKey(); 260 boolean master = true; 242 261 for (Entry<Integer, AttMap> object : objs.getValue().entrySet()) { 243 262 ArrayList<Fparams> objatts = new ArrayList<Fparams>(); 244 booleanmaster = (feature.type == objobj) && ((object.getKey() == 0) || (object.getKey() == 1));263 master = (feature.type == objobj) && ((object.getKey() == 0) || (object.getKey() == 1)); 245 264 long id = hash(master ? feature.id : slaveid); 246 265 objatts.add(new Fparams(S57field.FRID, new Object[] { 100, id, prim, grup, S57obj.encodeType(objobj), 1, 1 })); … … 282 301 while (!slaves.isEmpty()) { 283 302 long id = slaves.remove(0); 284 Object[] next = new Object[] { (long)((((id & 0xffffffff) + 0x100000000l) << 16) + (agen & 0xffff)), 2, "" };303 Object[] next = new Object[] { (long) ((((id & 0xffffffff) + 0x100000000l) << 16) + (agen & 0xffff)), 2, "" }; 285 304 params = Arrays.copyOf(params, (params.length + next.length)); 286 305 System.arraycopy(next, 0, params, (params.length - next.length), next.length); … … 289 308 objects.get(objects.size() - 1).addAll(refs); 290 309 } 291 310 292 311 for (ArrayList<Fparams> object : objects) { 293 312 object.addAll(geom); … … 303 322 } 304 323 } 305 324 306 325 // Re-write DSID/DSSI with final totals 307 326 ds = new ArrayList<Fparams>(); 308 ds.add(new Fparams(S57field.DSID, new Object[]{ 10, 1, 1, 4, "0S000000.000", 1, 0, date, date, "03.1", 1, "ENC", "", 1, agen, "Generated by OpenSeaMap.org" })); 309 ds.add(new Fparams(S57field.DSSI, new Object[]{ 2, 1, 2, metas, 0, geos, 0, isols, conns, edges, 0 })); 327 ds.add(new Fparams(S57field.DSID, new Object[] { 10, 1, 1, 4, "0S000000.000", 1, 0, date, date, "03.1", 1, "ENC", "", 1, agen, "Generated by OpenSeaMap.org" })); 328 ds.add(new Fparams(S57field.DSSI, new Object[] { 2, 1, 2, metas, 0, geos, 0, isols, conns, edges, 0 })); 310 329 record = S57dat.encRecord(1, ds); 311 330 System.arraycopy(record, 0, buf, header.length, record.length); 312 313 return idx; 331 332 return idx; 333 } 334 314 335 } 315 316 public static int encodeCatalogue(S57map map, byte[] buf) throws IndexOutOfBoundsException {317 318 return idx;319 }320 321 }
Note:
See TracChangeset
for help on using the changeset viewer.
