Bladeren bron

initial import of owsviewer

Jachym Cepicky 14 jaren geleden
bovenliggende
commit
27006a50b9
14 gewijzigde bestanden met toevoegingen van 901 en 0 verwijderingen
  1. 248 0
      OWS.py
  2. 22 0
      __init__.py
  3. 11 0
      config.cfg
  4. 11 0
      owsviewer.cgi
  5. 11 0
      tests/config.cfg
  6. 25 0
      tests/owsviewer_tests.py
  7. 37 0
      tests/test_wcs.py
  8. 39 0
      tests/test_wfs.py
  9. 4 0
      tests/wcs_gdal.xml
  10. 344 0
      tests/wfs_ogr.xml
  11. 50 0
      wcs/__init__.py
  12. 4 0
      wcs/templates/wcs.xml
  13. 92 0
      wfs/__init__.py
  14. 3 0
      wfs/templates/wfs.xml

+ 248 - 0
OWS.py

@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+import urlparse
+import urllib
+from lxml import objectify
+import os,sys
+import tempfile
+import logging
+import ConfigParser
+import md5
+import mapscript
+from string import Template
+
+class OWS:
+
+    capabilities = None
+    url = None
+    requestUrl = None
+    mapobj = None
+    qstring = None
+    owsNs = "http://www.opengis.net/ows/1.1"
+    cachedir = None
+    mapfileName = "mapfile.map"
+    config = None
+    parsedUrl = None
+    service = None
+
+    def __init__(self,url=None,qstring=None,configFile=None):
+        self.requestUrl = url
+        if url:
+            self.url = url
+            self.__getCapabilities()
+        if qstring:
+            self.qstring = qstring
+
+        configFiles = [
+                os.path.join(os.path.dirname(__file__),"config.cfg")
+                ]
+        if sys.platform == "win32":
+            pass # TODO Default conf. file on windows platform
+        elif sys.platform == "linux2":
+            configFiles.append("/etc/owsviewer.cfg")
+
+        if configFile:
+            configFiles.append(configFile)
+
+        self.config = ConfigParser.ConfigParser()
+        self.config.read(configFiles)
+
+        logging.debug("Creating cachedir for %s in %s" % (self.url,self.config.get("OWSViewer","cachedir")))
+        logging.debug("%s initialized"%self.service)
+
+    def __getCapabilities(self):
+        self.parsedUrl = urlparse.urlparse(self.url)
+        params = urlparse.parse_qs(self.parsedUrl.query,keep_blank_values=True)
+        if "request" in params:
+            params["request"] = "GetCapabilities"
+        else:
+            params["REQUEST"] = "GetCapabilities"
+
+        if "service" in params:
+            params["service"] = self.service
+        else:
+            params["SERVICE"] = self.service
+
+        url = urlparse.urlunparse((self.parsedUrl[0],
+                                    self.parsedUrl[1],
+                                    self.parsedUrl[2],
+                                    self.parsedUrl[3],
+                                    urllib.urlencode(params),
+                                    self.parsedUrl[5]))
+        e = objectify.parse(urllib.urlopen(url))
+        self.capabilities = e.getroot()
+
+        try:
+            params.pop("service")
+        except:
+            pass
+
+        try:
+            params.pop("request")
+        except:
+            pass
+
+        try:
+            params.pop("SERVICE")
+        except:
+            pass
+
+        try:
+            params.pop("REQUEST")
+        except:
+            pass
+
+        self.url = urlparse.urlunparse((self.parsedUrl[0],
+                                        self.parsedUrl[1],
+                                        self.parsedUrl[2],
+                                        self.parsedUrl[3],
+                                        urllib.urlencode(params),
+                                        self.parsedUrl[5]))
+
+    def getParams(self):
+        return urlparse.parse_qs(self.qstring)
+
+    def performRequest(self):
+        pass
+
+    def getOnlineResource(self,onlineresource,mapfilename=None):
+        o = urlparse.urlparse(onlineresource)
+        params = urlparse.parse_qs(o.query,keep_blank_values=True)
+        params["owsUrl"] = self.url
+        params["owsService"] = self.service
+        params["map"] = self.getMapfileLocation(mapfilename)
+
+
+        location = urlparse.urlunparse((o[0],o[1],o[2],o[3],urllib.urlencode(params),o[5]))
+        logging.debug("Setting OnlineResource to %s"% location)
+        return location
+
+    def getMapfileLocation(self,mapfilename=None):
+
+        # save the map if possible
+        if mapfilename:
+            mapfilename.replace("..","") # remove potential path change
+
+            # mapfile must end with .map and cachedir must be at the
+            # beginning of the mapfile name
+            if mapfilename.endswith(".map") and \
+               mapfilename.find(self.cachedir) == 0:
+                    return mapfilename
+                    
+            else:
+                # do not save anything
+                return
+        # save to new location otherwice
+        else:
+            return os.path.join(self.cachedir,self.mapfileName)
+
+    def __getCacheDir(self):
+        
+        self.cachedir = tempfile.mkdtemp(prefix="%s-%s"%(self.service,
+                                        md5.new(self.url).hexdigest()),
+                                        dir=self.config.get("OWSViewer","cachedir"))
+        logging.debug("Cachedir %s created" % self.cachedir)
+        open(os.path.join(self.cachedir,"url.txt"),"w").write(self.url)
+        return self.cachedir
+
+    def performRequest(self):
+        request = mapscript.OWSRequest()
+        request.loadParams()
+        mapobj = None
+
+        self.request=request.getValueByName("REQUEST")
+
+        # if no 'map' parameter in URL, create new mapfile
+        if not request.getValueByName("map"):
+            mapobj = self.makeMap()
+        else:
+            # there is 'map' parameter in URL and the file exists, load it
+            if os.path.isfile(request.getValueByName("map")):
+                mapobj = mapscript.mapObj(request.getValueByName("map"))
+            # there is 'map' parameter in URL BUT the file does not exist:
+            # create
+            else:
+                mapobj = self.makeMap(request.getValueByName("map"))
+
+        print mapobj.OWSDispatch(request)
+
+    def getMapObj(self,mapfilename=None):
+
+        self.__getCacheDir()
+
+        if self.url is not None and self.capabilities is None:
+            self.__getCapabilities()
+
+        mapobj = mapscript.mapObj()
+
+        mapobj.setMetaData("wms_onlineresource",self.getOnlineResource(self.config.get("MapServer","onlineresource"),mapfilename))
+
+        logging.debug("Setting SRS to %s"%self.config.get("MapServer","srs"))
+        mapobj.setMetaData("wms_srs",self.config.get("MapServer","srs"))
+
+        mapobj.setProjection("init=epsg:4326")
+        mapobj.setSize(500,500)
+        mapobj.setExtent(-180,-90,90,180)
+
+        logging.debug("Setting ERRORFILE to %s"%self.config.get("MapServer","errorfile"))
+        mapobj.setConfigOption("MS_ERRORFILE",self.config.get("MapServer","errorfile"))
+
+        logging.debug("Setting IMAGEPATH to %s"%self.config.get("MapServer","imagepath"))
+        mapobj.web.imagepath=self.config.get("MapServer","imagepath")
+
+        mapobj.setMetaData("ows_enable_request","*")
+        mapobj.setMetaData("wms_enable_request","*")
+
+        return mapobj
+
+    def saveMapfile(self,mapobj,mapfilename):
+
+        mapfilename = self.getMapfileLocation(mapfilename)
+        if mapfilename:
+
+            # save mapfile ONLY if GetCapabilities requested - it makes no
+            # sense for other cases
+            logging.info("Saving mapfile to %s" %  mapfilename)
+            mapobj.save(mapfilename)
+        else:
+            logging.info("Mapfile NOT saved")
+
+    def getLayerUrl(self):
+
+        layerurl = self.url
+
+        if self.url.find("?") > -1:
+            if not self.url.endswith("?") and\
+                not self.url.endswith("&"):
+                layerurl += "&"
+        else:
+            layerurl += "?"
+
+        return layerurl
+
+    def createLayerDefinitionFile(self, name, templatefile):
+
+            layerurl = self.getLayerUrl()
+            defFileName = os.path.join(self.cachedir,'%s.%s'%(name,self.service.lower()))
+            open(defFileName,'w').write(
+                    Template(open(templatefile).read()).substitute( 
+                            dict(url= layerurl, name=name)))
+
+            return defFileName
+
+
+def getService():
+
+    qstring = os.environ["QUERY_STRING"]
+    params = urlparse.parse_qs(qstring)
+    
+    owsUrl = urllib.unquote(params["owsUrl"][0])
+
+    if params["owsService"][0].lower() == "wfs":
+        from wfs import WFS
+        return WFS(owsUrl,qstring)
+    elif params["owsService"][0].lower() == "wcs":
+        from wcs import WCS
+        return WCS(owsUrl,qstring)
+    

