📄 mapmerger.java
字号:
/** * A class representing a map, as a group of services. It provides methods * to add / remove services, and to set and change the bounding box. * * @author Stefano Giaccio, Emanuele Tajariol * */package org.wfp.vam.intermap.kernel.map;import java.util.*;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.text.DecimalFormat;import org.jdom.Element;import org.wfp.vam.intermap.http.ConcurrentHTTPTransactionHandler;import org.wfp.vam.intermap.http.cache.HttpGetFileCache;import org.wfp.vam.intermap.kernel.GlobalTempFiles;import org.wfp.vam.intermap.kernel.map.images.ImageMerger;import org.wfp.vam.intermap.kernel.map.mapServices.BoundingBox;import org.wfp.vam.intermap.kernel.map.mapServices.MapService;public class MapMerger{ private static HttpGetFileCache cache; private static float defaultDPI = 96f; private float dpi = -1f; private BoundingBox bBox = new BoundingBox(); // Image extent private Map<Integer, Layer> _layers = new HashMap<Integer, Layer>(); private List<Integer> vRank = new ArrayList<Integer>(); // Service rank private int nextId = 1; private int activeServiceId; private String imageName = null; // The name of the merge image file private String imagePath = null; // The path of the merge image file private float degScale; // The map scale private float distScale; // The map scale private Map<Integer,String> htErrors = new Hashtable<Integer,String>(); private boolean reaspectWms = true; public static void setCache(HttpGetFileCache cache) { MapMerger.cache = cache; } public static void setDefaultDPI(float dpi) { defaultDPI = dpi; } public void setDPI(float dpi) { this.dpi = dpi; } public float getDPI() { return dpi==-1f ? defaultDPI : dpi; } public void reaspectWms(boolean reaspect) { this.reaspectWms = reaspect; }; /** Sets the Map BoundingBox */ public void setBoundingBox(BoundingBox bb) { bBox = bb; } /** Returns the Map BoudingBox */ public BoundingBox getBoundingBox() { return bBox; } /** Sets the active layer inside a given servce */ public void setActiveLayer(int service, int layer) throws Exception {// if (! htServices.containsKey(new Integer(service))) if (! _layers.containsKey(service)) throw new Exception(""); activeServiceId = service; getService(service).setActiveLayer(layer); } /** Returns the active service id */ public int getActiveServiceId() { return activeServiceId; } /** Returns the active Layer id */ public int getActiveLayerId() {// System.out.println("this: " + this);// System.out.println("getActiveServiceId: " + getActiveServiceId());// System.out.println("getActiveLayer: " + getService(getActiveServiceId()).getActiveLayer()); return getService(getActiveServiceId()).getActiveLayer(); } /** Adds a service on the top * * @return the id given to the service * */ public int addService(MapService service) {// System.out.println("service: " + service); // DEBUG if ( _layers.isEmpty() ) activeServiceId = nextId; Integer id = new Integer(nextId++); Layer layer = new Layer(service); _layers.put(id, layer); vRank.add(0, id); return id.intValue();// System.out.println("htServices: " + htServices); // DEBUG } /** Removes the service with the given id */ public void delService(int id) throws Exception { _layers.remove(id); vRank.remove(new Integer(id)); // be careful: we're removing the id object (Integer); an int would be used as index if (activeServiceId == id) if (vRank.size() > 0) { activeServiceId = vRank.get(0).intValue(); getService(activeServiceId).setActiveLayer(1); } else { activeServiceId = -1; } } /** Moves a service up */ public void moveServiceUp(int id) { Integer t = new Integer(id); int pos = vRank.indexOf(t); if (pos > 0) { vRank.remove(t); vRank.add(pos - 1, t); } } /** Moves a service down */ public void moveServiceDown(int id) { Integer t = new Integer(id); int pos = vRank.indexOf(t); if (pos < vRank.size() - 1) { vRank.remove(t); vRank.add(pos + 1, t); } } public void setServicesOrder(int[] order) { vRank.clear(); for (int i = 0 ; i < order.length; i++) vRank.add(new Integer(order[i])); } public Element toElementSimple() { Element elServices = new Element("services"); // Add each contained service to the elServices, ordered by vRank for (int idx: vRank) { Layer layer = _layers.get(idx); MapService s = layer.getService(); String legend = null; try { legend = s.getLegendUrl(); } catch (Exception e) {} Element eLayer = new Element("layer") .setAttribute("id", idx + "") .setAttribute("title", "" + s.getTitle()) .setAttribute("type", "" + s.getType()) .setAttribute("transparency", "" + layer.getIntTransparency()); if(legend != null) eLayer.setAttribute("legend", legend); elServices.addContent(eLayer); } return elServices; } /** Converts this object to a JDOM Element */ public Element toElement() { Element elServices = new Element("services"); // Add each contained service to the elServices, ordered by vRank// for (int i = 0; i < vRank.size(); i++) {// MapService s = (MapService)htServices.get(vRank.get(i));//// elServices.addContent(s.toElement()// .setAttribute("id", vRank.get(i) + ""));// } for (int id: vRank) { MapService s = _layers.get(id).getService(); elServices.addContent(s.toElement() .setAttribute("id", id + "")); } DecimalFormat df = new DecimalFormat("0.0000000000"); elServices.addContent( new Element("activeLayer") .setAttribute("service", "" + activeServiceId) .setAttribute("layer", "" + getActiveLayerId()) ) .addContent(new Element("degScale").setText(df.format(degScale))) .addContent(new Element("distScale").setText(df.format(distScale) + "")) .addContent(bBox.toElement()) .addContent(getStructTransparencies()) .addContent(getStructExpanded()) .addContent(getErrors()); return elServices; } public Iterable<Layer> getLayers() { return new Iterable<Layer>() { public Iterator<Layer> iterator() { return new Iterator<Layer>() { private int i = 0; private int last = vRank.size(); public boolean hasNext() { return i<last; } public Layer next() { return _layers.get(vRank.get(i++)); } public void remove() { throw new UnsupportedOperationException();} }; } }; } /** Returns an Element containing the transparency value for each service */ public Element getStructTransparencies() { Element elTransparency = new Element("transparency"); for(Integer id: _layers.keySet()) { Layer layer = _layers.get(id); elTransparency.addContent( new Element("service") .setAttribute("id", id.toString()) .setAttribute("transparency", ""+layer.getIntTransparency()) .setAttribute("name", layer.getService().getName() )); } return elTransparency; } /** Returns the transparency of a given layer */ public int getLayerTransparency(int id) { return _layers.get(id).getIntTransparency(); } public int getLayerTransparencyRanked(int id) { return _layers.get(vRank.get(id)).getIntTransparency(); } /** Sets the transparency value for a given service */ public void setTransparency(int id, float transparency) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); _layers.get(id).setTransparency(transparency); } /** Expands a service in the layer frame (used for ArcIMS services only) */ public void expandService(int id) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); _layers.get(id).setExpanded(true); } /** Collapses a service in the layer frame (used for ArcIMS services only) */ public void collapseService(int id) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); _layers.get(id).setExpanded(false); } /** ??? Expands a service in the layer frame (used for ArcIMS services only) */ public void showService(int id) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); _layers.get(id).setVisible(true); } /** ??? Collapses a service in the layer frame (used for ArcIMS services only) */ public void hideService(int id) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); _layers.get(id).setVisible(false); } public boolean toggleVisibility(int id) throws Exception { if ( ! _layers.containsKey(id)) throw new Exception("Illegal service id"); boolean newVis = ! _layers.get(id).isVisible(); _layers.get(id).setVisible(newVis); return newVis; } /** Get error messages from the remote servers */ public Element getErrors() { Element errors = new Element("errors"); for(Integer id: htErrors.keySet() ) { errors.addContent( new Element("layer") .setAttribute("id", id.toString()) .setAttribute("message", htErrors.get(id)) ); } return errors; } /** Returns number of map services contained */ public int size() { return _layers.size(); } /** Returns an Enumeration containing all the services */ public Iterable<MapService> getServices() { return new Iterable<MapService>() { public Iterator<MapService> iterator() { return new Iterator<MapService>() { private Iterator<Layer> _layerIterator = _layers.values().iterator(); public boolean hasNext() { return _layerIterator.hasNext(); } public MapService next() { return _layerIterator.next().getService(); } public void remove() { throw new UnsupportedOperationException();} }; } }; } /** Returns the MapService element with the given id*/ public MapService getService(int id) { return _layers.get(id).getService(); } public MapService getServiceRanked(int rank) { return _layers.get(vRank.get(rank)).getService(); }// public MapService getService(int id) { return (MapService)htServices.get(new Integer(id)); }// public boolean isVisible(int id) { return _layers.get(id).isVisible(); } public boolean isVisibleRanked(int rank) { return _layers.get(vRank.get(rank)).isVisible(); } /** Returns an element containing informations about the expanded or collapsed * services */ private Element getStructExpanded() { Element expanded = new Element("expandedServices"); for(Integer id: _layers.keySet()) { Layer layer = _layers.get(id); expanded.addContent(new Element("service") .setAttribute("id", id.toString()) .setAttribute("expanded", layer.isExpanded()? "true" : "false")); } return expanded; } private void buildWmsRequests(int width, int height) {// if (reaspectWms) bBox = reaspect(bBox, width, height); // reaspect the bounding box if no ArcIMS service did it////// MapService prevService = (MapService)htServices.get(vRank.get(0));// MapService prevService = _layers.get(vRank.get(0)).getService();// if (vRank.size() == 1)// {// try { vImageUrls.add(prevService.getImageUrl(bBox, width, height)); }// catch (Exception e) { e.printStackTrace(); /* DEBUG */ }// return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -