Ignore:
Timestamp:
2017-09-21T16:58:03+02:00 (7 years ago)
Author:
donvip
Message:

Edigeo: support VEC files

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

Legend:

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

    r33647 r33648  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.plugins.fr.cadastre.edigeo;
    3 
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    53
    64import java.io.BufferedReader;
     
    1513import java.util.function.Consumer;
    1614
     15import org.openstreetmap.josm.data.coor.EastNorth;
    1716import org.openstreetmap.josm.tools.Logging;
    1817
     
    4847        void processRecord(EdigeoRecord r) {
    4948            if ("RID".equals(r.name)) {
    50                 safeGetAndLog(r, s -> identifier += s, tr("Identifier"));
     49                safeGet(r, s -> identifier += s);
    5150            } else if ("NEX".equals(r.name) && lastReadString != null) {
    5251                safeGet(r, lastReadString);
     
    7877        protected final double safeGetDouble(EdigeoRecord r) {
    7978            return r.length > 0 ? Double.parseDouble(r.values.get(0)) : 0;
     79        }
     80
     81        protected final EastNorth safeGetEastNorth(EdigeoRecord r) {
     82            return r.length > 0 ? new EastNorth(Double.parseDouble(r.values.get(0)),
     83                                                Double.parseDouble(r.values.get(1))) : null;
    8084        }
    8185
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java

    r33643 r33648  
    44import java.io.IOException;
    55import java.nio.file.Path;
     6import java.util.ArrayList;
     7import java.util.HashMap;
     8import java.util.List;
     9import java.util.Map;
     10
     11import org.openstreetmap.josm.data.coor.EastNorth;
    612
    713/**
     
    1117
    1218    /**
     19     * Node descriptor block.
     20     */
     21    public static class NodeBlock extends Block {
     22
     23        enum NodeType {
     24            INITIAL_OR_FINAL(1),
     25            ISOLATED(2);
     26
     27            int code;
     28            NodeType(int code) {
     29                this.code = code;
     30            }
     31
     32            public static NodeType of(int code) {
     33                for (NodeType s : values()) {
     34                    if (s.code == code) {
     35                        return s;
     36                    }
     37                }
     38                throw new IllegalArgumentException(Integer.toString(code));
     39            }
     40        }
     41
     42        /** SCP */ String scdRef = "";
     43        /** TYP */ NodeType nodeType;
     44        /** COR */ EastNorth coordinate;
     45        /** ATC */ int nAttributes;
     46        /** QAC */ int nQualities;
     47
     48        NodeBlock(String type) {
     49            super(type);
     50        }
     51
     52        @Override
     53        void processRecord(EdigeoRecord r) {
     54            switch (r.name) {
     55            case "SCP": safeGet(r, s -> scdRef += s); break;
     56            case "TYP": nodeType = NodeType.of(safeGetInt(r)); break;
     57            case "COR": coordinate = safeGetEastNorth(r); break;
     58            case "ATC": nAttributes = safeGetInt(r); break;
     59            case "QAC": nQualities = safeGetInt(r); break;
     60            default:
     61                super.processRecord(r);
     62            }
     63        }
     64    }
     65
     66    /**
     67     * Arc descriptor block.
     68     */
     69    public static class ArcBlock extends Block {
     70        enum ArcType {
     71            LINE(1),
     72            CIRCLE_ARC(2),
     73            CURVE(3);
     74
     75            int code;
     76            ArcType(int code) {
     77                this.code = code;
     78            }
     79
     80            public static ArcType of(int code) {
     81                for (ArcType s : values()) {
     82                    if (s.code == code) {
     83                        return s;
     84                    }
     85                }
     86                throw new IllegalArgumentException(Integer.toString(code));
     87            }
     88        }
     89
     90        /** SCP */ String scdRef = "";
     91        /** CM1 */ EastNorth minCoordinate;
     92        /** CM2 */ EastNorth maxCoordinate;
     93        /** TYP */ ArcType arcType;
     94        /** PTC */ int nPoints;
     95        /** COR */ EastNorth initialPoint;
     96        /** COR */ EastNorth finalPoint;
     97        /** ATC */ int nAttributes;
     98        /** QAC */ int nQualities;
     99
     100        ArcBlock(String type) {
     101            super(type);
     102        }
     103
     104        @Override
     105        void processRecord(EdigeoRecord r) {
     106            switch (r.name) {
     107            case "SCP": safeGet(r, s -> scdRef += s); break;
     108            case "CM1": minCoordinate = safeGetEastNorth(r); break;
     109            case "CM2": maxCoordinate = safeGetEastNorth(r); break;
     110            case "TYP": arcType = ArcType.of(safeGetInt(r)); break;
     111            case "PTC": nPoints = safeGetInt(r); break;
     112            case "COR":
     113                EastNorth en = safeGetEastNorth(r);
     114                if (initialPoint == null) {
     115                    initialPoint = en;
     116                } else if (finalPoint == null) {
     117                    finalPoint = en;
     118                }
     119                break;
     120            case "ATC": nAttributes = safeGetInt(r); break;
     121            case "QAC": nQualities = safeGetInt(r); break;
     122            default:
     123                super.processRecord(r);
     124            }
     125        }
     126    }
     127
     128    /**
     129     * Face descriptor block.
     130     */
     131    public static class FaceBlock extends Block {
     132        /** SCP */ String scdRef = "";
     133        /** CM1 */ EastNorth minCoordinate;
     134        /** CM2 */ EastNorth maxCoordinate;
     135        /** ATC */ int nAttributes;
     136        /** QAC */ int nQualities;
     137
     138        FaceBlock(String type) {
     139            super(type);
     140        }
     141
     142        @Override
     143        void processRecord(EdigeoRecord r) {
     144            switch (r.name) {
     145            case "SCP": safeGet(r, s -> scdRef += s); break;
     146            case "CM1": minCoordinate = safeGetEastNorth(r); break;
     147            case "CM2": maxCoordinate = safeGetEastNorth(r); break;
     148            case "ATC": nAttributes = safeGetInt(r); break;
     149            case "QAC": nQualities = safeGetInt(r); break;
     150            default:
     151                super.processRecord(r);
     152            }
     153        }
     154    }
     155
     156    /**
     157     * Object descriptor block.
     158     */
     159    public static class ObjectBlock extends Block {
     160        /** SCP */ String scdRef = "";
     161        /** CM1 */ EastNorth minCoordinate;
     162        /** CM2 */ EastNorth maxCoordinate;
     163        /** REF */ String pointRef = "";
     164        /** ATC */ int nAttributes;
     165        /** ATP */ final List<String> attributeDefs = new ArrayList<>();
     166        /** TEX */ EdigeoCharset charset;
     167        /** ATV */ final List<String> attributeValues = new ArrayList<>();
     168        /** QAC */ int nQualities;
     169        /** QAP */ final List<String> qualityIndics = new ArrayList<>();
     170
     171        ObjectBlock(String type) {
     172            super(type);
     173        }
     174
     175        @Override
     176        void processRecord(EdigeoRecord r) {
     177            switch (r.name) {
     178            case "SCP": safeGet(r, s -> scdRef += s); break;
     179            case "CM1": minCoordinate = safeGetEastNorth(r); break;
     180            case "CM2": maxCoordinate = safeGetEastNorth(r); break;
     181            case "REF": safeGet(r, s -> pointRef += s); break;
     182            case "ATC": nAttributes = safeGetInt(r); break;
     183            case "ATP": safeGet(r, attributeDefs); break;
     184            case "TEX": safeGet(r, s -> charset = EdigeoCharset.of(s)); break;
     185            case "ATV": safeGet(r, attributeValues); break;
     186            case "QAC": nQualities = safeGetInt(r); break;
     187            case "QAP": safeGet(r, qualityIndics); break;
     188            default:
     189                super.processRecord(r);
     190            }
     191        }
     192    }
     193
     194    /**
     195     * Relation descriptor block.
     196     */
     197    public static class RelationBlock extends Block {
     198
     199        enum Composition {
     200            PLUS("P"),
     201            MINUS("M");
     202
     203            String code;
     204            Composition(String code) {
     205                this.code = code;
     206            }
     207
     208            public static Composition of(String code) {
     209                for (Composition s : values()) {
     210                    if (s.code.equals(code)) {
     211                        return s;
     212                    }
     213                }
     214                throw new IllegalArgumentException(code);
     215            }
     216        }
     217
     218        /** SCP */ String scdRef = "";
     219        /** FTC */ int nElements;
     220        /** FTP */ final List<String> elements = new ArrayList<>();
     221        /** SNS */ final Map<String, Composition> compositions = new HashMap<>();
     222        /** ATC */ int nAttributes;
     223        /** QAC */ int nQualities;
     224
     225        RelationBlock(String type) {
     226            super(type);
     227        }
     228
     229        @Override
     230        void processRecord(EdigeoRecord r) {
     231            switch (r.name) {
     232            case "SCP": safeGet(r, s -> scdRef += s); break;
     233            case "FTC": nElements = safeGetInt(r); break;
     234            case "FTP": safeGet(r, elements); break;
     235            case "SNS": safeGet(r, s -> compositions.put(elements.get(elements.size()-1), Composition.of(s))); break;
     236            case "ATC": nAttributes = safeGetInt(r); break;
     237            case "QAC": nQualities = safeGetInt(r); break;
     238            default:
     239                super.processRecord(r);
     240            }
     241        }
     242    }
     243
     244    /**
    13245     * Constructs a new {@code EdigeoFileVEC}.
    14246     * @param path path to VEC file
     
    21253    @Override
    22254    protected Block createBlock(String type) {
    23         // TODO Auto-generated method stub
    24         return null;
    25     }
    26 
     255        switch (type) {
     256        case "PNO":
     257            return new NodeBlock(type);
     258        case "PAR":
     259            return new ArcBlock(type);
     260        case "PFE":
     261            return new FaceBlock(type);
     262        case "FEA":
     263            return new ObjectBlock(type);
     264        case "LNK":
     265            return new RelationBlock(type);
     266        default:
     267            throw new IllegalArgumentException(type);
     268        }
     269    }
    27270}
Note: See TracChangeset for help on using the changeset viewer.