+ 22 - 0
__init__.py

@@ -0,0 +1,22 @@
+import urllib
+import tempfile
+import ConfigParser 
+
+DEFAULT_CONFIGS={}
+
+class OWSViewer:
+    workingDir = None
+    config = None
+
+    def __init__(self,configFiles):
+        config = ConfigParser.ConfigParser()
+        config.read(configFiles)
+
+        self.workingDir = tempfile.mkdtemp(prefix="owsviewer",dir=config.get("server","tempdir",vars=DEFAULT_CONFIGS))
+        
+    def getImage(self,url,targetFormat="image/png"):
+        pass
+
+        
+
+

+ 11 - 0
config.cfg

@@ -0,0 +1,11 @@
+[OWSViewer]
+cachedir=/tmp/
+logging=DEBUG
+
+[MapServer]
+tempdir=/tmp/
+errorfile=/tmp/mapserv.log
+imagepath=/tmp/mapserv/
+onlineresource=http://localhost/cgi-bin/owsviewer.cgi
+srs=EPSG:4326 EPSG:102067 EPSG:900913 EPSG:3035
+

+ 11 - 0
owsviewer.cgi

@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+import sys
+sys.path.append("/home/jachym/usr/src/hsrs/hslayers/trunk/source/scripts/hslframework/owsviewer/")
+
+import OWS
+import logging
+logging.basicConfig(level=logging.DEBUG)
+
+service = OWS.getService()
+service.performRequest()

+ 11 - 0
tests/config.cfg

@@ -0,0 +1,11 @@
+[OWSViewer]
+cachedir=/tmp/
+logging=DEBUG
+
+[MapServer]
+tempdir=/tmp/
+errorfile=/tmp/mapserv.log
+imagepath=/tmp/mapserv/
+onlineresource="http://localhost/cgi-bin/owsviewer.cgi"
+srs="EPSG:4326 EPSG:102067 EPSG:3035 EPSG:900913"
+

+ 25 - 0
tests/owsviewer_tests.py

@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+import unittest
+import os,sys
+
+OWSVIEWER_DIR=os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
+
+sys.path.append(OWSVIEWER_DIR+"/../")
+
+import owsviewer
+
+class TestBasicOWS(unittest.TestCase):
+
+    config = None
+
+    def setUp(self):
+        self.config = os.path.join(OWSVIEWER_DIR,"config.cfg")
+
+    def test(self):
+
+        owsv = owsviewer.OWSViewer(self.config)
+        pass
+
+if __name__ == "__main__":
+    unittest.main()

+ 37 - 0
tests/test_wcs.py

@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+import unittest
+import logging
+import os,sys
+
+OWSVIEWER_DIR=os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
+
+sys.path.append(OWSVIEWER_DIR)
+
+from OWS import *
+import wcs
+
+import mapscript
+
+class TestBasicOWS(unittest.TestCase):
+
+    config = None
+
+    def setUp(self):
+        logging.basicConfig(level=logging.DEBUG)
+
+    def test_getservice(self):
+        os.environ.update({"QUERY_STRING":
+                "owsService=WCS&owsUrl=http%3A//localhost/cgi-bin/wcs&request=GetCapabilities&service=wms"})
+
+        mywcs = getService()
+        self.assertTrue(isinstance(mywcs, wcs.WCS))
+        
+        mapObj = mywcs.makeMap()
+
+        self.assertTrue(isinstance(mapObj, mapscript.mapObj))
+        self.assertEquals(mapObj.numlayers,2)
+
+if __name__ == "__main__":
+    unittest.main()

+ 39 - 0
tests/test_wfs.py

