Ignore:
Timestamp:
2008-02-19T01:24:25+01:00 (17 years ago)
Author:
jrreid
Message:

Updated lakewalker to remove some debugging calls, add a duplicate node reducer, rename some methods and fixes to reduce wms requests when checking pixels right on the bbox edge

Location:
applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Lakewalker.java

    r6914 r6923  
    119119                        }
    120120                       
    121                         v = wms.getPixel(xy[0], xy[1],0xFF00FF00);
    122                         if(v < 0){
    123                                 return null;
    124                         }
    125                        
     121                        v = wms.getPixel(xy[0], xy[1]);
    126122                        if(v > this.threshold){
    127123                                break;
     
    169165                               
    170166                                if(!bbox.contains(geo[0], geo[1])){
    171                                         /**
    172                                          * TODO: Handle this case
    173                                          */
    174167                                        System.out.println("Outside bbox");
    175168                                        break;
    176169                                }
    177170                               
    178                                 v = wms.getPixel(test_x, test_y,0xFF0000FF);
     171                                v = wms.getPixel(test_x, test_y);
    179172                                if(v > this.threshold){
    180173                                        break;
     
    218211                        }                       
    219212                }
    220                        
    221                 // DEBUG
    222                 File f = new File(this.workingdir,"temp.png");
    223                 wms.saveimage(f,wms.image2);   
    224                
     213
    225214                return nodelist;
    226215        }
    227216       
    228         public ArrayList<double[]> vertex_reduce(ArrayList<double[]> nodes, double proximity){
     217        /**
     218         * Remove duplicate nodes from the list
     219         *
     220         * @param nodes
     221         * @return
     222         */
     223        public ArrayList<double[]> duplicateNodeRemove(ArrayList<double[]> nodes){
     224               
     225                double lastnode[] = new double[] {nodes.get(0)[0], nodes.get(0)[1]};
     226               
     227                for(int i = 1; i < nodes.size(); i++){
     228                        double[] thisnode = new double[] {nodes.get(i)[0], nodes.get(i)[1]};
     229                       
     230                        if(thisnode[0] == lastnode[0] && thisnode[1] == lastnode[1]){
     231                                // Remove the node
     232                                nodes.remove(i);
     233                               
     234                                // Shift back one index
     235                                i = i - 1;
     236                        }
     237                        lastnode = thisnode;
     238                }
     239               
     240                return nodes;
     241        }
     242       
     243        /**
     244         * Reduce the number of vertices based on their proximity to each other
     245         *
     246         * @param nodes
     247         * @param proximity
     248         * @return
     249         */
     250        public ArrayList<double[]> vertexReduce(ArrayList<double[]> nodes, double proximity){
     251               
     252                // Check if node list is empty
     253                if(nodes.size()==0){
     254                        return nodes;
     255                }
     256               
    229257                double[] test_v = nodes.get(0);
    230258                ArrayList<double[]> reducednodes = new ArrayList<double[]>();
     
    242270        }
    243271       
    244         public double point_line_distance(double[] p1, double[] p2, double[] p3){
     272        public double pointLineDistance(double[] p1, double[] p2, double[] p3){
    245273               
    246274                double x0 = p1[0];
     
    258286        }
    259287       
    260         public ArrayList<double[]> douglas_peucker(ArrayList<double[]> nodes, double epsilon){
     288        public ArrayList<double[]> douglasPeucker(ArrayList<double[]> nodes, double epsilon){
     289               
     290                // Check if node list is empty
     291                if(nodes.size()==0){
     292                        return nodes;
     293                }
     294               
    261295                int farthest_node = -1;
    262296                double farthest_dist = 0;
     
    269303               
    270304                for(int i = 1; i < nodes.size(); i++){
    271                         d = point_line_distance(nodes.get(i),first,last);
     305                        d = pointLineDistance(nodes.get(i),first,last);
    272306                        if(d>farthest_dist){
    273307                                farthest_dist = d;
     
    280314               
    281315                if(farthest_dist > epsilon){
    282                         seg_a = douglas_peucker(sublist(nodes,0,farthest_node+1),epsilon);
    283                         seg_b = douglas_peucker(sublist(nodes,farthest_node,nodes.size()-1),epsilon);
     316                        seg_a = douglasPeucker(sublist(nodes,0,farthest_node+1),epsilon);
     317                        seg_b = douglasPeucker(sublist(nodes,farthest_node,nodes.size()-1),epsilon);
    284318                               
    285319                        new_nodes.addAll(seg_a);
     
    353387               
    354388                protected Boolean contains(double lat, double lon){
    355                   if(lat > this.top || lat < this.bottom){
     389                  if(lat >= this.top || lat <= this.bottom){
    356390                    return false;
     391                  }
     392                  if(lon >= this.right || lon <= this.left){
     393                          return false;
    357394                  }
    358395                  if((this.right - this.left) % 360 == 0){
  • applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.java

    r6914 r6923  
    152152        setStatus("Running vertex reduction...");
    153153       
    154         nodelist = lw.vertex_reduce(nodelist, epsilon);
     154        nodelist = lw.vertexReduce(nodelist, epsilon);
    155155       
    156156        System.out.println("After vertex reduction "+nodelist.size()+" nodes remain.");
     
    162162        setStatus("Running Douglas-Peucker approximation...");
    163163       
    164         nodelist = lw.douglas_peucker(nodelist, epsilon);
     164        nodelist = lw.douglasPeucker(nodelist, epsilon);
    165165       
    166166        System.out.println("After Douglas-Peucker approximation "+nodelist.size()+" nodes remain.");
    167167         
     168        /**
     169         * And then through a duplicate node remover
     170         */
     171       
     172        setStatus("Removing duplicate nodes...");
     173       
     174        nodelist = lw.duplicateNodeRemove(nodelist);
     175       
     176        System.out.println("After removing duplicate nodes, "+nodelist.size()+" nodes remain.");
     177         
     178       
    168179        /**
    169180         * Turn the arraylist into osm nodes
     
    225236        }
    226237       
    227         commands.add(new AddCommand(way));
     238       
    228239        String waytype = Main.pref.get(LakewalkerPreferences.PREF_WAYTYPE, "water");
    229240   
     
    236247        way.nodes.add(fn);
    237248       
     249        commands.add(new AddCommand(way));
    238250       
    239251        if (!commands.isEmpty()) {
     
    243255          System.out.println("Failed");
    244256    }
     257       
     258        commands = new LinkedList<Command>();
     259        ways = new ArrayList<Way>();
     260       
    245261  }
    246262 
  • applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.java

    r6914 r6923  
    2323        // Hashmap to hold the mapping of cached images
    2424        private HashMap<String,Integer> imageindex = new HashMap<String,Integer>();
    25        
    26         public BufferedImage image2 = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
    2725       
    2826        private int resolution;
     
    152150        }
    153151       
    154         public int getPixel(int x, int y, int pixcol){
     152        public int getPixel(int x, int y) throws LakewalkerException{
    155153               
    156154                BufferedImage image = null;
     
    160158                } catch(LakewalkerException e){
    161159                        System.out.println(e.getError());
    162                         return -1;
     160                        throw new LakewalkerException(e.getMessage());                 
    163161                }
    164162       
     
    173171                int rgb = image.getRGB(pixel_x,pixel_y);
    174172               
    175                 // DEBUG: set the pixels
    176                 this.image2.setRGB(pixel_x,pixel_y,pixcol);
    177                
    178173                int pixel;
    179174               
     
    182177        int b = (rgb >>  0) & 0xff;
    183178
    184         //pixel = rgbToGrey(pixel); //(r+g+b)/3; //pixel & 0xff;
    185        
    186         int pixel2 = (int)((0.212671 * r) + (0.715160 * b) + (0.072169 * b));
    187        
    188179        pixel = (int)((0.30 * r) + (0.59 * b) + (0.11 * g));
    189180               
    190                 //System.out.println(pixel_y+","+pixel_x+"  "+r+","+g+","+b+"="+pixel+"("+pixel2+")");
    191 
    192181                return pixel;
    193182        }
    194183       
    195         private int rgbToGrey(int color) {
    196                 Color c = new Color(color);
    197             int red = c.getRed();
    198             int green = c.getGreen();
    199             int blue = c.getBlue();
    200             int tot = (red + green + blue) / 3;
    201             return tot;
    202         }
    203 
    204184        public int floor(int num, int precision){
    205185                double dnum = num/(double)precision;
     
    214194                return val.doubleValue() ;
    215195        }
    216 
     196       
    217197        public double[] xy_to_geo(int x, int y, double resolution){
    218198                double[] geo = new double[2];
Note: See TracChangeset for help on using the changeset viewer.