Beispielskripte

Alle auf den folgenden Seiten vorgestellten Skripten müssen in Form einer IwanScript Datei (*.iws) in einem Pfad eines virtuellen Iwan - Verzeichnis gespeichert werden und können dann über einen Aufruf im Browser ausgeführt werden.

Layerinfo
Go;
/*--------------------------------------------------------------
  Diese IWS - Datei zeigt die Schritte zur Erstellung eine einfachen  
  Übersicht über die Zugriffe einer Sitzung auf Ebenen
  zur Darstellung
  
--------------------------------------------------------------*/

//--------------------------------
//Zuerst wird überprüft, ob ein Projet existiert.
//Falls nicht, wird das Script abgebrochen.
//--------------------------------
  IF(IsNULL(GetActiveProject()));
    EndScript;
  ENDIF;

//Ein Session - Objekt wird erstellt
  ret=CreateObject(ses,"SESSION");    

//-----------------------
routine "SHOWSTAT";	
//-----------------------
	// Hinweis:
	// Setzt vorraus, das die Statistik durch "old=ses.UseLayerStat(true);" aktiviert wurde!
	arr=ses.LayerStatList();
	print("");
	while(arr.next());
	print("");
	wend();
	print("
Layername Zeichenzugriffe auf diese Ebene gez. Elemente
"+replace(arr.item(),":"," ")+"
");
EndRoutine();
End;
Projektinfo
Go;
/*--------------------------------------------------------------
  Diese IWS - Datei erstellt eine Übersicht aller Layer des 
  gerade aktiven Projektes. Es sind keine Parameter zu 
  übergeben.
  
  In einer Tabellenzeile wird der Name einer Ebene, die für sie 
  verwendeten Symbole, ihr Titel, die Beschreibung und der 
  Ebenentyp angegeben. Zusätzlich enthält sie alle Sachdaten-
  felder der Ebene und die Angaben zu Min- und MaxScale. 
  
  Eine Erweiterung ist sehr einfach möglich.
--------------------------------------------------------------*/ 

//--------------------------------
//Zuerst wird überprüft, ob ein Projet existiert.
//Falls nicht, wird das Script abgebrochen.
//--------------------------------
  IF(IsNULL(GetActiveProject()));
    EndScript;
  ENDIF;

//Ein Layers - Objekt wird erstellt, das alle einzelnen Ebenen enthält
  ret=CreateObject(lay,"LAYERS");    

End;
<html>
<head>
<title>ProjektInformation</title>
<style type=text/css>
  body
    {background-color:#f0f0f0;}
  table
    {color:black;font-size:8pt;}
  tr.normal td
    {background-color:white;border:1px solid #bbbbbb;}
  tr.head
    {font-weight:bold;text-align=center;}
  td.lef
    {text-align:left;vertical-align:top;}
  td.mid
    {text-align:center;vertical-align:top;}
  td.leg
    {text-align:center;vertical-align:middle;}
</style>
</head>
<body>
<center>
<!--Die Überschrift enthält Projektnamen und die Anzahl der Ebene im Projekt-->
  <b>Das aktuelle Projekt mit dem Namen "Go;GetActiveProject();End;"
   enthält Go;lay.count();End; Layer</b>
  <br>
</center>
<table width=100% cellspacing=2 cellpadding=0>
  <tr class="head">
    <td>Nr.</td>
    <td>Name</td>
    <td>Symbol</td>
    <td>Titel</td>
    <td>Beschreibung</td>
    <td>Typ</td>
    <td>Elemente</td>
    <td>Sachdaten - Felder</td>
    <td>MaxScale</td>
    <td>MinScale</td>
  </tr>

Go;
  ret=lay.first();
  index=0;
//Ein Array mit allen möglichen Layertypen wird erstellt
  ret=CreateObject(types,"ARRAY");
  layerTypen="Ungültig|Shapefile(alt)|Datenbank|Memory|Raster|Datenbank-Katalog|";
  layerTypen=layerTypen+"Image-Katalog|SDE|Annotation|DUMMY|Generisch|User";
  ret=types.FromString(layerTypen,"|");
//Für alle Layer des Projektes wird eine Tabellenzeile generiert
  while(lay.next());
    index++;
    layer=lay.GetItem();  //für jeden Layer wird ein Layer - Objekt erzeugt
    print("<tr class="normal"><td class="mid">"+int(index)+"</td>");
    print("<td class="mid">"+layer.Name()+"</td>");
    print("<td class="leg"><img src='___MAP.__SYS__?Action=GetLegSymbol&theLayer="+layer.Name+"'></td>");
    print("<td class="mid">"+iif(IsNull(layer.LayerTitle())," ",layer.LayerTitle)+"</td>");
    print("<td class="lef">"+layer.Description()+"</td>");
    print("<td class="lef">"+types.At(int(layer.Type()))+"</td>");
    print("<td class="lef">"+layer.Count()+"</td>");
      fields=layer.GetFields();
      ret=fields.first();
      ret=createObject(arr,"ARRAY");
      while(fields.next());
        ret=arr.add(fields.Item);
      wend;
    print("<td class="lef">"+arr.AsString(",")+"</td>"); 
    print("<td class="lef">"+iif(layer.MaxScale()=="-1"," ",layer.MaxScale())+"</td>"); 
    print("<td class="lef">"+iif(layer.MinScale()=="-1"," ",layer.MinScale())+"</td></tr>");
  wend;
End;
</table>
</body>
</html>
ReversDns
Go;
/*
  Namensauflösung für IP-Addressen
  
  Argumente für dieses Skript: IPS=ListDerAddressen
  Es kann eine einzelne Addresse angegeben werden, oder kommasepariert eine Liste
*/
       
End;
<html>
<head>
<title>Reverse DNS Lookup</title>
<style type=text/css>
  BODY,TABLE,TR
    {font-family:Verdana;font-size:12px;font-weight:800;}
  TR.HEAD
    {font-weight:800;}
  TR.A
    {color:#0000FF;background-color:#CCCCCC;}
  TR.B
    {color:#0000DF;background-color:#DDDDDD;}
</style>
</head>
<body>
<script>
  self.focus();
</script>

Go;
  IF(isnull($IPS));
    print("Keine Adresse übergeben (ips ist leer)!");
  ELSE;
    ret=CreateObject(arr,"Array");        
    count=arr.FromString($IPS,iif(isnull($SEP),",",$SEP));
    ret=arr.RemoveDup();
    IF(arr.First())
      print("<table width=100% border=0 cellpadding=4 cellspacing=0>");
      print("<tr class="HEAD"><td align=center>IP</td><td></td><td align=center>Host</td></tr>");
      flag=true;
      while(arr.Next());
        flag=not(flag);
        host=ReverseDNSLookup(arr.Item());
        print("<tr class="+iif(flag,"A","B")+"><td nowrap>"+arr.Item()+"<td>:</td>");
        print("<td nowrap width=100%>"+iif(isnull(host),"-k.A.-",host)+"</td></tr>");
      wend;
      print ("</table>");
    ENDIF;
  ENDIF;
End;
</body>
</html>
Symboldump
Go;
/*---------------------------------------------------------------------------------
  Stellt Symbole einer Symbolpalette dar.
  Der Startparameter ist FILE=DateiNameDerIpal
          
  Es wird ein Frameset erstellt, in welchem die Symbole in einer Tabelle
  ausgegeben werden.
      
  Wird diese Fenster per modalem Dialog geöffnet (nur IE), wird nach einem
  Klick auf das Symbol die Symbolnummer in dialogArguments.symbol zurückgegeben.

  Beispielaufruf:
  //JavaScipt in IE
  function ShowSymbolDump()
  {
    if(smbSet=="")
      smbSet='..\\symbols\\main.ipal';
    var url='http://{IhrServer}/DumpSymbol.iws?file='+smbSet;
    var args=new Object();
    args.symbol=-1;
    var features="dialogWidth:500px ;dialogHeight:540px ;center:yes; status:no; edge:raised";
    var ret=showModalDialog(url,args,features);
    if(args.symbol!=-1)
    {
      alert("Symbol:"+args.symbol;
    }
  }
 ---------------------------------------------------------------------------------*/
  w=60;  //Default-Width  der Symbole in px
  h=50;  //Default-Height der Symbole in px

  //---------------------------------------
  // kein Index übergeben, also die
  // Seite erstellen 
  //----------------------------------------
   if(ISNULL($INDEX));
     if(ISNULL($FILE));
       print("Bitte in Argument FILE einen gültigen Dateinamen übergeben!");
       EndScript();
     EndIf;
     ret=CreateObject(srv,"Server");
       //---------------------------------------------------
     //   Prüfen ob, die Serverversion ausreichend ist!
     //   Ist dies nicht der Fall, Abbruch des Skriptes.
       //---------------------------------------------------
     if(not(srv.IsNeededVersion("3.0.3.20")));
       print("Dieses Skript erfordert eine IWAN Version 3.0.3.20+");
       EndScript();
     EndIf;
       //---------------------------------------------
     //  Symbolset-Objekt erstellen
       //---------------------------------------------
     ret=CreateObject(smb,"Symbolset");

     //-----------------------------------------------------------------
     // Auslesen der Symbolanzahl,
     // Exisitert die Datei nicht bricht das Skript mit einem Fehler ab
     //-----------------------------------------------------------------
     smbCount=smb.GetCount($FILE);
     count=smbCount;
     idx=0;
     PerPage=20;      //Anzahl der Symbole pro Seite
     thisFile=GetScriptFile(false);  //Namen dieses Skriptes auslesen (ohne Pfad)
     if(isnull($PART));      //Wurde in PART nichts in der URL ausgegeben wird hier das Frameset erstellt
       End;
         <html>
         <head>
         <title> Ansicht des Symbolset Go;print($FILE);End;</title>
         Go;call "LABELStyle";End;
         <script>
           function onImageClick(idx)
           {            
             if(window.dialogArguments)
             {
               window.dialogArguments.symbol=idx;
             }
             self.close();
           }
         </script>
         </head>        
         <frameset rows="*,170" framespacing=0 frameborder=0>
           <frame name=right src="Go;print(thisFile+"?part=R&FILE="+$FILE+"&startAt=0")End;">
           <frame name=left  src="Go;print(thisFile+"?part=L&file="+$FILE+"&count="+int(count));End;">
         </frameset>      
         </html>      
       Go;
       EndScript();
     else;//PART enthält eine Wert....
       //Erstellen der Link's....
       if($PART=="L");      //erstellt die untere Seite des Fenster
         pages=count/PerPage;  
         pages=int(pages);
         End;
         <html>
         <head>
         Go; /*StyleSheet schreiben*/
           call "LABELStyle";
         End;  
         <style type=text/css>    
           A{width:30px;margin:2px;}
         </style>
         </head>
         <body>
         <br>Symbolset: <b>Go;print($FILE);End;</b><br>
         <nobr> mit insgesamt: <b>Go;print(int(count));End;</b>
         Symbolen, Seitengröße :<b>Go;Print(int(pages));End;</b></nobr><br><br>
         <center>
         Go;
         i=0;
         while(compare(i,pages,le));
           print("<a target=right href="+thisFile+"?part=R&FILE="+$FILE+"&startAt="+int(i*PerPage)+">-"+int(i)+"-</a> ");
           inc(i);
         wend;
         End;
         </center>
         </body>
         </html>
         Go;          
         EndScript();    //und das Skript zu beenden
       EndIf;//... Part==L
     EndIf;
       //---------------------------------------------
     // Wenn bis hier gekommen (PART!=L)
     // dann die Tabelle mit den Symbolen erstellen
       //---------------------------------------------
     count=min(PerPage,count);
     End;
       <html>
       <head>
         Go;call "LABELStyle";End;
         <script>
           function onImageClick(idx)
           {
             if(top.onImageClick)top.onImageClick(idx);
           }          
         </script>
       </head>
       <body>
       <center><br>
       <table style="border:6px solid Black;background-color:White;">
       <tr><td style="padding:6px;">
       <table cellpadding=3 cellspacing=3>
      
     Go;
     index=idx;
     if(not(isnull($STARTAT)));
       index=$STARTAT;      
     EndIf;
     thisFile=GetScriptFile(false);
     imgSize="width= "+int(w)+" height="+int(h);
     while(Compare(idx,count,lt));
       print("<tr>");
       i=0;
       while(Compare(i,5,lt));
         print("<td align=center>");
         print("<img "+imgSize+" onClick='onImageClick("+int(index)+")' src='"+thisFile+"?FILE="+$FILE+"&INDEX="+int(index)+"'>");
         print("<br>"+int(index)+"</td>");
         inc(i);inc(idx);inc(index);        
         if(index==smbCount);i=21;idx=count;EndIf;
       wend;    
       print("</tr>");    
     wend;  
     print("</table></td></tr></table></center>");
     diff=smbCount-index;
     if(Compare(diff,0,gt));
       print("<center><a href=dumpsymbol.iws?part=R&FILE="+$FILE+"&startAt="+int(index)+">");
       print("Die nächsten "+int(min(diff,PerPage))+" Symbole anzeigen</a></center>");
     EndIf;
     print("</body></html>");
     EndScript();
   else;//INDEX==NULL
     //------------------------------------------------------------
     // an dieser Stelle
     // wird das Symbol generiert und als Bild zurückgegeben
     //------------------------------------------------------------
     s=0.0001;
     color="White";
     if(not(IsNull($W)));w=$W;EndIf;
     if(not(IsNull($H)));h=$H;EndIf;
     if(not(IsNull($S)));s=$S;EndIf;
     if(not(IsNull($COLOR)));color=$COLOR;EndIf;

     ret=CreateObject(smb,"Symbolset");
     smb.Scale(s);
     smb.ImageWidth(w);
     smb.ImageHeight(h);
     smb.ImageBGColor(color);
     smb.GetSymbolFromFile($FILE,$INDEX);
     EndScript();
   endif;  

//---------------------------
   routine "LABELStyle";
//---------------------------
End;
   <style type=text/css>
     IMG{cursor:Hand;}
     BODY,TR,TD{font-size:10px;font-family:Verdana;}          
     BODY{margin:5px;background-color:#CDCDCD;overflow:hidden;}
     A{color:White;font-weight:Bold;text-decoration:none;background-color:Black;border:1px solid black;}
     A:HOVER,A:ACTIVE{color:Black;border:1px solid black;background-color:White;}
     A:ACTIVE{background-color:Yellow;color:Red;}
   </style>
Go;
EndRoutine;
End;
WFS Ausgabe

Go;
    Call "main";
    // ---------------------------------------------------#-
    // main
    // ---------------------------------------------------#-
    routine "main";
    
        ret=CreateObject(response,"RESPONSE");
        ret=response.SendContinue();
        response.SetHeader("ContentType","text/xml");
        ret=CreateObject(geom,"Geometry");
        ret=CreateSession();
        prj=iif(isNull($PROJECT),"bau",$PROJECT);
        prjSrs=31469;//server.GetProjection(GetActiveProject());
        ret=SetActiveProject(prj);
        if(Compare(GetActiveProject(),prj,EQ));
            ret=CreateObject(server,"SERVER");
            ret=CreateObject(request,"REQUEST");
            ret=CreateObject(wfs,"WFSREQUEST");
            
            // den BaseUrl bestimmen
            if (Compare(Len(request.Referer),0,EQ));
                sBaseUrl=printf("%s://%s%s",request.Protocol(),request.Host(),request.Url());
            else;
                sBaseUrl=request.Referer();
            endif;
            
            if (wfs.ParseRequest());
                if (Compare(wfs.Request,"GetCapabilities",EQ));
                    Call "GetCapabilities";
                endif;
                if (Compare(wfs.Request,"DescribeFeatureType",EQ));
                    Call "DescribeFeatureType";
                endif;
                if (Compare(wfs.Request,"GetFeature",EQ));
                    Call "GetFeature";
                endif;
            else;
                ret=CreateObject(exception,"OGCServiceException");
                ret=exception.Add("INVALID OR EMPTY REQUEST: "+wfs.LastError(),"0x0002","wfs.iws");
                exception.Xml();
            endif;
        else;
            ret=CreateObject(exception,"OGCServiceException");
            ret=exception.Add("SCRIPT: Could not set session or project '"+prj+"' not available","0x0001","wfs.iws");
            exception.Xml();
        endif;
    EndRoutine;
    
    // ---------------------------------------------------#-
    // GetFeature
    // ---------------------------------------------------#-
    routine "GetFeature";
End;<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>Go;
    wfs.RenderToStream();
        if(wfs.LastError!="");
            ret=CreateObject(exception,"OGCServiceException");
            ret=exception.Add("GetFeature: "+wfs.LastError(),"0x0020","wfs.iws");
            exception.Xml();
        endif;
    EndRoutine;
    
    // ---------------------------------------------------#-
    // DescribeFeatureType
    // ---------------------------------------------------#-
    routine "DescribeFeatureType";
End;<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>Go;
        result=wfs.DescribeLayersAsXsd();
        if(wfs.LastError()!="");
            ret=CreateObject(exception,"OGCServiceException");
            ret=exception.Add("DescribeFeatureType: "+wfs.LastError(),"0x0010","wfs.iws");
            exception.Xml();
        else;
            print(result);
        endif;
    EndRoutine;
    
    // ---------------------------------------------------#-
    // GetCapabilities
    // ---------------------------------------------------#-
    routine "GetCapabilities";
End;<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
        <WFS_Capabilities version='1.0.0' 
            xmlns='http://www.opengis.net/wfs'
            xmlns:ogc='http://www.opengis.net/ogc' 
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
            <Service>
                <Name>IWAN WFS MapServer Beta 1</Name>
                <Title>IWAN MapServer</Title>
                <Abstract></Abstract>
                <Keyword></Keyword>
                <OnlineResource>
                    Go;print(sBaseUrl);End;
                </OnlineResource>
                <Fees>NONE</Fees>
                <AccessConstraints>NONE</AccessConstraints>
            </Service>
            <Capability>
                <Request>
                    <GetCapabilities>
                        Go;Call "WriteDCPType";End;
                    </GetCapabilities>
                    <DescribeFeatureType>
                        <SchemaDescriptionLanguage>
                            <XMLSCHEMA />
                        </SchemaDescriptionLanguage>
                        Go;Call "WriteDCPType";End;
                    </DescribeFeatureType>
                    <GetFeature>
                        <ResultFormat>
                            <GML2 />
                        </ResultFormat>
                        Go;Call "WriteDCPType";End;
                    </GetFeature>
                </Request>
            </Capability>
            <FeatureTypeList>
                <Operations>
                    <Query />
                </Operations>
Go;
        ret=CreateObject(layers,"LAYERS");
        if(layers.first());
            while(layers.next()==true);
                layer=layers.GetItem(layers.Item());
                //if(not(InList(layers.item,"L1","L48")));Continue;EndIf;
                if(Compare(layer.ContentType(),"VECTOR",EQ)|Compare(layer.ContentType(),"ANNO",EQ));
End;
                    <FeatureType>
                        <Name>iwan:Go;layer.Name();End;</Name>
                        <Title>Go;HTMLEncode(layer.LayerTitle());End;</Title>
                        <Abstract>Go;HTMLEncode(layer.Description());End;</Abstract>
                        <Keywords>iwan Go;layer.Name();End; Go;HTMLEncode(layer.LayerTitle());End;</Keywords>
                        <SRS>EPSG:Go;print(prjSrs);End;</SRS>
Go;
                    extent=layer.GetExtent();
                    if(extent.Valid&not(extent.Unknown));
                            call "printBBox";
                    endif;
End;                
                    </FeatureType>
Go;
                endif;
            wend;
        endif;
End;
            </FeatureTypeList>
            <ogc:Filter_Capabilities>
                <ogc:Spatial_Capabilities>
                    <ogc:Spatial_Operators>
                        <ogc:Intersect /> 
                        <ogc:BBOX /> 
                    </ogc:Spatial_Operators>
                </ogc:Spatial_Capabilities>
                <ogc:Scalar_Capabilities>
                    <ogc:Logical_Operators /> 
                    <ogc:Comparison_Operators>
                        <ogc:Simple_Comparisons /> 
                        <ogc:Like /> 
                    </ogc:Comparison_Operators>
                </ogc:Scalar_Capabilities>
            </ogc:Filter_Capabilities>
        </WFS_Capabilities>        
Go;
    EndRoutine;
    
    // ---------------------------------------------------#-
    // WriteDCPType
    // ---------------------------------------------------#-
    routine "WriteDCPType";
        sUrl=printf("%s?%s",sBaseUrl,wfs.UnusedQueryString);
        sUrl=HTMLEncode(sUrl);
End;
        <DCPType>
            <HTTP>
                <Get onlineResource='Go;print(sUrl);End;' />
                <Post onlineResource='Go;print(sUrl);End;' />
            </HTTP>
        </DCPType>
Go;
    EndRoutine;
//----------------------------------------------------
    routine "printBBox";
//----------------------------------------------------
    strGeom=printf("gBOX:%.5f|%.5f|%.5f|%.5f",extent.Xmin,extent.yMin,extent.XMax,extent.YMax);
    ret=geom.FromGeometry(strGeom);
    ret=geom.Transform(prjSrs,4326);
    ext1=geom.GetExtent();
    printf("<LatLonBoundingBox minx='%.4f' miny='%.4f' maxx='%.4f' maxy='%.4f' />",ext1.Xmin,ext1.yMin,ext1.XMax,ext1.YMax);
    EndRoutine;
End;