@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+import unittest
+import os,sys
+import logging
+
+OWSVIEWER_DIR=os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
+
+sys.path.append(OWSVIEWER_DIR)
+
+print OWSVIEWER_DIR
+from OWS import *
+import wfs
+
+class TestBasicOWS(unittest.TestCase):
+
+    config = None
+    newwfs = None
+
+    def setUp(self):
+        logging.basicConfig(level=logging.DEBUG)
+
+    def test_getcapabilities(self):
+        os.environ.update({"QUERY_STRING":
+                "owsService=WFS&owsUrl=http%3A//bnhelp.cz/ows/crwfs&request=GetCapabilities&service=wms"})
+
+        mywfs = getService()
+        self.assertTrue(isinstance(mywfs, wfs.WFS))
+        
+        mapObj = mywfs.makeMap()
+
+        self.assertTrue(isinstance(mapObj, mapscript.mapObj))
+        self.assertEquals(mapObj.numlayers,8)
+
+        pass
+
+if __name__ == "__main__":
+    unittest.main()

+ 4 - 0
tests/wcs_gdal.xml

@@ -0,0 +1,4 @@
+<WCS_GDAL>
+    <ServiceURL>http://localhost/cgi-bin/wcs</ServiceURL>
+    <CoverageName>dmt</CoverageName>
+</WCS_GDAL>

+ 344 - 0
tests/wfs_ogr.xml

