Select Git revision
BingMapsTileLayer.java
Forked from
tdt4140-staff / examples
22 commits behind the upstream repository.
-
Hallvard Trætteberg authoredHallvard Trætteberg authored
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;
}
}