Ignore:
Timestamp:
2017-09-23T00:31:35+02:00 (7 years ago)
Author:
donvip
Message:

Edigeo: improve support of NF Z 52-000, resolve relation elements

Location:
applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFile.java

    r33653 r33656  
    7272        boolean isValid() {
    7373            return type.length() == 3 && areNotEmpty(identifier);
     74        }
     75
     76        void resolve() {
     77            // To be overriden if relevant
    7478        }
    7579
     
    199203
    200204    abstract boolean isValid();
     205
     206    void resolve() {
     207        // To be overriden if relevant
     208    }
    201209}
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileTHF.java

    r33655 r33656  
    265265                allFiles.add(new EdigeoFileVEC(this, vecId.get(i), dir.resolve(name + vecName.get(i) + ".VEC")).read(ds));
    266266            }
     267            allFiles.forEach(EdigeoFile::resolve);
    267268            for (EdigeoFile f : allFiles) {
    268269                boolean valid = f.isValid();
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java

    r33653 r33656  
    6060            }
    6161        }
     62
     63        @Override
     64        boolean isValid() {
     65            return super.isValid() && areNotNull(scdRef)
     66                    && areSameSize(nAttributes, attributeDefs, attributeValues)
     67                    && areSameSize(nQualities, qualityIndics);
     68        }
    6269    }
    6370
     
    227234
    228235    /**
    229      * Object descriptor block.
     236     * Object descriptor block. 7.5.1.4
    230237     */
    231238    public static class ObjectBlock extends BoundedBlock<McdObjectDef> {
    232         /** REF */ String pointRef = "";
     239        /** REF */ EastNorth refPoint;
    233240
    234241        ObjectBlock(Lot lot, String type) {
     
    239246        void processRecord(EdigeoRecord r) {
    240247            switch (r.name) {
    241             case "REF": safeGet(r, s -> pointRef += s); break;
    242             default:
    243                 super.processRecord(r);
    244             }
    245         }
    246     }
    247 
    248     /**
    249      * Relation descriptor block.
     248            case "REF": refPoint = safeGetEastNorth(r); break;
     249            default:
     250                super.processRecord(r);
     251            }
     252        }
     253    }
     254
     255    /**
     256     * Relation descriptor block. 7.5.1.5
    250257     */
    251258    public static class RelationBlock extends VecBlock<McdRelationDef> {
     
    271278
    272279        /** FTC */ int nElements;
    273         /** FTP */ final List<String> elements = new ArrayList<>();
    274         /** SNS */ final Map<String, Composition> compositions = new HashMap<>();
     280        /** FTP */ final List<List<String>> lElements = new ArrayList<>();
     281        /** SNS */ final Map<List<String>, Composition> mCompositions = new HashMap<>();
     282
     283        // Resolution of elements must be done when all VEC files are read
     284        final List<VecBlock<?>> elements = new ArrayList<>();
     285        final Map<VecBlock<?>, Composition> compositions = new HashMap<>();
    275286
    276287        RelationBlock(Lot lot, String type) {
     
    282293            switch (r.name) {
    283294            case "FTC": nElements = safeGetInt(r); break;
    284             case "FTP": safeGet(r, elements); break;
    285             case "SNS": compositions.put(elements.get(elements.size()-1), Composition.of(safeGetChar(r))); break;
    286             default:
    287                 super.processRecord(r);
    288             }
     295            case "FTP": lElements.add(r.values); break;
     296            case "SNS": mCompositions.put(lElements.get(lElements.size()-1), Composition.of(safeGetChar(r))); break;
     297            default:
     298                super.processRecord(r);
     299            }
     300        }
     301
     302        @Override
     303        boolean isValid() {
     304            return super.isValid() && nElements >= 2 && areSameSize(nElements, elements) && compositions.size() <= nElements;
     305        }
     306
     307        @Override
     308        final void resolve() {
     309            for (List<String> values : lElements) {
     310                VecBlock<?> b = lot.vec.stream().filter(v -> v.subsetId.equals(values.get(1))).findAny()
     311                        .orElseThrow(() -> new IllegalArgumentException(values.toString()))
     312                        .find(values, VecBlock.class);
     313                elements.add(b);
     314                compositions.put(b, mCompositions.get(values));
     315            }
     316            lElements.clear();
     317            mCompositions.clear();
    289318        }
    290319    }
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoLotFile.java

    r33653 r33656  
    2323
    2424    protected final Lot lot;
    25     private final String subsetId;
     25    protected final String subsetId;
    2626
    2727    private final Map<String, Class<? extends B>> classes = new HashMap<>();
     
    5252
    5353    @Override
    54     boolean isValid() {
     54    final boolean isValid() {
    5555        return blocks.values().stream().allMatch(l -> l.stream().allMatch(Block::isValid));
     56    }
     57
     58    @Override
     59    final void resolve() {
     60        blocks.forEach((k, v) -> v.forEach(Block::resolve));
    5661    }
    5762
     
    8489    public final <T extends B> T find(List<String> values, Class<T> klass) {
    8590        assert values.size() == 4 : values;
    86         assert values.get(0).equals(lot.identifier) : values;
    87         assert values.get(1).equals(subsetId) : values;
     91        assert values.get(0).equals(lot.identifier) : values + " / " + lot.identifier;
     92        assert values.get(1).equals(subsetId) : values + " / " + subsetId;
    8893        assert klass.isAssignableFrom(classes.get(values.get(2))) : values;
    8994        List<T> list = blocks.getInstances(klass);
Note: See TracChangeset for help on using the changeset viewer.