@@ -0,0 +1,344 @@
+<OGRWFSDataSource>
+  <URL>http://bnhelp.cz/ows/crwfs?</URL>
+  <WFS_Capabilities version="1.0.0" updateSequence="0" xmlns="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd">
+    <!-- MapServer version 5.0.3 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS INPUT=EPPL7 INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE -->
+    <Service>
+      <Name>MapServer WFS</Name>
+      <Title>Help Service Gazeteer</Title>
+      <Abstract>Vyhledavani sidel WFS</Abstract>
+      <OnlineResource>http://www.bnhelp.cz/ows/crwfs?</OnlineResource>
+    </Service>
+    <Capability>
+      <Request>
+        <GetCapabilities>
+          <DCPType>
+            <HTTP>
+              <Get onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+          <DCPType>
+            <HTTP>
+              <Post onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+        </GetCapabilities>
+        <DescribeFeatureType>
+          <SchemaDescriptionLanguage>
+            <XMLSCHEMA />
+          </SchemaDescriptionLanguage>
+          <DCPType>
+            <HTTP>
+              <Get onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+          <DCPType>
+            <HTTP>
+              <Post onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+        </DescribeFeatureType>
+        <GetFeature>
+          <ResultFormat>
+            <GML2 />
+          </ResultFormat>
+          <DCPType>
+            <HTTP>
+              <Get onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+          <DCPType>
+            <HTTP>
+              <Post onlineResource="http://www.bnhelp.cz/ows/crwfs?" />
+            </HTTP>
+          </DCPType>
+        </GetFeature>
+      </Request>
+    </Capability>
+    <FeatureTypeList>
+      <Operations>
+        <Query />
+      </Operations>
+      <FeatureType>
+        <Name>nuts1</Name>
+        <Title>NUTS1</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="-73.2635" miny="-21.3428" maxx="120.131" maxy="83.6274" />
+        <!-- WARNING: Required Feature Id attribute (fid) not specified for this feature type. Make sure you set one of wfs_featureid, ows_feature_id or gml_featureid metadata. -->
+      </FeatureType>
+      <FeatureType>
+        <Name>states</Name>
+        <Title>states</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="-180" miny="-89.9" maxx="180" maxy="83.6747" />
+        <!-- WARNING: Required Feature Id attribute (fid) not specified for this feature type. Make sure you set one of wfs_featureid, ows_feature_id or gml_featureid metadata. -->
+      </FeatureType>
+      <FeatureType>
+        <Name>nuts2</Name>
+        <Title>NUTS2</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="-73.2635" miny="-21.3428" maxx="120.131" maxy="83.6274" />
+        <!-- WARNING: Required Feature Id attribute (fid) not specified for this feature type. Make sure you set one of wfs_featureid, ows_feature_id or gml_featureid metadata. -->
+      </FeatureType>
+      <FeatureType>
+        <Name>nuts3</Name>
+        <Title>NUTS2</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="-73.2635" miny="-21.3428" maxx="120.131" maxy="83.6274" />
+        <!-- WARNING: Required Feature Id attribute (fid) not specified for this feature type. Make sure you set one of wfs_featureid, ows_feature_id or gml_featureid metadata. -->
+      </FeatureType>
+      <FeatureType>
+        <Name>orp</Name>
+        <Title>Obce s rozsirenou pusobnosti</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="12.0972" miny="48.5542" maxx="18.8585" maxy="51.0558" />
+      </FeatureType>
+      <FeatureType>
+        <Name>okresy</Name>
+        <Title>Okresy CR</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="12.0972" miny="48.5542" maxx="18.8583" maxy="51.0558" />
+      </FeatureType>
+      <FeatureType>
+        <Name>sidla</Name>
+        <Title>Sidla CR</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="12.0696" miny="48.5297" maxx="18.9733" maxy="51.0388" />
+      </FeatureType>
+      <FeatureType>
+        <Name>kraje</Name>
+        <Title>Kraje CR</Title>
+        <SRS>EPSG:4326</SRS>
+        <LatLongBoundingBox minx="12.0977" miny="48.5542" maxx="18.8505" maxy="51.0552" />
+      </FeatureType>
+      <FeatureType>
+        <Name>usrgaz</Name>
+        <Title>User objects</Title>
+        <SRS>EPSG:4326</SRS>
+        <!-- WARNING: Mandatory LatLongBoundingBox could not be established for this layer.  Consider setting LAYER.EXTENT or wfs_extent metadata. -->
+        <!-- WARNING: Required Feature Id attribute (fid) not specified for this feature type. Make sure you set one of wfs_featureid, ows_feature_id or gml_featureid metadata. -->
+      </FeatureType>
+    </FeatureTypeList>
+    <ogc:Filter_Capabilities>
+      <ogc:Spatial_Capabilities>
+        <ogc:Spatial_Operators>
+          <ogc:Equals />
+          <ogc:Disjoint />
+          <ogc:Touches />
+          <ogc:Within />
+          <ogc:Overlaps />
+          <ogc:Crosses />
+          <ogc:Intersect />
+          <ogc:Contains />
+          <ogc:DWithin />
+          <ogc:BBOX />
+        </ogc:Spatial_Operators>
+      </ogc:Spatial_Capabilities>
+      <ogc:Scalar_Capabilities>
+        <ogc:Logical_Operators />
+        <ogc:Comparison_Operators>
+          <ogc:Simple_Comparisons />
+          <ogc:Like />
+          <ogc:Between />
+        </ogc:Comparison_Operators>
+      </ogc:Scalar_Capabilities>
+    </ogc:Filter_Capabilities>
+  </WFS_Capabilities>
+  <OGRWFSLayer name="okresy">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="okresy" type="ms:okresyType" substitutionGroup="gml:_Feature" />
+      <complexType name="okresyType">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="KODOK" type="string" />
+              <element name="NAZOK" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="nuts1">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="nuts1" type="ms:nuts1Type" substitutionGroup="gml:_Feature" />
+      <complexType name="nuts1Type">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="ARRGCDL0" type="string" />
+              <element name="COUNT" type="string" />
+              <element name="CNTRY_NAME" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="nuts2">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="nuts2" type="ms:nuts2Type" substitutionGroup="gml:_Feature" />
+      <complexType name="nuts2Type">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="AREA" type="string" />
+              <element name="PERIMETER" type="string" />
+              <element name="NUEC1MV6_" type="string" />
+              <element name="NUEC1MV6_I" type="string" />
+              <element name="NURGCD" type="string" />
+              <element name="NURGCDL0" type="string" />
+              <element name="NURGCDL1" type="string" />
+              <element name="NURGCDL2" type="string" />
+              <element name="ARRGCDL0" type="string" />
+              <element name="Rowid_" type="string" />
+              <element name="NURGCD_1" type="string" />
+              <element name="NURGNM" type="string" />
+              <element name="NURGCDL0_1" type="string" />
+              <element name="NURGCDL1_1" type="string" />
+              <element name="NURGCDL2_1" type="string" />
+              <element name="Rowid1" type="string" />
+              <element name="NURGCD_12" type="string" />
+              <element name="IGELCD" type="string" />
+              <element name="Rowid_1" type="string" />
+              <element name="IGELCD_1" type="string" />
+              <element name="IGELCDDS" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="orp">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="orp" type="ms:orpType" substitutionGroup="gml:_Feature" />
+      <complexType name="orpType">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="CISORP" type="string" />
+              <element name="NAZOB" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="kraje">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="kraje" type="ms:krajeType" substitutionGroup="gml:_Feature" />
+      <complexType name="krajeType">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:MultiPolygonPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="KRAJ_KOD" type="string" />
+              <element name="KRAJ_NAZEV" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="states">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="states" type="ms:statesType" substitutionGroup="gml:_Feature" />
+      <complexType name="statesType">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="NAME" type="string" />
+              <element name="CAPITAL" type="string" />
+              <element name="APPROX" type="string" />
+              <element name="AREA" type="string" />
+              <element name="SOURCETHM" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="nuts3">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="nuts3" type="ms:nuts3Type" substitutionGroup="gml:_Feature" />
+      <complexType name="nuts3Type">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="AREA" type="string" />
+              <element name="PERIMETER" type="string" />
+              <element name="NUEC1MV7_" type="string" />
+              <element name="NUEC1MV7_I" type="string" />
+              <element name="NURGCD" type="string" />
+              <element name="NURGCDL0" type="string" />
+              <element name="NURGCDL1" type="string" />
+              <element name="NURGCDL2" type="string" />
+              <element name="ARRGCDL0" type="string" />
+              <element name="NURGLBLV" type="string" />
+              <element name="NUFTTP" type="string" />
+              <element name="Rowid_" type="string" />
+              <element name="NURGCD_1" type="string" />
+              <element name="NURGNM" type="string" />
+              <element name="NURGCDL0_1" type="string" />
+              <element name="NURGCDL1_1" type="string" />
+              <element name="NURGCDL2_1" type="string" />
+              <element name="Rowid1" type="string" />
+              <element name="NURGCD_12" type="string" />
+              <element name="IGSACD" type="string" />
+              <element name="IGELCD" type="string" />
+              <element name="Rowid_1" type="string" />
+              <element name="IGELCD_1" type="string" />
+              <element name="IGELCDDS" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+  <OGRWFSLayer name="sidla">
+    <schema targetNamespace="http://mapserver.gis.umn.edu/mapserver" xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="0.1">
+      <import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />
+      <element name="sidla" type="ms:sidlaType" substitutionGroup="gml:_Feature" />
+      <complexType name="sidlaType">
+        <complexContent>
+          <extension base="gml:AbstractFeatureType">
+            <sequence>
+              <element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1" />
+              <element name="CISLO" type="string" />
+              <element name="NAZEV" type="string" />
+              <element name="TYP" type="string" />
+              <element name="NAZEV_UNI" type="string" />
+              <element name="Y_JTS" type="string" />
+              <element name="X_JTS" type="string" />
+              <element name="Y" type="string" />
+              <element name="X" type="string" />
+              <element name="KN" type="string" />
+              <element name="NAZKR" type="string" />
+              <element name="KODOK" type="string" />
+              <element name="NAZOK" type="string" />
+              <element name="ICOB" type="string" />
+              <element name="NAZOB" type="string" />
+              <element name="KODORP" type="string" />
+              <element name="NAZORP" type="string" />
+              <element name="OKPO" type="string" />
+              <element name="KODPO" type="string" />
+              <element name="NAZEV_HLED" type="string" />
+            </sequence>
+          </extension>
+        </complexContent>
+      </complexType>
+    </schema>
+  </OGRWFSLayer>
+</OGRWFSDataSource>

