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

Edigeo: better support of areas

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/EdigeoFileVEC.java

    r33663 r33664  
    1616import java.util.stream.Stream;
    1717
     18import org.openstreetmap.josm.actions.CreateMultipolygonAction;
     19import org.openstreetmap.josm.command.SequenceCommand;
    1820import org.openstreetmap.josm.data.coor.EastNorth;
    1921import org.openstreetmap.josm.data.coor.LatLon;
     
    314316            }
    315317        }
     318
     319        boolean isClosed() {
     320            return nPoints >= 4 && points.get(0).equals(points.get(nPoints - 1));
     321        }
    316322    }
    317323
     
    557563
    558564    private static <T extends OsmPrimitive> T addPrimitiveAndTags(DataSet ds, ObjectBlock obj, T osm) {
    559         for (int i = 0; i < obj.nAttributes; i++) {
    560             osm.put(obj.attributeDefs.get(i).identifier, obj.attributeValues.get(i));
    561         }
    562         if (osm.getDataSet() == null) {
    563             ds.addPrimitive(osm);
     565        if (osm != null) {
     566            for (int i = 0; i < obj.nAttributes; i++) {
     567                osm.put(obj.attributeDefs.get(i).identifier, obj.attributeValues.get(i));
     568            }
     569            if (osm.getDataSet() == null) {
     570                ds.addPrimitive(osm);
     571            }
    564572        }
    565573        return osm;
     
    660668
    661669    private static OsmPrimitive faceToOsmPrimitive(DataSet ds, Projection proj, FaceBlock face) {
    662         List<ArcBlock> leftArcs = extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_LEFT_FACE);
    663         List<ArcBlock> rightArcs = extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_RIGHT_FACE);
    664         assert leftArcs.size() >= 1 || rightArcs.size() >= 1;
    665         if ((leftArcs.size() == 1 && rightArcs.isEmpty()) || (leftArcs.isEmpty() && rightArcs.size() == 1)) {
    666             Way w = new Way();
    667             ArcBlock ab = (leftArcs.isEmpty() ? rightArcs : leftArcs).get(0);
    668             for (EastNorth en : ab.points) {
    669                 w.addNode(getNodeAt(ds, proj, en));
    670             }
    671             return w;
     670        List<ArcBlock> allArcs = new ArrayList<>();
     671        allArcs.addAll(extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_LEFT_FACE));
     672        allArcs.addAll(extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_RIGHT_FACE));
     673        assert allArcs.size() >= 1;
     674        if (allArcs.size() == 1) {
     675            ArcBlock ab = allArcs.get(0);
     676            assert ab.isClosed();
     677            return arcToWay(ds, proj, ab);
    672678        } else {
    673             // TODO
    674             return new Way();
     679            List<Way> ways = allArcs.stream().map(ab -> arcToWay(ds, proj, ab)).filter(w -> w != null).collect(Collectors.toList());
     680            Pair<SequenceCommand, Relation> cmd = CreateMultipolygonAction.createMultipolygonCommand(ways, null);
     681            if (cmd != null) {
     682                cmd.a.executeCommand();
     683                return cmd.b;
     684            } else {
     685                ways.forEach(w -> ds.removePrimitive(w.getPrimitiveId()));
     686                return null;
     687            }
     688        }
     689    }
     690
     691    private static Way arcToWay(DataSet ds, Projection proj, ArcBlock ab) {
     692        Way way = new Way();
     693        for (int i = 0; i < ab.nPoints; i++) {
     694            Node n = getNodeAt(ds, proj, ab.points.get(i));
     695            if (i == 0 || !n.equals(way.lastNode())) {
     696                way.addNode(n);
     697            }
     698        }
     699        if (way.getNodesCount() < 2) {
     700            return null;
     701        }
     702        List<Way> existingWays = ds.searchWays(way.getBBox()).stream().filter(
     703                w -> w.hasEqualSemanticAttributes(way)).collect(Collectors.toList());
     704        if (existingWays.isEmpty()) {
     705            ds.addPrimitive(way);
     706            return way;
     707        } else {
     708            return existingWays.get(0);
    675709        }
    676710    }
  • applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java

    r33663 r33664  
    6060                p.remove(t);
    6161            }
    62             p.put("name", sb.toString().replaceAll("   ", " ").replaceAll("  ", " "));
     62            p.put("name", sb.toString().replaceAll("    ", " ").replaceAll("   ", " ").replaceAll("  ", " "));
    6363        }, "TEX_id");
    6464
Note: See TracChangeset for help on using the changeset viewer.