Skip to content
Snippets Groups Projects
Select Git revision
  • master default
  • issue-13-gpx
  • issue-10-fxmapcontrol
  • issue-9-file-menu
4 results

BingMapsTileLayer.java

Blame
  • Forked from tdt4140-staff / examples
    22 commits behind the upstream repository.
    BingMapsTileLayer.java 3.11 KiB
    /*
     * FX Map Control - https://github.com/ClemensFischer/FX-Map-Control
     * © 2016 Clemens Fischer
     */
    package fxmapcontrol;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.w3c.dom.DOMException;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    /**
     * Displays Bing Maps tiles. The static apiKey property must be set to a Bing Maps API Key.
     */
    public class BingMapsTileLayer extends MapTileLayer {
    
        public enum MapMode {
            Road, Aerial, AerialWithLabels
        }
    
        private static String apiKey;
        private final MapMode mapMode;
    
        public BingMapsTileLayer(MapMode mode) {
            this(new TileImageLoader(), mode);
        }
    
        public BingMapsTileLayer(ITileImageLoader tileImageLoader, MapMode mode) {
            super(tileImageLoader);
    
            mapMode = mode;
    
            if (apiKey == null || apiKey.isEmpty()) {
                Logger.getLogger(BingMapsTileLayer.class.getName()).log(Level.SEVERE, "BingMapsTileLayer requires a Bing Maps API Key.");
    
            } else {
                try {
                    String url = String.format("http://dev.virtualearth.net/REST/V1/Imagery/Metadata/%s?output=xml&key=%s", mapMode.toString(), apiKey);
                    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new URL(url).openStream());
    
                    Element metadataElement = (Element) document.getElementsByTagName("ImageryMetadata").item(0);
                    Element imageUrlElement = (Element) metadataElement.getElementsByTagName("ImageUrl").item(0);
                    Element subdomainsElement = (Element) metadataElement.getElementsByTagName("ImageUrlSubdomains").item(0);
                    Element zoomMinElement = (Element) metadataElement.getElementsByTagName("ZoomMin").item(0);
                    Element zoomMaxElement = (Element) metadataElement.getElementsByTagName("ZoomMax").item(0);
    
                    NodeList subdomainStrings = subdomainsElement.getElementsByTagName("string");
                    String[] subdomains = new String[subdomainStrings.getLength()];
    
                    for (int i = 0; i < subdomains.length; i++) {
                        subdomains[i] = subdomainStrings.item(i).getTextContent();
                    }
    
                    setName("Bing Maps " + mapMode);
                    setTileSource(new BingMapsTileSource(imageUrlElement.getTextContent(), subdomains));
                    setMinZoomLevel(Integer.parseInt(zoomMinElement.getTextContent()));
                    setMaxZoomLevel(Integer.parseInt(zoomMaxElement.getTextContent()));
    
                } catch (IOException | ParserConfigurationException | SAXException | DOMException ex) {
                    Logger.getLogger(BingMapsTileLayer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    
        public static String getApiKey() {
            return apiKey;
        }
    
        public static void setApiKey(String key) {
            apiKey = key;
        }
    
        public final MapMode getMapMode() {
            return mapMode;
        }
    }