Ticket #10132: improve_pbf_plugin.patch

File improve_pbf_plugin.patch, 10.3 KB (added by GerdP, 9 years ago)
  • plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfImporter.java

     
    1111import org.openstreetmap.josm.io.CachedFile;
    1212import org.openstreetmap.josm.io.OsmImporter;
    1313import org.openstreetmap.josm.plugins.pbf.PbfConstants;
    14 import org.xml.sax.SAXException;
    1514
    1615/**
    1716 * @author Don-vip
     
    2827                return PbfReader.parseDataSet(in, progressMonitor);
    2928        }
    3029
    31         protected DataSet parseDataSet(final String source) throws IOException, SAXException, IllegalDataException {
    32         return parseDataSet(new CachedFile(source).getInputStream(), NullProgressMonitor.INSTANCE);
     30        protected DataSet parseDataSet(final String source) throws IOException, IllegalDataException {
     31                try(CachedFile cf = new CachedFile(source)) {
     32                        return parseDataSet(cf.getInputStream(), NullProgressMonitor.INSTANCE);
     33                }
    3334        }
    3435}
  • plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java

     
    3131
    3232import crosby.binary.BinaryParser;
    3333import crosby.binary.Osmformat;
     34import crosby.binary.Osmformat.DenseInfo;
    3435import crosby.binary.Osmformat.DenseNodes;
    3536import crosby.binary.Osmformat.HeaderBBox;
    3637import crosby.binary.Osmformat.HeaderBlock;
     
    4748    protected class PbfParser extends BinaryParser {
    4849
    4950        public IllegalDataException exception = null;
    50        
     51        private boolean discourageUpload;
    5152        private double parseRawDegrees(long raw) {
    5253            return raw * .000000001;
    5354        }
     
    108109
    109110        @Override
    110111        protected void parseDense(DenseNodes nodes) {
     112                if (nodes.hasDenseinfo() == false)
     113                        discourageUpload = true;
    111114            if (exception == null) {
    112115                try {
    113116                    int keyIndex = 0;
     
    121124                    long timestamp = 0;
    122125                    for (int i = 0; i < nodes.getIdCount(); i++) {
    123126                        // Id (delta) and version (normal)
    124                         Node node = new Node(nodeId+=nodes.getId(i), nodes.getDenseinfo().getVersion(i));
     127                        Node node = new Node(nodeId+=nodes.getId(i), nodes.hasDenseinfo() ? nodes.getDenseinfo().getVersion(i): 1);
    125128                        // Lat/Lon (delta)
    126129                        node.setCoor(new LatLon(parseLat(nodeLat+=nodes.getLat(i)), parseLon(nodeLon+=nodes.getLon(i))).getRoundedToOsmPrecision());
    127130                        checkCoordinates(node.getCoor());
    128                         // Changeset (delta)
    129                         checkChangesetId(changesetId+=nodes.getDenseinfo().getChangeset(i));
    130                         node.setChangesetId((int) changesetId);
    131                         // User (delta)
    132                         node.setUser(User.createOsmUser(uid+=nodes.getDenseinfo().getUid(i), getStringById(suid+=nodes.getDenseinfo().getUserSid(i))));
    133                         // Timestamp (delta)
    134                         checkTimestamp(timestamp+=nodes.getDenseinfo().getTimestamp(i));
    135                         node.setTimestamp(new Date(date_granularity * timestamp));
     131                        if (nodes.hasDenseinfo()) {
     132                                // Changeset (delta)
     133                                if (nodes.getDenseinfo().getChangesetCount() > i) {
     134                                        checkChangesetId(changesetId+=nodes.getDenseinfo().getChangeset(i));
     135                                        node.setChangesetId((int) changesetId);
     136                                }
     137                                // User (delta)
     138                                if (nodes.getDenseinfo().getUidCount() > i && nodes.getDenseinfo().getUserSidCount() > i) {
     139                                        node.setUser(User.createOsmUser(uid+=nodes.getDenseinfo().getUid(i), getStringById(suid+=nodes.getDenseinfo().getUserSid(i))));
     140                                }
     141                                // Timestamp (delta)
     142                                if (nodes.getDenseinfo().getTimestampCount() > i) {
     143                                        checkTimestamp(timestamp+=nodes.getDenseinfo().getTimestamp(i));
     144                                        node.setTimestamp(new Date(date_granularity * timestamp));
     145                                }
     146                        }
    136147                        // A single table contains all keys/values of all nodes.
    137148                        // Each node's tags are encoded in alternating <key_id> <value_id>.
    138149                        // A single stringid of 0 delimit when the tags of a node ends and the tags of the next node begin.
     
    163174                try {
    164175                    for (Osmformat.Node n : osmNodes) {
    165176                        final Info info = n.getInfo();
    166                         final Node node = new Node(n.getId(), info.getVersion());
     177                        if (info.hasVersion() == false)
     178                                discourageUpload = true;
     179                        final Node node = new Node(n.getId(), info.hasVersion() ? info.getVersion() : 1);
    167180                        node.setCoor(new LatLon(parseLat(n.getLat()), parseLon(n.getLon())).getRoundedToOsmPrecision());
    168181                        checkCoordinates(node.getCoor());
    169                         checkChangesetId(info.getChangeset());
    170                         node.setChangesetId((int) info.getChangeset());
    171                         node.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    172                         checkTimestamp(info.getTimestamp());
    173                         node.setTimestamp(getDate(info));
     182                        if (info.hasChangeset()) {
     183                                checkChangesetId(info.getChangeset());
     184                                node.setChangesetId((int) info.getChangeset());
     185                        }
     186                        if (info.hasUid() && info.hasUserSid())
     187                                node.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
     188                        if (info.hasTimestamp()) {
     189                                checkTimestamp(info.getTimestamp());
     190                                node.setTimestamp(getDate(info));
     191                        }
    174192                        Map<String, String> keys = new HashMap<>();
    175193                        for (int i=0; i<n.getKeysCount(); i++) {
    176194                            keys.put(getStringById(n.getKeys(i)), getStringById(n.getVals(i)));
     
    190208                try {
    191209                    for (Osmformat.Way w : osmWays) {
    192210                        final Info info = w.getInfo();
    193                         final Way way = new Way(w.getId(), info.getVersion());
    194                         checkChangesetId(info.getChangeset());
    195                         way.setChangesetId((int) info.getChangeset());
    196                         way.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    197                         checkTimestamp(info.getTimestamp());
    198                         way.setTimestamp(getDate(info));
     211                        if (info.hasVersion() == false)
     212                                discourageUpload = true;
     213                        final Way way = new Way(w.getId(), info.hasVersion() ? info.getVersion() : 1);
     214                        if (info.hasChangeset()) {
     215                                checkChangesetId(info.getChangeset());
     216                                way.setChangesetId((int) info.getChangeset());
     217                        }
     218                        if (info.hasUid() && info.hasUserSid()) {
     219                                way.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
     220                        }
     221                        if (info.hasTimestamp()) {
     222                                checkTimestamp(info.getTimestamp());
     223                                way.setTimestamp(getDate(info));
     224                        }
    199225                        Map<String, String> keys = new HashMap<>();
    200226                        for (int i=0; i<w.getKeysCount(); i++) {
    201227                            keys.put(getStringById(w.getKeys(i)), getStringById(w.getVals(i)));
     
    221247                try {
    222248                    for (Osmformat.Relation r : osmRels) {
    223249                        final Info info = r.getInfo();
    224                         final Relation rel = new Relation(r.getId(), info.getVersion());
    225                         checkChangesetId(info.getChangeset());
    226                         rel.setChangesetId((int) info.getChangeset());
    227                         rel.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    228                         checkTimestamp(info.getTimestamp());
    229                         rel.setTimestamp(getDate(info));
     250                        if (info.hasVersion() == false)
     251                                discourageUpload = true;
     252                        final Relation rel = new Relation(r.getId(), info.hasVersion() ? info.getVersion() : 1);
     253                        if (info.hasChangeset()) {
     254                                checkChangesetId(info.getChangeset());
     255                                rel.setChangesetId((int) info.getChangeset());
     256                        }
     257                        if (info.hasUid() && info.hasUserSid()) {
     258                                rel.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
     259                        }
     260                        if (info.hasTimestamp()) {
     261                                checkTimestamp(info.getTimestamp());
     262                                rel.setTimestamp(getDate(info));
     263                        }
    230264                        Map<String, String> keys = new HashMap<>();
    231265                        for (int i=0; i<r.getKeysCount(); i++) {
    232266                            keys.put(getStringById(r.getKeys(i)), getStringById(r.getVals(i)));
     
    258292                    exception = e;
    259293                }
    260294            }
     295            if (discourageUpload)
     296                ds.setUploadDiscouraged(true);
    261297        }
    262298
    263299        @Override
    264300        public void complete() {
     301            if (discourageUpload)
     302                ds.setUploadDiscouraged(true);
    265303        }
    266304    }
    267305