Soyez le premier à donner votre avis sur cette source.
Snippet vu 2 851 fois - Téléchargée 3 fois
import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import javax.imageio.*; import javax.swing.*; public class LoadTuilesIGN extends JFrame { private static final boolean DEBUG = false; private static final String URL1 = "https://wxs.ign.fr/an7nvfzojv5wa96dsga5nk8w/geoportail/wmts?layer=GEOGRAPHICALGRIDSYSTEMS.MAPS&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fjpeg&TileMatrix=" ; private static final String URL2 = "&TileRow=" ; private static BufferedImage image ; private final JButton btnplus, btnmoins, btwplus, btwmoins, btsplus, btsmoins, bteplus, btemoins ; private static final short hauteurtuile = 256 ; private static final short largeurtuile = 256 ; private static int[] tuileNum = new int [4] ; private static final short irangsup = 0 ; // indice ds tuileNum du N° de tuile de la rangée supérieure private static final short icolgauche = 1 ; private static final short iranginf = 2 ; // indice ds tuileNum du N° de tuile de la rangée supérieure private static final short icoldroite = 3 ; private static final double RADIUS_MAJOR = 6378137.0; @FunctionalInterface private interface xAxisProjectionSphericalMercator {double convertir(double longin);} private static xAxisProjectionSphericalMercator maxAxisProjectionSphericalMercator = longin -> Math.toRadians(longin) * RADIUS_MAJOR ; @FunctionalInterface private interface yAxisProjectionSphericalMercator {double convertir(double latin);} private static final yAxisProjectionSphericalMercator mayAxisProjectionSphericalMercator = latin -> Math.log(Math.tan(Math.PI / 4 + Math.toRadians(latin) / 2)) * RADIUS_MAJOR ; private static final short arglon = 1, arglat = 2, argmat = 3 ; private JScrollPane pancarte ; // panneau image private ImageIcon imcarte = new ImageIcon (); private static int rwidth, rheight ; // taille JFrame private static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); private static int nbTuilesHaut, nbTuilesLarg ; // ns de tuiles en H et V private static String defargs[] = {"Plainfaing.png", "7.014816999999994", "48.17267500000001", "15"} ; private static final int IndRESOLUTION = 0, IndTopLeftCornerX0 = 1, IndTopLeftCornerY0 = 2 ; // indice ds TabMatrix donnant la col pour la Résolution (m/px) private static final double TabMatrix[][] = { // info relatives au zoom : 1ère col : résolutions telles qu'indiquées en [https://geoservices.ign.fr/documentation/geoservices/wmts.html#rsolutions-et-chelles-en-webmercator-sphrique] {156543.0339280410}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {4.7773142678, -20037508.3427892476320267, 20037508.3427892476320267}} ; public LoadTuilesIGN (String nomfichier) { super ("Géoportail crawler V0.91") ; final File outputfile = new File(nomfichier); final String filetype = nomfichier.substring(nomfichier.lastIndexOf(".") + 1) ; addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { try { // retrieve image ImageIO.write(image, (filetype.equals("*.jpg,*.JPG") || filetype.equals("*.png,*.PNG") || filetype.equals("*.gif,*.GIF") || filetype.equals("*.jpeg,*.JPEG") || filetype.equals("*.bmp,*.BMP")) ? ".jpg" : filetype, outputfile); } catch (IOException ew) { ew.printStackTrace(); } System.exit(0); } }); rwidth = Math.min(screenSize.width, largeurtuile * (tuileNum[icoldroite] - tuileNum[icolgauche] + 1)) ; rheight = Math.min(screenSize.height, hauteurtuile * (tuileNum[iranginf] - tuileNum[irangsup] + 1)) ; if (DEBUG) System.out.println( "*** DEBUG *** LoadTuilesIGN, rwidth="+rwidth+", rheight="+rheight); Construimage ( ) ; setPreferredSize(new Dimension(rwidth, rheight)); setLocation (50,50) ; pancarte = new JScrollPane(new JLabel(imcarte)) ; getContentPane().add(pancarte, BorderLayout.CENTER ) ; Box Panboun = Box.createHorizontalBox() ; btnplus = new JButton ("+") ; btnplus.setPreferredSize(new Dimension(rwidth/5,15)); btnplus.addActionListener(new btnListener(irangsup, -1)); Panboun.add(btnplus) ; btnmoins = new JButton ("-") ; btnmoins.setPreferredSize(new Dimension(rwidth/5,15)); btnmoins.addActionListener(new btnListener(irangsup, 1)); Panboun.add(btnmoins) ; getContentPane().add(Panboun, BorderLayout.NORTH ) ; Box Panbouw = Box.createVerticalBox() ; btwmoins = new JButton () ; Verticalize (btwmoins, "-", false) ; btwmoins.setPreferredSize(new Dimension(15,rheight/5)); btwmoins.addActionListener(new btnListener(icolgauche, 1)); Panbouw.add(btwmoins) ; btwplus = new JButton () ; Verticalize (btwplus, "+", false) ; btwplus.setPreferredSize(new Dimension(15,rheight/5)); btwplus.addActionListener(new btnListener(icolgauche, -1)); Panbouw.add(btwplus) ; getContentPane().add(Panbouw, BorderLayout.WEST ) ; Box Panbous = Box.createHorizontalBox() ; btsmoins = new JButton ("-") ; btsmoins.setPreferredSize(new Dimension(rwidth/5,15)); btsmoins.addActionListener(new btnListener(iranginf, -1)); Panbous.add(btsmoins) ; btsplus = new JButton ("+") ; btsplus.setPreferredSize(new Dimension(rwidth/5,15)); btsplus.addActionListener(new btnListener(iranginf, 1)); Panbous.add(btsplus) ; getContentPane().add(Panbous, BorderLayout.SOUTH ) ; Box Panboue = Box.createVerticalBox() ; bteplus = new JButton () ; Verticalize (bteplus, "+", true) ; bteplus.setPreferredSize(new Dimension(15,rheight/5)); bteplus.addActionListener(new btnListener(icoldroite, 1)); Panboue.add(bteplus) ; btemoins = new JButton () ; Verticalize (btemoins, "-", true) ; btemoins.setPreferredSize(new Dimension(15,rheight/5)); btemoins.addActionListener(new btnListener(icoldroite, -1)); Panboue.add(btemoins) ; getContentPane().add(Panboue, BorderLayout.EAST ) ; pack() ; setVisible(true) ; } public class btnListener implements ActionListener { private int incrément ; // valeur de l'incrément private short tuind ; // index ds "tuileNum" N° de rangée ou de col de tuile à incrémenter /** * constructeur de btnListener * @param incrément * la valeur à incrémenter (+1 ou -1) * @param tuind * N° de rangée ou de col de tuile à incrémenter */ public btnListener (short tuind, int incrément) { this.incrément = incrément ; this.tuind = tuind ; } // fin de btnListener public void actionPerformed(ActionEvent e) { if (DEBUG) System.out.println( "*** DEBUG *** btnListener::actionPerformed, tuileNum["+tuind+"] = "+tuileNum[tuind]+", incrément = "+incrément); tuileNum[tuind] = tuileNum[tuind] + incrément ; Construimage ( ) ; if (tuileNum[icolgauche] == tuileNum[icoldroite]) { btwmoins.setVisible(false); btemoins.setVisible(false); } else { btwmoins.setVisible(true); btemoins.setVisible(true); } if (tuileNum[irangsup] == tuileNum[iranginf]) { btnmoins.setVisible(false); btsmoins.setVisible(false); } else { btnmoins.setVisible(true); btsmoins.setVisible(true); } pancarte.repaint(); pack() ; } } static void Verticalize (JButton btn, String caption, boolean clockwise) { Font f = btn.getFont (); FontMetrics fm = btn.getFontMetrics (f); int captionHeight = fm.getHeight (); int captionWidth = fm.stringWidth (caption); BufferedImage bi = new BufferedImage (captionHeight + 4, captionWidth + 4, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D) bi.getGraphics (); g.setColor (new Color (0, 0, 0, 0)); // transparent g.fillRect (0, 0, bi.getWidth (), bi.getHeight ()); g.setColor (btn.getForeground ()); g.setFont (f); g.setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); if (clockwise) { g.rotate (Math.PI / 2); } else { g.rotate (- Math.PI / 2); g.translate (-bi.getHeight (), bi.getWidth ()); } g.drawString (caption, 2, -6); Icon icon = new ImageIcon (bi); btn.setIcon (icon); btn.setMargin (new Insets (15, 2, 15, 2)); btn.setActionCommand (caption); } private void Construimage () { image = new BufferedImage (largeurtuile * (tuileNum[icoldroite] - tuileNum[icolgauche] + 1), hauteurtuile * (tuileNum[iranginf] - tuileNum[irangsup] + 1), BufferedImage.TYPE_INT_RGB) ; if (DEBUG) System.out.println( "*** DEBUG *** Construimage, largeur image="+image.getWidth()+", hauteur d'image="+image.getHeight()+", tuileNum[irangsup]= "+tuileNum[irangsup]+", tuileNum[icolgauche]= "+tuileNum[icolgauche]+", tuileNum[iranginf]= "+tuileNum[iranginf]+", tuileNum[icoldroite]= "+tuileNum[icoldroite]); Graphics g = image.getGraphics(); BufferedImage tuile = null ; for (int r = tuileNum[irangsup] ; r <= tuileNum[iranginf] ; r++) // pour chaque rangée for (int c = tuileNum[icolgauche] ; c <= tuileNum[icoldroite] ; c++) { // pour chaque colonne try { HttpURLConnection httpcon = (HttpURLConnection) (new URL(URL1+defargs[argmat]+URL2+ String.valueOf(r) + "&TileCol=" + String.valueOf(c) )).openConnection(); httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 Gecko/20100101"); // contourne l'erreur 403 InputStream in = httpcon.getInputStream() ; tuile = ImageIO.read(in); tuile.addTileObserver(null) ; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } g.drawImage(tuile, largeurtuile * (c - tuileNum[icolgauche]), hauteurtuile * (r - tuileNum[irangsup]), null); } // pour chaque colonne imcarte.setImage(image) ; if (DEBUG) System.out.println( "*** DEBUG *** Construimage, largeur imageIcon="+imcarte.getIconWidth()+", hauteur d'imageIcon="+imcarte.getIconHeight()); } // Construimage public static void main(String[] args) { // méthode principale /** Le premier argument donne le nom de l'image qui sera créée en sortie de programme * et les 2 arguments suivants donnent les coordonnées (longitude et latitude) du point central de la carte, * et le dernier donne le niveau de zoom de la carte résultante (pour l'instant seul 15 est implémenté) * Ex Plainfaing.png 7.014816999999994 48.17267500000001 15 * args[0] : fichier image en sortie * args[1] : longitude en degrés décimaux (DD) du point central de la carte * args[2] : latitude en degrés décimaux (DD) du point central de la carte * args[3] : niveau de zoom (pour l'instant seul 15 est implémenté) * Algorithme * 1 Si l'utilisateur a donné des arguments sur la ligne de commande alors remplacer les arg par défault par ces derniers * 2 forcer le niveau de zoom à 15 * 3 calculer l'espace disponible ds l'écran d'affichage et en déduire les nbs de tuiles affichables * 4 calculer les rang et col de tuiles selon l'algorithme donné en [https://geoservices.ign.fr/documentation/geoservices/wmts.html#rsolutions-et-chelles-en-webmercator-sphrique] */ if (args.length == 4) defargs = args ; // des arguments sont là // les arguments n'étaient pas là if (Short.valueOf(defargs[argmat]) < 15 || Short.valueOf(defargs[argmat]) > 15) defargs[argmat] = "15" ; if (DEBUG) System.out.println( "*** DEBUG *** main, nom = "+defargs[0]+", longitude = "+defargs[arglon]+", latitude = "+defargs[arglat]+", defargs[argmat] = "+defargs[argmat]+", IndRESOLUTION = "+IndRESOLUTION+", TabMatrix[0][0] = "+TabMatrix[0][0]); nbTuilesHaut = screenSize.height / hauteurtuile ; nbTuilesLarg = screenSize.width / largeurtuile ; if (DEBUG) System.out.println( "*** DEBUG *** main, screenSize.height = "+screenSize.height+", screenSize.width = "+screenSize.width+ ", nbTuilesHaut = "+nbTuilesHaut +", nbTuilesLarg = "+nbTuilesLarg); tuileNum[irangsup] = (int) ((TabMatrix[Short.valueOf(defargs[argmat])][IndTopLeftCornerY0] - mayAxisProjectionSphericalMercator.convertir(Double.valueOf(defargs[arglat])))/(TabMatrix[15][IndRESOLUTION] * hauteurtuile)) - nbTuilesHaut/2; tuileNum[iranginf] = tuileNum[irangsup] + nbTuilesHaut ; tuileNum[icolgauche] = (int) ((maxAxisProjectionSphericalMercator.convertir(Double.valueOf(defargs[arglon]))-TabMatrix[Short.valueOf(defargs[argmat])][IndTopLeftCornerX0])/(TabMatrix[15][IndRESOLUTION] * hauteurtuile)) - nbTuilesLarg/2; tuileNum[icoldroite] = tuileNum[icolgauche] + nbTuilesLarg ; if (DEBUG) System.out.println( "*** DEBUG *** main, tuileNum[irangsup] = "+tuileNum[irangsup]+", tuileNum[icolgauche] = "+tuileNum[icolgauche]+", tuileNum[iranginf] = "+tuileNum[iranginf]+", tuileNum[icoldroite] = "+tuileNum[icoldroite]); SwingUtilities.invokeLater(new Runnable() { public void run() { new LoadTuilesIGN (defargs[0]) ; } }); } // méthode principale }*
3 mars 2019 à 11:33
3 mars 2019 à 08:30
3 mars 2019 à 00:05
Modifié le 27 déc. 2018 à 11:13
Plutot que de poster 2 sources. Tu aurais pu mettre l’autre à jour.
Et tant que tu y es, ajouter la coloration syntaxique histoire que ce soit lisible.
Voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
27 déc. 2018 à 08:15
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.