Ignore:
Timestamp:
2011-07-28T23:31:27+02:00 (13 years ago)
Author:
frederik
Message:

make ImportImagePlugin work. add option to use images unprojected if projection cannot be determined

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

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/ImportImagePlugin/src/org/openstreetmap/josm/plugins/ImportImagePlugin/ImageLayer.java

    r25934 r26413  
    44
    55import java.awt.Component;
     6import java.awt.Color;
    67import java.awt.Graphics2D;
    78import java.awt.Image;
     
    6869    private CoordinateReferenceSystem sourceRefSys;
    6970
    70 
    71 
    7271    /**
    7372     * Constructor
     
    8281        this.image = (BufferedImage) createImage();
    8382        layericon = new ImageIcon(ImportImagePlugin.pluginClassLoader.getResource("images/layericon.png"));
    84        
    8583    }
    8684
     
    9795        try {
    9896            // create a grid coverage from the image
    99             coverage = PluginOperations.createGridFromFile(imageFile, null);
     97            coverage = PluginOperations.createGridFromFile(imageFile, null, true);
    10098            this.sourceRefSys = coverage.getCoordinateReferenceSystem();
    10199           
     
    109107            if(e.getMessage().contains("No projection file found"))
    110108            {
    111                 int useDefaultCRS = JOptionPane.showConfirmDialog(Main.parent, "<html>No projection file (.prj) found.<br>Use the default Coordinate Reference System instead?</html>", "Missing projection", JOptionPane.YES_NO_OPTION);
    112                 if (useDefaultCRS == 0)
    113                 {
     109                int useUnprojected = JOptionPane.showConfirmDialog(Main.parent, "<html>No projection file (.prj) found.<br />Use the image unprojected?</html>", "Missing projection", JOptionPane.YES_NO_OPTION);
     110                if (useUnprojected == 0) { // Yes
     111                    logger.debug("Passing through image un-projected.");
    114112                    try {
    115113                        // create a grid coverage from the image
    116                         coverage = PluginOperations.createGridFromFile(imageFile, PluginOperations.defaultSourceCRS);
     114                        coverage = PluginOperations.createGridFromFile(imageFile, null, false);
    117115                        this.sourceRefSys = coverage.getCoordinateReferenceSystem();
    118                        
    119                         // now reproject grid coverage
    120                         coverage = PluginOperations.reprojectCoverage(coverage, CRS.decode(Main.proj.toCode()));
    121116                    } catch (Exception e1) {
    122117                        logger.error("Error while creating GridCoverage:",e1);
    123118                        throw new IOException(e1);
    124119                    }
    125                 }
    126                 else{
    127                     logger.debug("Layer creation cancled by user due to missing projection information.");
     120                } else { // No
     121                    logger.debug("No projection and user declined un-projected use");
    128122                    throw new LayerCreationCancledException();
    129123                }
    130 
    131124            }
    132125            else
     
    140133
    141134        // TODO
    142         upperLeft = new EastNorth(coverage.getEnvelope2D().y, coverage
    143                 .getEnvelope2D().x
    144                 + coverage.getEnvelope2D().width);
     135        upperLeft = new EastNorth(coverage.getEnvelope2D().x,
     136                coverage.getEnvelope2D().y + coverage.getEnvelope2D().height);
    145137        angle = 0;
    146138        bbox = coverage.getEnvelope2D();
     
    163155            EastNorth center = Main.map.mapView.getCenter();
    164156            EastNorth leftop = Main.map.mapView.getEastNorth(0, 0);
    165             double pixel_per_lon_degree = (Main.map.mapView.getWidth() / 2.0)
     157            double pixel_per_east_unit = (Main.map.mapView.getWidth() / 2.0)
    166158                    / (center.east() - leftop.east());
    167             double pixel_per_lat_degree = (Main.map.mapView.getHeight() / 2.0)
     159            double pixel_per_north_unit = (Main.map.mapView.getHeight() / 2.0)
    168160                    / (leftop.north() - center.north());
    169161
    170162            // This is now the offset in screen pixels
    171             double pic_offset_x = ((upperLeft.east() - leftop.east()) * pixel_per_lon_degree);
    172             double pic_offset_y = ((leftop.north() - upperLeft.north()) * pixel_per_lat_degree);
     163            double pic_offset_x = ((upperLeft.east() - leftop.east()) * pixel_per_east_unit);
     164            double pic_offset_y = ((leftop.north() - upperLeft.north()) * pixel_per_north_unit);
    173165
    174166            Graphics2D g = (Graphics2D) g2.create();
     
    187179            double height = projbounds.maxNorth - projbounds.minNorth;
    188180
    189             double ratio_x = (this.bbox.getMaxY() - this.bbox.getMinY())
     181            double ratio_x = (this.bbox.getMaxX() - this.bbox.getMinX())
    190182                    / width;
    191             double ratio_y = (this.bbox.getMaxX() - this.bbox.getMinX())
     183            double ratio_y = (this.bbox.getMaxY() - this.bbox.getMinY())
    192184                    / height;
    193185
     
    199191            double scaley = pixels4bbox_height / image.getHeight();
    200192
     193            if ((scalex > 10) || (scaley > 10)) {
     194                logger.warn("Not drawing image - scale too big");
     195                return;
     196            }
    201197            g.scale(scalex, scaley);
    202198
     
    282278    void resample(CoordinateReferenceSystem refSys) throws IOException, NoSuchAuthorityCodeException, FactoryException
    283279    {
    284        
    285         GridCoverage2D coverage =  PluginOperations.createGridFromFile(this.imageFile, refSys);
     280        logger.debug("resample");
     281        GridCoverage2D coverage =  PluginOperations.createGridFromFile(this.imageFile, refSys, true);
    286282        coverage = PluginOperations.reprojectCoverage(coverage, CRS.decode(Main.proj.toCode()));
    287283        this.bbox = coverage.getEnvelope2D();
     
    333329    }
    334330   
    335    
    336    
    337331    public CoordinateReferenceSystem getSourceRefSys() {
    338332        return sourceRefSys;
  • applications/editors/josm/plugins/ImportImagePlugin/src/org/openstreetmap/josm/plugins/ImportImagePlugin/LoadImageAction.java

    r23305 r26413  
    1414import org.openstreetmap.josm.actions.JosmAction;
    1515import org.openstreetmap.josm.data.Bounds;
    16 import org.openstreetmap.josm.data.coor.LatLon;
     16import org.openstreetmap.josm.data.coor.EastNorth;
    1717import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    1818import org.openstreetmap.josm.plugins.ImportImagePlugin.ImageLayer.LayerCreationCancledException;
     
    4545        ImageLayer layer = null;
    4646        if (result == JFileChooser.APPROVE_OPTION) {
    47             logger.info("File choosed:" + fc.getSelectedFile());
     47            logger.info("File choosen:" + fc.getSelectedFile());
    4848            try {
    4949                layer = new ImageLayer(fc.getSelectedFile());
     
    5151                // if user decides that layer should not be created just return.
    5252                return;
    53             }catch (Exception e) {
     53            } catch (Exception e) {
    5454                logger.error("Error while creating image layer: \n" + e.getMessage());
    5555                JOptionPane.showMessageDialog(null, marktr("Error while creating image layer: " + e.getCause()));
     
    6060            // Add layer:
    6161            Main.main.addLayer(layer);
    62             LatLon min = new LatLon(layer.getBbox().getMinX(), layer.getBbox().getMinY());
    63             LatLon max = new LatLon(layer.getBbox().getMaxX(), layer.getBbox().getMaxY());
     62            EastNorth min = new EastNorth(layer.getBbox().getMinX(), layer.getBbox().getMinY());
     63            EastNorth max = new EastNorth(layer.getBbox().getMaxX(), layer.getBbox().getMaxY());
    6464            BoundingXYVisitor boundingXYVisitor = new BoundingXYVisitor();
    65             boundingXYVisitor.visit(new Bounds(min, max));
     65            boundingXYVisitor.visit(min);
     66            boundingXYVisitor.visit(max);
    6667            Main.map.mapView.recalculateCenterScale(boundingXYVisitor);
    67             Main.map.mapView.zoomTo(new Bounds(min, max));
    6868        }
    6969    }
  • applications/editors/josm/plugins/ImportImagePlugin/src/org/openstreetmap/josm/plugins/ImportImagePlugin/PluginOperations.java

    r23305 r26413  
    107107     * @throws Exception
    108108     */
    109     public static GridCoverage2D createGridFromFile(File file, CoordinateReferenceSystem refSys) throws IOException{
     109    public static GridCoverage2D createGridFromFile(File file, CoordinateReferenceSystem refSys, boolean failIfNoPrjFile) throws IOException {
    110110
    111111        GridCoverage2D coverage = null;
     
    125125           
    126126            // try to read GeoTIFF:
    127             try{
     127            try {
    128128                coverage = readGeoTiff(file, refSys);
    129129                return coverage;
    130             }catch (DataSourceException dse) {
    131                 if(!dse.getMessage().contains("Coordinate Reference System is not available")){
     130            } catch (DataSourceException dse) {
     131                if (!dse.getMessage().contains("Coordinate Reference System is not available")){
    132132                    dse.printStackTrace();
    133133                }
     
    143143            for (int i = 0; i < postfixes.length; i++) {
    144144                File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]);
    145                 if(prjFile.exists()){
     145                if (prjFile.exists()){
    146146                    tfwReader = new WorldFileReader(prjFile);
    147147                }
    148148            }
    149             if(tfwReader == null){
     149
     150            if (tfwReader == null) {
    150151                throw new IOException("No Worldfile found.");
    151152            }
    152153           
    153             if(refSys == null){
     154            if (refSys == null) {
    154155                // if no crs is delivered try to read projection file:
    155156                refSys = readPrjFile(file);
    156                 if(refSys == null) throw new IOException("No projection file found.");
     157                if (refSys == null) {
     158                    if (failIfNoPrjFile) throw new IOException("No projection file found.");
     159                    logger.debug("no projection given, no projection file found; using unprojected file.");
     160                }
    157161            }
    158162           
     
    178182            for (int i = 0; i < postfixes.length; i++) {
    179183                File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]);
    180                 if(prjFile.exists()){
     184                if (prjFile.exists()){
    181185                    tfwReader = new WorldFileReader(prjFile);
    182186                }
    183187            }
    184             if(tfwReader == null) throw new IOException("No Worldfile found.");
    185            
    186             if(refSys == null){
     188            if (tfwReader == null) throw new IOException("No Worldfile found.");
     189           
     190            if (refSys == null) {
    187191                // if no crs is delivered try to read projection file:
    188192                refSys = readPrjFile(file);
    189                 if(refSys == null) throw new IOException("No projection file found.");
     193                if (refSys == null) {
     194                    if (failIfNoPrjFile) throw new IOException("No projection file found.");
     195                    logger.debug("no projection given, no projection file found; using unprojected file.");
     196                }
    190197            }
    191198           
     
    209216            for (int i = 0; i < postfixes.length; i++) {
    210217                File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]);
    211                 if(prjFile.exists()){
     218                if (prjFile.exists()){
    212219                    tfwReader = new WorldFileReader(prjFile);
    213220                }
    214221            }
    215             if(tfwReader == null) throw new IOException("No Worldfile found.");
    216 
    217             if(refSys == null){
     222            if (tfwReader == null) throw new IOException("No Worldfile found.");
     223
     224            if (refSys == null) {
    218225                // if no crs is delivered try to read projection file:
    219226                refSys = readPrjFile(file);
    220                 if(refSys == null) throw new IOException("No projection file found.");
     227                if (refSys == null) {
     228                    if (failIfNoPrjFile) throw new IOException("No projection file found.");
     229                    logger.debug("no projection given, no projection file found; using unprojected file.");
     230                }
    221231            }
    222232           
     
    240250            for (int i = 0; i < postfixes.length; i++) {
    241251                File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]);
    242                 if(prjFile.exists()){
     252                if (prjFile.exists()){
    243253                    tfwReader = new WorldFileReader(prjFile);
    244254                }
     
    246256            if(tfwReader == null) throw new IOException("No Worldfile found.");
    247257           
    248             if(refSys == null){
     258            if (refSys == null) {
    249259                // if no crs is delivered try to read projection file:
    250260                refSys = readPrjFile(file);
    251                 if(refSys == null) throw new IOException("No projection file found.");
     261                if (refSys == null) {
     262                    if (failIfNoPrjFile) throw new IOException("No projection file found.");
     263                    logger.debug("no projection given, no projection file found; using unprojected file.");
     264                }
    252265            }
    253266           
     
    290303       
    291304        File prjFile = new File(prjFilename);
    292         if(!prjFile.exists()) throw new IOException("No projection file found (.prj) for image '" + file.getName() + "'");
     305        if (!prjFile.exists()) return null;
    293306        logger.debug("Loading .prj file: " + prjFile.getAbsolutePath());
    294307       
Note: See TracChangeset for help on using the changeset viewer.