Ignore:
Timestamp:
2014-02-09T19:58:46+01:00 (11 years ago)
Author:
malcolmh
Message:

save

File:
1 edited

Legend:

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

    r30231 r30269  
    8080       
    8181        public enum Rflag {
    82                 UNKN, AGGR, MASTER, SLAVE, PEER
     82                UNKN, AGGR, MASTER, SLAVE
    8383        }
    8484       
     
    9292        }
    9393
     94        public class RelTab extends ArrayList<Reln> {
     95                public RelTab() {
     96                        super();
     97                }
     98        }
     99
     100        public class ObjTab extends HashMap<Integer, AttMap> {
     101                public ObjTab() {
     102                        super();
     103                }
     104        }
     105
     106        public class ObjMap extends EnumMap<Obj, ObjTab> {
     107                public ObjMap() {
     108                        super(Obj.class);
     109                }
     110        }
     111
     112        public class Aggr {
     113                public RelTab rels;
     114                public long par;
     115                public Aggr() {
     116                        rels = new RelTab();
     117                        par = 0;
     118                }
     119        }
     120
    94121        public class AttMap extends HashMap<Att, AttVal<?>> {
    95122                public AttMap() {
    96123                        super();
    97                 }
    98         }
    99 
    100         public class RelTab extends ArrayList<Reln> {
    101                 public RelTab() {
    102                         super();
    103                 }
    104         }
    105 
    106         public class ObjTab extends HashMap<Integer, AttMap> {
    107                 public ObjTab() {
    108                         super();
    109                 }
    110         }
    111 
    112         public class ObjMap extends EnumMap<Obj, ObjTab> {
    113                 public ObjMap() {
    114                         super(Obj.class);
    115124                }
    116125        }
     
    177186                public int inners;                                              // Number of inners
    178187                public ArrayList<Comp> refs;    // Ordered list of compounds
     188                public double area;                                             // Area of feature
     189                public double length;                                   // Length of feature
     190                public Snode centre;                                    // Centre of feature
    179191                public Geom(Pflag p) {
    180192                        prim = p;
     
    182194                        outers = inners = 0;
    183195                        refs = new ArrayList<Comp>();
     196                        area = 0;
     197                        length = 0;
     198                        centre = new Snode();
    184199                }
    185200        }
     
    190205                public Obj type;                        // Feature type
    191206                public AttMap atts;             // Feature attributes
    192                 public RelTab rels;             // Related objects
    193                 public ObjMap objs;             // Slave objects
    194                 public double area;             // Area of feature
    195                 public double length;   // Length of feature
    196                 public Snode centre;    // Centre of feature
     207                public Aggr aggr;                       // Related objects
     208                public ObjMap objs;             // Slave object attributes
    197209
    198210                Feature() {
     
    201213                        type = Obj.C_AGGR;
    202214                        atts = new AttMap();
    203                         rels = new RelTab();
     215                        aggr = new Aggr();
    204216                        objs = new ObjMap();
    205                         area = 0;
    206                         length = 0;
    207                         centre = new Snode();
    208217                }
    209218        }
     
    249258                feature.geom = new Geom(p);
    250259                feature.type = obj;
    251                 index.put(id, feature);
     260                if (obj != Obj.UNKOBJ) {
     261                        index.put(id, feature);
     262                }
    252263        }
    253264       
     
    262273                        break;
    263274                case 3:
    264                         r = Rflag.PEER;
     275                        r = Rflag.UNKN;
    265276                        break;
    266277                }
    267                 feature.rels.add(new Reln(id, r));
     278                feature.aggr.rels.add(new Reln(id, r));
    268279        }
    269280       
     
    296307
    297308        public void endFile() {
     309                sortGeom();
    298310                for (long id : index.keySet()) {
    299311                        Feature feature = index.get(id);
    300                         for (Reln rel : feature.rels) {
    301                                 Feature reln = index.get(rel.id);
    302                                 reln.reln = rel.reln;
    303                                 if (feature.reln == Rflag.UNKN) {
    304                                         switch (rel.reln) {
     312                        for (Reln reln : feature.aggr.rels) {
     313                                Feature rel = index.get(reln.id);
     314                                if (cmpGeoms(feature.geom, rel.geom)) {
     315                                        switch (reln.reln) {
    305316                                        case MASTER:
    306317                                                feature.reln = Rflag.AGGR;
     
    308319                                        case SLAVE:
    309320                                                feature.reln = Rflag.MASTER;
    310                                         case PEER:
    311                                                 feature.reln = Rflag.PEER;
    312321                                                break;
    313322                                        default:
     323                                                feature.reln = Rflag.UNKN;
    314324                                                break;
    315325                                        }
    316                                 }
    317                                 ObjTab tab = feature.objs.get(reln.type);
    318                                 if (tab == null) {
    319                                         tab = new ObjTab();
    320                                         feature.objs.put(reln.type, tab);
    321                                 }
    322                                 tab.put(tab.size(), reln.atts);
     326                                        rel.reln = reln.reln;
     327                                } else {
     328                                        reln.reln = Rflag.UNKN;
     329                                }
    323330                        }
    324331                }
     
    328335                                feature.reln = Rflag.MASTER;
    329336                        }
    330                         if ((feature.type != Obj.UNKOBJ) && ((feature.reln == Rflag.MASTER) || (feature.reln == Rflag.PEER))) {
     337                        if ((feature.type != Obj.UNKOBJ) && (feature.reln == Rflag.MASTER)) {
    331338                                if (features.get(feature.type) == null) {
    332339                                        features.put(feature.type, new ArrayList<Feature>());
     
    335342                        }
    336343                }
    337                 sortGeom();
     344                for (long id : index.keySet()) {
     345                        Feature feature = index.get(id);
     346                        for (Reln reln : feature.aggr.rels) {
     347                                Feature rel = index.get(reln.id);
     348                                if (rel.reln == Rflag.SLAVE) {
     349                                        if (feature.objs.get(rel.type) == null) {
     350                                                feature.objs.put(rel.type, new ObjTab());
     351                                        }
     352                                        ObjTab tab = feature.objs.get(rel.type);
     353                                        int ix = tab.size();
     354                                        tab.put(ix, rel.atts);
     355                                }
     356                        }
     357                }
    338358        }
    339359
     
    401421                                        items = new ObjTab();
    402422                                        feature.objs.put(obj, items);
    403                                 }
    404                                 AttMap atts = items.get(idx);
    405                                 if (atts == null) {
    406                                         atts = new AttMap();
    407                                         items.put(idx, atts);
    408                                 }
    409                                 AttVal<?> attval = S57val.convertValue(val, att);
    410                                 if (attval.val != null)
    411                                         atts.put(att, attval);
     423                                        Feature type = new Feature();
     424                                        type.reln = Rflag.SLAVE;
     425                                        type.type = obj;
     426                                        type.geom = feature.geom;
     427                                }
     428//                              AttMap atts = items.get(idx);
     429//                              if (atts == null) {
     430//                                      atts = new AttMap();
     431//                                      items.put(idx, atts);
     432//                              }
     433//                              AttVal<?> attval = S57val.convertValue(val, att);
     434//                              if (attval.val != null)
     435//                                      atts.put(att, attval);
    412436                        } else {
    413437                                if (subkeys[1].equals("type")) {
    414                                         feature.type = S57obj.enumType(val);
     438                                        obj = S57obj.enumType(val);
    415439                                        if (feature.objs.get(feature.type) == null) {
    416440                                                feature.objs.put(feature.type, new ObjTab());
     441                                                Feature type = new Feature();
     442                                                type.reln = Rflag.MASTER;
     443                                                type.type = obj;
     444                                                type.geom = feature.geom;
    417445                                        }
    418446                                } else {
     
    435463                                node.flg = Nflag.ISOL;
    436464                        }
    437                         feature.length = 0;
    438                         feature.area = 0;
     465                        feature.geom.length = 0;
     466                        feature.geom.area = 0;
    439467                        break;
    440468                case LINE:
     
    442470                        nodes.get(edge.first).flg = Nflag.CONN;
    443471                        nodes.get(edge.last).flg = Nflag.CONN;
    444                         feature.length = calcLength(feature.geom);
     472                        feature.geom.length = calcLength(feature.geom);
    445473                        if (edge.first == edge.last) {
    446474                                feature.geom.prim = Pflag.AREA;
    447                                 feature.area = calcArea(feature.geom);
     475                                feature.geom.area = calcArea(feature.geom);
    448476                        } else {
    449                                 feature.area = 0;
     477                                feature.geom.area = 0;
    450478                        }
    451479                        break;
     
    460488                                features.put(feature.type, new ArrayList<Feature>());
    461489                        }
    462                         feature.centre = findCentroid(feature);
    463490                        features.get(feature.type).add(feature);
     491                        feature.geom.centre = findCentroid(feature);
    464492                }
    465493        }
     
    470498                for (long id : index.keySet()) {
    471499                        feature = index.get(id);
    472                         Geom geom = feature.geom;
    473                         Geom sort = new Geom(geom.prim);
     500                        Geom sort = new Geom(feature.geom.prim);
    474501                        long first = 0;
    475502                        long last = 0;
    476503                        Comp comp = null;
    477504                        boolean next = true;
    478                         if ((geom.prim == Pflag.LINE) || (geom.prim == Pflag.AREA)) {
    479                                 int sweep = geom.elems.size();
    480                                 while (!geom.elems.isEmpty()) {
    481                                         Prim prim = geom.elems.remove(0);
     505                        if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) {
     506                                int sweep = feature.geom.elems.size();
     507                                while (!feature.geom.elems.isEmpty()) {
     508                                        Prim prim = feature.geom.elems.remove(0);
    482509                                        Edge edge = edges.get(prim.id);
    483510                                        if (next == true) {
     
    509536                                                                comp.size++;
    510537                                                        } else {
    511                                                                 geom.elems.add(prim);
     538                                                                feature.geom.elems.add(prim);
    512539                                                        }
    513540                                                } else {
     
    521548                                                                comp.size++;
    522549                                                        } else {
    523                                                                 geom.elems.add(prim);
     550                                                                feature.geom.elems.add(prim);
    524551                                                        }
    525552                                                }
     
    527554                                        if (--sweep == 0) {
    528555                                                next = true;
    529                                                 sweep = geom.elems.size();
    530                                         }
     556                                                sweep = feature.geom.elems.size();
     557                                        }
     558                                }
     559                                if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {
     560                                        sort.prim = Pflag.AREA;
    531561                                }
    532562                                feature.geom = sort;
    533563                        }
    534                         if (geom.prim == Pflag.AREA) {
     564                        if (feature.geom.prim == Pflag.AREA) {
    535565                                ArrayList<Prim> outers = new ArrayList<Prim>();
    536566                                ArrayList<Prim> inners = new ArrayList<Prim>();
     
    544574                                ArrayList<Prim> sorting = outers;
    545575                                ArrayList<Prim> closed = null;
    546                                 sort = new Geom(geom.prim);
     576                                sort = new Geom(feature.geom.prim);
    547577                                sort.outers = feature.geom.outers;
    548578                                sort.inners = feature.geom.inners;
     
    596626        }
    597627       
     628        public boolean cmpGeoms (Geom g1, Geom g2) {
     629                return ((g1.prim == g2.prim) && (g1.outers == g2.outers) && (g1.inners == g2.inners) && (g1.elems.size() == g2.elems.size()));
     630        }
     631       
    598632        public class EdgeIterator {
    599633                Edge edge;
     
    653687                int cc, ec;
    654688                Comp comp;
     689                long lastref;
    655690               
    656691                public GeomIterator(Geom g) {
     
    659694                        cc = ec = 0;
    660695                        comp = null;
     696                        lastref = 0;
    661697                        if ((geom.prim != Pflag.NOSP) && (geom.prim != Pflag.POINT)) {
    662698                                it = geom.elems.listIterator();
     
    690726                        }
    691727                        long ref = eit.nextRef();
     728                        if (ref == lastref) {
     729                                ref = eit.nextRef();
     730                        }
     731                        lastref = ref;
    692732                        if (!eit.hasNext()) {
    693733                                eit = null;
Note: See TracChangeset for help on using the changeset viewer.