Ignore:
Timestamp:
2014-01-06T16:26:41+01:00 (12 years ago)
Author:
malcolmh
Message:

save

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java

    r30184 r30186  
    1919public class Js57toosm {
    2020       
     21        public static int rnum = 0;
     22
    2123        public static void main(String[] args) throws IOException {
    2224
    23                 FileInputStream in = new FileInputStream("/Users/mherring/boatsw/oseam/openseamap/renderer/js57toosm/tst.000");
     25                FileInputStream in = new FileInputStream("/Users/mherring/boatsw/oseam/josm/plugins/smed2/js57toosm/tst.000");
    2426                PrintStream out = System.out;
    2527
     
    3638                double somf = 1;
    3739                long name = 0;
    38                 S57map map = new S57map();;
     40                S57map.Nflag nflag = Nflag.ANON;
     41                S57map map = new S57map();
     42                double minlat = 90, minlon = 180, maxlat = -90, maxlon = -180;
    3943
    4044                while (in.read(leader) == 24) {
     
    5559                                if (!ddr) switch (tag) {
    5660                                case "0001":
    57                                         out.println("Record: " + (long)S57dat.getSubf(record, fields+pos, S57field.I8RI, S57subf.I8RN));
     61                                        int i8rn = (int)(long)S57dat.getSubf(record, fields+pos, S57field.I8RI, S57subf.I8RN);
     62                                        if (i8rn != ++rnum) {
     63                                                out.println("Out of order record ID");
     64                                                in.close();
     65                                                System.exit(-1);
     66                                        }
    5867                                        break;
    5968                                case "DSID":
     
    8291                                        break;
    8392                                case "VRID":
    84                                         name = (long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCNM) << 32;
     93                                        name = (long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCNM);
     94                                        switch ((int)name) {
     95                                        case 110:
     96                                                nflag = Nflag.ISOL;
     97                                                break;
     98                                        case 120:
     99                                                nflag = Nflag.CONN;
     100                                                break;
     101                                        default:
     102                                                nflag = Nflag.ANON;
     103                                                break;
     104                                        }
     105                                        name <<= 32;
    85106                                        name += (long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCID);
    86107                                        name <<= 16;
     108                                        if (nflag == Nflag.ANON) {
     109                                                map.newEdge(name);
     110                                        }
    87111                                        break;
    88112                                case "ATTV":
     
    91115                                        break;
    92116                                case "VRPT":
     117                                        name = (long)S57dat.getSubf(record, fields+pos, S57field.VRPT, S57subf.NAME) << 16;
     118                                        int topi = (int)((long)S57dat.getSubf(S57subf.TOPI));
     119                                        map.addConn(name, topi);
     120                                        name = (long)S57dat.getSubf(S57subf.NAME) << 16;
     121                                        topi = (int)((long)S57dat.getSubf(S57subf.TOPI));
     122                                        map.addConn(name, topi);
    93123                                        break;
    94124                                case "SGCC":
     
    99129                                                double lat = (double) ((long) S57dat.getSubf(S57subf.YCOO)) / comf;
    100130                                                double lon = (double) ((long) S57dat.getSubf(S57subf.XCOO)) / comf;
    101                                                 map.addNode(name++, lat, lon);
     131                                                if (nflag == Nflag.ANON) {
     132                                                        map.newNode(++name, lat, lon, nflag);
     133                                                } else {
     134                                                        map.newNode(name, lat, lon, nflag);
     135                                                }
     136                                                if (lat < minlat) minlat = lat;
     137                                                if (lat > maxlat) maxlat = lat;
     138                                                if (lon < minlon) minlon = lon;
     139                                                if (lon > maxlon) maxlon = lon;
    102140                                        }
    103141                                        break;
     
    108146                                                double lon = (double) ((long) S57dat.getSubf(S57subf.XCOO)) / comf;
    109147                                                double depth = (double) ((long) S57dat.getSubf(S57subf.VE3D)) / somf;
    110                                                 map.addNode(name++, lat, lon, depth);
     148                                                map.newNode(name++, lat, lon, depth);
     149                                                if (lat < minlat) minlat = lat;
     150                                                if (lat > maxlat) maxlat = lat;
     151                                                if (lon < minlon) minlon = lon;
     152                                                if (lon > maxlon) maxlon = lon;
    111153                                        }
    112154                                        break;
     
    114156                        }
    115157                }
    116                 int a = 0; int i = 0; int c = 0; int d = 0;
    117                 for (Snode node : map.nodes.values()) {
    118                         switch (node.flg) {
    119                         case ANON: a++; break;
    120                         case ISOL: i++; break;
    121                         case CONN: c++; break;
    122                         case DPTH: d++; break;
     158                in.close();
     159               
     160                out.println("<?xml version='1.0' encoding='UTF-8'?>");
     161                out.println("<osm version='0.6' generator='js57toosm'>");
     162                out.println("<bounds minlat='" + minlat +"' minlon='" + minlon + "' maxlat='" + maxlat + "' maxlon='" + maxlon + "'/>");
     163               
     164                for (long id : map.nodes.keySet()) {
     165                        Snode node = map.nodes.get(id);
     166                        if (node.flg == S57map.Nflag.DPTH) {
     167                                out.format("  <node id='%d' lat='%f' lon='%f' version='1'>%n", -id, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
     168                                out.format("    <tag k='seamark:type' v='sounding'/>%n");
     169                                out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode)node).val);
     170                                out.format("  </node>%n");
     171                        } else {
     172                                out.format("  <node id='%d' lat='%f' lon='%f' version='1'/>%n",-id,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
    123173                        }
    124174                }
    125                 out.println("Anon " + a);
    126                 out.println("Isol " + i);
    127                 out.println("Conn " + c);
    128                 out.println("Dpth " + d);
    129                 in.close();
     175               
     176                for (long id : map.edges.keySet()) {
     177                        Edge edge = map.edges.get(id);
     178                        out.format("  <way id='%d' version='1'>%n", -id);
     179                        out.format("    <nd ref='%d'/>%n", -edge.first);
     180                        for (long anon : edge.nodes) {
     181                                out.format("    <nd ref='%d'/>%n", -anon);
     182                        }
     183                        out.format("    <nd ref='%d'/>%n", -edge.last);
     184                        out.format("  </way>%n");
     185                }
     186               
     187                out.println("</osm>\n");
    130188        }
    131189
Note: See TracChangeset for help on using the changeset viewer.