|
From: Artur H. <ko...@us...> - 2001-11-21 13:48:23
|
Update of /cvsroot/geotools/geotools/src/uk/ac/leeds/ccg/raster
In directory usw-pr-cvs1:/tmp/cvs-serv13012/uk/ac/leeds/ccg/raster
Modified Files:
ImageLayer.java
Log Message:
Added support for creating ImageLayer with InputStream as image data source and full support for downaloding map data from WMS with jprotocols package
Index: ImageLayer.java
===================================================================
RCS file: /cvsroot/geotools/geotools/src/uk/ac/leeds/ccg/raster/ImageLayer.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** ImageLayer.java 2001/10/26 06:16:47 1.27
--- ImageLayer.java 2001/11/21 13:48:19 1.28
***************
*** 23,333 ****
* <a href="mailto:ia...@ge...">i.t...@ge...</a>
* @author <a href="mailto:ca...@sh...">Cameron Shorter</a>
*/
public class ImageLayer extends uk.ac.leeds.ccg.geotools.SimpleLayer implements Runnable
{
! /* Stores all informatation about an image and it's geographic reference */
! private Image image = null;
! private GeoRectangle bbox = null;
! private MediaTracker tracker;
! private int myID = 1;
! private final static boolean DEBUG=false;
! private Canvas obs = new Canvas();
! private Toolkit tk;
! private URL src;
! private Thread thread;
! public ImageLayer(URL source,GeoRectangle bounds){
! if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.raster.ImageLayer constructed. Will identify itself as IL-->");
! changeImage(source,bounds);
! }
! public ImageLayer(Image image,GeoRectangle bounds){
bbox = bounds;
! this.image = image;
! tracker = new MediaTracker(new Frame());
! tracker.addImage(this.image,0);
! this.setStatus(Layer.COMPLETED);
! }
! /** Change the image and extent for the layer. */
! public void changeImage(URL source,GeoRectangle bounds){
! this.src=source;
! //if (DEBUG) System.out.println("ImageLayer.changeImage= "+src);
! this.bbox=bounds;
! setStatus(Layer.LOADING);
! thread = new Thread(this);
! thread.setPriority(Thread.MIN_PRIORITY);
! thread.start();
! return;
! }
! /** Change the image and but not the extent. */
! public void changeImage(URL source){
! changeImage(
! source,
! this.bbox);
! }
! /** Change the extent of the image */
! public void changeExtent(GeoRectangle bounds){
! this.bbox = bounds;
! this.notifyLayerChangedListeners(LayerChangedEvent.GEOGRAPHY);
! }
! public GeoRectangle getBounds()
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return this.bbox;
! }
! public GeoRectangle getBoundsOf(int id[])
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return null;
! }
! public GeoRectangle getBoundsOf(int id)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return null;
! }
! public int getID(GeoPoint p)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return 0;
! }
! public int getID(double x, double y)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return 0;
! }
! public void paintHighlight(Graphics g, Scaler scale, int id, ShadeStyle style)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! }
! public void paintScaled(GeoGraphics gg)
! {
! // Print out a call stack
! //if(DEBUG) {
! // try {
! // throw new RuntimeException();
! // } catch (RuntimeException e) {
! // System.out.println("IL ("+this+")-->paintScaled call stack ");
! // e.printStackTrace();
! // }
! //}
! double cellSizeX = 0;
! double cellSizeY = 0;
! boolean drawn;
! Graphics g= gg.getGraphics();
! Scaler scale = gg.getScale();
! GeoRectangle gr = scale.getMapExtent();
! //if(DEBUG)System.out.println("IL-->gr "+gr);
! GeoRectangle me = getBounds();
! //if(DEBUG)System.out.println("IL-->me "+me);
! GeoRectangle out = gr.createIntersect(me);
! //if(DEBUG)System.out.println("IL-->gr "+gr+"\nme "+me+"\nout "+out);
! //if(DEBUG)System.out.println("IL-->getStatus="+this.getStatus());
! int gh,gw;
! if(DEBUG)System.out.println("IL ("+this+") -->0");
! if(out!=null){
! if(DEBUG)System.out.println("IL ("+this+") -->1");
! if(out.equals(me)){
! if(DEBUG)System.out.println("IL ("+this+") -->2 ");
! //if(DEBUG)System.out.println("IL-->No clip");
! //GeoRectangle out = bbox;
! int origin[]=scale.toGraphics(out.x,out.y);
! gh=scale.toGraphics(out.height);
! gw=scale.toGraphics(out.width);
! if(this.image!=null){
! drawn = g.drawImage(
! this.image,
! origin[0],
! origin[1]-gh,
! gw,
! gh,
! null);
! try {
! tracker.waitForID(myID);
! } catch (InterruptedException e) {
! System.out.println("IL-->Interupted while drawing");
! setStatus(Layer.ERRORED);
! return;
! }
! if(DEBUG)System.out.println("IL ("+this+") -->3 drawn="+drawn);
! }
! //if((this.getStatus()&Layer.COMPLETED)==Layer.COMPLETED){
! // if(DEBUG)System.out.println("IL ("+this+") -->4 ");
! // g.setColor(Color.red);
! // g.drawRect(origin[0]+1,origin[1]-gh-1,gw-1,gh-1);
! //}
! }
! else{
! if(DEBUG)System.out.println("IL ("+this+") -->5 ");
! if((this.getStatus()&Layer.COMPLETED)!=Layer.COMPLETED) {
! if(DEBUG)System.out.println("IL ("
! +this+") -->Layer not loaded");
! return;
! }
! //complex clip case
! MemoryImageSource source;
! cellSizeX = me.width/this.image.getWidth(
! new Frame());
! cellSizeY = me.height/this.image.getHeight(
! new Frame());
! int x,y,width,height;
! if(out.y%cellSizeY>0){
! out.y=out.y+cellSizeY-(out.y%cellSizeY);
! out.height+=cellSizeY;
! }
! // out.x=out.x-(out.x%cellSizeX);
! x=(int)Math.floor(((out.x-me.x)/cellSizeX));
! y=(int)Math.ceil(((me.y-out.y+me.height-out.height)/cellSizeY));
! width=(int)Math.ceil((out.width/cellSizeX));
! height=(int)Math.ceil(((out.height)/cellSizeY));
! // out.x=out.x-(out.x%cellSizeX);
! x=(int)Math.floor(((out.x-me.x)/cellSizeX));
! //y=(int)Math.ceil(((out.y-me.y+out.height)/cellSizeY));
! //h=(int)Math.ceil(((out.height)/cellsize));
! //mh=(int)Math.ceil(((me.height)/cellsize));
! //gh=(int)Math.ceil(((gr.height)/cellsize));
! //top=(int)Math.ceil(((out.y)/cellsize))+h;
! //mtop=(int)Math.ceil(((me.y)/cellsize))+mh;
! //y=(int)(Math.max(Math.ceil(out.y),Math.ceil(me.y))/cellSizeY);
! y=(int)Math.ceil(((me.y-out.y+me.height-out.height)/cellSizeY));
! // if(DEBUG)System.out.println("IL-->start "+x+" "+y);
! width=(int)Math.ceil((out.width/cellSizeX));
! height=(int)Math.ceil(((out.height)/cellSizeY));
! //if(DEBUG)System.out.println("IL-->w/h "+width+" "+height);
! y=Math.max(y,0);
! int[] data = new int[(height*width)];
! PixelGrabber pg = new PixelGrabber(
! this.image,
! x,
! y,
! width,
! height,
! data,
! 0,
! width);
! //if(DEBUG)System.out.println("IL-->about to grab");
! try {
! pg.grabPixels();
! } catch (InterruptedException e) {
! System.err.println("IL-->interrupted waiting for pixels!");
! return;
! }
! if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
! System.err.println("IL-->image fetch aborted or errored, status="+pg.getStatus());
! return ;
! }
! source = new MemoryImageSource(width,height,data,0,width);
! Image image2 = obs.createImage(source);
! int origin[]=scale.toGraphics(out.x,out.y);
! gh=scale.toGraphics(out.height);
! gw=scale.toGraphics(out.width);
! drawn=g.drawImage(image2,origin[0],origin[1]-gh,gw,gh,obs);
! try {
! tracker.waitForID(myID);
! } catch (InterruptedException e) {
! System.out.println("IL-->Interupted while drawing");
! setStatus(Layer.ERRORED);
! return;
! }
! if(DEBUG)System.out.println("IL ("+this+") -->5.1 drawn="+drawn);
! image2=null;
! if((this.getStatus()&Layer.COMPLETED)!=Layer.COMPLETED){
! if(DEBUG)System.out.println("IL ("+this+") -->6 ");
! g.setColor(Color.red);
! g.drawRect(origin[0],origin[1]-gh,gw,gh);
! }
! }
! }
! }
! public void run() {
! setStatus(Layer.PENDING);
! if(DEBUG) System.out.println(
! "IL--> Request image " + this.src + " " + bbox);
! // Start getting the image. If the image is .gif or .jpg then
! // use default java tools otherwise use Jimi class
! //String type="";
! //try{
! // URLConnection con = this.src.openConnection();
! // type = con.getContentType();
! //}catch(java.io.IOException ioe){
! // System.err.println("IL--> problem opening connection");
//}
! //if((type!=null) && type.startsWith("image")){
! Frame dummy = new Frame();
! Toolkit tk = Toolkit.getDefaultToolkit();
! // if(type.trim().endsWith("gif")
! // || type.trim().endsWith("jpeg")){
!
! // If a previous image was being tracked, then remove it.
! if(tracker!=null){
! tracker.removeImage(this.image);
! this.image=null;
}
! this.image = tk.getImage(this.src);
! // }else{
! // this.image = Jimi.getImage(this.src,type);
! // }
! // if(DEBUG)System.out.println(
! // "IL--> Image Width="+this.image.getWidth(dummy));
! if(tracker==null)tracker = new MediaTracker(dummy);
! tracker.addImage(this.image,++myID);
! try {
! if(DEBUG)System.out.println("IL ("+this+")-->Waiting ");
! while((tracker.statusID(myID,true)&tracker.LOADING)!=0){
! if(getStatus()==Layer.ABORTED){
! tracker.removeImage(this.image,myID);
! break;
! }
! tracker.waitForID(myID,500);
! //if(DEBUG)System.out.println("IL ("+this+")-->status loop, status="+tracker.statusID(myID,true)+" myID="+myID);
! }
! int state=tracker.statusID(myID,true);
! if((state&tracker.COMPLETE) == tracker.COMPLETE){
! if(DEBUG)System.out.println("IL ("+this+")-->Image Ready ");
! setStatus(Layer.COMPLETED);
! //setStatus() triggers a LayerChangedEvent.
! }else if(state == tracker.ABORTED){
! setStatus(Layer.ABORTED);
! if(DEBUG)System.out.println("IL ("+this+")-->Image Aborted ");
! //}else if(state == tracker.ERRORED){
! // setStatus(Layer.ERRORED);
! // if(DEBUG)System.out.println("IL ("+this+")-->Image Error ");
! }else {
! setStatus(Layer.ERRORED);
! if(DEBUG)System.out.println("IL ("+this+")-->Image Error ");
! }
! } catch (InterruptedException e) {
! System.out.println("IL ("+this+")-->Interupted ");
! setStatus(Layer.ERRORED);
! return;
}
! //} else { // not image
! // if (DEBUG) System.out.println("Image unavailable, con type= "+type);
//}
//setStatus(Layer.ERRORED);
! }
}
--- 23,386 ----
* <a href="mailto:ia...@ge...">i.t...@ge...</a>
* @author <a href="mailto:ca...@sh...">Cameron Shorter</a>
+ * @author <a href="mailto:ko...@us...">Artur Hefczyc</a>
*/
public class ImageLayer extends uk.ac.leeds.ccg.geotools.SimpleLayer implements Runnable
{
! /* Stores all informatation about an image and it's geographic reference */
! private Image image = null;
! private GeoRectangle bbox = null;
! private MediaTracker tracker;
! private int myID = 1;
! private final static boolean DEBUG=false;
! private Canvas obs = new Canvas();
! private Toolkit tk;
! private URL src = null;
! protected java.io.InputStream src_stream = null;
! private Thread thread;
! public ImageLayer(URL source,GeoRectangle bounds){
! if(DEBUG)System.out.println("---->uk.ac.leeds.ccg.raster.ImageLayer constructed. Will identify itself as IL-->");
! changeImage(source,bounds);
! }
!
! public ImageLayer(java.io.InputStream in, GeoRectangle bounds)
! {
! changeImage(in, bounds);
! }
! public ImageLayer(Image image,GeoRectangle bounds){
bbox = bounds;
! this.image = image;
! tracker = new MediaTracker(new Frame());
! tracker.addImage(this.image,0);
! this.setStatus(Layer.COMPLETED);
! }
! /** Change the image and extent for the layer. */
! public void changeImage(URL source,GeoRectangle bounds){
! this.src = source;
! this.src_stream = null;
! //if (DEBUG) System.out.println("ImageLayer.changeImage= "+src);
! changeImage(bounds);
! }
! public void changeImage(java.io.InputStream in, GeoRectangle bounds)
! {
! this.src_stream = in;
! this.src = null;
! changeImage(bounds);
! }
! public void changeImage(GeoRectangle bounds)
! {
! this.bbox=bounds;
! setStatus(Layer.LOADING);
! thread = new Thread(this);
! thread.setPriority(Thread.MIN_PRIORITY);
! thread.start();
! }
! /** Change the image and but not the extent. */
! public void changeImage(URL source){
! changeImage(source, this.bbox);
! }
! /** Change the extent of the image */
! public void changeExtent(GeoRectangle bounds){
! this.bbox = bounds;
! this.notifyLayerChangedListeners(LayerChangedEvent.GEOGRAPHY);
! }
! public GeoRectangle getBounds()
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return this.bbox;
! }
! public GeoRectangle getBoundsOf(int id[])
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return null;
! }
! public GeoRectangle getBoundsOf(int id)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return null;
! }
! public int getID(GeoPoint p)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return 0;
! }
! public int getID(double x, double y)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! return 0;
! }
! public void paintHighlight(Graphics g, Scaler scale, int id, ShadeStyle style)
! {
! // This method is derived from interface uk.ac.leeds.ccg.geotools.Layer
! // to do: code goes here
! }
! public void paintScaled(GeoGraphics gg)
! {
! // Print out a call stack
! //if(DEBUG) {
! // try {
! // throw new RuntimeException();
! // } catch (RuntimeException e) {
! // System.out.println("IL ("+this+")-->paintScaled call stack ");
! // e.printStackTrace();
! // }
! //}
! double cellSizeX = 0;
! double cellSizeY = 0;
! boolean drawn;
! Graphics g= gg.getGraphics();
! Scaler scale = gg.getScale();
! GeoRectangle gr = scale.getMapExtent();
! //if(DEBUG)System.out.println("IL-->gr "+gr);
! GeoRectangle me = getBounds();
! //if(DEBUG)System.out.println("IL-->me "+me);
! GeoRectangle out = gr.createIntersect(me);
! //if(DEBUG)System.out.println("IL-->gr "+gr+"\nme "+me+"\nout "+out);
! //if(DEBUG)System.out.println("IL-->getStatus="+this.getStatus());
! int gh,gw;
! if(DEBUG)System.out.println("IL ("+this+") -->0");
! if(out!=null){
! if(DEBUG)System.out.println("IL ("+this+") -->1");
! if(out.equals(me)){
! if(DEBUG)System.out.println("IL ("+this+") -->2 ");
! //if(DEBUG)System.out.println("IL-->No clip");
! //GeoRectangle out = bbox;
! int origin[]=scale.toGraphics(out.x,out.y);
! gh=scale.toGraphics(out.height);
! gw=scale.toGraphics(out.width);
! if(this.image!=null){
! drawn = g.drawImage(
! this.image,
! origin[0],
! origin[1]-gh,
! gw,
! gh,
! null);
! try {
! tracker.waitForID(myID);
! } catch (InterruptedException e) {
! System.out.println("IL-->Interupted while drawing");
! setStatus(Layer.ERRORED);
! return;
! }
! if(DEBUG)System.out.println("IL ("+this+") -->3 drawn="+drawn);
! }
! //if((this.getStatus()&Layer.COMPLETED)==Layer.COMPLETED){
! // if(DEBUG)System.out.println("IL ("+this+") -->4 ");
! // g.setColor(Color.red);
! // g.drawRect(origin[0]+1,origin[1]-gh-1,gw-1,gh-1);
//}
! }
! else{
! if(DEBUG)System.out.println("IL ("+this+") -->5 ");
! if((this.getStatus()&Layer.COMPLETED)!=Layer.COMPLETED) {
! if(DEBUG)System.out.println("IL ("
! +this+") -->Layer not loaded");
! return;
}
! //complex clip case
! MemoryImageSource source;
! cellSizeX = me.width/this.image.getWidth(
! new Frame());
! cellSizeY = me.height/this.image.getHeight(
! new Frame());
! int x,y,width,height;
! if(out.y%cellSizeY>0){
! out.y=out.y+cellSizeY-(out.y%cellSizeY);
! out.height+=cellSizeY;
! }
! // out.x=out.x-(out.x%cellSizeX);
! x=(int)Math.floor(((out.x-me.x)/cellSizeX));
! y=(int)Math.ceil(((me.y-out.y+me.height-out.height)/cellSizeY));
! width=(int)Math.ceil((out.width/cellSizeX));
! height=(int)Math.ceil(((out.height)/cellSizeY));
! // out.x=out.x-(out.x%cellSizeX);
! x=(int)Math.floor(((out.x-me.x)/cellSizeX));
! //y=(int)Math.ceil(((out.y-me.y+out.height)/cellSizeY));
! //h=(int)Math.ceil(((out.height)/cellsize));
! //mh=(int)Math.ceil(((me.height)/cellsize));
! //gh=(int)Math.ceil(((gr.height)/cellsize));
! //top=(int)Math.ceil(((out.y)/cellsize))+h;
! //mtop=(int)Math.ceil(((me.y)/cellsize))+mh;
! //y=(int)(Math.max(Math.ceil(out.y),Math.ceil(me.y))/cellSizeY);
! y=(int)Math.ceil(((me.y-out.y+me.height-out.height)/cellSizeY));
! // if(DEBUG)System.out.println("IL-->start "+x+" "+y);
! width=(int)Math.ceil((out.width/cellSizeX));
! height=(int)Math.ceil(((out.height)/cellSizeY));
! //if(DEBUG)System.out.println("IL-->w/h "+width+" "+height);
! y=Math.max(y,0);
! int[] data = new int[(height*width)];
! PixelGrabber pg = new PixelGrabber(
! this.image,
! x,
! y,
! width,
! height,
! data,
! 0,
! width);
! //if(DEBUG)System.out.println("IL-->about to grab");
! try {
! pg.grabPixels();
! } catch (InterruptedException e) {
! System.err.println("IL-->interrupted waiting for pixels!");
! return;
! }
! if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
! System.err.println("IL-->image fetch aborted or errored, status="+pg.getStatus());
! return ;
! }
! source = new MemoryImageSource(width,height,data,0,width);
! Image image2 = obs.createImage(source);
! int origin[]=scale.toGraphics(out.x,out.y);
! gh=scale.toGraphics(out.height);
! gw=scale.toGraphics(out.width);
! drawn=g.drawImage(image2,origin[0],origin[1]-gh,gw,gh,obs);
! try {
! tracker.waitForID(myID);
! } catch (InterruptedException e) {
! System.out.println("IL-->Interupted while drawing");
! setStatus(Layer.ERRORED);
! return;
! }
! if(DEBUG)System.out.println("IL ("+this+") -->5.1 drawn="+drawn);
! image2=null;
! if((this.getStatus()&Layer.COMPLETED)!=Layer.COMPLETED){
! if(DEBUG)System.out.println("IL ("+this+") -->6 ");
! g.setColor(Color.red);
! g.drawRect(origin[0],origin[1]-gh,gw,gh);
! }
! }
! }
! }
! protected byte[] getImageData(java.io.InputStream instr)
! {
! byte[] res = null;
! try {
! java.io.ByteArrayOutputStream outstr = new java.io.ByteArrayOutputStream();
! byte[] buff = new byte[16000];
! int cnt = instr.read(buff);
! while (cnt != -1) {
! outstr.write(buff, 0, cnt);
! cnt = instr.read(buff);
! } // end of while (cnt != -1)
! // instr.close();
! res = outstr.toByteArray();
! outstr.close();
! } catch (java.io.IOException e) {
! res = null;
! } // end of try-catch
!
! return res;
! }
! public void run() {
! setStatus(Layer.PENDING);
! if(DEBUG) System.out.println(
! "IL--> Request image " + this.src + " " + bbox);
! // Start getting the image. If the image is .gif or .jpg then
! // use default java tools otherwise use Jimi class
! //String type="";
! //try{
! // URLConnection con = this.src.openConnection();
! // type = con.getContentType();
! //}catch(java.io.IOException ioe){
! // System.err.println("IL--> problem opening connection");
! //}
! //if((type!=null) && type.startsWith("image")){
! Frame dummy = new Frame();
! Toolkit tk = Toolkit.getDefaultToolkit();
! // if(type.trim().endsWith("gif")
! // || type.trim().endsWith("jpeg")){
! // If a previous image was being tracked, then remove it.
! if(tracker!=null){
! tracker.removeImage(this.image);
! this.image=null;
! }
! if (src != null) {
! this.image = tk.getImage(this.src);
! } // end of if (src != null)
! if (src_stream != null) {
! this.image = tk.createImage(getImageData(src_stream));
! } // end of if (src_stream != null)
!
!
! // }else{
! // this.image = Jimi.getImage(this.src,type);
! // }
! // if(DEBUG)System.out.println(
! // "IL--> Image Width="+this.image.getWidth(dummy));
!
! if(tracker==null)tracker = new MediaTracker(dummy);
! tracker.addImage(this.image,++myID);
! try {
! if(DEBUG)System.out.println("IL ("+this+")-->Waiting ");
! while((tracker.statusID(myID,true)&tracker.LOADING)!=0){
! if(getStatus()==Layer.ABORTED){
! tracker.removeImage(this.image,myID);
! break;
}
! tracker.waitForID(myID,500);
! //if(DEBUG)System.out.println("IL ("+this+")-->status loop, status="+tracker.statusID(myID,true)+" myID="+myID);
!
! }
! int state=tracker.statusID(myID,true);
! if((state&tracker.COMPLETE) == tracker.COMPLETE){
! if(DEBUG)System.out.println("IL ("+this+")-->Image Ready ");
! setStatus(Layer.COMPLETED);
! //setStatus() triggers a LayerChangedEvent.
! }else if(state == tracker.ABORTED){
! setStatus(Layer.ABORTED);
! if(DEBUG)System.out.println("IL ("+this+")-->Image Aborted ");
! //}else if(state == tracker.ERRORED){
! // setStatus(Layer.ERRORED);
! // if(DEBUG)System.out.println("IL ("+this+")-->Image Error ");
! }else {
! setStatus(Layer.ERRORED);
! if(DEBUG)System.out.println("IL ("+this+")-->Image Error ");
! }
!
! } catch (InterruptedException e) {
! System.out.println("IL ("+this+")-->Interupted ");
! setStatus(Layer.ERRORED);
! return;
! }
! //} else { // not image
! // if (DEBUG) System.out.println("Image unavailable, con type= "+type);
//}
//setStatus(Layer.ERRORED);
! }
}
+ /*
+ * Changes in file:
+ *
+ * $Log$
+ * Revision 1.28 2001/11/21 13:48:19 kobit
+ * Added support for creating ImageLayer with InputStream as image data source and full support for downaloding map data from WMS with jprotocols package
+ *
+ *
+ */
|