Ignore:
Timestamp:
2012-09-30T12:33:11+02:00 (12 years ago)
Author:
zverik
Message:

changed number format to %f, removed ref handling, improved sorting

Location:
applications/editors/josm/plugins/poly/src/poly
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/poly/src/poly/PolyExporter.java

    r28573 r28755  
    99import java.util.ArrayList;
    1010import java.util.Comparator;
     11import java.util.LinkedHashMap;
    1112import java.util.List;
    1213import java.util.Locale;
     
    4041            try {
    4142                DataSet ds = ((OsmDataLayer)layer).data;
    42                 Map<Way, Boolean> ways = new TreeMap<Way, Boolean>(new AreaComparator());
     43                Map<Way, Boolean> ways = new TreeMap<Way, Boolean>();
    4344                String polygonName = file.getName();
    4445                if( polygonName.indexOf('.') > 0 )
     
    4647                for( Way w : ds.getWays() ) {
    4748                    if( w.isClosed() ) {
    48                         boolean outer = true;
    49                         for( OsmPrimitive p : w.getReferrers() ) {
    50                             if( p instanceof Relation && ((Relation)p).isMultipolygon() ) {
    51                                 for( RelationMember m : ((Relation)p).getMembers() ) {
    52                                     if( m.refersTo(w) && "inner".equals(m.getRole()) ) {
    53                                         outer = false;
    54                                         break;
    55                                     }
    56                                 }
    57                             }
    58                             if( !outer ) break;
    59                         }
     49                        boolean outer = isOuter(w);
    6050                        ways.put(w, outer);
    6151                        if( w.hasKey("name") )
     
    6353                    }
    6454                }
     55                ways = sortOuterInner(ways);
    6556
    6657                int counter = 1;
     
    7061                    if( !ways.get(w) )
    7162                        writer.write('!');
    72                     writer.write(w.hasKey("ref") ? w.get("ref") : String.valueOf(counter++));
     63                    writer.write(String.valueOf(counter++));
    7364                    writer.newLine();
    7465                    for( Node n : w.getNodes() ) {
    75                         writer.write(String.format(Locale.ENGLISH, "   %E   %E", n.getCoor().lon(), n.getCoor().lat()));
     66                        writer.write(String.format(Locale.ENGLISH, "   %f   %f", n.getCoor().lon(), n.getCoor().lat()));
    7667                        writer.newLine();
    7768                    }
     
    8778    }
    8879
    89     private class AreaComparator implements Comparator<Way> {
    90         @Override
    91         public int compare( Way w1, Way w2 ) {
    92             if( w1.hasKey("ref") && !w2.hasKey("ref") )
    93                 return -1;
    94             else if( !w1.hasKey("ref") && w2.hasKey("ref") )
    95                 return 1;
    96             else if( w1.hasKey("ref") && w2.hasKey("ref") && !w1.get("ref").equals(w2.get("ref")) )
    97                 return w1.get("ref").compareTo(w2.get("ref"));
     80    private boolean isOuter( Way w ) {
     81        for( OsmPrimitive p : w.getReferrers() ) {
     82            if( p instanceof Relation && ((Relation)p).isMultipolygon() ) {
     83                for( RelationMember m : ((Relation)p).getMembers() ) {
     84                    if( m.refersTo(w) && "inner".equals(m.getRole()) ) {
     85                        return false;
     86                    }
     87                }
     88            }
     89        }
     90        return true;
     91    }
     92
     93    private Map<Way, Boolean> sortOuterInner( Map<Way, Boolean> ways ) {
     94        LinkedHashMap<Way, Boolean> result = new LinkedHashMap<Way, Boolean>(ways.size());
     95        List<Way> inner = new ArrayList<Way>();
     96        for( Way w : ways.keySet() ) {
     97            Boolean outer = ways.get(w);
     98            if( outer )
     99                result.put(w, outer);
    98100            else
    99                 return w1.compareTo(w2);
     101                inner.add(w);
    100102        }
     103        for( Way w : inner )
     104            result.put(w, Boolean.FALSE);
     105        return result;
    101106    }
    102107}
  • applications/editors/josm/plugins/poly/src/poly/PolyImporter.java

    r28573 r28755  
    77import java.util.ArrayList;
    88import java.util.List;
     9import javax.swing.JOptionPane;
     10import org.openstreetmap.josm.Main;
    911import org.openstreetmap.josm.data.coor.LatLon;
    1012
     
    7375        Area area = null;
    7476        boolean parsingSection = false;
     77        int fixedCoords = 0;
    7578        while(true) {
    7679            String line;
     
    117120                        throw new IllegalDataException(tr("A polygon coordinate line must contain exactly 2 numbers"));
    118121                    LatLon coord = new LatLon(coords[1], coords[0]);
    119                     if( !coord.isValid() )
    120                         throw new IllegalDataException(tr("Invalid coordinates were found: {0}, {1}", coord.lat(), coord.lon()));
     122                    if( !coord.isValid() ) {
     123                        // fix small deviations
     124                        double lat = coord.lat();
     125                        double lon = coord.lon();
     126                        if( lon < -180.0 && lon> -185.0 ) lon = -180.0;
     127                        if( lon > 180.0 && lon < 185.0 ) lon = 180.0;
     128                        if( lat < -90.0 && lat > -95.0 ) lat = -90.0;
     129                        if( lat > 90.0 && lat < 95.0 ) lat = 90.0;
     130                        fixedCoords++;
     131                        coord = new LatLon(lat, lon);
     132                        if( !coord.isValid() )
     133                            throw new IllegalDataException(tr("Invalid coordinates were found: {0}, {1}", coord.lat(), coord.lon()));
     134                    }
    121135                    area.addNode(coord);
    122136                }
    123137            }
    124138        }
     139        if( fixedCoords > 0 )
     140            JOptionPane.showMessageDialog(Main.parent, tr("{0} points were outside world bounds and were moved", fixedCoords), "Import poly", JOptionPane.WARNING_MESSAGE);
    125141        return areas;
    126142    }
     
    195211            }
    196212            way.addNode(way.getNode(0));
    197             way.put("ref", name);
    198213            if( polygonName != null )
    199214                way.put("name", polygonName);
Note: See TracChangeset for help on using the changeset viewer.