+ 50 - 0
wcs/__init__.py

@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+from OWS import OWS
+import mapscript
+from osgeo import gdal
+from osgeo import osr
+from string import Template
+import os
+import logging
+
+
+class WCS(OWS):
+
+    service = "WCS"
+    request = '' # GetCapabilies, ...
+
+    def __init__(self,url=None,qstring=None,configFiles=None):
+        OWS.__init__(self,url,qstring)
+
+    def makeMap(self,mapfilename=None):
+
+        mapobj = self.getMapObj(mapfilename)
+
+        for layer in self.capabilities.Contents.getchildren():
+            name =  layer.Identifier.text
+            logging.debug("Creating layer %s" % name)
+
+
+            layerDefFile = self.createLayerDefinitionFile(name,
+                    os.path.join( os.path.dirname(__file__), "templates",'wcs.xml'))
+
+            ds = gdal.Open(layerDefFile)
+            lyrobj = mapscript.layerObj(mapobj)
+            lyrobj.name = name
+            lyrobj.data = layerDefFile
+            lyrobj.title = layer["{%s}%s" % (self.owsNs,"Title")].text
+            lyrobj.setMetaData("wms_title",layer["{%s}%s" % (self.owsNs,"Title")].text)
+            sr = osr.SpatialReference()
+            sr.ImportFromWkt(ds.GetProjection())
+            lyrobj.setProjection(sr.ExportToProj4())
+            lyrobj.type = mapscript.MS_LAYER_RASTER
+            lyrobj.dump = mapscript.MS_TRUE
+            lyrobj.template = "foo"
+            cls = mapscript.classObj(lyrobj)
+            mapscript.styleObj(cls)
+
+        self.saveMapfile(mapobj,mapfilename)
+        return mapobj
+

