Ignore:
Timestamp:
2014-02-15T13:01:07+01:00 (11 years ago)
Author:
malcolmh
Message:

save

File:
1 edited

Legend:

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

    r30279 r30282  
    1111
    1212import java.io.*;
    13 import java.util.Iterator;
    14 import java.util.Map;
     13import java.util.*;
    1514
    1615import s57.S57map.Prim;
    1716import s57.S57obj;
     17import s57.S57obj.*;
    1818import s57.S57att;
    19 import s57.S57obj.Obj;
    2019import s57.S57att.*;
    2120import s57.S57val;
     
    5756                long objl = 0;
    5857                double minlat = 90, minlon = 180, maxlat = -90, maxlon = -180;
     58               
     59                HashMap<Long, Boolean> done = new HashMap<Long, Boolean>();
    5960
    6061                while (in.read(leader) == 24) {
     
    113114                                                        long attl = (long) S57dat.getSubf(S57subf.ATTL);
    114115                                                        String atvl = (String) S57dat.getSubf(S57subf.ATVL);
    115                                                         map.newAtt(attl, atvl);
     116                                                        if (!atvl.isEmpty()) {
     117                                                                map.newAtt(attl, atvl);
     118                                                        }
    116119                                                } while (S57dat.more());
    117120                                                break;
     
    225228                                                        Snode node;
    226229                                                        while ((node = map.nodes.get(ref)) != null) {
    227                                                                 out.format("  <node id='%d' lat='%.8f' lon='%.8f' version='1'>%n", -ref, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
    228                                                                 out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
    229                                                                 if ((feature.type == Obj.SOUNDG) && (node.flg == S57map.Nflag.DPTH))
    230                                                                         out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode) node).val);
    231                                                                 writeAtts(feature, type);
    232                                                                 out.format("  </node>%n");
    233                                                                 map.nodes.remove(ref++);
     230                                                                if (!done.containsKey(ref)) {
     231                                                                        out.format("  <node id='%d' lat='%.8f' lon='%.8f' version='1'>%n", -ref, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
     232                                                                        out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
     233                                                                        if ((feature.type == Obj.SOUNDG) && (node.flg == S57map.Nflag.DPTH))
     234                                                                                out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode) node).val);
     235                                                                        writeAtts(feature, type);
     236                                                                        out.format("  </node>%n");
     237                                                                        done.put(ref, true);
     238                                                                }
     239                                                                ref++;
    234240                                                        }
    235241                                                }
     
    252258                                                                        long ref = git.nextRef();
    253259                                                                        Snode node = map.nodes.get(ref);
    254                                                                         if (node != null) {
     260                                                                        if (!done.containsKey(ref)) {
    255261                                                                                out.format("  <node id='%d' lat='%.8f' lon='%.8f' version='1'/>%n", -ref, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
    256                                                                                 map.nodes.remove(ref);
     262                                                                                done.put(ref, true);
    257263                                                                        }
    258264                                                                }
     
    273279                                                        }
    274280                                                        out.format("  </way>%n");
     281                                                        done.put(way, true);
    275282                                                }
    276283                                        } else if (feature.geom.prim == Pflag.AREA) {
     
    283290                                                                        long ref = git.nextRef();
    284291                                                                        Snode node = map.nodes.get(ref);
    285                                                                         if (node != null) {
     292                                                                        if (!done.containsKey(ref)) {
    286293                                                                                out.format("  <node id='%d' lat='%.8f' lon='%.8f' version='1'/>%n", -ref, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
    287                                                                                 map.nodes.remove(ref);
     294                                                                                done.put(ref, true);
    288295                                                                        }
    289296                                                                }
     
    292299                                                git = map.new GeomIterator(feature.geom);
    293300                                                while (git.hasComp()) {
    294                                                         long way = git.nextComp();
    295                                                         out.format("  <way id='%d' version='1'>%n", -way);
    296                                                         while (git.hasEdge()) {
    297                                                                 git.nextEdge();
    298                                                                 while (git.hasNode()) {
    299                                                                         long ref = git.nextRef();
    300                                                                         out.format("    <nd ref='%d'/>%n", -ref);
    301                                                                 }
    302                                                         }
    303                                                         out.format("  </way>%n");
     301                                                        git.nextComp();
     302                                                        while (git.hasEdge()) {
     303                                                                long way = git.nextEdge();
     304                                                                if (!done.containsKey(way)) {
     305                                                                        out.format("  <way id='%d' version='1'>%n", -way);
     306                                                                        while (git.hasNode()) {
     307                                                                                long ref = git.nextRef(true);
     308                                                                                out.format("    <nd ref='%d'/>%n", -ref);
     309                                                                        }
     310                                                                        out.format("  </way>%n");
     311                                                                        done.put(way, true);
     312                                                                }
     313                                                        }
    304314                                                }
    305315                                                out.format("  <relation id='%d' version='1'>%n", -map.ref++);
    306316                                                out.format("    <tag k='type' v='multipolygon'/>%n");
    307                                                 int i = 0;
    308                                                 for (Comp comp : feature.geom.refs) {
    309                                                         if (i++ < feature.geom.outers) {
    310                                                                 out.format("    <member type='way' ref='%d' role='outer'/>%n", -comp.ref);
    311                                                         } else {
    312                                                                 out.format("    <member type='way' ref='%d' role='inner'/>%n", -comp.ref);
     317                                                git = map.new GeomIterator(feature.geom);
     318                                                int outers = feature.geom.refs.get(0).size;
     319if (feature.geom.inners != 0){
     320        int x=0;
     321}
     322                                                while (git.hasComp()) {
     323                                                        git.nextComp();
     324                                                        while (git.hasEdge()) {
     325                                                                long way = git.nextEdge();
     326                                                                if (outers-- > 0) {
     327                                                                        out.format("    <member type='way' ref='%d' role='outer'/>%n", -way);
     328                                                                } else {
     329                                                                        out.format("    <member type='way' ref='%d' role='inner'/>%n", -way);
     330                                                                }
    313331                                                        }
    314332                                                }
Note: See TracChangeset for help on using the changeset viewer.