Changeset 23915 in osm for applications/editors


Ignore:
Timestamp:
2010-10-30T16:05:06+02:00 (14 years ago)
Author:
oliverw
Message:

Added action to guess street names by picking the closest way to the address node.

Location:
applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/AddressEditContainer.java

    r23894 r23915  
    6363        private List<AddressNode> unresolvedAddresses = new ArrayList<AddressNode>(100);
    6464        private List<AddressNode> incompleteAddresses = new ArrayList<AddressNode>(100);
    65        
     65        private HashMap<String, AddressNode> addressCache = new HashMap<String, AddressNode>();
    6666        private HashSet<Node> visitedNodes = new HashSet<Node>();
    6767        private HashSet<Way> visitedWays = new HashSet<Way>();
     
    126126                        return;
    127127                }
    128                
    129                 AddressNode aNode = NodeFactory.createNode(n);
     128       
     129                String aid = "" + n.getId();
     130                AddressNode aNode = null;
     131                if (!addressCache.containsKey(aid)) {
     132                        aNode = NodeFactory.createNode(n);
     133                        if (aNode != null) {
     134                                addressCache.put(aid, aNode);
     135                        }
     136                } else {
     137                        aNode = addressCache.get(aid);
     138                        aNode.setOsmObject(n);
     139                }
    130140               
    131141                if (aNode != null) {
     
    404414
    405415        @Override
    406         public void entityChanged() {
     416        public void entityChanged(INodeEntity entity) {
    407417                invalidate();           
    408418        }
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/AddressNode.java

    r23894 r23915  
    1515
    1616import org.openstreetmap.josm.data.osm.OsmPrimitive;
     17import org.openstreetmap.josm.plugins.addressEdit.gui.GuessAddressDataAction;
    1718
    1819public class AddressNode extends NodeEntityBase {
    19 
    20         private static final String MISSING_TAG = "?";
     20        public static final String MISSING_TAG = "?";
     21       
     22        private String guessedStreetName;
    2123
    2224        public AddressNode(OsmPrimitive osmObject) {
    2325                super(osmObject);
    2426        }
    25 
     27       
     28        /* (non-Javadoc)
     29         * @see org.openstreetmap.josm.plugins.addressEdit.NodeEntityBase#setOsmObject(org.openstreetmap.josm.data.osm.OsmPrimitive)
     30         */
     31        @Override
     32        public void setOsmObject(OsmPrimitive osmObject) {
     33                super.setOsmObject(osmObject);
     34        }
     35       
    2636        /**
    2737         * Checks if the underlying address node has all tags usually needed to describe an address.
     
    4555        }
    4656       
     57        /**
     58         * Returns <tt>true</tt>, if this address node has a street name.
     59         * @return
     60         */
    4761        public boolean hasStreetName() {
    4862                return TagUtils.hasAddrStreetTag(osmObject);
    4963        }
    5064       
     65        /**
     66         * Returns the street name guessed by the nearest-neighbour search.
     67         * @return the guessedStreetName
     68         */
     69        public String getGuessedStreetName() {
     70                return guessedStreetName;
     71        }
     72
     73        /**
     74         * @param guessedStreetName the guessedStreetName to set
     75         */
     76        public void setGuessedStreetName(String guessedStreetName) {
     77                this.guessedStreetName = guessedStreetName;
     78                fireEntityChanged(this);
     79        }
     80
    5181        /**
    5282         * Gets the name of the post code associated with this address.
     
    142172                        setStreetName(node.getName());                 
    143173                        node.addAddress(this);
    144                         fireEntityChanged();
     174                        fireEntityChanged(this);
     175                }
     176        }
     177       
     178        public void applyGuessedStreet() {
     179                if (!StringUtils.isNullOrEmpty(getGuessedStreetName())) {
     180                        setOSMTag(TagUtils.ADDR_STREET_TAG, guessedStreetName);
    145181                }
    146182        }
     
    195231                // TODO: Add further countries here
    196232                // DE
    197                 return String.format("%s %s, %s-%s %s (%s)",
    198                                 node.getStreet(),
     233                String guessed = node.getGuessedStreetName();
     234                String sName = node.getStreet();
     235                if (!StringUtils.isNullOrEmpty(guessed) && MISSING_TAG.equals(sName)) {
     236                        sName = String.format("(%s)", guessed);
     237                }       
     238               
     239                return String.format("%s %s, %s-%s %s (%s) ",
     240                                sName,
    199241                                node.getHouseNumber(),
    200242                                node.getCountry(),
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/IAddressEditContainerListener.java

    r23834 r23915  
    1414package org.openstreetmap.josm.plugins.addressEdit;
    1515
     16
    1617public interface IAddressEditContainerListener {
    1718        /**
     
    2425         * Notifies clients that an entity has been changed.
    2526         */
    26         public void entityChanged();
     27        public void entityChanged(INodeEntity node);
    2728}
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/NodeEntityBase.java

    r23894 r23915  
    3939       
    4040        /**
     41         * @param osmObject the osmObject to set
     42         */
     43        protected void setOsmObject(OsmPrimitive osmObject) {
     44                this.osmObject = osmObject;
     45        }
     46
     47        /**
    4148         * Adds a change listener.
    4249         * @param listener
     
    5764         * Notifies clients that the address container changed.
    5865         */
    59         protected static void fireEntityChanged() {
     66        protected static void fireEntityChanged(INodeEntity entity) {
    6067                for (IAddressEditContainerListener listener : listeners) {
    61                         listener.entityChanged();
     68                        listener.entityChanged(entity);
    6269                }
    6370        }
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/AbstractAddressEditAction.java

    r23834 r23915  
    1616import java.awt.event.ActionEvent;
    1717
    18 import javax.swing.AbstractAction;
    19 import javax.swing.Icon;
     18import org.openstreetmap.josm.actions.JosmAction;
     19import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
    2020
    21 public abstract class AbstractAddressEditAction extends AbstractAction {
     21public abstract class AbstractAddressEditAction extends JosmAction {
    2222
    2323        /**
     
    2727
    2828        private AddressEditSelectionEvent event;
     29        protected AddressEditContainer container;
    2930
    3031        /**
     
    3233         * @param icon
    3334         */
    34         public AbstractAddressEditAction(String name, Icon icon) {
    35                 super(name, icon);
     35        public AbstractAddressEditAction(String name, String iconName, String tooltip) {
     36                super(name, iconName, tooltip, null, true);
     37               
    3638                setEnabled(false);
    3739        }
     
    4143         */
    4244        public AbstractAddressEditAction(String name) {
    43                 this(name, null);
     45                this(name, null, "");
     46        }
     47       
     48        /**
     49         * @return the container
     50         */
     51        public AddressEditContainer getContainer() {
     52                return container;
    4453        }
    4554
    4655        /**
    47          * Updates 'enabled' state.
     56         * @param container the container to set
     57         */
     58        public void setContainer(AddressEditContainer container) {
     59                this.container = container;
     60                updateEnabledState(container);
     61        }
     62
     63        /**
     64         * Updates 'enabled' state depending on the given selection event.
    4865         * @param ev
    4966         * @return
     
    5168        public void updateEnabledState(AddressEditSelectionEvent ev) {
    5269                // If the tree selection changes, we will get a new event. So this is safe.
    53                 this.event = ev; // save for later use. 
     70                super.updateEnabledState();
     71                this.event = ev; // save for later use.
     72                if (ev != null) {
     73                        updateEnabledState(ev);
     74                }
    5475        }
     76
     77        /**
     78         * Updates 'enabled' state depending on the given address container object.
     79         * @param container The address container (maybe null).
     80         * @return
     81         */
     82        protected abstract void updateEnabledState(AddressEditContainer container);
    5583
    5684        /* (non-Javadoc)
     
    6088        public void actionPerformed(ActionEvent arg0) {
    6189                if (event != null) { // use the event acquired previously.
    62                         addressEditActionPerformed(event);                     
     90                        addressEditActionPerformed(event);     
     91                        event = null; // consume event
     92                } else {
     93                        actionPerformed(arg0);
    6394                }
    6495        }
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/AddressEditDialog.java

    r23880 r23915  
    6969        private JTable streetTable;
    7070       
     71        /* Actions */
    7172        private AssignAddressToStreetAction resolveAction = new AssignAddressToStreetAction();
     73        private GuessAddressDataAction guessAddressAction = new GuessAddressDataAction();
    7274       
    7375        private AbstractAddressEditAction[] actions = new AbstractAddressEditAction[] {
    74                 resolveAction   
     76                resolveAction,
     77                guessAddressAction
    7578        };
    7679        private JLabel streetLabel;
     
    123126                        SideButton assign = new SideButton(resolveAction, "assignstreet_24");                                                                                                                     
    124127                        unresolvedButtons.add(assign);
     128                        SideButton guess = new SideButton(guessAddressAction);                                                                                                                     
     129                        unresolvedButtons.add(guess);
    125130                        unresolvedPanel.add(unresolvedButtons, BorderLayout.SOUTH);
    126131                       
     
    140145                } else {
    141146                        this.getContentPane().add(new JLabel(tr("(No data)")), BorderLayout.CENTER);
     147                }
     148               
     149                for (int i = 0; i < actions.length; i++) {
     150                        actions[i].setContainer(addressEditContainer);
    142151                }
    143152               
     
    226235        public void containerChanged(AddressEditContainer container) {
    227236                updateHeaders();
     237               
     238                for (int i = 0; i < actions.length; i++) {
     239                        actions[i].setContainer(container);
     240                }
    228241        }
    229242
    230243        @Override
    231         public void entityChanged() {
     244        public void entityChanged(INodeEntity entity) {
    232245                updateHeaders();
    233246        }
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/AddressEditTableModel.java

    r23835 r23915  
    1818import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
    1919import org.openstreetmap.josm.plugins.addressEdit.IAddressEditContainerListener;
     20import org.openstreetmap.josm.plugins.addressEdit.INodeEntity;
    2021
    2122public class AddressEditTableModel extends DefaultTableModel implements IAddressEditContainerListener{
     
    3940
    4041        @Override
    41         public void entityChanged() {
     42        public void entityChanged(INodeEntity entity) {
    4243                fireTableDataChanged();
    4344        }
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/AssignAddressToStreetAction.java

    r23876 r23915  
    1616import static org.openstreetmap.josm.tools.I18n.tr;
    1717
     18import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
    1819import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
    1920import org.openstreetmap.josm.plugins.addressEdit.StreetNode;
     
    5152        @Override
    5253        public void updateEnabledState(AddressEditSelectionEvent ev) {
    53                 super.updateEnabledState(ev);
    5454                setEnabled(ev.getSelectedStreet() != null && ev.getSelectedUnresolvedAddresses() != null);
     55        }
     56
     57        @Override
     58        public void updateEnabledState(AddressEditContainer container) {
     59                // we only accept a selection here
     60                setEnabled(false);
    5561        }
    5662
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/IncompleteAddressesTableModel.java

    r23884 r23915  
    1818import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
    1919import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
     20import org.openstreetmap.josm.plugins.addressEdit.StringUtils;
    2021
    2122public class IncompleteAddressesTableModel extends AddressEditTableModel {
     
    7677                        return aNode.getPostCode();
    7778                case 4:
    78                         return aNode.getStreet();
     79                        if (!StringUtils.isNullOrEmpty(aNode.getGuessedStreetName()) &&
     80                                        AddressNode.MISSING_TAG.equals(aNode.getStreet())) {
     81                               
     82                                return "(" + aNode.getGuessedStreetName() + ")";
     83                        } else {
     84                                return aNode.getStreet();
     85                        }
    7986                default:
    8087                        throw new RuntimeException("Invalid column index: " + column);
  • applications/editors/josm/plugins/AddressEdit/src/org/openstreetmap/josm/plugins/addressEdit/gui/UnresolvedAddressesTableModel.java

    r23894 r23915  
    3333import org.openstreetmap.josm.plugins.addressEdit.AddressEditContainer;
    3434import org.openstreetmap.josm.plugins.addressEdit.AddressNode;
     35import org.openstreetmap.josm.plugins.addressEdit.StringUtils;
    3536
    3637/**
     
    9293                switch (column) {
    9394                case 0:
    94                         return aNode.getStreet();
     95                        String guessed = aNode.getGuessedStreetName();
     96                        String cur = aNode.getStreet();
     97                        if (!StringUtils.isNullOrEmpty(guessed) &&
     98                                        AddressNode.MISSING_TAG.equals(cur)) {
     99                               
     100                                return "*" + guessed;
     101                        } else {
     102                                return aNode.getStreet();
     103                        }
    95104                case 1:
    96105                        return aNode.getHouseNumber();
     
    100109                        return aNode.getPostCode();
    101110                case 4:
    102                         return aNode.getName();
     111                        return aNode.getName();                 
    103112                default:
    104113                        throw new RuntimeException("Invalid column index: " + column);
Note: See TracChangeset for help on using the changeset viewer.