+ 4 - 0
wcs/templates/wcs.xml

@@ -0,0 +1,4 @@
+<WCS_GDAL>
+  <ServiceURL>$url</ServiceURL>
+  <CoverageName>$name</CoverageName>
+</WCS_GDAL>

+ 92 - 0
wfs/__init__.py

@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+from OWS import OWS
+import mapscript
+import cgi
+from lxml import objectify
+import urllib
+import urlparse
+import logging
+from osgeo import ogr
+import os
+
+
+class WFS(OWS):
+
+    service = "WFS"
+
+    def __init__(self,url=None,qstring=None,configFiles=None):
+        OWS.__init__(self,url,qstring)
+
+    def makeMap(self,mapfilename=None):
+
+        mapobj = self.getMapObj(mapfilename)
+
+        for layer in self.capabilities.FeatureTypeList.getchildren():
+            if layer.tag != "{http://www.opengis.net/wfs}FeatureType":
+                    continue
+            name = layer.Name.text
+            logging.debug("Creating layer %s" % name)
+            
+
+            layerDefFile = self.createLayerDefinitionFile(name,
+                    os.path.join( os.path.dirname(__file__), "templates",'wfs.xml'))
+
+            ds = ogr.Open(layerDefFile)
+
+            lyrobj = mapscript.layerObj(mapobj)
+            lyrobj.name = name
+            lyrobj.title = layer.Title.text
+            lyrobj.data = layerDefFile
+            lyrobj.setMetaData("wms_title",layer.Title.text)
+            lyrobj.setMetaData("wfs_typename",layer.Name.text)
+            lyrobj.setMetaData("wfs_version",self.capabilities.attrib["version"])
+
+            if ds:
+                ogrLayer = ds.GetLayerByName(name)
+                if ogrLayer:
+                    feature = ogrLayer.GetNextFeature()
+                    if feature:
+                        geom = feature.GetGeometryRef()
+                        if geom:
+                            lyrobj.type = self.getGeomName(geom.GetGeometryName())
+                        else:
+                            mapobj.removeLayer(mapobj.numlayers-1)
+                            logging.debug("No ogrGeometry found")
+                            continue
+                    else:
+                        mapobj.removeLayer(mapobj.numlayers-1)
+                        logging.debug("No ogrFeature found")
+                        continue
+                else:
+                    mapobj.removeLayer(mapobj.numlayers-1)
+                    logging.debug("No ogrLayer found")
+                    continue
+            else:
+                mapobj.removeLayer(mapobj.numlayers-1)
+                logging.debug("No ogrDataSource found")
+                continue
+
+            lyrobj.setProjection(layer.SRS.text)
+            lyrobj.dump = mapscript.MS_TRUE 
+            lyrobj.template = "foo"
+            cls = mapscript.classObj(lyrobj)
+            style = mapscript.styleObj(cls)
+            style.outlinecolor=mapscript.colorObj(134,81,0)
+            style.color=mapscript.colorObj(238,153,0)
+            style.size=5
+            style.width=5
+
+        self.saveMapfile(mapobj,mapfilename)
+        return mapobj
+    
+    def getGeomName(self,geomname):
+
+        if geomname.find("LINE") > -1:
+            return mapscript.MS_LAYER_LINE
+        elif geomname.find("POLYGON") > -1:
+            return mapscript.MS_LAYER_POLYGON
+        else:
+            return mapscript.MS_LAYER_POINT
+

+ 3 - 0
wfs/templates/wfs.xml

@@ -0,0 +1,3 @@
+<OGRWFSDataSource>
+  <URL>$url</URL>
+</OGRWFSDataSource>