Changeset 23192 in osm for applications/editors/josm/plugins/00_plugin_dir_template
- Timestamp:
- 2010-09-15T18:59:53+02:00 (14 years ago)
- Location:
- applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin/ImageImportPlugin.java
r23139 r23192 31 31 */ 32 32 public class ImageImportPlugin extends Plugin{ 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 33 34 private static Logger logger; 35 36 JMenu mainmenu = null; 37 JosmAction loadFileAction = null; 38 39 // custom Classloader 40 static ClassLoader pluginClassLoader; 41 42 // plugin proerties 43 static Properties pluginProps; 44 45 // path constants 46 static final String PLUGIN_DIR = Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/"; 47 static final String PLUGINPROPERTIES_PATH = Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/pluginProperties.properties"; 48 static final String PLUGINLIBRARIES_DIR = Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/lib/"; 49 static final String PLUGINPROPERTIES_FILENAME = "pluginProperties.properties"; 50 static final String LOGGING_PROPERTIES_FILEPATH = Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/log4j.properties/"; 51 52 53 public Properties getPluginProps() { 54 return pluginProps; 55 } 56 57 58 /** 59 * constructor 60 * 61 * @param info 62 */ 63 public ImageImportPlugin(PluginInformation info){ 64 super(info); 65 66 try { 67 68 // First create custom ClassLoader to load resources from the main JAR 69 pluginClassLoader = createPluginClassLoader(); 70 71 // Initialize logger 72 initializeLogger(pluginClassLoader); 73 74 // Check whether plugin has already been installed. Otherwise install 75 checkInstallation(); 76 77 // If resources are available load properties from plugin directory 78 if(pluginProps == null || pluginProps.isEmpty()) 79 { 80 pluginProps = new Properties(); 81 pluginProps.load(new File(PLUGINPROPERTIES_PATH).toURI().toURL().openStream()); 82 logger.debug("Plugin properties loaded"); 83 } 84 85 /* Change class path: 86 * Use java reflection methods to add URLs to the class-path. 87 * Changes take effect when calling methods of other plugin classes 88 * (new threads) 89 * */ 90 URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 91 String[] libraryNames = pluginProps.getProperty("libraries").split(","); 92 Class<URLClassLoader> sysclass = URLClassLoader.class; 93 Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class}); 94 method.setAccessible(true); 95 for (int i = 0; i < libraryNames.length; i++) { 96 File library = new File(PLUGINLIBRARIES_DIR + "/" + libraryNames[i]); 97 method.invoke(sysLoader, new Object[]{library.toURI().toURL()}); 98 } 99 100 101 // load information about supported reference systems 102 PluginOperations.loadCRSData(pluginProps); 103 104 // create new Action for menu entry 105 LoadImageAction loadFileAction = new LoadImageAction(); 106 loadFileAction.setEnabled(true); 107 108 // add menu entries 109 Main.main.menu.fileMenu.insert(loadFileAction, 8); 110 Main.main.menu.fileMenu.insertSeparator(9); 111 112 113 } catch (Exception e) { 114 logger.fatal("Error while loading plugin", e); 115 try { 116 throw e; 117 } catch (Exception e1) { 118 e1.printStackTrace(); 119 } 120 } 121 122 logger.info("Plugin successfully loaded."); 123 124 } 125 126 127 128 /** 129 * Checks whether plugin resources are available. 130 * If not, start install procedure. 131 * 132 * @throws IOException 133 */ 134 private void checkInstallation() throws IOException 135 { 136 137 // check plugin resource state 138 boolean isInstalled = true; 139 if(!new File(PLUGINPROPERTIES_PATH).exists() 140 || !new File(PLUGIN_DIR).exists() 141 || !new File(PLUGINLIBRARIES_DIR).exists()) 142 isInstalled = false; 143 144 145 // if properties file doesn't exist, install plugin 146 if(!isInstalled) 147 { 148 149 /*----------- Begin installation ---------------*/ 150 151 // check if plugin directory exist 152 File pluginDir = new File(PLUGIN_DIR); 153 if(!pluginDir.exists()){ 154 pluginDir.mkdir(); 155 } 156 157 // check if "lib" directory exist 158 File libDir = new File(PLUGINLIBRARIES_DIR); 159 if(!libDir.exists()){ 160 libDir.mkdir(); 161 } 162 163 // create local properties file 164 if(pluginProps == null || pluginProps.isEmpty()){ 165 166 FileWriter fw = new FileWriter(new File(PLUGINPROPERTIES_PATH)); 167 URL propertiesURL = pluginClassLoader.getResource("resources/" + PLUGINPROPERTIES_FILENAME); 168 pluginProps = new Properties(); 169 pluginProps.load(propertiesURL.openStream()); 170 pluginProps.store(fw, null); 171 fw.close(); 172 logger.debug("Plugin properties loaded"); 173 } 174 175 if(!new File(LOGGING_PROPERTIES_FILEPATH).exists()) 176 { 177 FileWriter fw = new FileWriter(new File(LOGGING_PROPERTIES_FILEPATH)); 178 URL propertiesURL = pluginClassLoader.getResource("resources/log4j.properties"); 179 Properties loggingProps = new Properties(); 180 loggingProps.load(propertiesURL.openStream()); 181 loggingProps.store(fw, null); 182 fw.close(); 183 logger.debug("Logging properties created"); 184 } 185 186 187 // Copy all needed JAR files to $PLUGIN_DIR$/lib/ 188 String[] libStrings = pluginProps.getProperty("libraries").split(","); 189 190 for (int i = 0; i < libStrings.length; i++) { 191 192 URL url = pluginClassLoader.getResource("lib/" + libStrings[i]); 193 194 FileOutputStream out = null; 195 196 try{ 197 out = new FileOutputStream(new File(libDir, libStrings[i])); 198 } catch (FileNotFoundException e) { 199 break; 200 } 201 202 BufferedInputStream in = null; 203 try 204 { 205 in = new BufferedInputStream(url.openStream()); 206 207 byte[] buffer = new byte[1024]; 208 while (true) 209 { 210 int count = in.read(buffer); 211 if (count == -1) 212 break; 213 out.write(buffer, 0, count); 214 } 215 } 216 finally 217 { 218 if (in != null) 219 in.close(); 220 } 221 } 222 logger.debug("Plugin successfully installed"); 223 } 224 } 225 226 227 /** 228 * Initialize logger using plugin classloader. 229 * 230 * @param cl 231 */ 232 private void initializeLogger(ClassLoader cl) { 233 234 Properties props = new Properties(); 235 try { 236 props.load(new File(LOGGING_PROPERTIES_FILEPATH).toURI().toURL().openStream()); 237 238 // Set file for logging here: 239 props.setProperty("log4j.appender.MyRoFiAppender.file", 240 (Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/" + "log.log")); 241 242 PropertyConfigurator.configure(props); 243 244 logger = Logger.getLogger(ImageImportPlugin.class); 245 246 logger.info("Logger successfully initialized."); 247 248 return; 249 250 } catch (IOException e) { 251 System.out.println("Logging properties file not found. Using standard settings."); 252 } 253 254 // if no log4j.properties file can be found, initialize manually: 255 256 props.setProperty("log4j.rootLogger", "INFO, A"); 257 props.setProperty("log4j.appender.A", "org.apache.log4j.FileAppender"); 258 259 props.setProperty("log4j.appender.A.layout", 260 "org.apache.log4j.PatternLayout "); 261 props.setProperty("log4j.appender.A.layout.ConversionPattern", 262 "%d{ISO8601} %-5p [%t] %c: %m%n"); 263 264 // Set file for logging here: 265 props.setProperty("log4j.appender.A.file", 266 (Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImageImportPlugin/" + "log.log")); 267 268 PropertyConfigurator.configure(props); 269 logger = Logger.getLogger(ImageImportPlugin.class); 270 logger.info("Logger successfully initialized with standard settings."); 271 272 } 273 274 /** 275 * get a plugin-specific classloader. 276 * 277 * @return 278 * @throws MalformedURLException 279 */ 280 private ClassLoader createPluginClassLoader() throws MalformedURLException 281 { 282 ClassLoader loader = null; 283 loader = URLClassLoader.newInstance( 284 new URL[] { new File(Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin.jar").toURI().toURL()}, 285 ImageImportPlugin.class.getClassLoader() 286 ); 287 288 return loader; 289 } 290 291 291 } -
applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin/ImageLayer.java
r23139 r23192 40 40 41 41 /** 42 * 42 * Layer which contains spatial referenced image data. 43 43 * 44 44 * @author Christoph Beekmans, Fabian Kowitz, Anna Robaszkiewicz, Oliver Kuhn, Martin Ulitzny … … 47 47 public class ImageLayer extends Layer { 48 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 // 150 // 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 49 private Logger logger = Logger.getLogger(ImageLayer.class); 50 51 private File imageFile; 52 53 private BufferedImage image = null; 54 55 // coordinates of upper left corner 56 private EastNorth upperLeft; 57 // Angle of rotation of the image 58 private double angle = 0.0; 59 60 // current bbox 61 private Envelope2D bbox; 62 63 // Layer icon 64 private Icon layericon = null; 65 66 // reference system of the oringinal image 67 private CoordinateReferenceSystem sourceRefSys; 68 69 70 71 /** 72 * Constructor 73 * 74 * @param file 75 * @throws IOException 76 */ 77 public ImageLayer(File file) throws IOException { 78 super(file.getName()); 79 80 this.imageFile = file; 81 this.image = (BufferedImage) createImage(); 82 layericon = new ImageIcon(ImageImportPlugin.pluginClassLoader.getResource("images/layericon.png")); 83 84 } 85 86 /** 87 * create spatial referenced image. 88 * 89 * @return 90 * @throws IOException 91 */ 92 private Image createImage() throws IOException { 93 94 // geotools type for images and value coverages 95 GridCoverage2D coverage = null; 96 try { 97 // create a grid coverage from the image 98 coverage = PluginOperations.createGridFromFile(imageFile, null); 99 this.sourceRefSys = coverage.getCoordinateReferenceSystem(); 100 101 // now reproject grid coverage 102 coverage = PluginOperations.reprojectCoverage(coverage, CRS.decode(Main.proj.toCode())); 103 104 } catch (FactoryException e) { 105 logger.error("Error while creating GridCoverage:",e); 106 throw new IOException(e.getMessage()); 107 } catch (Exception e) { 108 if(e.getMessage().contains("No projection file found")) 109 { 110 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); 111 if (useDefaultCRS == 0) 112 { 113 try { 114 // create a grid coverage from the image 115 coverage = PluginOperations.createGridFromFile(imageFile, PluginOperations.defaultSourceCRS); 116 this.sourceRefSys = coverage.getCoordinateReferenceSystem(); 117 118 // now reproject grid coverage 119 coverage = PluginOperations.reprojectCoverage(coverage, CRS.decode(Main.proj.toCode())); 120 } catch (Exception e1) { 121 logger.error("Error while creating GridCoverage:",e1); 122 throw new IOException(e1); 123 } 124 } 125 else{ 126 logger.debug("Layer creation cancled by user due to missing projection information."); 127 throw new LayerCreationCancledException(); 128 } 129 130 } 131 else 132 { 133 logger.error("Error while creating GridCoverage:",e); 134 throw new IOException(e); 135 } 136 137 } 138 logger.debug("Coverage created: " + coverage); 139 140 // TODO 141 upperLeft = new EastNorth(coverage.getEnvelope2D().y, coverage 142 .getEnvelope2D().x 143 + coverage.getEnvelope2D().width); 144 angle = 0; 145 bbox = coverage.getEnvelope2D(); 146 147 // Refresh 148 // Main.map.mapView.repaint(); 149 // PlanarImage image = (PlanarImage) coverage.getRenderedImage(); 150 // logger.info("Color Model: " + coverage.getRenderedImage().getColorModel()); 151 ImageWorker worker = new ImageWorker(coverage.getRenderedImage()); 152 153 return worker.getBufferedImage(); 154 } 155 156 @Override 157 public void paint(Graphics2D g2, MapView mv, Bounds bounds) { 158 159 if (image != null && g2 != null) { 160 161 // Position image at the right graphical place 162 EastNorth center = Main.map.mapView.getCenter(); 163 EastNorth leftop = Main.map.mapView.getEastNorth(0, 0); 164 double pixel_per_lon_degree = (Main.map.mapView.getWidth() / 2.0) 165 / (center.east() - leftop.east()); 166 double pixel_per_lat_degree = (Main.map.mapView.getHeight() / 2.0) 167 / (leftop.north() - center.north()); 168 169 // This is now the offset in screen pixels 170 double pic_offset_x = ((upperLeft.east() - leftop.east()) * pixel_per_lon_degree); 171 double pic_offset_y = ((leftop.north() - upperLeft.north()) * pixel_per_lat_degree); 172 173 Graphics2D g = (Graphics2D) g2.create(); 174 175 // Move picture by offset from upper left corner 176 g.translate(pic_offset_x, pic_offset_y); 177 178 // Rotate image by angle 179 g.rotate(angle * Math.PI / 180.0); 180 181 // Determine scale to fit JOSM extents 182 ProjectionBounds projbounds = Main.map.mapView 183 .getProjectionBounds(); 184 185 double width = projbounds.max.getX() - projbounds.min.getX(); 186 double height = projbounds.max.getY() - projbounds.min.getY(); 187 188 double ratio_x = (this.bbox.getMaxY() - this.bbox.getMinY()) 189 / width; 190 double ratio_y = (this.bbox.getMaxX() - this.bbox.getMinX()) 191 / height; 192 193 double pixels4bbox_width = ratio_x * Main.map.mapView.getWidth(); 194 double pixels4bbox_height = ratio_y * Main.map.mapView.getHeight(); 195 196 // Scale image to JOSM extents 197 double scalex = pixels4bbox_width / image.getWidth(); 198 double scaley = pixels4bbox_height / image.getHeight(); 199 200 g.scale(scalex, scaley); 201 202 // Draw picture 203 g.drawImage(image, 0, 0, null); 204 205 } else { 206 logger.error("Error while dawing image: image == null or Graphics == null"); 207 } 208 } 209 210 public Envelope2D getBbox() { 211 return bbox; 212 } 213 214 @Override 215 public Icon getIcon() { 216 // TODO Auto-generated method stub 217 return this.layericon; 218 } 219 220 @Override 221 public Object getInfoComponent() { 222 // TODO Auto-generated method stub 223 return null; 224 } 225 226 @Override 227 public Component[] getMenuEntries() { 228 228 return new Component[]{ 229 229 new JMenuItem(LayerListDialog.getInstance().createActivateLayerAction(this)), … … 235 235 new JSeparator(), 236 236 new JMenuItem(new LayerListPopup.InfoAction(this))}; 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 237 } 238 239 @Override 240 public boolean isMergable(Layer arg0) { 241 // TODO Auto-generated method stub 242 return false; 243 } 244 245 @Override 246 public void mergeFrom(Layer arg0) { 247 // TODO Auto-generated method stub 248 249 } 250 251 @Override 252 public void visitBoundingBox(BoundingXYVisitor arg0) { 253 // TODO Auto-generated method stub 254 } 255 256 257 @Override 258 public String getToolTipText() { 259 // TODO Auto-generated method stub 260 return this.getName(); 261 } 262 263 264 public File getImageFile() { 265 return imageFile; 266 } 267 268 public BufferedImage getImage() { 269 return image; 270 } 271 272 /** 273 * loads the image and reprojects it using a transformation 274 * calculated by the new reference system. 275 * 276 * @param newRefSys 277 * @throws IOException 278 * @throws FactoryException 279 * @throws NoSuchAuthorityCodeException 280 */ 281 void resample(CoordinateReferenceSystem refSys) throws IOException, NoSuchAuthorityCodeException, FactoryException 282 { 283 284 GridCoverage2D coverage = PluginOperations.createGridFromFile(this.imageFile, refSys); 285 coverage = PluginOperations.reprojectCoverage(coverage, CRS.decode(Main.proj.toCode())); 286 this.bbox = coverage.getEnvelope2D(); 287 this.image = ((PlanarImage)coverage.getRenderedImage()).getAsBufferedImage(); 288 289 // TODO 290 upperLeft = new EastNorth(coverage.getEnvelope2D().y, coverage 291 .getEnvelope2D().x 292 + coverage.getEnvelope2D().width); 293 angle = 0; 294 295 // repaint and zoom to new bbox 296 Main.map.mapView.repaint(); 297 LatLon min = new LatLon(bbox.getMinX(), bbox.getMinY()); 298 LatLon max = new LatLon(bbox.getMaxX(), bbox.getMaxY()); 299 Main.map.mapView.zoomTo(new Bounds(min, max)); 300 301 302 } 303 304 /** 305 * Action that creates a dialog GUI element with properties of a layer. 306 * 307 */ 308 public class LayerPropertiesAction extends AbstractAction 309 { 310 public ImageLayer imageLayer; 311 312 public LayerPropertiesAction(ImageLayer imageLayer){ 313 super(tr("Layer Properties")); 314 this.imageLayer = imageLayer; 315 } 316 317 public void actionPerformed(ActionEvent arg0) { 318 319 LayerPropertiesDialog layerProps = new LayerPropertiesDialog(imageLayer, PluginOperations.crsDescriptions); 320 layerProps.setLocation(Main.parent.getWidth() / 4 , Main.parent.getHeight() / 4); 321 layerProps.setVisible(true); 322 } 323 324 } 325 326 /** 327 * Exception which represents that the layer creation has been cancled by the 328 * user. 329 * 330 */ 331 class LayerCreationCancledException extends IOException{ 332 } 333 334 335 336 public CoordinateReferenceSystem getSourceRefSys() { 337 return sourceRefSys; 338 } 339 340 public void setSourceRefSys(CoordinateReferenceSystem sourceRefSys) { 341 this.sourceRefSys = sourceRefSys; 342 } 343 343 } -
applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin/LayerPropertiesDialog.java
r23139 r23192 42 42 */ 43 43 public class LayerPropertiesDialog extends JFrame{ 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 44 45 private Vector<String> supportedCRS; 46 private ImageLayer imageLayer; 47 48 private JPanel mainPanel = null; 49 private JPanel jPanel = null; 50 private JPanel buttonPanel = null; 51 private JTabbedPane jTabbedPane = null; 52 private JPanel infoPanel = null; 53 private JPanel crsPanel = null; 54 private JButton okButton = null; 55 private JLabel layerNameLabel = null; 56 private JLabel layerNameValueLabel = null; 57 private JLabel imageFileLabel = null; 58 private JLabel imageFileValueLabel = null; 59 private JLabel sizeLabel = null; 60 private JLabel sizeValueLabel = null; 61 private JLabel crsLabel = null; 62 private JLabel crsValueLabel = null; 63 private JLabel extentLabel = null; 64 private JLabel defaultCRSDescriptorLabel = null; 65 private JLabel defaultCRSLabel = null; 66 private JTextField searchField = null; 67 private JScrollPane crsListScrollPane = null; 68 private JList crsJList = null; 69 private JButton useDefaultCRSButton = null; 70 private JButton applySelectedCRSButton = null; 71 private JButton setSelectedCRSAsDefaultButton = null; 72 private JLabel searchFieldLabel = null; 73 private JCheckBox eastingFirstCheckBox = null; 74 private JLabel eastingFirstLabel = null; 75 private JLabel tabDescriptionLabel = null; 76 private JLabel upperLeftLabel = null; 77 private JLabel lowerLeftLabel = null; 78 private JLabel upperRightLabel = null; 79 private JLabel lowerRightLabel = null; 80 private JLabel upperLeftValueLabel = null; 81 private JLabel upperRightValueLabel = null; 82 private JLabel lowerLeftValueLabel = null; 83 private JLabel lowerRightValueLabel = null; 84 private JLabel currentCRSLabel = null; 85 private JLabel currentCRSValueLabel = null; 86 87 /** 88 * This method initializes 89 * 90 */ 91 public LayerPropertiesDialog(ImageLayer imageLayer, Vector<String> supportedCRS) { 92 super(imageLayer.getName()); 93 this.supportedCRS = supportedCRS; 94 this.imageLayer = imageLayer; 95 initialize(); 96 } 97 98 /** 99 * This method initializes 100 * 101 */ 102 public LayerPropertiesDialog(Vector<String> supportedCRS) { 103 super(); 104 this.supportedCRS = supportedCRS; 105 initialize(); 106 } 107 108 109 /** 110 * This method initializes this 111 * 112 */ 113 private void initialize() { 114 114 this.setMinimumSize(new Dimension(404, 485)); 115 115 this.setContentPane(getMainPanel()); 116 116 this.setPreferredSize(new Dimension(404, 485)); 117 118 119 120 121 122 * 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 * 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 * 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 * 174 175 176 177 178 179 180 181 182 183 184 185 186 187 * 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 * 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 * 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 * 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 * 394 395 396 397 398 399 400 401 402 403 404 405 406 407 * 408 409 410 411 412 413 414 415 416 417 418 419 420 * 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 * 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 * 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 * 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 117 118 } 119 120 /** 121 * This method initializes mainPanel 122 * 123 * @return javax.swing.JPanel 124 */ 125 private JPanel getMainPanel() { 126 if (mainPanel == null) { 127 mainPanel = new JPanel(); 128 mainPanel.setLayout(null); 129 mainPanel.add(getJPanel(), null); 130 mainPanel.add(getButtonPanel(), null); 131 } 132 return mainPanel; 133 } 134 135 /** 136 * This method initializes jPanel 137 * 138 * @return javax.swing.JPanel 139 */ 140 private JPanel getJPanel() { 141 if (jPanel == null) { 142 GridBagConstraints gridBagConstraints = new GridBagConstraints(); 143 gridBagConstraints.fill = GridBagConstraints.BOTH; 144 gridBagConstraints.gridy = 0; 145 gridBagConstraints.weightx = 1.0; 146 gridBagConstraints.weighty = 1.0; 147 gridBagConstraints.gridx = 0; 148 jPanel = new JPanel(); 149 jPanel.setLayout(new GridBagLayout()); 150 jPanel.setBounds(new Rectangle(0, 0, 391, 406)); 151 jPanel.add(getJTabbedPane(), gridBagConstraints); 152 } 153 return jPanel; 154 } 155 156 /** 157 * This method initializes buttonPanel 158 * 159 * @return javax.swing.JPanel 160 */ 161 private JPanel getButtonPanel() { 162 if (buttonPanel == null) { 163 buttonPanel = new JPanel(); 164 buttonPanel.setLayout(null); 165 buttonPanel.setBounds(new Rectangle(0, 405, 391, 46)); 166 buttonPanel.add(getOkButton(), null); 167 } 168 return buttonPanel; 169 } 170 171 /** 172 * This method initializes jTabbedPane 173 * 174 * @return javax.swing.JTabbedPane 175 */ 176 private JTabbedPane getJTabbedPane() { 177 if (jTabbedPane == null) { 178 jTabbedPane = new JTabbedPane(); 179 jTabbedPane.addTab("General Information", null, getInfoPanel(), null); 180 jTabbedPane.addTab("Source Reference System", null, getCrsPanel(), null); 181 } 182 return jTabbedPane; 183 } 184 185 /** 186 * This method initializes infoPanel 187 * 188 * @return javax.swing.JPanel 189 */ 190 private JPanel getInfoPanel() { 191 if (infoPanel == null) { 192 lowerRightValueLabel = new JLabel(); 193 lowerRightValueLabel.setBounds(new Rectangle(210, 315, 134, 16)); 194 lowerRightValueLabel.setHorizontalAlignment(SwingConstants.RIGHT); 195 lowerRightValueLabel.setText((float)imageLayer.getBbox().getMinX() + ", " + (float)imageLayer.getBbox().getMaxY()); 196 lowerLeftValueLabel = new JLabel(); 197 lowerLeftValueLabel.setBounds(new Rectangle(30, 315, 133, 16)); 198 lowerLeftValueLabel.setHorizontalAlignment(SwingConstants.LEFT); 199 lowerLeftValueLabel.setText((float)imageLayer.getBbox().getMinX() + ", " + (float)imageLayer.getBbox().getMinY()); 200 upperRightValueLabel = new JLabel(); 201 upperRightValueLabel.setBounds(new Rectangle(210, 255, 138, 16)); 202 upperRightValueLabel.setHorizontalAlignment(SwingConstants.RIGHT); 203 upperRightValueLabel.setText((float)imageLayer.getBbox().getMaxX() + ", " + (float)imageLayer.getBbox().getMaxY()); 204 upperLeftValueLabel = new JLabel(); 205 upperLeftValueLabel.setBounds(new Rectangle(30, 255, 133, 16)); 206 upperLeftValueLabel.setHorizontalAlignment(SwingConstants.LEFT); 207 upperLeftValueLabel.setText((float)imageLayer.getBbox().getMaxX() + ", " + (float)imageLayer.getBbox().getMinY()); 208 lowerRightLabel = new JLabel(); 209 lowerRightLabel.setBounds(new Rectangle(287, 344, 74, 16)); 210 lowerRightLabel.setText("Lower Right"); 211 upperRightLabel = new JLabel(); 212 upperRightLabel.setBounds(new Rectangle(285, 225, 91, 16)); 213 upperRightLabel.setText("Upper Right"); 214 lowerLeftLabel = new JLabel(); 215 lowerLeftLabel.setBounds(new Rectangle(15, 345, 92, 16)); 216 lowerLeftLabel.setText("Lower Left"); 217 upperLeftLabel = new JLabel(); 218 upperLeftLabel.setBounds(new Rectangle(15, 224, 91, 16)); 219 upperLeftLabel.setText("Upper Left"); 220 extentLabel = new JLabel(); 221 extentLabel.setBounds(new Rectangle(120, 195, 136, 16)); 222 extentLabel.setEnabled(false); 223 extentLabel.setHorizontalAlignment(SwingConstants.CENTER); 224 extentLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); 225 extentLabel.setText("Extent"); 226 crsValueLabel = new JLabel(); 227 crsValueLabel.setBounds(new Rectangle(150, 150, 226, 16)); 228 229 String crsDescription = ""; 230 try { 231 crsDescription = imageLayer.getBbox().getCoordinateReferenceSystem().getIdentifiers().iterator().next().toString(); 232 } catch (Exception e) { 233 } 234 crsValueLabel.setText(crsDescription + "(" + imageLayer.getBbox().getCoordinateReferenceSystem().getName().toString() + ")"); 235 236 crsLabel = new JLabel(); 237 crsLabel.setBounds(new Rectangle(15, 150, 118, 16)); 238 crsLabel.setText("Reference System"); 239 sizeValueLabel = new JLabel(); 240 sizeValueLabel.setBounds(new Rectangle(150, 105, 226, 16)); 241 sizeValueLabel.setText(imageLayer.getImage().getHeight() + " x " + imageLayer.getImage().getWidth()); 242 sizeLabel = new JLabel(); 243 sizeLabel.setBounds(new Rectangle(15, 105, 121, 16)); 244 sizeLabel.setText("Image size"); 245 imageFileValueLabel = new JLabel(); 246 imageFileValueLabel.setBounds(new Rectangle(150, 60, 226, 16)); 247 imageFileValueLabel.setText(imageLayer.getImageFile().getAbsolutePath()); 248 imageFileValueLabel.setToolTipText(imageLayer.getImageFile().getAbsolutePath()); 249 imageFileLabel = new JLabel(); 250 imageFileLabel.setBounds(new Rectangle(15, 60, 121, 16)); 251 imageFileLabel.setText("Image file"); 252 layerNameValueLabel = new JLabel(); 253 layerNameValueLabel.setBounds(new Rectangle(150, 15, 226, 16)); 254 layerNameValueLabel.setText(imageLayer.getName()); 255 layerNameLabel = new JLabel(); 256 layerNameLabel.setBounds(new Rectangle(15, 15, 121, 16)); 257 layerNameLabel.setText("Layer name"); 258 infoPanel = new JPanel(); 259 infoPanel.setLayout(null); 260 infoPanel.setFont(new Font("Dialog", Font.BOLD, 12)); 261 infoPanel.add(layerNameLabel, null); 262 infoPanel.add(layerNameValueLabel, null); 263 infoPanel.add(imageFileLabel, null); 264 infoPanel.add(imageFileValueLabel, null); 265 infoPanel.add(sizeLabel, null); 266 infoPanel.add(sizeValueLabel, null); 267 infoPanel.add(crsLabel, null); 268 infoPanel.add(crsValueLabel, null); 269 infoPanel.add(extentLabel, null); 270 infoPanel.add(upperLeftLabel, null); 271 infoPanel.add(lowerLeftLabel, null); 272 infoPanel.add(upperRightLabel, null); 273 infoPanel.add(lowerRightLabel, null); 274 infoPanel.add(upperLeftValueLabel, null); 275 infoPanel.add(upperRightValueLabel, null); 276 infoPanel.add(lowerLeftValueLabel, null); 277 infoPanel.add(lowerRightValueLabel, null); 278 } 279 return infoPanel; 280 } 281 282 /** 283 * This method initializes crsPanel 284 * 285 * @return javax.swing.JPanel 286 */ 287 private JPanel getCrsPanel() { 288 if (crsPanel == null) { 289 currentCRSValueLabel = new JLabel(); 290 currentCRSValueLabel.setBounds(new Rectangle(78, 33, 297, 16)); 291 String crsDescription = "unknown"; 292 try { 293 crsDescription = imageLayer.getSourceRefSys().getIdentifiers().iterator().next().toString(); 294 } catch (Exception e) { 295 } 296 currentCRSValueLabel.setText(crsDescription); 297 298 currentCRSLabel = new JLabel(); 299 currentCRSLabel.setBounds(new Rectangle(15, 33, 52, 16)); 300 currentCRSLabel.setText("Current:"); 301 tabDescriptionLabel = new JLabel(); 302 tabDescriptionLabel.setBounds(new Rectangle(15, 9, 361, 16)); 303 tabDescriptionLabel.setText("Set here the source reference system of the image"); 304 eastingFirstLabel = new JLabel(); 305 eastingFirstLabel.setBounds(new Rectangle(315, 210, 76, 46)); 306 eastingFirstLabel.setHorizontalTextPosition(SwingConstants.TRAILING); 307 eastingFirstLabel.setHorizontalAlignment(SwingConstants.CENTER); 308 eastingFirstLabel.setText("<html>Easting<br>first</html>"); 309 searchFieldLabel = new JLabel(); 310 searchFieldLabel.setBounds(new Rectangle(298, 114, 84, 16)); 311 searchFieldLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); 312 searchFieldLabel.setHorizontalTextPosition(SwingConstants.TRAILING); 313 searchFieldLabel.setHorizontalAlignment(SwingConstants.CENTER); 314 searchFieldLabel.setText("Search"); 315 defaultCRSLabel = new JLabel(); 316 defaultCRSLabel.setBounds(new Rectangle(15, 89, 361, 16)); 317 defaultCRSLabel.setText(PluginOperations.defaultSourceCRSDescription); 318 defaultCRSDescriptorLabel = new JLabel(); 319 defaultCRSDescriptorLabel.setBounds(new Rectangle(15, 63, 226, 16)); 320 defaultCRSDescriptorLabel.setText("Default Reference System:"); 321 crsPanel = new JPanel(); 322 crsPanel.setLayout(null); 323 crsPanel.add(defaultCRSDescriptorLabel, null); 324 crsPanel.add(defaultCRSLabel, null); 325 crsPanel.add(getSearchField(), null); 326 crsPanel.add(getCrsListScrollPane(), null); 327 crsPanel.add(getUseDefaultCRSButton(), null); 328 crsPanel.add(getApplySelectedCRSButton(), null); 329 crsPanel.add(getSetSelectedCRSAsDefaultButton(), null); 330 crsPanel.add(searchFieldLabel, null); 331 crsPanel.add(getEastingFirstCheckBox(), null); 332 crsPanel.add(eastingFirstLabel, null); 333 crsPanel.add(tabDescriptionLabel, null); 334 crsPanel.add(currentCRSLabel, null); 335 crsPanel.add(currentCRSValueLabel, null); 336 } 337 return crsPanel; 338 } 339 340 /** 341 * This method initializes okButton 342 * 343 * @return javax.swing.JButton 344 */ 345 private JButton getOkButton() { 346 if (okButton == null) { 347 okButton = new JButton(); 348 okButton.setBounds(new Rectangle(134, 5, 136, 31)); 349 okButton.setText("OK"); 350 okButton.addActionListener(new java.awt.event.ActionListener() { 351 public void actionPerformed(java.awt.event.ActionEvent e) { 352 353 setVisible(false); 354 dispose(); 355 } 356 }); 357 } 358 return okButton; 359 } 360 361 /** 362 * This method initializes searchField 363 * 364 * @return javax.swing.JTextField 365 */ 366 private JTextField getSearchField() { 367 if (searchField == null) { 368 searchField = new JTextField(); 369 searchField.setBounds(new Rectangle(13, 111, 282, 20)); 370 searchField.setToolTipText("Enter keywords or EPSG codes"); 371 searchField.addKeyListener(new java.awt.event.KeyAdapter() { 372 public void keyTyped(java.awt.event.KeyEvent e) { 373 374 for (Iterator iterator = supportedCRS.iterator(); iterator 375 .hasNext();) { 376 String type = (String) iterator.next(); 377 if(type.contains(searchField.getText())) 378 { 379 crsJList.setSelectedIndex(supportedCRS.indexOf(type)); 380 crsJList.ensureIndexIsVisible(supportedCRS.indexOf(type)); 381 break; 382 } 383 384 } 385 } 386 }); 387 } 388 return searchField; 389 } 390 391 /** 392 * This method initializes crsListScrollPane 393 * 394 * @return javax.swing.JScrollPane 395 */ 396 private JScrollPane getCrsListScrollPane() { 397 if (crsListScrollPane == null) { 398 crsListScrollPane = new JScrollPane(); 399 crsListScrollPane.setBounds(new Rectangle(15, 135, 301, 241)); 400 crsListScrollPane.setViewportView(getCrsJList()); 401 } 402 return crsListScrollPane; 403 } 404 405 /** 406 * This method initializes crsJList 407 * 408 * @return javax.swing.JList 409 */ 410 private JList getCrsJList() { 411 if (crsJList == null) { 412 crsJList = new JList(supportedCRS); 413 crsJList.addListSelectionListener(new ListSelectionHandler()); 414 } 415 return crsJList; 416 } 417 418 /** 419 * This method initializes useDefaultCRSButton 420 * 421 * @return javax.swing.JButton 422 */ 423 private JButton getUseDefaultCRSButton() { 424 if (useDefaultCRSButton == null) { 425 useDefaultCRSButton = new JButton(); 426 useDefaultCRSButton.setBounds(new Rectangle(253, 54, 118, 28)); 427 useDefaultCRSButton.setText("Apply Default"); 428 useDefaultCRSButton.addActionListener(new java.awt.event.ActionListener() { 429 public void actionPerformed(java.awt.event.ActionEvent e) { 430 431 try { 432 433 setCursor(new Cursor(Cursor.WAIT_CURSOR)); 434 if(PluginOperations.defaultSourceCRS != null){ 435 imageLayer.resample(PluginOperations.defaultSourceCRS); 436 }else 437 { 438 JOptionPane.showMessageDialog(getContentPane(), "<html>No default reference system available.<br>Please select one from the list</html>"); 439 } 440 441 } catch (NoSuchAuthorityCodeException e1) { 442 // TODO Auto-generated catch block 443 e1.printStackTrace(); 444 } catch (FactoryException e1) { 445 // TODO Auto-generated catch block 446 e1.printStackTrace(); 447 } catch (IOException e2) { 448 // TODO Auto-generated catch block 449 e2.printStackTrace(); 450 } 451 finally{ 452 setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 453 } 454 } 455 }); 456 } 457 return useDefaultCRSButton; 458 } 459 460 /** 461 * This method initializes applySelectedCRSButton 462 * 463 * @return javax.swing.JButton 464 */ 465 private JButton getApplySelectedCRSButton() { 466 if (applySelectedCRSButton == null) { 467 applySelectedCRSButton = new JButton(); 468 applySelectedCRSButton.setBounds(new Rectangle(315, 135, 69, 61)); 469 applySelectedCRSButton.setHorizontalAlignment(SwingConstants.CENTER); 470 applySelectedCRSButton.setHorizontalTextPosition(SwingConstants.TRAILING); 471 applySelectedCRSButton.setText("<html>Apply<br>Selection</html>"); 472 applySelectedCRSButton.addActionListener(new java.awt.event.ActionListener() { 473 public void actionPerformed(java.awt.event.ActionEvent e) { 474 475 String selection = (String) crsJList.getSelectedValue(); 476 String code = selection.substring(selection.indexOf("[-") + 2, selection.indexOf("-]")); 477 478 CoordinateReferenceSystem newRefSys = null; 479 try { 480 newRefSys = CRS.decode(code, eastingFirstCheckBox.isSelected()); 481 482 setCursor(new Cursor(Cursor.WAIT_CURSOR)); 483 484 imageLayer.resample(newRefSys); 485 486 } catch (NoSuchAuthorityCodeException e1) { 487 // TODO Auto-generated catch block 488 e1.printStackTrace(); 489 } catch (FactoryException e1) { 490 // TODO Auto-generated catch block 491 e1.printStackTrace(); 492 } catch (IOException e2) { 493 // TODO Auto-generated catch block 494 e2.printStackTrace(); 495 } 496 finally{ 497 setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 498 } 499 500 501 } 502 }); 503 } 504 return applySelectedCRSButton; 505 } 506 507 /** 508 * This method initializes setSelectedCRSAsDefaultButton 509 * 510 * @return javax.swing.JButton 511 */ 512 private JButton getSetSelectedCRSAsDefaultButton() { 513 if (setSelectedCRSAsDefaultButton == null) { 514 setSelectedCRSAsDefaultButton = new JButton(); 515 setSelectedCRSAsDefaultButton.setBounds(new Rectangle(315, 300, 69, 61)); 516 setSelectedCRSAsDefaultButton.setText("<html>Set as<br>Default</html>"); 517 setSelectedCRSAsDefaultButton 518 .addActionListener(new java.awt.event.ActionListener() { 519 public void actionPerformed(java.awt.event.ActionEvent e) { 520 521 if(crsJList.getSelectedValue() != null){ 522 String selection = (String) crsJList.getSelectedValue(); 523 String code = selection.substring(selection.indexOf("[-") + 2, selection.indexOf("-]")); 524 525 try { 526 PluginOperations.defaultSourceCRS = CRS.decode(code, eastingFirstCheckBox.isSelected()); 527 PluginOperations.defaultSourceCRSDescription = selection; 528 529 ImageImportPlugin.pluginProps.setProperty("default_crs_eastingfirst", "" + eastingFirstCheckBox.isSelected()); 530 ImageImportPlugin.pluginProps.setProperty("default_crs_srid", code); 531 FileWriter fileWriter = new FileWriter(new File(ImageImportPlugin.PLUGINPROPERTIES_PATH)); 532 ImageImportPlugin.pluginProps.store(fileWriter, null); 533 fileWriter.close(); 534 535 defaultCRSLabel.setText(selection); 536 537 } catch (IOException e2) { 538 // TODO Auto-generated catch block 539 e2.printStackTrace(); 540 } catch (NoSuchAuthorityCodeException e3) { 541 // TODO Auto-generated catch block 542 e3.printStackTrace(); 543 } catch (FactoryException e4) { 544 // TODO Auto-generated catch block 545 e4.printStackTrace(); 546 } 547 }else{ 548 JOptionPane.showMessageDialog(getContentPane(), "Please make a selection from the list."); 549 } 550 551 552 } 553 }); 554 } 555 return setSelectedCRSAsDefaultButton; 556 } 557 558 /** 559 * This method initializes eastingFirstCheckBox 560 * 561 * @return javax.swing.JCheckBox 562 */ 563 private JCheckBox getEastingFirstCheckBox() { 564 if (eastingFirstCheckBox == null) { 565 eastingFirstCheckBox = new JCheckBox(); 566 eastingFirstCheckBox.setBounds(new Rectangle(345, 255, 21, 21)); 567 } 568 return eastingFirstCheckBox; 569 } 570 571 572 573 /** 574 * Listener setting text in the search field if selection has changed. 575 * 576 */ 577 577 class ListSelectionHandler implements ListSelectionListener { 578 578 public void valueChanged(ListSelectionEvent e) { 579 580 581 582 583 579 if(e.getValueIsAdjusting()) 580 { 581 searchField.setText(supportedCRS.get(e.getLastIndex())); 582 searchField.setEditable(true); 583 } 584 584 } 585 585 } -
applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin/LoadImageAction.java
r23139 r23192 26 26 */ 27 27 public class LoadImageAction extends JosmAction { 28 29 28 29 private Logger logger = Logger.getLogger(LoadImageAction.class); 30 30 31 32 33 34 35 36 31 /** 32 * Constructor... 33 */ 34 public LoadImageAction() { 35 super(tr("Import image"), null, tr("Import georeferenced image"), null, false); 36 } 37 37 38 38 public void actionPerformed(ActionEvent arg0) { 39 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 40 // Choose a file 41 JFileChooser fc = new JFileChooser(); 42 fc.setAcceptAllFileFilterUsed(false); 43 int result = fc.showOpenDialog(Main.parent); 44 45 ImageLayer layer = null; 46 if (result == JFileChooser.APPROVE_OPTION) { 47 logger.info("File choosed:" + fc.getSelectedFile()); 48 try { 49 layer = new ImageLayer(fc.getSelectedFile()); 50 } catch (LayerCreationCancledException e) { 51 // if user decides that layer should not be created just return. 52 return; 53 }catch (Exception e) { 54 logger.error("Error while creating image layer: \n" + e.getMessage()); 55 JOptionPane.showMessageDialog(null, marktr("Error while creating image layer: " + e.getCause())); 56 return; 57 58 } 59 60 // Add layer: 61 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()); 64 BoundingXYVisitor boundingXYVisitor = new BoundingXYVisitor(); 65 boundingXYVisitor.visit(new Bounds(min, max)); 66 Main.map.mapView.recalculateCenterScale(boundingXYVisitor); 67 Main.map.mapView.zoomTo(new Bounds(min, max)); 68 } 69 } 70 70 } -
applications/editors/josm/plugins/00_plugin_dir_template/src/org/openstreetmap/josm/plugins/ImportImagePlugin/PluginOperations.java
r23139 r23192 47 47 public class PluginOperations { 48 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 49 private static final Logger logger = Logger.getLogger(PluginOperations.class); 50 51 // contains descriptions of all available CRS 52 static Vector<String> crsDescriptions; 53 54 // the standard native CRS of user images 55 static CoordinateReferenceSystem defaultSourceCRS; 56 // description of 'defaultSourceCRS' 57 static String defaultSourceCRSDescription; 58 59 60 61 public static enum SUPPORTEDIMAGETYPES { 62 tiff, tif, jpg, jpeg, bmp, png 63 } 64 65 public static enum POSTFIXES_WORLDFILE { 66 wld, jgw, jpgw, pgw, pngw, tfw, tifw, bpw, bmpw, 67 }; 68 69 /** 70 * Reprojects a GridCoverage to a given CRS. 71 * 72 * @param coverage 73 * @param targetCrs 74 * @return destination 75 * @throws FactoryException 76 * @throws NoSuchAuthorityCodeException 77 */ 78 public static GridCoverage2D reprojectCoverage(GridCoverage2D coverage, 79 CoordinateReferenceSystem targetCrs) throws NoSuchAuthorityCodeException, FactoryException { 80 81 // TODO: add category for NO_DATA values in coverage (transparency in 82 // image) 83 84 GridCoverage2D destination = null; 85 86 DefaultProcessor processor = new DefaultProcessor(null); 87 ParameterValueGroup resampleParams = processor.getOperation("Resample") 88 .getParameters(); 89 90 // set parameters 91 resampleParams.parameter("Source").setValue(coverage); 92 resampleParams.parameter("CoordinateReferenceSystem").setValue( 93 targetCrs); 94 95 // resample coverage with given parameters 96 destination = (GridCoverage2D) processor.doOperation(resampleParams); 97 98 return destination; 99 } 100 101 /** 102 * Creates a org.geotools.coverage.grid.GridCoverage2D from a given file. 103 * 104 * @param file 105 * @return 106 * @throws IOException 107 * @throws Exception 108 */ 109 public static GridCoverage2D createGridFromFile(File file, CoordinateReferenceSystem refSys) throws IOException{ 110 111 GridCoverage2D coverage = null; 112 113 if (!file.exists()) throw new FileNotFoundException("File not found."); 114 115 String extension = null; 116 String fileNameWithoutExt = null; 117 int dotPos = file.getAbsolutePath().lastIndexOf("."); 118 extension = file.getAbsolutePath().substring(dotPos); 119 fileNameWithoutExt = file.getAbsolutePath().substring(0, dotPos); 120 121 /*------- switch for file type -----------*/ 122 if (extension.equalsIgnoreCase(".tif") 123 || extension.equalsIgnoreCase(".tiff")) 124 { 125 126 // try to read GeoTIFF: 127 try{ 128 coverage = readGeoTiff(file, refSys); 129 return coverage; 130 }catch (DataSourceException dse) { 131 if(!dse.getMessage().contains("Coordinate Reference System is not available")){ 132 dse.printStackTrace(); 133 } 134 } catch (FactoryException facte) { 135 logger.fatal("Error while reading from GeoTIFF:", facte); 136 throw new IOException(facte); 137 } 138 139 // file is no GeoTiff, searching for Worldfile and projection file: 140 String[] postfixes = {"wld", "tfw", "tifw"}; 141 // try to read Worldfile: 142 WorldFileReader tfwReader = null; 143 for (int i = 0; i < postfixes.length; i++) { 144 File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]); 145 if(prjFile.exists()){ 146 tfwReader = new WorldFileReader(prjFile); 147 } 148 } 149 if(tfwReader == null){ 150 throw new IOException("No Worldfile found."); 151 } 152 153 if(refSys == null){ 154 // if no crs is delivered try to read projection file: 155 refSys = readPrjFile(file); 156 if(refSys == null) throw new IOException("No projection file found."); 157 } 158 159 BufferedImage img = ImageIO.read(file); 160 161 // create Envelope 162 double width = (double) (img.getWidth() * tfwReader.getXPixelSize()); 163 double height = (double) (img.getHeight() * (-tfwReader.getYPixelSize())); 164 double lowerLeft_x = (double) tfwReader.getXULC(); 165 double lowerLeft_y = (double) tfwReader.getYULC() - height; 166 Envelope2D bbox = new Envelope2D(null, new Rectangle2D.Double(lowerLeft_x, lowerLeft_y, width, height)); 167 168 coverage = createGridCoverage(img, bbox, refSys); 169 170 } 171 // 172 else if (extension.equalsIgnoreCase(".jpg") 173 || extension.equalsIgnoreCase(".jpeg")) 174 { 175 String[] postfixes = {"wld", "jgw", "jpgw"}; 176 // try to read Worldfile: 177 WorldFileReader tfwReader = null; 178 for (int i = 0; i < postfixes.length; i++) { 179 File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]); 180 if(prjFile.exists()){ 181 tfwReader = new WorldFileReader(prjFile); 182 } 183 } 184 if(tfwReader == null) throw new IOException("No Worldfile found."); 185 186 if(refSys == null){ 187 // if no crs is delivered try to read projection file: 188 refSys = readPrjFile(file); 189 if(refSys == null) throw new IOException("No projection file found."); 190 } 191 192 BufferedImage img = ImageIO.read(file); 193 194 // create Envelope 195 double width = (double) (img.getWidth() * tfwReader.getXPixelSize()); 196 double height = (double) (img.getHeight() * (-tfwReader.getYPixelSize())); 197 double lowerLeft_x = (double) tfwReader.getXULC(); 198 double lowerLeft_y = (double) tfwReader.getYULC() - height; 199 Envelope2D bbox = new Envelope2D(null, new Rectangle2D.Double(lowerLeft_x, lowerLeft_y, width, height)); 200 201 coverage = createGridCoverage(img, bbox, refSys); 202 203 } 204 else if(extension.equalsIgnoreCase(".bmp")) 205 { 206 String[] postfixes = {"wld", "bmpw", "bpw"}; 207 // try to read Worldfile: 208 WorldFileReader tfwReader = null; 209 for (int i = 0; i < postfixes.length; i++) { 210 File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]); 211 if(prjFile.exists()){ 212 tfwReader = new WorldFileReader(prjFile); 213 } 214 } 215 if(tfwReader == null) throw new IOException("No Worldfile found."); 216 217 if(refSys == null){ 218 // if no crs is delivered try to read projection file: 219 refSys = readPrjFile(file); 220 if(refSys == null) throw new IOException("No projection file found."); 221 } 222 223 BufferedImage img = ImageIO.read(file); 224 225 // create Envelope 226 double width = (double) (img.getWidth() * tfwReader.getXPixelSize()); 227 double height = (double) (img.getHeight() * (-tfwReader.getYPixelSize())); 228 double lowerLeft_x = (double) tfwReader.getXULC(); 229 double lowerLeft_y = (double) tfwReader.getYULC() - height; 230 Envelope2D bbox = new Envelope2D(null, new Rectangle2D.Double(lowerLeft_x, lowerLeft_y, width, height)); 231 232 coverage = createGridCoverage(img, bbox, refSys); 233 } 234 else if(extension.equalsIgnoreCase(".png")) 235 { 236 237 String[] postfixes = {"wld", "pgw", "pngw"}; 238 // try to read Worldfile: 239 WorldFileReader tfwReader = null; 240 for (int i = 0; i < postfixes.length; i++) { 241 File prjFile = new File(fileNameWithoutExt + "." + postfixes[i]); 242 if(prjFile.exists()){ 243 tfwReader = new WorldFileReader(prjFile); 244 } 245 } 246 if(tfwReader == null) throw new IOException("No Worldfile found."); 247 248 if(refSys == null){ 249 // if no crs is delivered try to read projection file: 250 refSys = readPrjFile(file); 251 if(refSys == null) throw new IOException("No projection file found."); 252 } 253 254 BufferedImage img = ImageIO.read(file); 255 256 // create Envelope 257 double width = (double) (img.getWidth() * tfwReader.getXPixelSize()); 258 double height = (double) (img.getHeight() * (-tfwReader.getYPixelSize())); 259 double lowerLeft_x = (double) tfwReader.getXULC(); 260 double lowerLeft_y = (double) tfwReader.getYULC() - height; 261 Envelope2D bbox = new Envelope2D(null, new Rectangle2D.Double(lowerLeft_x, lowerLeft_y, width, height)); 262 263 coverage = createGridCoverage(img, bbox, refSys); 264 } 265 else{ 266 throw new IOException("Image type not supported. Supported formats are: \n" + 267 Arrays.toString(SUPPORTEDIMAGETYPES.values())); 268 } 269 270 return coverage; 271 } 272 273 /** 274 * Searches for a projection file (.prj) with the same name of 'file' 275 * tries to parse it. 276 * 277 * 278 * @param file image file, not the real world file (will be searched) 279 * @return 280 * @throws IOException 281 */ 282 public static CoordinateReferenceSystem readPrjFile(File file) throws IOException 283 { 284 285 CoordinateReferenceSystem refSys = null; 286 287 String prjFilename = null; 288 int dotPos = file.getAbsolutePath().lastIndexOf("."); 289 prjFilename = file.getAbsolutePath().substring(0, dotPos) + ".prj"; 290 291 File prjFile = new File(prjFilename); 292 if(!prjFile.exists()) throw new IOException("No projection file found (.prj) for image '" + file.getName() + "'"); 293 logger.debug("Loading .prj file: " + prjFile.getAbsolutePath()); 294 295 StringBuilder sb = new StringBuilder(); 296 String content = null; 297 BufferedReader br = new BufferedReader(new FileReader(prjFile)); 298 while((content = br.readLine()) != null) 299 { 300 sb.append(content); 301 } 302 303 try { 304 refSys = CRS.parseWKT(sb.toString().trim()); 305 } catch (FactoryException e) { 306 throw new IOException("Unable to parse prj-file: '" + prjFile.getName() + "'"); 307 } 308 309 return refSys; 310 311 } 312 313 314 /** 315 * Method for external use. 316 * 317 * @param img 318 * @param bbox 319 * @param crs 320 * @return 321 */ 322 public static GridCoverage2D createGridCoverage(BufferedImage img, Envelope2D bbox, CoordinateReferenceSystem crs) 323 { 324 bbox.setCoordinateReferenceSystem(crs); 325 return new GridCoverageFactory().create("", img, bbox); 326 } 327 328 /** 329 * Method for reading a GeoTIFF file. 330 * 331 * @param file 332 * @param refSys if delivered, the coverage will be forced to use this crs 333 * @return 334 * @throws IOException 335 * @throws FactoryException 336 */ 337 public static GridCoverage2D readGeoTiff(File file, CoordinateReferenceSystem refSys) throws IOException, FactoryException 338 { 339 GridCoverage2D coverage = null; 340 Hints hints = new Hints(); 341 if(refSys != null) 342 { 343 hints.put(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, refSys); 344 345 } 346 // dont't use the EPSG-Factory because of wrong behaviour 347 hints.put(Hints.CRS_AUTHORITY_FACTORY, CRS.getAuthorityFactory(true)); 348 349 GeoTiffReader reader = new GeoTiffReader(file, hints); 350 351 coverage = (GridCoverage2D) reader.read(null); 352 353 return coverage; 354 } 355 356 357 /** 358 * Loads CRS data from an EPSG database and creates descrptions for each one. 359 * 360 * @param pluginProps 361 * @throws Exception 362 */ 363 public static void loadCRSData(Properties pluginProps) 364 { 365 String defaultcrsString = pluginProps.getProperty("default_crs_srid"); 366 367 crsDescriptions = new Vector<String>(); 368 Set<String> supportedCodes = CRS.getSupportedCodes("EPSG"); 369 CRSAuthorityFactory fac = CRS.getAuthorityFactory(false); 370 371 for (Iterator iterator = supportedCodes.iterator(); iterator.hasNext();) { 372 String string = (String) iterator.next(); 373 try { 374 InternationalString desc = fac.getDescriptionText("EPSG:" + string); 375 376 String description = desc.toString() + " [-EPSG:" + string + "-]"; 377 378 crsDescriptions.add(description); 379 380 if(defaultcrsString != null && defaultcrsString.equalsIgnoreCase("EPSG:" + string)){ 381 boolean isEastingFirst = Boolean.valueOf(pluginProps.getProperty("default_crs_eastingfirst")); 382 defaultSourceCRS = CRS.decode("EPSG:" + string, isEastingFirst); 383 defaultSourceCRSDescription = description; 384 } 385 } catch (NoSuchAuthorityCodeException e) { 386 if(!string.equalsIgnoreCase("WGS84(DD)")){ 387 logger.error("Error while loading EPSG data: " + e.getMessage()); 388 } 389 } catch (FactoryException e) { 390 logger.error("Error while loading EPSG data: " + e.getMessage()); 391 } 392 } 393 } 394 395 395 }
Note:
See TracChangeset
for help on using the changeset viewer.