Ignore:
Timestamp:
2016-02-27T09:09:45+01:00 (9 years ago)
Author:
malcolmh
Message:

[seachart] update

File:
1 edited

Legend:

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

    r31955 r32082  
    234234        private Feature feature;
    235235        private Edge edge;
    236         private KeyVal<?> osm = S57osm.OSMtag("", "");
     236        private ArrayList<KeyVal<?>> osm;
    237237        private boolean sea;
    238238
     
    375375                feature.geom.elems.add(new Prim(id));
    376376                edge = null;
    377                 osm = S57osm.OSMtag("", "");
     377                osm =  new ArrayList<>();
    378378        }
    379379
     
    385385                feature.geom.elems.add(new Prim(id));
    386386                edge = new Edge();
    387                 osm = S57osm.OSMtag("", "");
     387                osm = new ArrayList<>();
    388388        }
    389389
     
    406406                feature.geom.prim = Pflag.AREA;
    407407                edge = null;
    408                 osm = S57osm.OSMtag("", "");
     408                osm = new ArrayList<>();
    409409        }
    410410
     
    475475                        }
    476476                } else if (!sea) {
    477                         KeyVal<?> kv = S57osm.OSMtag(key, val);
    478                         if (kv.obj != Obj.UNKOBJ) {
    479                                 osm.obj = kv.obj;
    480                                 if (kv.att != Att.UNKATT) {
    481                                         osm = kv;
    482                                 }
    483                         }
     477                        S57osm.OSMtag(osm, key, val);
    484478                }
    485479        }
     
    489483                case POINT:
    490484                        Snode node = nodes.get(id);
    491                         if ((node.flg != Nflag.CONN) && (node.flg != Nflag.DPTH) && (!feature.objs.isEmpty() || (osm.obj != Obj.UNKOBJ))) {
     485                        if ((node.flg != Nflag.CONN) && (node.flg != Nflag.DPTH) && (!feature.objs.isEmpty() || !osm.isEmpty())) {
    492486                                node.flg = Nflag.ISOL;
    493487                        }
     
    507501                }
    508502                if (sortGeom(feature) && !((edge != null) && (edge.last == 0))) {
    509                         if (osm.obj != Obj.UNKOBJ) {
     503                        if (feature.type != Obj.UNKOBJ) {
     504                                index.put(id, feature);
     505                                if (features.get(feature.type) == null) {
     506                                        features.put(feature.type, new ArrayList<Feature>());
     507                                }
     508                                features.get(feature.type).add(feature);
     509                        }
     510                        for (KeyVal<?> kvx : osm) {
     511                                Feature base = new Feature();
     512                                base.reln = Rflag.MASTER;
     513                                base.geom = feature.geom;
     514                                base.type = kvx.obj;
     515                                ObjTab objs = new ObjTab();
     516                                base.objs.put(kvx.obj, objs);
     517                                AttMap atts = new AttMap();
     518                                objs.put(0, atts);
     519                                if (kvx.att != Att.UNKATT) {
     520                                        atts.put(kvx.att, new AttVal<>(kvx.conv, kvx.val));
     521                                }
     522                                index.put(++xref, base);
     523                                if (features.get(kvx.obj) == null) {
     524                                        features.put(kvx.obj, new ArrayList<Feature>());
     525                                }
     526                                features.get(kvx.obj).add(base);
     527                        }
     528/*                      if (!osm.isEmpty()) {
    510529                                if (feature.type == Obj.UNKOBJ) {
    511530                                        feature.type = osm.obj;
     
    541560                                        features.get(osm.obj).add(base);
    542561                                }
    543                         }
    544                         if (feature.type != Obj.UNKOBJ) {
    545                                 index.put(id, feature);
    546                                 if (features.get(feature.type) == null) {
    547                                         features.put(feature.type, new ArrayList<Feature>());
    548                                 }
    549                                 features.get(feature.type).add(feature);
    550                         }
     562                        }*/
    551563                }
    552564        }
     
    575587                                feature.geom.centre = nodes.get(feature.geom.elems.get(0).id);
    576588                                return true;
    577                         } else {
    578                                 int sweep = feature.geom.elems.size();
    579                                 while (!feature.geom.elems.isEmpty()) {
    580                                         Prim prim = feature.geom.elems.remove(0);
    581                                         Edge edge = edges.get(prim.id);
    582                                         if (edge == null) {
    583                                                 return false;
    584                                         }
    585                                         if (next == true) {
    586                                                 next = false;
    587                                                 first = edge.first;
     589                        }
     590                        Geom outer = new Geom(feature.geom.prim);
     591                        Geom inner = new Geom(feature.geom.prim);
     592                        for (Prim prim : feature.geom.elems) {
     593                                if (prim.outer) {
     594                                        outer.elems.add(prim);
     595                                } else {
     596                                        inner.elems.add(prim);
     597                                }
     598                        }
     599                        boolean outin = true;
     600                        int sweep = outer.elems.size();
     601                        if (sweep == 0) {
     602                                return false;
     603                        }
     604                        int prev = sweep;
     605                        int top = 0;
     606                        while (!outer.elems.isEmpty()) {
     607                                Prim prim = outer.elems.remove(0);
     608                                Edge edge = edges.get(prim.id);
     609                                if (edge == null) {
     610                                        return false;
     611                                }
     612                                if (next == true) {
     613                                        next = false;
     614                                        first = edge.first;
     615                                        last = edge.last;
     616                                        prim.forward = true;
     617                                        sort.elems.add(prim);
     618                                        if (prim.outer) {
     619                                                sort.outers++;
     620                                        } else {
     621                                                sort.inners++;
     622                                        }
     623                                        comp = new Comp(cref++, 1);
     624                                        sort.comps.add(comp);
     625                                } else {
     626                                        if (edge.first == last) {
     627                                                sort.elems.add(prim);
    588628                                                last = edge.last;
    589629                                                prim.forward = true;
     630                                                comp.size++;
     631                                        } else if (edge.last == first) {
     632                                                sort.elems.add(top, prim);
     633                                                first = edge.first;
     634                                                prim.forward = true;
     635                                                comp.size++;
     636                                        } else if (edge.last == last) {
    590637                                                sort.elems.add(prim);
    591                                                 if (prim.outer) {
    592                                                         sort.outers++;
    593                                                 } else {
    594                                                         sort.inners++;
     638                                                last = edge.first;
     639                                                prim.forward = false;
     640                                                comp.size++;
     641                                        } else if (edge.first == first) {
     642                                                sort.elems.add(top, prim);
     643                                                first = edge.last;
     644                                                prim.forward = false;
     645                                                comp.size++;
     646                                        } else {
     647                                                outer.elems.add(prim);
     648                                        }
     649                                }
     650                                if (--sweep == 0) {
     651                                        sweep = outer.elems.size();
     652                                        if ((sweep == 0) || (sweep == prev)) {
     653                                                if ((sort.prim == Pflag.AREA) && (first != last)) {
     654                                                        return false;
    595655                                                }
    596                                                 comp = new Comp(cref++, 1);
    597                                                 sort.comps.add(comp);
    598                                         } else {
    599                                                 if (edge.first == last) {
    600                                                         sort.elems.add(prim);
    601                                                         last = edge.last;
    602                                                         prim.forward = true;
    603                                                         comp.size++;
    604                                                 } else if (edge.last == first) {
    605                                                         sort.elems.add(0, prim);
    606                                                         first = edge.first;
    607                                                         prim.forward = true;
    608                                                         comp.size++;
    609                                                 } else if (edge.last == last) {
    610                                                         sort.elems.add(prim);
    611                                                         last = edge.first;
    612                                                         prim.forward = false;
    613                                                         comp.size++;
    614                                                 } else if (edge.first == first) {
    615                                                         sort.elems.add(0, prim);
    616                                                         first = edge.last;
    617                                                         prim.forward = false;
    618                                                         comp.size++;
    619                                                 } else {
    620                                                         feature.geom.elems.add(prim);
     656                                                if (outin) {
     657                                                        if (sweep != 0) {
     658                                                                return false;
     659                                                        }
     660                                                        outer = inner;
     661                                                        outin = false;
     662                                                        sweep = outer.elems.size();
    621663                                                }
    622                                         }
    623                                         if (--sweep == 0) {
    624664                                                next = true;
    625                                                 sweep = feature.geom.elems.size();
    626                                         }
    627                                 }
    628                                 if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {
    629                                         sort.prim = Pflag.AREA;
    630                                 }
    631                                 feature.geom = sort;
    632                         }
     665                                                top = sort.elems.size();
     666                                        }
     667                                        prev = sweep;
     668                                }
     669                        }
     670                        if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {
     671                                sort.prim = Pflag.AREA;
     672                        }
     673                        feature.geom = sort;
    633674                        if (feature.geom.prim == Pflag.AREA) {
    634675                                int ie = 0;
Note: See TracChangeset for help on using the changeset viewer.